Suricata IDS 入門-規則詳解
安全脈搏SecPulse.Com獨家發文,如需轉載,請先聯繫授權。
suricata是一款開源高性能的入侵檢測系統,並支持ips(入侵防禦)與nsm(網路安全監控)模式,用來替代原有的snort入侵檢測系統,完全兼容snort規則語法和支持lua腳本。
1 規則配置
配置文件位置:/etc/suricata/suricata.yaml
規則目錄位置:/etc/suricata/rules
先設置HOME_NET與EXTERNAL_NET,推薦HOME_NET填寫內網網段,EXTERNAL_NET設置為any
注意如果HOME_NET設置了any,EXTERNAL_NET設置!HOME_NET的話會報錯,如果HOME_NET設置了內網地址,EXTERNAL_NET設置為!$HOME_NET的話,有些內網之間的告警就無法匹配到
通過配置文件的default-rule-path設置規則目錄,rule-files來選擇啟用那些規則。
classification-file:/etc/suricata/classification.config
reference-config-file:/etc/suricata/reference.config
threshold-file:/etc/suricata/threshold.config
修改配置文件改成下面
outputs:
fast:
enabled: yes
eve-log:
enabled: yes
types:
- alert:
payload-buffer-size: 6kb #paylaod大小限制
payload-printable: yes #記錄原始payload
http-body-printable: yes #記錄http 原始響應系想你
啟用下面的xff、http、dns、tls、ssh、flow等欄位
注意 配置文件中必須禁用校驗和checksum,不然的話會有非常多的誤報,並且占空間。
類似下面這種告警
{"timestamp":"2018-04-01T15:11:35.318851+0000","flow_id":2220356201340002,"pcap_cnt":12,"event_type":"alert","src_ip":"192.168.2.140","src_port":58598,"dest_ip":"192.168.2.2","dest_port":4444,"proto":"TCP","alert":{"action":"allowed","gid":1,"signature_id":2200073,"rev":2,"signature":"SURICATA IPv4 invalid checksum","category":"Generic Protocol Command Decode","severity":3},"flow":{"pkts_toserver":2,"pkts_toclient":1,"bytes_toserver":120,"bytes_toclient":66,"start":"2018-04-01T15:11:35.318562+0000"},"payload_printable":"","stream":0}
2 Suricata規則詳解
更多參考官網文檔:http://suricata.readthedocs.io/en/suricata-4.0.4
完整規則:
alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (msg:"INDICATOR-SHELLCODE heapspray characters detected - ASCII "; flow:to_client,established; file_data; content:"0d0d0d0d"; fast_pattern:only; metadata:service ftp-data, service http,service imap, service pop3; reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html; classty pe:attempted-user; sid:33339; rev:1;)
默認規則的說明:https://www.jianshu.com/p/d81db4c352af
alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any
規則行為協議源ip源埠流量方向目標ip目標埠紅色代表規則頭
規則行為,根據優先順序排列:
pass 如果匹配到規則後,suricata會停止掃描數據包,並跳到所有規則的末尾
drop ips模式使用,如果匹配到之後則立即阻斷數據包不會發送任何信息
reject 對數據包主動拒絕,接受者與發送中都會收到一個拒絕包
alert 記錄所有匹配的規則並記錄與匹配規則相關的數據包
協議:
在規則中指定匹配那些協議,suricata支持的協議要比snort多一些
TCP、UDP、ICMP、IP(同時用與TCP與UDP)、http、ftp、smb、dns
源ip,目標ip:
支持單個ip,cidr,ip組,[96.30.87.36,96.32.45.57],所有主機any,以及規則文件中配置的ip變數$HOME_NET(受保護的ip段)與$EXTERNAL_NET(其他所有ip):
源埠/目標埠:
支持設置單個埠80,埠組[80,8080],埠範圍[1024:65535]以及any任意埠,還可以在配置文件中添加埠組,通過!號來進行排除
流量方向:
-> 單向流量,從源ip到目標ip的單項流量
雙向流量,2個ip往返之間的流量
規則體
(msg:"INDICATOR-SHELLCODE heapspray characters detected - ASCII "; flow:to_client,established; file_data; content:"0d0d0d0d"; fast_pattern:only; metadata:service ftp-data, service http,service imap, service pop3; reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html; classtype:attempted-user; sid:33339; rev:1;)
MSG:規則名稱,規則中的第一個欄位,ids告警上顯示的信息,INDICATOR-SHELLCODE heapspray characters detected - ASCII
特徵標示符sid:
用於唯一性規則標識,sid不能重複,0-10000000 VRT保留,20000000-29999999 Emerging保留,30000000+:公用
組gid:
[1:2000000] 告警前面的1代表組id
修訂rev:
規則版本號,每次修改規則rev則遞增1
引用reference:
連接外部信息來源,補充描述,reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html
優先順序 priority:
手動設置規則優先順序別,範圍1-255,1最高,一般都是1-4,suricata會首先檢查優先順序較高的規則
類別 classtype:
根據規則檢測到的活動類型為規則分類, classtype:attempted-user
元數據 Metadata:
suricata會忽略元數據背後的語句,用於添加備註
源ip、目標ip檢測:
sameip會將流量中源ip和目標ip相同的顯示出來
alert ip any any -> any any (msg:"GPL SCAN same SRC/DST"; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:2100527; rev:9; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
內容匹配 content:檢測數據包中是否存在此內容,例如檢測流量中是否存在0d0d0d0d
如果有多個匹配項可以使用 content:"evilliveshere"; content:"here"; 這種寫法,注意如果沒有用內容修飾的話,ids不會按照先後順序去匹配的,只會在內容中匹配是否包含這2個值,必須用內容修飾來調整先後順序,用distance 0 來讓第二個匹配項在第一個匹配項匹配位置之後匹配,並且如果有多個content他們的關係是and關係必須都匹配到才告警 。
使用感嘆號!對匹配項的否定:content:!"evilliveshere";
匹配內容區分大小寫,保留字元(; "|)須進行轉義或十六進位轉碼
內容修飾,能夠更加精準匹配
不區分大小寫 nocase:
content:"root";nocase; #修飾符直接在;號後面添加
偏移位置 offset:
content:"xss";offset 100; #代表了從數據包開始位置0往後偏移100位位元組後進行匹配
結束位置 depth:
content:"xss";offset 100;depth 200; #代表了匹配數據包結束的位置,如果沒有offset則是從開始位置計算,有offset則是從offset開始,此次則是從100位元組開始匹配到200位元組內的內容。
在xx範圍外 distance :
本次匹配必須在上一次匹配結束位置到distance設置的偏移位置區間之外,例如content:"msg1";content:"msg2";distance 25; 如果msg1在第100行找到,那麼就會在100+25後匹配msg2
在xx範圍內 within:
本次匹配必須在上一次匹配結束位置之內,如果上次結束是100,within 15;那麼第二次匹配必須在100到115之內開始匹配
如果within與distance同時出現 content:"evilliveshere"; content:"here"; distance:1;within:7; 則匹配here在 evilliveshere位置結束1-7內匹配
有效載荷大小 dsize:
dsize: >64 用來匹配payload大小,可以用來檢測異常包大小
pcre正則 pcre:
content:"xss"; pcre:"xssw" 先匹配content內容後才進行匹配pcre正則,這樣的話減少系統開銷
http修飾符:
更多詳細內容查看:http://suricata.readthedocs.io/en/suricata-4.0.4/rules/http-keywords.html
alert tcp any any -> any 80(msg:"Evil Doamin www.appliednsm.com"; "content:"GET";httpmethod; content:"www.appliednsm.com";http_uri; sid:5445555; rev:1;)
http_client_body HTTP客戶端請求的主體內容
http_cookie HTTP頭欄位的「Cookie」內容
http_header HTTP請求或響應頭的任何內容
http_method 客戶端使用的HTTP方法(GET,POST等)
http_uri HTTP客戶端請求的URI內容
http_stat_code 伺服器響應的HTTP狀態欄位內容
http_stat_message 伺服器響應的HTTP狀態消息內容
http_encode 在HTTP傳輸過程中所使用的編碼類型
url_len url長度
快速匹配模式:
fast_pattern; 如果suricata規則中有多個匹配項目,快速匹配的目的是設置優先順序最高的匹配項,如果設置了快速匹配模式沒有命中則跳過這條規則
flow流匹配:
flow是特定時間內具有相同數據的數據包(5元組信息)同屬於一個流,suricata會將這些流量保存在內存中。
flowbits set , name 設置條件
flowbits isset, name 選擇條件
一旦設置flowbits之後,第一條規則沒有命中那麼第二條規則即使命中了也不會顯示出來,例如一些攻擊行為的響應信息,現在請求中設置條件,然後在響應中選擇條件
to_client/from_server 伺服器到客戶端
to_server/from_client 客戶端到伺服器
established 匹配已經建立連接的(tcp則是經過3次握手之後,udp則是有雙向流量)
no_established 匹配不屬於建立連接的
only_stream 匹配由流引擎重新組裝的數據包
no_stream 不匹配流引擎重新組裝的數據包
閥值 threshold:
threshold: type , track , count , seconds
threshold 最小閥值 也就是說只有匹配到至少多少次數才進行告警
limit 限制告警次數,例如最少5分鐘內告警一次
調節閥值主要是通過2種方法,一種是通過規則內的threshold關鍵字來調節,下圖中類型是limit也就是限制告警次數,track by_src代表來源ip,seconds 60 每個60秒告警一次count 1
另外一種則是通過配置文件/etc/suricata/threshold.config來進行控制,更加推薦這種方法,寫在規則內部每次更新後都會替換掉。
suppress 則是告警排除,排除指定ip產生的規則告警,下圖則表示如果來自217.110.97.128/25如果命中圖中的規則後則不會產生告警,主要用於排除一些掃描ip
3 規則更新管理
suricata規則更新可以使用suricata-update來進行更新
apt install python-pip python-yaml
pip install --pre --upgrade suricata-update 安裝命令
輸入suricata-update 會自動進行規則更新,顯示當前已經更新與啟用了多少規則
通過suricata-udpate可以很好的控制規則,例如要禁用某一個規則,直接新建/etc/suricata/disable.conf 文件,然後在裡面填入sid,每次更新的話會自動禁止該規則
規則更新後,所有的規則都會保存在/var/lib/suricata/rules/suricata.rules這一個文件中,這個時候就必須修改suricata配置文件的default-rule-path與rule-files來指定規則文件到這個規則上
suricata-update list-sources 列出當前的規則源
suricata主要是et/open 規則,這是系統自帶的規則,目前開源免費的就是et/open、pt規則、sslbl規則,其餘的需要授權碼才能更新
ptresearch/attackdetection規則是來自github https://github.com/ptresearch/AttackDetection 的開源規則,裡面包含了近幾年常見cve漏洞的檢測,更新十分及時。
sslbl/ssl-fp-blacklist 列表裡面提供了有關惡意軟體與殭屍網路的ssl證書列表,根據證書特徵來匹配流量中的威脅
通過enable-source ptresearch/attackdetection 來啟用規則
4 手工編寫規則
4.1.檢測windows 回傳信息
wireshark通過打開網上提供的shell.cap文件,通過追蹤流量發現回傳cmd shell信息
這裡以windows的版權信息「2009 Microsoft Corporation」來作為特徵將他們轉換成16進位,由於是發送請求所以添加to_server與established
alert tcp any any -> any any (msg: "Hacker backdoor or shell Microsoft Corporation"; flow:to_server,established; content:"|20 4d 69 63 72 6f 73 6f 66 74 20 43 6f 72 70 6f 72 61 74 69 6f 6e|"; depth:200; sid:3030303; rev:1;)
用suricata測試pcap流量包,成功發現告警注意-l./的意思是在當前位置生成日誌,如果沒有加-l參數則是才配置文件中指定的默認位置追加日誌
4.2. 載入更強大的lua腳本來檢測ssl自簽名
腳本來源:https://github.com/OISF/suricata/pull/1585
suricata可以使用lua腳本來生成告警與事件(在suricata.yaml裡面配置),也可以直接寫在規則裡面用luajit解析lua來進行匹配
將以下文件保存self-signed-cert.lua,如果遇到ssl自簽名就會進行告警。
function init (args)
local needs = {}
needs["tls"] = tostring(true)
return needs
end
function match(args)
version, subject, issuer, fingerprint = TlsGetCertInfo();
if subject == issuer then
--[[selfSigned = string.format("
Issuer: %s
Subject: %s
are the same.
Self Signed Certificate!
",
issuer, subject)
print(string.format("
Issuer: %s
Subject: %s
are the same.
Self Signed Certificate!
",
issuer, subject))]]
return 1
else
return 0
end
--[[str = string.format("
Version %s
Issuer %s
Subject %s
Fingerprint %s",
version, issuer, subject, fingerprint)
SCLogInfo(str);]]
end#
配置文件中加入以下規則
alert tls any any -> any any (msg:"SURICATA TLS Self Signed Certificate"; flow:established; luajit:self-signed-cert.lua; classtype:protocol-command-decode; sid:999666111; rev:1;)
4.3.使用pcre正則來進行匹配
這條規則主要是用來檢測一些挖礦程序與自動化利用腳本,如果系統被利用或者爆破成功後調用curl與wget下載.sh腳本時進行告警
alert http any any -> any any (msg:"***Linux wget/curl download .sh script***"; flow:established,to_server; pcre:"/curl|Wget|linux-gnu/i"; content:".sh"; http_uri; content:"200"; http_stat_code; sid:3000004; rev:1;)
4.4 從流量中提取文件
在suricata.yaml文件裡面開啟文件存儲功能
如果沒有相應的規則文件,即使設置了文件存儲功能也不會提取,需要添加規則文件,規則裡面如果沒有添加fileexe參數的話,filestore會保存所有文件
alert http any any -> any any (msg:"File store all"; flow:established,to_server; content:"POST";http_method; fileext:"php"; filestore; sid:1; rev:1;)
運行後會生成files-json.log、file目錄,file-json.log記錄了http與文件信息
files目錄下則是保存的文件,與meta文件信息
5 規則提取與測試
首先搭建漏洞環境,用poc攻擊時通過wireshark抓包來分析攻擊特徵,然後導出pcap包。
suricata -c /etc/suricata/suricata.yaml -T # -T參數測試規則是否存在問題
編寫規則後,通過suricata -c /etc/suricata/suricata.yaml -r test.pcap -l ./ 該命令會讀取test.pcap包並將結果保存到當前目錄,如果這個時候規則出現錯誤時會提示響應的告警
如果有簽名命中則出現在eve.json與fast.log中
fast.log記錄了流量中匹配到簽名的告警信息,包括時間,五元組信息,告警id,告警信息。此次檢測的是meterpreter 控制流量
eve.json則是記錄了告警信息,flow流信息,協議解析的信息(例如http,dns等),以及攻擊的payload等
suricata不需要重新啟動來載入新的規則
修改rule文件添加新的規則後執行下面命令
ps -ef|grep suricata 查找suricata程序的pid
kill -USR2 1111 通過kill命令發送usr2信號來重新載入suricata規則
find * -name "eve.json*" |xargs -i{} cat {} | jq -c "[.src_ip,.dest_ip,.proto,.alert.signature]" |grep -v null | sed "s/"//g;s/[//;s/]//" | awk -F="," "END" |grep -E "([0-9]*.)[0-9]*" # 使用linux命令分析統計eve.json告警信息,需要安裝jq(linux終端下json格式化輸出的工具)
如果要web展現的話可以使用elk或者Squert,snorby安裝後感覺不是很好用,十分推薦securityonion(安全洋蔥)系統,集成了snort/suricata、bro、elk、ossec以及各種分析工具 https://securityonion.net/
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※滲透基礎——選擇一個合適的C2域名
※CVE-2017-14322 登錄認證繞過分析
TAG:SecPulse安全脈搏 |