天天看點

EnGarde建立Snort規則讓黑客無處遁形

Snort是一個開源的網絡入侵檢測系統,它是一個可以實時監視網絡通信的資料包嗅探器。通過協定分析和内容搜尋與比對,Snort能夠檢測攻擊方法,包括拒絕伺服器攻擊、緩沖區溢出、CGI攻擊、秘密的端口掃描等。Snort的生命力在于其功能強大的規則。

可以認為編寫Snort規則就像編寫程式一樣。Snort規則包括變量、關鍵字和函數。為什麼我們需要編寫規則?其原因是沒有這些規則,Snort将不可能檢測黑客的攻擊行為。本文将讨論編寫規則的問題。

先決條件:

你需要:

1.一台可以進行開發規則的機器。這些規則不應當運作在一台産生性伺服器上,因為這些規則隻能作為你參考的例子。

2.你還需要一台用戶端計算機,并使其與運作Snort的機器相連接配接。

3.安裝有Snort的EnGarde Secure Community 3.0.18(或以上版本)。

文法問題

其文法初看起來可能有點兒奇怪,不過本節将解釋這個問題,這樣您就可以開始編寫自己的規則。Snort規則分為兩個部分:規則的頭部和規則選項。首先,規則頭部包含着規則、動作、協定、源位址和目标位址、源端口、目标端口。第二部分是規則選項,它包含着一個警告消息和某資料包有關部分的資訊(如果要采取某個動作的話,就應當看一些這種資訊)。

例如:alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)

上例中,圓括号之前的部分屬于規則的頭部,圓括号内部的屬于規則選項部分。

規則動作:

規則動作描述一個資料包的“誰,在何處,什麼”的問題,并指明規則被激發後,在事件中應當做什麼。在編寫規則時,你可以從下面的關鍵字中選擇:

·alert –用選擇的警告方法生成一個警告,然後記錄這個資料包。

·log -記錄這個資料包。

·pass – 忽略此資料包。

協定:

規則的下一部分是協定。一些比較流行的協定包括TCP、UDP、ICMP等,不過Snort支援許多其它的協定,并繼續增加新的協定。

源IP位址

緊跟着協定的部分是IP位址。它定義了資料包來自何處。你可以用“any”這個關鍵字來定義所有的IP位址。你甚至可以編寫一個能夠比對除你指定的IP位址之外任何位址的規則。這是通過使用“!”這個否定操作符實作的。

源端口

它說的是資料包來自哪個端口。端口号也可以使用“any”關鍵字。你還可以通過使用“:”定義一個範圍内的端口。例如,1:1000定義了從1到1000範圍内的所有端口。

方向操作符:

方向操作符“->”用于定義規則所适用的通信方向。換句話說,即指明通信進入或出自你計算機的什麼地方。

目标位址

下一部分是目标位址。它定義了資料包要到何方。與源位址類似,你也可以使用“any”關鍵字或定義一個不會引起規則被激發的位址。

目标端口

緊随目标IP位址的部分是目标端口号,即資料包設法連接配接的端口号。這兒的選項與源端口相同。

規則選項

圓括号内的所有内容稱為規則選項。一個比較常用的關鍵字是“content”,不過你還可以用其它許多關鍵字。關鍵字“content”允許使用者設定規則,搜尋資料包有效負荷内的特定内容,并激發一個響應。

例如:

alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh";
 msg: "IMAP buffer overflow!";)
      

通過上例可以看出,我們檢查了資料包是否包含了某種二進制位元組(Binary Byte)碼和文本。

基本格式

動作 協定 源IP位址 源端口 方向 目标位址 目标端口 ( 規則選項)
      

增加一個新規則

既然我們對要Snort規則的文法有了一個基本的了解,現在我們就可以向系統中增加一條新的規則:

首先以根使用者身份登入,并轉換到sysadm_r:

[test_server]# newrole -r sysadm_r
Authenticating root.
Password:
[test_server]# setenforce 0
      

下一步,編輯Snort.conf檔案,需要使用自己喜歡的編輯器來修改/var/chroot/snort/etc/snort.conf。我們需要包括下面的行:

include local.rules
      

這會告訴Snort,要求它使用存儲在local.rules中的新規則。

現在我們可以建立local.rules檔案:  

[test_server]# cd /var/chroot/snort/etc
[test_server]# touch local.rules
      

下一部分比較有趣,因為我們需要編寫規則了。在一個編輯器中打開local.rules,并增加下面的行。注意,這個規則僅是示例,你需要保證不能在一個真實的環境中使用哦:

alert tcp any any -> any 80 (msg: "Sample alert";classtype:misc-attack;
 sid: 2002973; rev:1;)
      

最後,重新啟動Snort,以使新的規則生效

[test_server]# /etc/init.d/snortd restart
      

一個簡單的例子

既然現在我們增加了一條新規則,現在解釋一下這條規則的作用,看一下其具體運用。

我們剛增加的規則是:

alert tcp any any -> any 80 (msg: "示例警告"; classtype:misc-attack;
 sid: 2002973; rev:1;)
      

規則如何工作:

在使用者試圖通路一個Web站點是,就會激發上面的規則。規則被激發後,會打開警告,顯示一個消息。在這裡動作的關鍵字“alert”用所定義的方法生成一個消息,然後記錄這個資料包。我們正檢測的資料包的協定是TCP協定,而且所有的IP位址和端口号已經定義。目标位址在連接配接到端口80的任何IP位址上定義。最後,規則選項的關鍵字“msg”告訴記錄器和警告引擎來顯示消息“示例警告”。

測試

現在你一定對自己的規則是怎樣運作的感興趣。為了看到規則的具體作用,你需要跟蹤Snort的警告日志。

[test_server]# cd /var/chroot/snort/var/log/snort
[test_server]# tail -f alert
      

打開一個Web浏覽器,輸入你的測試伺服器的IP位址。

現在可以檢視一下Snort的警告記錄。你會看到來自Snort的一個消息,這是由我們剛才增加的規則所引起的。

[**] [1:2002973:1] Sample alert [**]
[Classification: Misc Attack] [Priority: 2]
12/12-15:35:22.130162 test_client:35524 -> test_server:80
TCP TTL:64 TOS:0x0 ID:35734 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x5F3B46F0 Ack: 0x85067266 Win: 0xB7 TcpLen: 32
TCP Options (3) => NOP NOP TS: 49925498 1529581
      

檢測有效負荷樣例

将下面的行添加到/var/chroot/snort/etc/local.rules中:

alert tcp any any -> any 80
 (content:"index.pl";sid:12345678;rev:1;classtype:misc-attack;)
 
      

你可以看出,我們編寫了一個規則,用以根據内容“index.pl”檢測任何連接配接到端口80的通信。

注意在Snort的警告日志中,你應當能夠看到一個與下面類似的消息:

[**] [1:2002973:1] Sample alert [**]
[Classification: Misc Attack] [Priority: 2]
12/13-08:13:20.545431 test_client:32950 -> test_server:80
TCP TTL:64 TOS:0x0 ID:11275 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x188A67A3 Ack: 0xF74B200C Win: 0xD8 TcpLen: 32
TCP Options (3) => NOP NOP TS: 64899598 45624
      

這僅僅是個開始

通過你所擁有的知識,現在你就可以開始更深入地研究如何編寫自己的規則。官方的Snort文檔包含着文法的每一個細節。随着你更深入編寫你的Snort規則,你就會注意到以前沒有注意到網絡攻擊者。

繼續閱讀