Snort Rules——使用pcre进行规则匹配
題目描述
if snort see two packets in a TCP flow with
- first packet has " login " or " Initial " in payload, destination port is 3399;
- and second packet has a " IPv4Address:Port " string (E.g.123.45.6.7:8080) in payload. destination port is 3399;
- output a alert with msg " bot founded " and sid 1000001
參考資料:
Snort規則詳解
PCRE正則表達式語法
php pcre正則表達式完全教程——pcre官方文檔
正則表達式校驗IP地址
使用正則表達式驗證IPv4地址
我們把題目中的幾個難點拆分出來:
難點一:兩條規則均命中,構成一個攻擊事件
解決方法:設置flowbits字段(flowbits使用規范)
在第一條檢測規則中,我們設置一個標志位botlogin,同時設定不發出警報
flowbits:set,botlogin;flowbits:noalert;在第二條規則中,我們檢測標志位是否為1
flowbits:isset,botlogin;難點二:first packet has " login " or " Initial " in payload
這是一個邏輯或的內容匹配,我們可以使用pcre規則實現
快速瀏覽一下PCRE正則表達式語法后,我們可以捏出來一個規則雛形:
pcre:"login|Initial";實際上,這個 " 顯而易見 " 規則,就可以解決第二個難點了,但還存在一點點語法錯誤
參考一下pcre中分隔符和元字符的使用方法,我們可以在前后加上小括號讓pattern看上去更優美完整,再使用分隔符進行限定即可
這里是否需要這么多限定pattern界限的符號,我并不確定
不過保險起見,就都寫上了
難點三:has a " IPv4Address:Port " string (E.g.123.45.6.7:8080) in payload
IPv4地址
IPv4地址:0-255.0-255.0-255.0-255
我們先來解決0-255如何表示為pattern
最簡單的想法,將0-255拆分成:0-9,10-99,100-199,200-249,250-255
可以注意到,表達式中出現了[0-9][0-9]的結構,我們可以用{x}表示之前緊鄰的模式需要匹配幾次
[0-9][0-9] --> [0-9]{2}此外,我們也可以用\d代表[0-9]
(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])在0-255這部分后面添加一個 " . "(注意需要使用轉義符 " \ ")
((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.)" 0-255. "重復匹配三次
((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}完整的IPv4檢測正則表達式
((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])理論上,上述正則表達式就可以解決我們的問題
但是
我親愛的同學遺憾地告訴我
在網上在線測評的時候,發現以上規則無法正確匹配255.255.255.255(最后一組的最后兩個5無法匹配)
大概率是因為snort默認采用最短匹配
前三組有 " . " 的約束就會老老實實地挨個匹配
最后一組如圖,首次匹配2成功了,一看是或關系,就直接跳到末尾了
這就可以解釋為什么網上的很多文章," 無緣無故 " 會將確定性強(更特殊)的部分放到整個正則表達式的最前面
因此,保險起見,我們把IPv4的pcre規則更改為:
端口號
端口號:0-65535
還是先采用最簡單的想法
簡化一下
\d [1-9]\d [1-9]\d{2} [1-9]\d{3} [1-5]\d{4} 6[0-4]\d{3} 65[0-4]\d{2} 655[0-2]\d 6553[0-5]簡單的,我們可以把0-9999(近似)表示為
\d{1,4}完整的端口檢測正則表達式
(\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])同IPv4正則表達式描述的問題
以防萬一我們可以把確定性高的表達式放到前面:
最終的答案:
alert tcp any any -> any 3399 (msg:"bot login";pcre:"/(login|Initial)/";flowbits:set,botlogin;flowbits:noalert;sid:1000002;) alert tcp any any -> any 3399 (msg:"bot founded";pcre:"/((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]):(\d{1,4}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])/";flowbits:isset,botlogin;sid:1000001;)調整正則表達式順序后:
alert tcp any any -> any 3399 (msg:"bot login";pcre:"/(login|Initial)/";flowbits:set,botlogin;flowbits:noalert;sid:1000002;) alert tcp any any -> any 3399 (msg:"bot founded";pcre:"/((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]):(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|\d{1,4})/";flowbits:isset,botlogin;sid:1000001;)測試方法
snort讀取外部數據方式
snort --pcap-dir="./pcap" -c test.rules -A fast cat /var/log/snort/alert總結
以上是生活随笔為你收集整理的Snort Rules——使用pcre进行规则匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧养老解决方案有哪些新行业诞生?
- 下一篇: 这个Python库有点逆天了,居然能把图