首頁 > 軟體

Snort中pcre和正規表示式的使用詳解

2022-03-30 13:01:12

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後兩位也沒有任何限制1d{2}
200~249十位限制在0~4,個位沒有限制2[0-4]d
250~255個位限制在0~525[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|DB匹配成功了,將不會再看CD

所以上面匹配IPv4地址時,我們單獨一個分組寫成25[0-5]|2[0-4]d|1?d{1,2}而不是1?d{1,2}|2[0-4]d|25[0-5]

後者匹配255時,只會匹配到255,而不會匹配到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]d
65530~65535個位限制在0~56553[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)

到此這篇關於Snort中pcre和正規表示式的使用的文章就介紹到這了,更多相關Snort pcre 正規表示式使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com