當前位置:
首頁 > 最新 > Suricata IDS 入門-規則詳解

Suricata IDS 入門-規則詳解

安全脈搏SecPulse.Com獨家發文,如需轉載,請先聯繫授權。

suricata是一款開源高性能的入侵檢測系統,並支持ips(入侵防禦)與nsm(網路安全監控)模式,用來替代原有的snort入侵檢測系統,完全兼容snort規則語法和支持lua腳本。


配置文件位置:/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}

更多參考官網文檔: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


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.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文件信息


首先搭建漏洞環境,用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/


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 SecPulse安全脈搏 的精彩文章:

滲透基礎——選擇一個合適的C2域名
CVE-2017-14322 登錄認證繞過分析

TAG:SecPulse安全脈搏 |