Snort中pcre和正則表達(dá)式的使用詳解
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. 解決方案
題目要求檢測(cè)包含兩個(gè)包的特定流,需要通過設(shè)置標(biāo)記位,即flowbits來實(shí)現(xiàn)。另外,題目中均要求檢測(cè)特定的字符串或模式,所以還需要在pcre字段中通過正則表達(dá)式實(shí)現(xiàn)。
2.1 第一條檢測(cè)規(guī)則
匹配特定字符串
pcre:"/login|Initial/";
正則表達(dá)式的兩端需要加上限界符/
。
設(shè)置標(biāo)志位,同時(shí)不發(fā)出警報(bào)。
flowbits:set,login_Initial;flowsbits:noalert;
2.2 第二條檢測(cè)規(guī)則
2.2.1 匹配模式IPv4Address:Port
IPv4Address
IPv4地址使用點(diǎn)分十進(jìn)制表示時(shí),分為4組,每組的范圍均為[0,255]。即從0.0.0.0到255.255.255.255。
我們先分析單獨(dú)一組的特點(diǎn):
區(qū)間 | 限制 | 表示 |
---|---|---|
0~99 | 沒有任何限制 | \d{1,2} |
100~199 | 后兩位也沒有任何限制 | 1\d{2} |
200~249 | 十位限制在0~4,個(gè)位沒有限制 | 2[0-4]\d |
250~255 | 個(gè)位限制在0~5 | 25[0-5] |
可以發(fā)現(xiàn)表格中前兩種情況可以合并為1?\d{1,2}
,所以可以用25[0-5]|2[0-4]\d|1?\d{1,2}
來匹配0~255;
將其作為一個(gè)分組,再考慮到.
,我們可以寫出如下正則表達(dá)式匹配IPv4地址:
((25[0-5]|2[0-4]\d|1?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|1?\d{1,2})
值得說明的是:
這里我們認(rèn)為數(shù)字前出現(xiàn)填充0
的情況與非填充狀態(tài)等價(jià):
如:192.01.00.1
等價(jià)于192.1.0.1
。
這種情況下才能使用\d{1,2}
,因?yàn)榭赡軙?huì)出現(xiàn)00
的情況。
正則表達(dá)式的短路性質(zhì):
當(dāng)|
運(yùn)算符分隔的多個(gè)表達(dá)式有一個(gè)匹配成功時(shí),該表達(dá)式之后的表達(dá)式將不會(huì)繼續(xù)匹配。
如:A|B|C|D
,B
匹配成功了,將不會(huì)再看C
和D
。
所以上面匹配IPv4地址時(shí),我們單獨(dú)一個(gè)分組寫成25[0-5]|2[0-4]\d|1?\d{1,2}
而不是1?\d{1,2}|2[0-4]\d|25[0-5]
。
后者匹配255
時(shí),只會(huì)匹配到25
和5
,而不會(huì)匹配到255
:
同樣后者構(gòu)造的正則表達(dá)式去匹配255.255.255.255
,只會(huì)匹配到255.255.255.25
,缺少最后一個(gè)5
:
因?yàn)樗ヅ涞阶詈笠唤M的25
時(shí)就判定匹配成功,直接跳到末尾,結(jié)束匹配。而前面幾組255
正確匹配的原因是:如果只匹配25
,發(fā)現(xiàn)剩下的5
和.
不匹配,之后會(huì)進(jìn)行回溯,繼續(xù)檢查后面的條件,發(fā)現(xiàn)255
匹配成功且.
也匹配成功,不再回溯。
- Port
端口號(hào)的范圍是0~65535,我們同樣可以分成不同的區(qū)間來匹配端口號(hào)。
區(qū)間 | 限制 | 表示 |
---|---|---|
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,個(gè)位沒有任何限制 | 655[0-2]\d |
65530~65535 | 個(gè)位限制在0~5 | 6553[0~5] |
同樣,我們可以將表格前兩種情況合并為[1-5]?\d{1,4}
。結(jié)合上面提到的短路性質(zhì),我們可以寫出最終用于匹配端口號(hào)的正則表達(dá)式:
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 檢查標(biāo)志位
flowbits:isset,bot_founded;
3. 檢測(cè)規(guī)則
通過上述分析,我們可以寫出如下檢測(cè)規(guī)則:
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)
到此這篇關(guān)于Snort中pcre和正則表達(dá)式的使用的文章就介紹到這了,更多相關(guān)Snort pcre 正則表達(dá)式使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php匹配網(wǎng)址的正則 幾乎可以匹配任何網(wǎng)址
php匹配網(wǎng)址的正則 幾乎可以匹配任何網(wǎng)址,需要的朋友可以參考下2013-05-05JScript中正則表達(dá)函數(shù)的說明與應(yīng)用
JScript中正則表達(dá)函數(shù)的說明與應(yīng)用...2006-06-06