網站首頁 編程語言 正文
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]\d |
250~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]\d |
65530~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.cnblogs.com/c0ver1/p/idshwk2.html
相關推薦
- 2022-03-19 C語言結合ffmpeg打印音視頻信息_C 語言
- 2022-10-04 golang中time包之時間間隔格式化和秒、毫秒、納秒等時間戳格式輸出的方法實例_Golang
- 2022-10-17 Kotlin編程循環控制示例詳解_Android
- 2023-08-28 vscode里面報:‘xxx‘ is assigned a value but never used
- 2022-04-24 redis用list做消息隊列的實現示例_Redis
- 2023-01-03 python案例中Flask全局配置示例詳解_python
- 2022-07-27 Python中的協程(Coroutine)操作模塊(greenlet、gevent)_python
- 2022-06-28 C#遞歸算法和排列算法_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支