Suricata是一款免費開源的網絡威脅檢測工具。主要用於實時入侵檢測(IDS),嵌入式入侵防禦(IPS)和網絡安全監控(NSM)等。因工作需要,我也準備來盤一下,準備部署檢測一下工控這塊的流量,同時也添加一些工控規則來提高檢測效率。

Suricata介紹:

雖然Suricata作爲一款免費開源的安全工具,但是它得到了衆多企業的認可,很多都在部署和使用它。這代表Suricata是成熟的,功能完善,實用性強的安全工具。Suricata是一款高性能網絡入侵檢測防禦引擎。該引擎基於多線程,充分利用多核優勢。它支持多種協議,如:ip4、ipv6、tcp、udp、http、smtp、pop3、imap、ftp等。可動態加載預設規則,支持多種文件格式統計數據輸出,如pcap、json、unified2等,非常便於與Barnyard2等工具集成。

suricata所有版本: https://openinfosecfoundation.org/download/

Suricata架構:

有三種運行模式,分別爲single,workers,autofp。官方推薦性能最佳的運行模式爲workers模式。

single模式:只有一個包處理線程,一般在開發模式下使用。

workers模式:多個包處理線程,每個線程包含完整的處理邏輯。

autofp模式:有多個包捕獲線程,多個包處理線程。一般適用於nfqueue場景,從多個queue中消費流量來處理。

報文檢測系統通常包含四大部分,報文獲取、報文解碼、報文檢測、日誌記錄;Suricata不同的功能安裝模塊劃分,一個模塊的輸出是另一個模塊的輸入,Suricata通過線程將模塊串聯起來,如下圖所示:

Suricata部署

安裝步驟,以Ubuntu1804版本爲例,可以使用官方的PPA進行安裝:

sudo add-apt-repository ppa:oisf/suricata-stable 
sudo apt update 
sudo apt install suricata jq

1、更新規則:

suricata-update

2、測試suricata正常運行:

suricata -T

3、啓動運行:

suricata -i ens33 -c /etc/suricata/suricata.yaml

配置解讀:

cd 到suricata配置文件目錄: cd /etc/suricata/, 我們會查看到如下4個配置文件 classification.config/reference.config/suricata.yaml/threshold.config 和一個rules文件夾。

suricata.yaml:是Suricata默認的配置文件,以硬編碼的形式寫在源代碼中,裏面定義了幾乎關於Suricata的所有運行內容,包括運行模式、抓包的數量和大小、簽名和規則的屬性和日誌告警輸出等等。

classification.config:定義了各種流量攻擊類型和優先級,類似拒絕服務攻擊和web應用攻擊等,如下圖所示:

reference.config:記錄一些安全網站,漏洞平臺的網址,或者是自己可以自定義的url,是參考的意思,用來聯繫外部的惡意攻擊檢測網站中關於此類攻擊的頁面。

threshold.config:threshold(閾值)關鍵字可用於控制規則的警報頻率,可用於在規則生成警報之前爲其設置最小閾值.

rules文件夾:存放不同種類的規則,規則用來判定流量攻擊類型,並定義攻擊類型和告警種類,可以存放自帶的規則,也可以自己按規則語法編寫,如下圖所示:

規則詳解:

接下來我們主要講Suricata的規則,這是檢測工具的靈魂,同樣的產品,別人的好用,攔截率準確率高,誤報率低,那就是人家規則寫得好。Suricata的規則書寫參考snort規則(suricata完全兼容snort規則),下面我就來簡單介紹下規則的每段含義,因爲主要是講工控規則,所以我取一條工控規則來說,規則如下:

alert modbus any any -> any any (msg:"SURICATA Modbus Request flood detected"; flow:to_server;app-layer-event:modbus.flooded; classtype:protocol-command-decode; sid:2250009; rev:2;)

alert: 默認順序爲:pass,drop,reject,alert 跳過、丟棄、拒絕、警告 四種類型的動作

Modbus:註明協議種類,UDP/ICMP等

Any:源地址/目的地址(IP)

Any:源端口/目的端口

->:方向,單向流量;<>雙向流量

Any:源地址/目的地址(IP)

Any:源端口/目的端口

msg:”SURICATA Modbus Request flood detected”: 關鍵字msg提供對觸發警報的有關簽名/規則相關文本提示信息

flow:to_server:客戶端到服務器

app-layer-event:modbus.flooded:具體攻擊內容

classtype:protocol-command-decode:提供有關規則和警報分類的信息,由classification.config文件定義。

sid:2250009:用於唯一性規則標識,sid不能重複

rev:2:規則版本號,每次修改規則rev則遞增1

工控規則編寫:

Suricata現在主要是et/open  規則,這是系統自帶的規則,目前開源免費的就是et/open、pt規則、sslbl規則,其餘的需要授權碼才能更新。推薦給大家一個補充規則的鏈接, https://github.com/ptresearch/AttackDetection 的開源規則,裏面包含了近幾年常見cve漏洞的檢測,大家可以酌情使用。

其實自己規則編寫也不難,上面介紹了規則每部分的含義,最好寫的是包含content的規則,例如我們知道modbus的停啓功能碼是40,41,我們可以在規則裏編寫content: “|00 00 00 00 33 41 ff 00|”來匹配;如果是應用層的流量攻擊,就可以寫成 app-layer-event:dnp3.flooded/app-layer-event:modbus.invalid_length等。一般在工控規則中,最常見的應用層的檢測和對功能碼的檢測,截取關鍵的功能碼配合偏移位置(offset)和結束位置來匹配(depth),如下圖所示:

我參考了之前大佬寫的Suricata(Snort)工控方面的規則,如下圖所示,這是關於西門子S7的規則,主要用來檢測關於Nmap通過掃描102端口開啓來尋找PLC的流量:

裏面還包含了對現有modbus、enip和dnp3規則補充,建議有興趣的朋友可以去看下:

鏈接奉上: https://github.com/digitalbond/Quickdraw-Snort

模擬流量攻擊:

分析和編寫了Suricata的規則,下面就進行實際的流量測試,不過在測試之前,對suricata.yaml 配置文件還要做小小的修改,因爲我是對Modbus PLC設備進行攻擊的時候抓取流量包,然後保存下來放到Suricata裏面回放,所以要將下圖中的pcap-file改成yes:

雖然規則裏包含了Modbus的規則,但是默認是不開啓的,所以我們在suricata.yaml裏面找到Modbus這塊,改成yes:

接着我通過修改抓取到Modbus PLC之間的通信的Session id,然後帶上Session id對數據包進行長度和非法字符串的修改,再通過python腳本發送給PLC,同時用wireshark來抓取,以此來獲取我們需要的數據包。我把數據包放入服務器中後,通過執行suricata  -r  modbus.pcap,對數據包進行回放,然後導出json格式的日誌進行查看,如下圖所示,顯示alert並且顯示唯一的SID號,可以去rules裏面找到對應命中的是哪條規則:

下圖是suricata操作的一些命令,有需要的朋友可以看一下:

總結:

Suricata其實包含的功能十分豐富,因篇幅有限,我只驗證解釋了關於Suricata工控方面的使用,Suricata支持內嵌lua腳本,以實現自定義檢測和輸出腳本,支持常見數據包解碼,支持常見應用層協議解碼,支持分析離線pcap文件和pcap文件方式存儲流量數據,這些好用的功能都需要大家一點點去摸索和拓展使用。

Suricata規則這一塊,是需要大家一點點去積累完善的,通過平時蒐集的威脅情報,結合自己系統的生產環境,以及定期關注新爆出的安全漏洞等,自己慢慢去增加豐富規則,來使我們的安全世界更加堅固!

*本文作者:黃一113530,轉載請註明來自FreeBuf.COM

相關文章