Snort中pcre和正則運算式的使用
1. 題目描述
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 an alert with msg “bot founded” and sid 1000001
2. 解決方案
題目要求檢測包含兩個包的特定流,需要通過設定標記位,即flowbits來實作,另外,題目中均要求檢測特定的字串或模式,所以還需要在pcre欄位中通過正則運算式實作,
2.1 第一條檢測規則
-
匹配特定字串
pcre:"/login|Initial/";正則運算式的兩端需要加上限界符
/, -
設定標志位,同時不發出警報,
flowbits:set,login_Initial;flowsbits:noalert;
2.2 第二條檢測規則
2.2.1 匹配模式IPv4Address:Port
-
IPv4Address
IPv4地址使用點分十進制表示時,分為4組,每組的范圍均為[0,255],即從0.0.0.0到255.255.255.255,
我們先分析單獨一組的特點:
區間 限制 表示 0~99 沒有任何限制 \d{1,2}100~199 后兩位也沒有任何限制 1\d{2}200~249 十位限制在0~4,個位沒有限制 2[0-4]\d250~255 個位限制在0~5 25[0-5]可以發現表格中前兩種情況可以合并為
1?\d{1,2},所以可以用25[0-5]|2[0-4]\d|1?\d{1,2}來匹配0~255;將其作為一個分組,再考慮到
.,我們可以寫出如下正則運算式匹配IPv4地址:((25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1?\d{1,2})
值得說明的是:
這里我們認為數字前出現填充
0的情況與非填充狀態等價:如:
192.01.00.1等價于192.1.0.1,這種情況下才能使用
\d{1,2},因為可能會出現00的情況,正則運算式的短路性質:
當
|運算子分隔的多個運算式有一個匹配成功時,該運算式之后的運算式將不會繼續匹配,如:
A|B|C|D,B匹配成功了,將不會再看C和D,所以上面匹配IPv4地址時,我們單獨一個分組寫成
25[0-5]|2[0-4]\d|1?\d{1,2}而不是1?\d{1,2}|2[0-4]\d|25[0-5],后者匹配
255時,只會匹配到25和5,而不會匹配到255:![]()
同樣后者構造的正則運算式去匹配
255.255.255.255,只會匹配到255.255.255.25,缺少最后一個5:![]()
因為它匹配到最后一組的
25時就判定匹配成功,直接跳到末尾,結束匹配,而前面幾組255正確匹配的原因是:如果只匹配25, 發現剩下的5和.不匹配,之后會進行回溯,繼續檢查后面的條件,發現255匹配成功且.也匹配成功,不再回溯,
-
Port
埠號的范圍是0~65535,我們同樣可以分成不同的區間來匹配埠號,
區間 限制 表示 0~9999 沒有任何限制 \d{1,4}10000~59999 后四位沒有任何限制 [1-5]\d{4}60000~64999 千位限制在0~4,后三位沒有任何限制 6[0-4]\d{3}65000~65499 百位限制在0~4,后兩位沒有任何限制 65[0-4]\d{2}65500~65529 十位限制在0~4,個位沒有任何限制 655[0-2]\d65530~65535 個位限制在0~5 6553[0~5]同樣,我們可以將表格前兩種情況合并為
[1-5]?\d{1,4},結合上面提到的短路性質,我們可以寫出最終用于匹配埠號的正則運算式:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4}
2.2.2 檢查標志位
flowbits:isset,bot_founded;
3. 檢測規則
通過上述分析,我們可以寫出如下檢測規則:
alert tcp any any -> any 3399 (pcre:"/login|Initial/";flowbits:set,login_Initial;flowbits:noalert;sid:1000000)
alert tcp any any -> any 3399 (msg:"bot founded";pcre:"/((25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1?\d{1,2}):(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4})/";flowbits:isset,bot_founded;sid:1000001)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452002.html
標籤:其他
下一篇:靜態鏈路聚合方案
