概述
Snort 是免費 Network Intrusion Prevention System(NIPS) 及 Network Intrusion Detection System (NIDS) 軟件,其具有對數據流量分析和對網絡數據包進行協(xié)議分析處理的能力箭昵,通過靈活可定制的規(guī)則庫(Rule)呵晨,可對處理的報文內容進行搜索和匹配随闺,能夠檢測出各種攻擊卒废,并進行實時預警里逆。
軟件采用雙授權:
- 源代碼及社區(qū)版本規(guī)則庫使用 GPLv2 授權
- 專用規(guī)則庫(Proprietary Snort Rules)使用 "Non-Commercial Use License"授權娇妓,只允許個人使用,不可用作商業(yè)
架構
- Packet Decoder辫塌,從接口收幀漏策,作報文粗解析(Ethernet/WIFI/IP/UDP/TCP/GRE等),最深解析到 IP 協(xié)議字段的首部臼氨,將報文送到 Preprocessor
- Preprocessor掺喻,使用 Plugin 解析報文板壮,主要 Plugin 如 HTTP/FTP/SSH 等等 preprocessor plugin恨胚,使用規(guī)則(preprocessor rule)做初解析及執(zhí)行行為(alert/log/pass/drop/sdrop/rject 等),分片報文在這個階段進行重組
- Detetction Engine,Snort 的核心模塊繁调,將從 preprocessor 送來的報文進行更精確的規(guī)則(snort rule)匹配晒来,包括:應用竭宰、流方向兼贡、報文模式匹配等,后執(zhí)行行為
- Logging and Alerting System只酥,對于規(guī)則匹配中需觸發(fā) Log 及告警的流進行處理褥实,寫入本地文件
/var/log/snort
目錄 - Output Modules,將 Log 及告警通過 Unix Socket, WindowsPopup, SNMP Trap 等方式提交到日志服務器或數據庫
規(guī)則
Decoder 與 Preprocessor 規(guī)則
Decoder 階段使用 snort.conf
文件中 config disbale_decode_alerts
參數配置告警行為裂允,通過 config enable_decode_drops
參數的優(yōu)先級高于 rule 中的 drop 行為優(yōu)先級
Decoder 與 Preprocessor 的 Rule 通過配置文件保存在源代碼的 preproc_rules/
目錄损离,對應于 decoder.rules
與 preprocessor.rules
文件, Decoder 與 Preprocessor 的 Rule 的啟用需要在 snort.conf 中增加相應的配置:
var PREPROC_RULE_PATH /path/to/preproc_rules
...
include $PREPROC_RULE_PATH/preprocessor.rules
include $PREPROC_RULE_PATH/decoder.rules
Decoder 與 Preprocessor 的 Rule 支持以下行為:
- alert绝编,發(fā)送告警信息
- log僻澎,記錄 Log 信息
- pass,通過瓮增,正常轉發(fā)
- drop,丟棄報文哩俭,并記錄
- sdrop绷跑,丟棄報文,不記錄
- reject凡资,丟棄報文砸捏,并記錄,對于 TCP 報文隙赁,回應 RESET垦藏,對于 UDP 回應 ICMP Port unreachable
Rule 的樣例 "對于 Ether-Type 為 0x0800 但 IPv4 首部中協(xié)議版本號不為 v4 的報文進行告警" 描述如下:
alert ( msg: "DECODE_NOT_IPV4_DGRAM"; sid: 1; gid: 116; rev: 1; \
metadata: rule-type decode ; classtype:protocol-command-decode;)
Snort 支持多種類似的 Decoder 與 Preprocessor 處理,詳細信息如下:
基本上常見的應用協(xié)議 Preprocessor 都支持
Detection 規(guī)則
Snort Detection 的 Rule 規(guī)則由 Rule Header 與 Options 兩個部分構成
伞访,
- Rule Header掂骏,描述流的行為及基本特征,描述串為固定格式信息
[行為][協(xié)議][IP地址][端口號][流方向][IP地址][端口號]
七類信息 - Rule Opitons厚掷,描述流的精確匹配信息弟灼,包括:HTTP 首部、Cookie冒黑、UA田绑、特定偏移的字串,等等抡爹,這個是 Snort 最強大的部分掩驱,也是 Snort 的核心部分
下面的例子: 從 $BAD_NETK
網絡任意源端口到 $HOME
網絡的 80 端口 且有效載荷中包含十六進制為 0x47 0x45 0x54(即 "GET")字符串的報文
Rule Header
Detection 階段的 Rule Action 比 Decoder/Preprocessor 階段增加了 Activate / Dynamic 行為, Activate 定義流規(guī)則同時指定規(guī)則 ID (activates:ID),Dynmaic 規(guī)則通過指定的規(guī)則 ID 進行激活(activated_by:ID)欧穴,這兩個行為能夠組合出更靈活的 Snort Rule 規(guī)則
Rule 樣例 "檢測到非 $HOME_NET 對 IMAP(TCP 80端口) 的 buffer overflow 攻擊后民逼,記錄后續(xù)的 50 個報文首部信息" 如下:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA; \
content:"|E8C0FFFFFF|/bin"; activates:1; \
msg:"IMAP buffer overflow!";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by:1; count:50;)
通過 Activate/Dynamic 組合,在識別出流量后苔可,可收集后續(xù)關聯流量缴挖,以供進一步的流量分析處理。
Rule Options
規(guī)則 Options 是 Snort 的 Detetction Engine 最核心的技術焚辅,通過豐富的 Options 提供易用映屋、靈活且強大的規(guī)則定義機制,規(guī)則的 Options 為 Rule 中的 (;)
定義的部分同蜻,通過 ;
定義多個 option棚点,每個 option 內的關鍵字使用 :
標識。
包括四個分別為 flags
, content
, activates
與 msg
關鍵字的 Option 樣例:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;
content:"|E8C0FFFFFF|/bin"; activates:1; \
msg:"IMAP buffer overflow!";)
Snort 的 Rule Options 主要有以下四類:
- general湾蔓,提供 Rule 的基本信息瘫析,并不對流量產生任何行為。
- payload默责,對數據流的有效載荷進行查找贬循,可進行多數據關聯查找。
- non-payload桃序,非數據載荷查找杖虾。
- post-detection,對檢測出的特定的規(guī)則進行關聯觸發(fā)媒熊。
通用選項(General)
關鍵字
關鍵字 | 格式 | 說明 |
---|---|---|
msg | msg:”message text" | 用于 alert/log 引擎進行信息告警/記錄及報文記錄 |
reference | reference:<id system="">, <id>; [reference:<id system="">, <id>;]</id></id></id></id> | 外部信息引用奇适,包括 URL/CVE 等等 |
gid | <div>gid:<generator id="">;</generator></div> | General ID,區(qū)分 Snort 事件分類芦鳍,ID 大于 100 是給特定 Preprocessor 與 decoder |
sid | sid:<snort rules="" id="">;</snort> | Snort Rule ID嚷往,每個 Rule 的唯一標識 |
rev | rev:<revision integer="">;</revision> | sid 所對應 rule 的版本號 |
classtype | classtype:<class name="">;</class> | Rule 分類,Snort 已做了 4 個優(yōu)先級 34 種分類 |
priority | priority:<priority integer="">;</priority> | Rule 優(yōu)先級 |
metadata | metadata:key1 value1, key2 value2; | Key-Value 格式存儲的 Rule 擴展信息 |
樣例
- msg /reference 關鍵字
alert tcp any any -> any 7070 (msg:"IDS411/dos-realaudio"; \
flags:AP; content:"|fff4 fffd 06|"; reference:arachnids,IDS411;)
alert tcp any any -> any 21 (msg:"IDS287/ftp-wuftp260-venglin-linux"; \
flags:AP; content:"|31c031db 31c9b046 cd80 31c031db|"; \
reference:arachnids,IDS287; reference:bugtraq,1387; \
reference:cve,CAN-2000-1574;)
- gid/sid/rev 關鍵字
alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;)
- classtype 關鍵字
alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; \
content:"expn root"; nocase; classtype:attempted-recon;)
- priority 關鍵字
alert tcp any any -> any 80 (msg:"WEB-MISC phf attempt"; flags:A+; \
content:"/cgi-bin/phf"; priority:10;)
alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; \
dsize:>128; classtype:attempted-admin; priority:10 )
- metadata 關鍵字
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared; metadata:soid 3|12345;)
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; \
metadata:engine shared, soid 3|12345;)
alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; \
metadata:service http;)
載荷選項(Payload)
關鍵字
Snort 的 Payload 選項的關鍵字(Key)非常豐富柠衅,主要分為三大類
- 查找關鍵字:對數據流進行內容查找皮仁,包括: content, protected_content 、byte_[test/jump] 及 isdata
- 協(xié)議關鍵字:Preprocessor 解析協(xié)議相關的選項查找
- 修飾關鍵字:修飾查找行為的關鍵字菲宴,主要包括:nocase, rawbytes, depth, offset, distance, within, http_[cookie/header/method/uri] 等等
具體的參看下圖
![Payload Rule](http://7xjudy.com1.z0.glb.clouddn.com/2016-12-08-Payload Rule.jpg)
樣例
載荷查找樣例:
# 匹配 HTTP Cookie 中包括 ABC 與 EFG 的流
alert tcp any any -> any 80 (content:"ABC"; content:"EFG"; http_cookie;)
# 匹配 TCP 報文 ABC 之后 10 個字節(jié)內存在 EFG 的流
alert tcp any any -> any any (content:"ABC"; content:"EFG"; within:10;)
# 匹配 HTTP 報文的 URI 滿足 foo.php?id=<數值> 的流
alert tcp any any -> any 80 (content:"/foo.php?id="; pcre:"/\/foo.php?id=[0-9]{1,10}/iU";)
# 匹配 HTTP 報文首部包含 User-Agent 的流
alert tcp any any -> any 80 (content:"User-Agent:"; http_header; nocase;)
非載荷選項(Non-Payload)
關鍵字
Non-Payload 的關鍵字用于匹配 IP 層魂贬、傳輸層協(xié)議的關鍵字段,主要包括:
- fragoffset裙顽,匹配 IP 報文中分片 offset 字段
fragoffset:[!|<|>]<number>;
- ttl付燥,匹配 IP 首部的 TTL 字段,支持比較
ttl:[<, >, =, <=, >=]<number>;
愈犹,支持數值范圍ttl:[<number>]-[<number>];
- tos键科,匹配 IP 首部 tos 字段
tos:[!]<number>;
- id闻丑,匹配 IP ID 字段,
id:<number>;
- ipopts勋颖,匹配 IP 首部的選項嗦嗡,
ipopts:<rr|eol|nop|ts|sec|esec|lsrr|lsrre|ssrr|satid|any>;
- fragbits,匹配 IP 首部的分片標識饭玲,支持使用
+/*/!
進行邏輯組合fragbits:[+*!]<[MDR]>;
- dsize侥祭,匹配/測試 報文的載荷長度,
dsize:min<>max;
與dsize:[<|>]<number>;
- flags茄厘,匹配 TCP 的 Flag 字段矮冬,支持使用
+/*/!
進行邏輯組合,flags:[!|*|+]<FSRPAUCE0>[,<FSRPAUCE>];
- flowbits次哈,匹配/設置 TCP 的 Flag 字段胎署,用于跟蹤 TCP 協(xié)議 Sesion 狀態(tài)
flowbits:[set|setx|unset|toggle|isset|isnotset|noalert|reset][, <bits/bats>][, <GROUP_NAME>];
bits ::= bit[|bits]
bats ::= bit[&bats]
- seq,匹配 TCP 的序列號窑滞,
seq:<number>;
- ack琼牧,匹配 TCP 的 ACK 序列號,
ack:<number>;
- windows哀卫,匹配 TCP 的窗口大小巨坊,
window:[!]<number>;
- itype,匹配 ICMP 的 type 字段此改,
itype:min<>max;
與itype:[<|>]<number>;
- icode趾撵,匹配 ICMP 的 code 字段,
icode:min<>max;
與icode:[<|>]<number>;
- icmp_id带斑,匹配 ICMP 的 ID 值鼓寺,
icmp_id:<number>;
- icmp_seq勋拟,匹配 ICMP 的序列號勋磕,
icmp_seq:<number>;
- rpc,匹配 SUNRPC 請求信息敢靡,
rpc:<application number>, [<version number>|*], [<procedure number>|*]>;
- ip_proto挂滓,匹配 IP 的協(xié)議字段,
ip_proto:[!|>|<] <name or number>;
- sameip啸胧,匹配源 IP 與目的 IP 相同的流
- stream_reassemable赶站,對 TCP 流的重組流進行設置,
stream_reassemble:<enable|disable>, <server|client|both>[, noalert][, fastpath];
- stream_size纺念,匹配指定長度的 TCP 流贝椿,
stream_size:<server|client|both|either>, <operator>, <number>;
樣例
非載荷查找樣例:
# 記錄 IGMP 報文
alert ip any any -> any any (ip_proto:igmp;)
# 記錄源 IP 與目的 IP 相同報文
alert ip any any -> any any (sameip;)
# 記錄客戶端發(fā)出的小于 6 Byte 的 TCP 流
alert tcp any any -> any any (stream_size:client,<,6;)
檢測后處理選項(Post-Detection)
關鍵字
- logto,將規(guī)則對應的信息記錄到指定的 LOG 文件中陷谱,
logto:"filename";
- session烙博,將 TCP Session 中的用戶數據報文進行記錄瑟蜈,
session:[printable|binary|all];
- resp,通過發(fā)送響應結束對 Session 的請求
- react渣窜,向對應對的客戶送發(fā)送 WEB 頁面應答后關閉連接
- tag铺根,匹配規(guī)則的流觸發(fā)后續(xù)報文進行記錄,可指定針對流的源[或/且]目的主機進行后續(xù)記錄乔宿,
tag:host, <count>, <metric>, <direction>;
與tag:session[, <count>, <metric>][, exclusive];
- activates 與 activated_by位迂,用于關聯兩個 Rule,第1個 Rule 使用
activates:id
設定 ID详瑞,第2個 Rule 使用activated_by:id
激活 - count掂林,修飾 activated_by,用于指定激活規(guī)則的報文個數
- replace蛤虐,修訂先前 content 匹配的內容党饮,要求 replace 的長度與 content 一致,
replace:"<string>";
- detection_filter驳庭,事件在特定的發(fā)生頻率之后被激活刑顺,
detection_filter: track <by_src|by_dst>, count <c>, seconds <s>;
樣例
檢測后處理樣例:
# 記錄 TELNET 中所有可見字符內容
log tcp any any <> any 23 (session:printable;)
# 丟棄 1 分鐘內登錄失敗超過 30 次的 SSH 請求
drop tcp 10.1.2.100 any > 10.1.1.100 22 ( \
msg:"SSH Brute Force Attempt";
flow:established,to_server; \
content:"SSH"; nocase; offset:0; depth:4; \
detection_filter:track by_src, count 30, seconds 60; \
sid:1000001; rev:1;)
[End]