Snort 中文手冊


摘要

snort有三種工作模式:嗅探器、數據包記錄器、網絡入侵檢測系統。嗅探器模式僅僅是從網絡上讀取數據包並作爲連續不斷的流顯示在終端上。數據包記錄器模式把數據包記錄到硬盤上。網路入侵檢測模式是最複雜的,而且是可配置的。我們可以讓snort分析網絡數據流以匹配用戶定義的一些規則,並根據檢測結果採取一定的動作。(2003-12-11 16:39:12)


Snort 用戶手冊

 

第一章 snort簡介

    snort有三種工作模式:嗅探器、數據包記錄器、網絡入侵檢測系統。嗅探器模式僅僅是從網絡上讀取數據包並作爲連續不斷的流顯示在終端上。數據包記錄器模式把數據包記錄到硬盤上。網路入侵檢測模式是最複雜的,而且是可配置的。我們可以讓snort分析網絡數據流以匹配用戶定義的一些規則,並根據檢測結果採取一定的動作。

嗅探器

    所謂的嗅探器模式就是snort從網絡上讀出數據包然後顯示在你的控制檯上。首先,我們從最基本的用法入手。如果你只要把TCP/IP包頭信息打印在屏幕上,只需要輸入下面的命令:

  ./snort -v

    使用這個命令將使snort只輸出IP和TCP/UDP/ICMP的包頭信息。如果你要看到應用層的數據,可以使用:

      ./snort -vd

    這條命令使snort在輸出包頭信息的同時顯示包的數據信息。如果你還要顯示數據鏈路層的信息,就使用下面的命令:

  ./snort -vde

    注意這些選項開關還可以分開寫或者任意結合在一塊。例如:下面的命令就和上面最後的一條命令等價:

  ./snort -d -v –e

數據包記錄器

    如果要把所有的包記錄到硬盤上,你需要指定一個日誌目錄,snort就會自動記錄數據包:

      ./snort -dev -l ./log

    當然,./log目錄必須存在,否則snort就會報告錯誤信息並退出。當snort在這種模式下運行,它會記錄所有看到的包將其放到一個目錄中,這個目錄以數據包目的主機的IP地址命名,例如:192.168.10.1

  如果你只指定了-l命令開關,而沒有設置目錄名,snort有時會使用遠程主機的IP地址作爲目錄,有時會使用本地主機IP地址作爲目錄名。爲了只對本地網絡進行日誌,你需要給出本地網絡:

  ./snort -dev -l ./log -h 192.168.1.0/24

    這個命令告訴snort把進入C類網絡192.168.1的所有包的數據鏈路、TCP/IP以及應用層的數據記錄到目錄./log中。

    如果你的網絡速度很快,或者你想使日誌更加緊湊以便以後的分析,那麼應該使用二進制的日誌文件格式。所謂的二進制日誌文件格式就是tcpdump程序使用的格式。使用下面的命令可以把所有的包記錄到一個單一的二進制文件中:

  ./snort -l ./log -b

    注意此處的命令行和上面的有很大的不同。我們勿需指定本地網絡,因爲所有的東西都被記錄到一個單一的文件。你也不必冗餘模式或者使用-d、-e功能選項,因爲數據包中的所有內容都會被記錄到日誌文件中。

    你可以使用任何支持tcpdump二進制格式的嗅探器程序從這個文件中讀出數據包,例如: tcpdump或者Ethereal。使用-r功能開關,也能使snort讀出包的數據。snort在所有運行模式下都能夠處理tcpdump格式的文件。例如:如果你想在嗅探器模式下把一個tcpdump格式的二進制文件中的包打印到屏幕上,可以輸入下面的命令:

      ./snort -dv -r packet.log

    在日誌包和入侵檢測模式下,通過BPF(BSD Packet Filter)接口,你可以使用許多方式維護日誌文件中的數據。例如,你只想從日誌文件中提取ICMP包,只需要輸入下面的命令行:

      ./snort -dvr packet.log icmp

網絡入侵檢測系統

    snort最重要的用途還是作爲網絡入侵檢測系統(NIDS),使用下面命令行可以啓動這種模式:

      ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

    snort.conf是規則集文件。snort會對每個包和規則集進行匹配,發現這樣的包就採取相應的行動。如果你不指定輸出目錄,snort就輸出到/var/log/snort目錄。

    注意:如果你想長期使用snort作爲自己的入侵檢測系統,最好不要使用-v選項。因爲使用這個選項,使snort向屏幕上輸出一些信息,會大大降低snort的處理速度,從而在向顯示器輸出的過程中丟棄一些包。

    此外,在絕大多數情況下,也沒有必要記錄數據鏈路層的包頭,所以-e選項也可以不用:

      ./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

    這是使用snort作爲網絡入侵檢測系統最基本的形式,日誌符合規則的包,以ASCII形式保存在有層次的目錄結構中。

網絡入侵檢測模式下的輸出選項

    在NIDS模式下,有很多的方式來配置snort的輸出。在默認情況下,snort以ASCII格式記錄日誌,使用full報警機制。如果使用full報警機制,snort會在包頭之後打印報警消息。如果你不需

要日誌包,可以使用-N選項。

    snort有6種報警機制:full、fast、socket、syslog、smb(winpopup)和none。其中有4個可以在命令行狀態下使用-A選項設置。這4個是:

  • -A fast:報警信息包括:一個時間戳(timestamp)、報警消息、源/目的IP地址和端口。
    -A full:是默認的報警模式。
    -A unsock:把報警發送到一個UNIX套接字,需要有一個程序進行監聽,這樣可以實現實時報警。
    -A none:關閉報警機制。

    使用-s選項可以使snort把報警消息發送到syslog,默認的設備是LOG_AUTHPRIV和LOG_ALERT。可以修改snort.conf文件修改其配置。

    snort還可以使用SMB報警機制,通過SAMBA把報警消息發送到Windows主機。爲了使用這個報警機制,在運行./configure腳本時,必須使用--enable-smbalerts選項。
下面是一些輸出配置的例子:

    使用默認的日誌方式(以解碼的ASCII格式)並且把報警發給syslog:

    ./snort -c snort.conf -l ./log -s -h 192.168.1.0/24

    使用二進制日誌格式和SMB報警機制:  

./snort -c snort.conf -b -M WORKSTATIONS

第二章 編寫snort 規則

基礎

    snort使用一種簡單的,輕量級的規則描述語言,這種語言靈活而強大。在開發snort規則時要記住幾個簡單的原則。

    第一,大多數snort規則都寫在一個單行上,或者在多行之間的行尾用/分隔。Snort規則被分成兩個邏輯部分:規則頭和規則選項。規則頭包含規則的動作,協議,源和目標ip地址與網絡掩碼,以及源和目標端口信息;規則選項部分包含報警消息內容和要檢查的包的具體部分。
下面是一個規則範例:

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

    第一個括號前的部分是規則頭(rule header),包含的括號內的部分是規則選項(rule options)。規則選項部分中冒號前的單詞稱爲選項關鍵字(option keywords)。注意,不是所有規則都必須包含規則選項部分,選項部分只是爲了使對要收集或報警,或丟棄的包的定義更加嚴格。組成一個規則的所有元素對於指定的要採取的行動都必須是真的。當多個元素放在一起時,可以認爲它們組成了一個邏輯與(AND)語句。同時,snort規則庫文件中的不同規則可以認爲組成了一個大的邏輯或(OR)語句。

規則高級概念

Includes:


include允許由命令行指定的規則文件包含其他的規則文件。

格式:

include:

注意在該行結尾處沒有分號。被包含的文件會把任何預先定義的變量值替換爲自己的變量引用。參見變量(Variables)一節以獲取關於在SNORT規則文件中定義和使用變量的更多信息。

Variables :

變量可能在snort中定義。

格式:

var:

例子:

var MY_NET 192.168.1.0/24
alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)

規則變量名可以用多種方法修改。可以在"$"操作符之後定義變量。"?" 和 "-"可用於變量修改操作符。

$var - 定義變量。
$(var) - 用變量"var"的值替換。
$(var:-default) - 用變量"var"的值替換,如果"var"沒有定義用"default"替換。
$(var:?message) - 用變量"var"的值替換或打印出錯誤消息"message"然後退出。

例子:

var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23

Config

Snort的很多配置和命令行選項都可以在配置文件中設置。

格式:

config [: ]

Directives

  • order 改變規則的順序( snort -o )
  • alertfile 設置報警輸出文件,例如:config alertfile: alerts
  • classification 創建規則分類。
  • decode_arp 開啓arp解碼功能。(snort -a)
  • dump_chars_only 開啓字符傾卸功能。(snort -C)
  • dump_payload 傾卸應用層數據。(snort -d)
  • decode_data_link 解碼第二層數據包頭。(snort -e)
  • bpf_file 指定BPF過濾器(snort -F)。例如:config bpf_file: filename.bpf
  • set_gid 改變GID (snort -g)。例如:config set_gid: snort_group
  • daemon 以後臺進程運行。(snort -D)
  • reference_net 設置本地網絡。 (snort -h). 例如:config reference_net:192.168.1.0/24
  • interface 設置網絡接口(snort –i )。例如:config interface: xl0
  • alert_with_interface_name 報警時附加上接口信息。(snort -I)
  • logdir 設置記錄目錄 (snort -l)。例如:config logdir: /var/log/snort
  • umask 設置snort輸出文件的權限位。(snort -m). Example: config umask: 022
  • pkt_count 處理n個數據包後就退出。(snort -n). Example: config pkt_count: 13
  • nolog 關閉記錄功能,報警仍然有效。 (snort -N)
  • obfuscate 使IP地址混亂 (snort -O)
  • no_promisc 關閉混雜模式。(snort -p)
  • quiet 安靜模式,不顯示標誌和狀態報告。(snort -q)
  • checksum_mode 計算校驗和的協議類型。類型值:none, noip, notcp, noicmp, noudp, all
  • utc 在時間戳上用UTC時間代替本地時間。 (snort -U)
  • verbose 將詳細記錄信息打印到標準輸出。 (snort -v)
  • dump_payload_verbose 傾卸數據鏈路層的原始數據包 ( snort -X )
  • show_year 在時間戳上顯示年份。(snort -y)
  • stateful 爲stream4設置保證模式。
  • min_ttl 設置一個snort內部的ttl值以忽略所有的流量。
  • disable_decode_alerts 關閉解碼時發出的報警。
  • disable_tcpopt_experimental_alerts 關閉tcp實驗選項所發出的報警。
  • disable_tcpopt_obsolete_alerts關閉tcp過時選項所發出的報警。
  • disable_tcpopt_ttcp_alerts 關閉ttcp選項所發出的報警。
  • disable_tcpopt_alerts 關閉選項長度確認報警。
  • disable_ipopt_alerts 關閉IP選項長度確認報警。
  • detection 配置檢測引擎。( 例如:search-method lowmem )
  • reference 給snort加入一個新的參考系統。

規則頭

規則動作:

規則的頭包含了定義一個包的who,where和what信息,以及當滿足規則定義的所有屬性的包出現時要採取的行動。規則的第一項是"規則動作"(rule action),"規則動作"告訴snort在發現匹配規則的包時要幹什麼。在snort中有五種動作:alert、log、pass、activate和dynamic.

1、Alert-使用選擇的報警方法生成一個警報,然後記錄(log)這個包。
2、Log-記錄這個包。
3、Pass-丟棄(忽略)這個包。
4、activate-報警並且激活另一條dynamic規則。
5、dynamic-保持空閒直到被一條activate規則激活,被激活後就作爲一條log規則執行。
你可以定義你自己的規則類型並且附加一條或者更多的輸出模塊給它,然後你就可以使用這些規則類型作爲snort規則的一個動作。

下面這個例子創建一條規則,記錄到tcpdump。

ruletype suspicious
{
type log output
log_tcpdump: suspicious.log
}
??搠?敧?捯浵???o??< 下面這個例子創建一條規則,記錄到系統日誌和MySQL數據庫
ruletype redalert
{
type alert output
alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname=snort host=localhost
}

協議


規則的下一部分是協議。Snort當前分析可疑包的ip協議有四種:tcp 、udp、icmp和ip。將來可能會更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。

Ip地址

規則頭的下一個部分處理一個給定規則的ip地址和端口號信息。關鍵字"any"可以被用來定義任何地址。Snort沒有提供根據ip地址查詢域名的機制。地址就是由直接的數字型ip地址和一個cidr塊組成的。Cidr塊指示作用在規則地址和需要檢查的進入的任何包的網絡掩碼。/24表示c類網絡, /16表示b類網絡,/32表示一個特定的機器的地址。例如,192.168.1.0/24代表從192.168.1.1到192.168.1.255的地址塊。在這個地址範圍的任何地址都匹配使用這個192.168.1.0/24標誌的規則。這種記法給我們提供了一個很好的方法來表示一個很大的地址空間。

有一個操作符可以應用在ip地址上,它是否定運算符(negation operator)。這個操作符告訴snort匹配除了列出的ip地址以外的所有ip地址。否定操作符用"!"表示。下面這條規則對任何來自本地網絡以外的流都進行報警。

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

這個規則的ip地址代表"任何源ip地址不是來自內部網絡而目標地址是內部網絡的tcp包"。
你也可以指定ip地址列表,一個ip地址列表由逗號分割的ip地址和CIDR塊組成,並且要放在方括號內“[”,“]”。此時,ip列表可以不包含空格在ip地址之間。下面是一個包含ip地址列表的規則的例子。

alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)

端口號

端口號可以用幾種方法表示,包括"any"端口、靜態端口定義、範圍、以及通過否定操作符。"any"端口是一個通配符,表示任何端口。靜態端口定義表示一個單個端口號,例如111表示portmapper,23表示telnet,80表示http等等。端口範圍用範圍操作符":"表示。範圍操作符可以有數種使用方法,如下所示:

log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何端口的,目標端口範圍在1到1024的udp流

log tcp any any -> 192.168.1.0/24 :6000
記錄來自任何端口,目標端口小於等於6000的tcp流

log tcp any :1024 -> 192.168.1.0/24 500:
記錄來自任何小於等於1024的特權端口,目標端口大於等於500的tcp流


端口否定操作符用"!"表示。它可以用於任何規則類型(除了any,這表示沒有,呵呵)。例如,由於某個古怪的原因你需要記錄除x windows端口以外的所有一切,你可以使用類似下面的規則:

log tcp any any -> 192.168.1.0/24 !6000:6010

方向操作符

方向操作符"->"表示規則所施加的流的方向。方向操作符左邊的ip地址和端口號被認爲是流來自的源主機,方向操作符右邊的ip地址和端口信息是目標主機,還有一個雙向操作符"<>"。它告訴snort把地址/端口號對既作爲源,又作爲目標來考慮。這對於記錄/分析雙向對話很方便,例如telnet或者pop3會話。用來記錄一個telnet會話的兩側的流的範例如下:

log !192.168.1.0/24 any <> 192.168.1.0/24 23

Activate 和 dynamic 規則:

注:Activate 和 dynamic 規則將被tagging 所代替。在snort的將來版本,Activate 和 dynamic 規則將完全被功能增強的tagging所代替。

Activate 和 dynamic 規則對給了snort更強大的能力。你現在可以用一條規則來激活另一條規則,當這條規則適用於一些數據包時。在一些情況下這是非常有用的,例如你想設置一條規則:當一條規則結束後來完成記錄。Activate規則除了包含一個選擇域:activates外就和一條alert規則一樣。Dynamic規則除了包含一個不同的選擇域:activated_by 外就和log規則一樣,dynamic規則還包含一個count域。

Actevate規則除了類似一條alert規則外,當一個特定的網絡事件發生時還能告訴snort加載一條規則。Dynamic規則和log規則類似,但它是當一個activate規則發生後被動態加載的。把他們放在一起如下圖所示:

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;)

規則選項

規則選項組成了snort入侵檢測引擎的核心,既易用又強大還靈活。所有的snort規則選項用分號";"隔開。規則選項關鍵字和它們的參數用冒號":"分開。按照這種寫法,snort中有42個規則選項關鍵字。

msg - 在報警和包日誌中打印一個消息。
logto - 把包記錄到用戶指定的文件中而不是記錄到標準輸出。
ttl - 檢查ip頭的ttl的值。
tos 檢查IP頭中TOS字段的值。
id - 檢查ip頭的分片id值。
ipoption 查看IP選項字段的特定編碼。
fragbits 檢查IP頭的分段位。
dsize - 檢查包的淨荷尺寸的值 。
flags -檢查tcp flags的值。
seq - 檢查tcp順序號的值。
ack - 檢查tcp應答(acknowledgement)的值。
window 測試TCP窗口域的特殊值。
itype - 檢查icmp type的值。
icode - 檢查icmp code的值。
icmp_id - 檢查ICMP ECHO ID的值。
icmp_seq - 檢查ICMP ECHO 順序號的值。
content - 在包的淨荷中搜索指定的樣式。
content-list 在數據包載荷中搜索一個模式集合。
offset - content選項的修飾符,設定開始搜索的位置 。
depth - content選項的修飾符,設定搜索的最大深度。
nocase - 指定對content字符串大小寫不敏感。
session - 記錄指定會話的應用層信息的內容。
rpc - 監視特定應用/進程調用的RPC服務。
resp - 主動反應(切斷連接等)。
react - 響應動作(阻塞web站點)。
reference - 外部攻擊參考ids。
sid - snort規則id。
rev - 規則版本號。
classtype - 規則類別標識。
priority - 規則優先級標識號。
uricontent - 在數據包的URI部分搜索一個內容。
tag - 規則的高級記錄行爲。
ip_proto - IP頭的協議字段值。
sameip - 判定源IP和目的IP是否相等。
stateless - 忽略劉狀態的有效性。
regex - 通配符模式匹配。
??搠?敧?捯浵???o??< distance - 強迫關係模式匹配所跳過的距離。
within - 強迫關係模式匹配所在的範圍。
byte_test - 數字模式匹配。
byte_jump - 數字模式測試和偏移量調整。

msg

msg規則選項告訴記錄和報警引擎,記錄或報警一個包的內容的同時打印的消息。它是一個簡單的文本字符串,轉義符是""。
格式:
msg: "";

logto

logto選項告訴snort把觸發該規則的所有的包記錄到一個指定的輸出日誌文件中。這在把來自諸如nmap活動,http cgi掃描等等的數據組合到一起時很方便。需要指出的是當snort工作在二進制記錄模式下時這個選項不起作用。
格式:
logto:"filename";

ttl

這個規則選項用於設置一個要檢查的存活期的值。只有確切地匹配時它所進行的檢查才成功。這個選項關鍵字用於檢測traceroute。
格式:
ttl:;

TOS

tos關鍵字允許你驗證IP頭中TOS字段爲一個特殊的值。只有匹配時才執行成功。
格式:
tos: ;

id

這個選項關鍵字用於檢測ip頭的分片id的值。有些黑客工具(以及別的程序)爲了各種目的設置這個域的值,例如一些黑客常使用31337。用一個簡單的規則檢查這個值就可以對付他們。
格式:
id: ;

Ipoption

如果數據包中使用了IP選項,Ipoption選項會查找使用中的某個特別IP選項,比如源路由。這個選項的合法參數如下:

rr - Record route(記錄路由)
eol - End of list (列表結尾)
nop - No op (無所作爲)
ts - Time Stamp (時間戳)
sec - IP security option (IP安全選項)
lsrr - Loose source routing (鬆散源路由)
ssrr - Strict source routing (嚴格源路由)
satid - Stream identifier (流標示符)

鬆散和嚴格源路由是IP選項中最經常被檢查的內容,但是它們並沒有被用在任何廣泛使用的Internet應用中。每一個特定的規則只能用這個選項一次。

格式:

ipoption: option;

Fragbits

這條規則檢測IP頭中的分段和保留位字段的值,共有三個位能被檢測,保留位RB(Reserved Bit ), 更多分段位MF(More Fragments ), 和不分段位DF(Don’t Fragment)。這些位可以結合在一起來檢測。使用下面的值來代表這些位,R-RB,M-MF,D-DF。你也可以使用修飾語對特殊的位來指出合理的匹配標準:* + 所有標記匹配特殊位外加任何其他*;*-任何標記匹配如果任何位被設置爲*;!如果指定位沒有設置就沒有標記匹配。

格式:
fragbits: ;

例子:
alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: "Rerserved bit set!";)

dsize

dsize選項用於檢查包的淨荷的大小。它可以設置成任意值,可以使用大於/小於符號來指定範圍。例如,如果你知道某個特定的服務有一個特定大小的緩衝區,你可以設定這個選項來監視緩衝區溢出的企圖。它在檢查緩衝區溢出時比檢查淨荷內容的方法要快得多。

格式:
dsize: [<>][<>];
說明:“> <”號是可選的。

content

content 關鍵字是snort中比較重要的一個。它允許用戶設置規則在包的淨荷中搜索指定的內容並根據內容觸發響應。當進行content選項模式匹配時, Boyer-Moore模式匹配函數被調用,並且對包的內容進行檢查(很花費計算能力)。如果包的淨荷中包含的數據確切地匹配了參數的內容,這個檢查成功並且該規則選項的其他部分被執行。注意這個檢查是大小寫敏感的。

Content關鍵字的選項數據比較複雜;它可以包含混合的文本和二進制數據。二進制數據一般包含在管道符號中("|"),表示爲字節碼(bytecode)。字節碼把二進制數據表示爲16進制數字,是描述複雜二進制數據的好方法。下面是包含了一個混合數據的snort規則範例。

格式:
content: [!] "";

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

注:多內容的規則可以放在一條規則中,還有(: ; / “)不能出現在content規則中。如果一條規則前面有一個“!”。那麼那些不包含這些內容的數據包將觸發報警。這對於關注那些不包含一定內容的數據包是有用的。

offset

offset規則選項被用作使用content規則選項關鍵字的規則的修飾符。這個關鍵字修飾符指定模式匹配函數從包淨荷開始處開始搜索的偏移量。它對於cgi掃描檢測規則很有用,cgi掃描的內容搜索字符串不會在淨荷的前4個字節中出現。小心不要把這個偏移量設置的太嚴格了,會有可能漏掉攻擊!這個規則選項關鍵字必須和content規則選項一起使用。

格式:
offset: ;

depth

depth也是一個content規則選項修飾符。它設置了內容模式匹配函數從他搜索的區域的起始位置搜索的最大深度。它對於限制模式匹配函數超出搜索區域指定範圍而造成無效搜索很有用。(也就是說,如果你在一個web包中搜索"cgi-bin/phf",你可能不需要浪費時間搜索超過淨荷的頭20 個字節)。

格式:
depth: ;

例子:
alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3; depth: 22; msg: "CGI-PHF access";)

nocase

nocase選項用於取消content規則中的大小寫敏感性。它在規則中指定後,任何與包淨荷進行比較的ascii字符都被既作爲大寫又作爲小寫對待。

格式:
nocase;

例子:
alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; nocase; msg: "FTP root user access attempt";)

flags

這個規則檢查tcp標誌。在snort中有9個標誌變量:

F - FIN (LSB in TCP Flags byte)
S - SYN
R - RST
P - PSH
A - ACK
U - URG
2 - Reserved bit 2
1 - Reserved bit 1 (MSB in TCP Flags byte)
0 - No TCP Flags Set
在這些標誌之間還可以使用邏輯操作符:
+ ALL flag, 匹配所有的指定的標誌外加一個標誌。
* ANY flag, 匹配指定的任何一個標誌。
! NOT flag, 如果指定的標誌不在這個數據包中就匹配成功。
保留位可以用來檢測不正常行爲,例如IP棧指紋攻擊或者其他可疑的行爲。

格式:
flags: [,mask value];

例子:
alert any any -> 192.168.1.0/24 any (flags: SF,12; msg: "Possible SYN FIN scan";)

seq

這個規則選項引用tcp順序號(sequence number)。基本上,它探測一個包是否有一個靜態的順序號集,因此很少用。它是爲了完整性而包含進來的。

格式:
seq: ;

ack

ack規則選項關鍵字引用tcp頭的確認(acknowledge)部分。這個規則的一個實用的目的是:檢查nmap tcp ping,nmap tcp ping把這個域設置爲0,然後發送一個tcp ack flag置位的包來確定一個網絡主機是否活着。

格式:
ack: ;

例子:
alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";)

Window

這條規則選項指向TCP窗口大小。這個選項檢查靜態窗口大小,此外別無他用。包括它只是爲了完整性。

格式:
window:[!];

Itype
這條規則測試ICMP的type字段的值。它被設置爲使用這個字段的數字值。要得到所有可能取值的列表,可以參見Snort包中自帶的decode.h文件,任何ICMP的參考資料中也可以得到。應該注意的是,type字段的取值可以超過正常範圍,這樣可以檢查用於拒絕服務或flooding攻擊的非法 type值的ICMP包。

格式:
itype: ;
 

Icode

Icode規則選項關鍵字和itype規則非常接近,在這裏指定一個數值,Snort會探測使用該值作爲code值的ICMP包。超出正常範圍的數值可用於探測可疑的流量。

格式:
icode: ;

Session

Session關鍵字用於從TCP會話中抽取用戶數據。要檢查用戶在telnet,rlogin,ftp或web sessions中的用戶輸入,這個規則選項特別有用。Session規則選項有兩個可用的關鍵字作爲參數:printable或all。 Printable關鍵字僅僅打印用戶可以理解或者可以鍵入的數據。All關鍵字使用16進制值來表示不可打印的字符。該功能會顯著地降低Snort的性能,所以不能用於重負載環境。它適合於對二進制(tcpdump格式)log文件進行事後處理。

格式:
session: [printable|all];

例子
log tcp any any <> 192.168.1.0/24 23 (session: printable;)

Icmp_id

Icmp_id選項檢查ICMP ECHO數據包中ICMP ID數值是否是指定值。許多祕密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用於增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。

格式:
icmp_id: ;

Icmp_seq

Icmp_seq選項檢查ICMP ECHO數據包中ICMP sequence字段數值是否是指定值。許多祕密通道(covert channel)程序使用靜態ICMP字段通訊,所以該選項在檢查這種流量時非常有用。這個特別的插件用於增強由Max Vision編寫的stacheldraht探測規則,但是在探測一些潛在攻擊時確實有效。(我知道該字段的信息和icmp_id的描述幾乎完全相同,實際上它們就是同樣的東西!)

格式:
icmp_seq: ;

Rpc

這個選項查看RPC請求,並自動將應用(Application)、過程(procedure)和程序版本(program version)譯碼,如果所有三個值都匹配的話,該規則就顯示成功。這個選項的格式爲"應用、過程、版本"。在過程和版本域中可以使用通配符"*"。

格式:
rpc: ;

例子
alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (TCP)";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport (UDP)";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:"RPC ttdb";)

??搠?敧?捯浵???o??<

Resp

Resp關鍵字可以對匹配一條Snort規則的流量進行靈活的反應(flexible reponse -FlexResp)。FlexResp代碼允許Snort主動地關閉惡意的連接。該插件合法的參數如下:
rst_snd - 向發送方發送TCP-RST數據包
rst_rcv - 向接受方發送TCP-RST數據包
rst_all - 向收發雙方發送TCP_RST數據包
icmp_net - 向發送方發送ICMP_NET_UNREACH
icmp_host - 向發送方發送ICMP_HOST_UNREACH
icmp_port - 向發送方發送ICMP_PORT_UNREACH
icmp_all - 向發送方發送上述所有的ICMP數據包
在向目標主機發送多種響應數據包時,這些選項組合使用。多個參數之間使用逗號分隔。

格式:
resp:

使用resp選項時要小心,因爲很容易就會使snort陷入無限循環中,例如如下規則:
alert tcp any any -> 192.168.1.1/24 any (msg: "aiee!"; resp: rst_all;)

content_list

content_list 關鍵字允許多內容字符串被放在一個單獨的內容匹配選項中,被匹配的字符串被存放在指定的文件中,而且每個字符串要單獨佔用一行。否則他們就等同於一個content字符串。這個選項是react關鍵字的基礎。

格式;
content-list: ;

下面是一個文件的內容:
# adult sites
"porn"
"porn"
"adults"
"hard core"
"www.pornsite.com"

React

注意,使用這個功能很容易使網絡流量陷入迴路。React關鍵字以匹配一個規則時所作出的靈活的反應爲基礎。基本的反應是阻塞一些引人注意的站點的用戶的訪問。響應代碼允許snort積極的關掉有冒犯行爲的訪問和/或發送一個通知給瀏覽者。這個通知可以包含你自己的註釋。這個選項包括如下的基本修飾詞:

block——關閉連接並且發送一個通知
warm——發送明顯的警告信息
基本修飾詞可以和如下的附加修飾詞組合使用:
msg——把msg選項的內容包含進阻塞通知信息中
proxy——使用代理端口發送通知信息
大量的附加修飾詞由逗號隔開,react 關鍵字將被放在選項的最後一項。

格式:
react: ;

例子:
alert tcp any any <> 192.168.1.0/24 80 (content: "bad.htm"; msg: "Not for children!"; react: block, msg;)

reference

這個關鍵字允許規則包含一個外面的攻擊識別系統。這個插件目前支持幾種特定的系統,它和支持唯一的URL一樣好。這些插件被輸出插件用來提供一個關於產生報警的額外信息的連接。
確信先看一看如下地方:
http://www.snort.org/snort-db

格式:
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; )

Sid

這個關鍵字被用來識別snort規則的唯一性。這個信息允許輸出插件很容易的識別規則的ID號。
sid 的範圍是如下分配的:

<100 保留做將來使用
100-1000,000 包含在snort發佈包中
>1000,000 作爲本地規則使用
文件sid-msg.map 包含一個從msg標籤到snort規則ID的映射。這將被post-processing 輸出模塊用來映射一個ID到一個報警信息。

格式:
sid: ;

rev

這個關鍵字是被用來識別規則修改的。修改,隨同snort規則ID,允許簽名和描述被較新的信息替換。

格式:
rev:

Classtype

這個關鍵字把報警分成不同的攻擊類。通過使用這個關鍵字和使用優先級,用戶可以指定規則類中每個類型所具有的優先級。具有classification的規則有一個缺省的優先級。

格式:
classtype:

在文件classification.config中定義規則類。這個配置文件使用如下的語法:
config classification: ,

Priority

這個關鍵字給每條規則賦予一個優先級。一個classtype規則具有一個缺省的優先級,但這個優先級是可以被一條priority規則重載的。

格式:
priority: ;

Uricontent
這個關鍵字允許只在一個請求的URI(URL)部分進行搜索匹配。它允許一條規則只搜索請求部分的攻擊,這樣將避免服務數據流的錯誤報警。關於這個關鍵字的參數的描述可以參考content關鍵字部分。這個選項將和HTTP解析器一起工作。(只能搜索第一個“/”後面的內容)。

格式:
uricontent:[!];

Tag

這個關鍵字允許規則記錄不僅僅是觸發這條規則的那個數據包。一旦一條規則被觸發,來自這個主機的數據包將被貼上“標籤”。被貼上標籤的數據流將被記錄用於隨後的響應代碼和提交攻擊流量的分析。

格式:
tag: , , , [direction]

type

session 記錄觸發這條規則的會話的數據包
host 記錄激活tag規則的主機的所有數據包(這裏將使用[direction]修飾詞
count Count 指定一個單位的數量。這個單位由給出。
metric
packets 標記主機/會話的個數據包。
seconds 標記主機/會話的秒。

例子:
alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: "|e8 c0ff ffff|/bin/sh"; tag: host, 300, packets, src; msg: "IMAP Buffer overflow, tagging!";)
alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: "incoming telnet session";)

Ip_proto
Ip_proto關鍵字允許檢測IP協議頭。這些協議可以是由名字標識的,參考/etc/protocols文件。在規則中要謹慎使用ip_protocol關鍵字。

格式:
ip_proto:[!] ;

例子: br> alert ip !$HOME_NET any -> $HOME_NET any (msg: "IGMP traffic detected"; ip_proto: igmp;)

SameIP

Sameip關鍵字允許規則檢測源IP和目的IP是否相等。

格式:
sameip;

例子:
alert ip $HOME_NET any -> $HOME_NET any (msg: "SRC IP == DST IP"; sameip;)

Regex
這個模塊現在還正在開發,所以在當前的產品規則集中還不能使用。如果使用的話,它將觸發一個錯誤信息。

Flow

這個選項要和TCP流重建聯合使用。它允許規則只應用到流量流的某個方向上。這將允許規則只應用到客戶端或者服務器端。這將能把內網客戶端流覽web頁面的數據包和內網服務器所發送的數據包區分開來。這個確定的關鍵字能夠代替標誌:A+ 這個標誌在顯示已建立的TCP連接時都將被使用。

選項:
to_client 觸發服務器上從A到B的響應。
to_server 觸發客戶端上從A到B的請求。
from_client 觸發客戶端上從A到B的請求。
from_server觸發服務器上從A到B的響應。
established 只觸發已經建立的TCP連接。
stateless 不管流處理器的狀態都觸發(這對處理那些能引起機器崩潰的數據包很有用。
no_stream 不在重建的流數據包上觸發(對dsize 和 stream4 有用。
only_stream 只在重建的流數據包上觸發。

格式:
flow:[to_client|to_server|from_client|from_server|established|stateless|no_stream|only_stream]}

例子:
alert tcp !$HOME_NET any -> $HOME_NET 21 (flow: from_client; content: "CWD incoming"; nocase; msg: "cd incoming detected"; )
alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: "Port 0 TCP traffic"; flow: stateless;)

Fragoffset

這個關鍵字允許把IP分段偏移值和一個十進制數相比較。爲了抓到一個IP會話的第一個分段,你可以使用這個fragbits關鍵字並且和fragoffset:0 選項一起查看更多的分段選項。

格式:
fragoffset:[<|>]

例子:
alert ip any any -> any any (msg: "First Fragment"; fragbits: M; fragoffset: 0;)

Rawbytes

Rawbytes關鍵字允許規則查看telnet 解碼數據來處理不常見的數據。這將使得telnet 協議代碼獨立於預處理程序來檢測。這是對前面的content 的一個修飾。

格式:
rawbytes;

例子:
alert tcp any any -> any any (msg: "Telnet NOP"; content: "|FF F1|"; rawbytes;)

distance

distance關鍵字是content關鍵字的一個修飾詞,確信在使用content時模式匹配間至少有N個字節存在。它被設計成在規則選項中和其他選項聯合使用。

格式:
distance: ;

例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; distance: 1;)

Within

Winthin關鍵字是content關鍵字的一個修飾詞,確保在使用content時模式匹配間至多有N個字節存在。它被設計成在規則選項中和distance選項聯合使用。

格式:
within: ;

例子:
alert tcp any any -> any any (content: "2 Patterns"; content: "ABCDE"; content: "EFGH"; within: 10;)

Byte_Test

測試一個字節的域爲特定的值。能夠測試二進制值或者把字節字符串轉換成二進制後再測試。

格式:byte_test: , , , [[relative],[big],[little],[string],[hex],[dec],[oct]]
bytes_to_convert 從數據包取得的字節數。
operator 對檢測執行的操作 (<,>,=,!)。
value 和轉換後的值相測試的值。
offset 開始處理的字節在負載中的偏移量。
relative 使用一個相對於上次模式匹配的相對的偏移量。
big 以網絡字節順序處理數據(缺省)。
little 以主機字節順序處理數據。
string 數據包中的數據以字符串形式存儲。
hex 把字符串數據轉換成十六進制數形式。
dec 把字符串數據轉換成十進制數形式。
oct 把字符串數據轉換成八進制數形式。

例子:
alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4,>, 1000, 20, relative;)

alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"AMD procedure 7 plog overflow "; content: "|00 04 93 F3|"; content: "|00 00 00 07|"; distance: 4; within: 4; byte_test: 4, >,1000, 20, relative;)

Byte_Jump

Byte_jump 選項用來取得一定數量的字節,並把它們轉換成數字形式,跳過一些字節以進一步進行模式匹配。這就允許相對模式匹配在網絡數據中進行數字值匹配。

格式:
byte_jump: , [[relative],[big],[little],[string],[hex],[dec],[oct],[align]]

bytes_to_convert 從數據包中選出的字節數。
offset 開始處理的字節在負載中的偏移量。
relative 使用一個相對於上次模式匹配的相對的偏移量。
big 以網絡字節順序處理數據(缺省)。
little 以主機字節順序處理數據。
string 數據包中的數據以字符串形式存儲。
hex 把字符串數據轉換成十六進制數形式。
dec 把字符串數據轉換成十進制數形式。
oct 把字符串數據轉換成八進制數形式。
align 以32位爲邊界對轉換的字節數對齊,即轉換的字節數爲4的倍數。

例子:
alert udp any any -> any 32770:34000 (content: "|00 01 86 B8|"; content: "|00 00 00 01|"; distance: 4; within: 4; byte_jump: 4, 12, relative, align; byte_test: 4, >, 900, 20, relative; msg: "statd format string buffer overflow";)

第三章 預處理程序

    預處理程序從Snort版本1.5開始引入,使得Snort的功能可以很容易地擴展,用戶和程序員能夠將模塊化的插件方便地融入Snort之中。預處理程序代碼在探測引擎被調用之前運行,但在數據包譯碼之後。通過這個機制,數據包可以通過額外的方法被修改或分析。使用preprocessor關鍵字加載和配置預處理程序。在Snort規則文件中的preprocessor指令格式如下:

preprocessor :

例子:
preprocessor minfrag: 128

HTTP Decode

HTTP Decode用於處理HTTP URI字符串並且將串中的數據轉化爲可讀的ASCII字串。HTTP對於一些特性定義了一個十六進制編碼方法,例如字符串%20被解釋成一個空格。Web服務器被設計成能夠處理無數的客戶端並且支持多種不同的標準。

格式:
http_decode: [unicode] [iis_alt_unicode][double_encode] [iis_flip_slash] [full_whitespace]

例子:
preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode

Portscan Detector

Snort Portscan預處理程序的用處:
向標準記錄設備中記錄從一個源IP地址來的端口掃描的開始和結束。如果指定了一個記錄文件,在記錄掃描類型的同時也記錄目的IP地址和端口。端口掃描定義爲在時間T(秒)之內向超過P個端口進行TCP連接嘗試,或者在時間T(秒)之內向超過P個端口發送UDP數據包。端口掃描可以是對任一IP 地址的多個端口,也可以是對多個IP地址的同一端口進行。現在這個版本可以處理一對一和一對多方式的端口掃描,下一個完全版本將可以處理分佈式的端口掃描(多對一或多對多)。端口掃描也包括單一的祕密掃描(stealth scan)數據包,比如NULL,FIN,SYNFIN,XMAS等。如果包括祕密掃描的話,端口掃描模塊會對每一個掃描數據包告警。爲避免這種情況,可以在Snort標準發行版中的scan-lib文件裏把有關祕密掃描數據包的小節註釋掉,這樣對每次掃描就只記錄一次。如果使用外部記錄特性,可以在記錄文件中看到(端口掃描的?)技術和類型。該模塊的參數如下:

  • network to monitor - 監視端口掃描的目標網絡以network/CIDR表示。
  • number of ports - 在探測期間訪問的端口數目。
  • detection period - 以秒計數的端口訪問時間限制。
  • logdir/filename - 告警信息存放的目錄/文件名,告警也可以寫入標準的告警文件中。

格式:
portscan:

例子:
preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log

Portscan Ignorehosts

如果用戶的服務器(比如NTP,NFS和DNS服務器)會妨礙端口掃描的探測,可以通知portscan模塊忽略源自這些主機的TCP SYN和UDP端口掃描。該模塊的參數爲IPs/CIDR的列表。

格式:
portscan-ignorehosts:

例子:
preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24

Frag2

Frag2是一個新的IP碎片重組預處理器。Frag2的內存使用和碎片時間超時選項是可配置的。不給出參數,frag2將使用缺省的內存量(4MB)和時間超時值(60秒)。這個時間值用來決定一個沒有重組的分段將被丟棄的時間長度。

格式
preprocessor frag2: [memcap ], [timeout ], [min_ttl ], [detect_state_problems??搠?敧?捯浵???o??<], [ttl_limit ]

timeout 在狀態表中保存一個不活躍的流的最大時間值,如果發現活動就重新刷新對話並且這個會話被自動拾起。缺省值是30秒。

memcap 內存消耗的最大值,如果超出這個值,frag2就強制削減那些不活躍的會話,缺省值是4MB。detect_state_problems turns on alerts for events such as overlapping fragments
min_ttl 設置frag2接受的最小ttl值。

detect_state_problems 發現重疊分段時報警。

ttl_limit 設置ttl的極限值,它可以避免報警。 (初始化段 TTL +/- TTL Limit)

例子:
preprocessor frag2: memcap 16777216, timeout 30

Stream4

Stream4模塊使snort 具有 TCP流從新組裝和狀態分析能力。強壯的流重組能力使得snort能夠忽視無“狀態”攻擊,例如,stick粘滯位攻擊。Stream4也能夠給大量用戶提供超過256個TCP同步連接。Stream4缺省配置時能夠處理32768個TCP同步連接。Stream4有兩個可配置的模塊,stream4 preprocessor 和相關的 stream4_reassemble 插件。stream4_reassemble有如下選項

Stream4 格式:

preprocessor stream4: [noinspect], keepstats [machine|binary], [timeout ], [memcap ], [detect_scans], [detect_state_problems], [disable_evasion_alerts], [ttl_limit ]

noinspect 關閉狀態監測能力。

keepstats [machine|binary] 保持會話統計,如果是“machine”選項就從機器以平坦的模式讀入,如果是“binary”選項就用統一的二進制模式輸出。

timeout 在狀態表中保存一個不活躍的流的最大時間值,如果發現活動就重新刷新對話並且這個會話被自動拾起。缺省值是30秒。

memcap 內存消耗的最大值,如果超出這個值,frag2就強制削減那些不活躍的會話,缺省值是8MB。

detect_scans 打開portscan 的報警能力。

detect_state_problems 打開流事件報警能力,例如,沒有RST的數據包、帶有數據的SYN包和超出窗口序列號的包。

disable_evasion_alerts 關閉事件報警能力,例如,TCP重疊。

ttl_limit 設置ttl的極限值。

Stream4_Reassemble 格式:
preprocessor stream4_reassemble: [clientonly], [serveronly],[noalerts], [ports ]
clientonly 對一個連接的客戶端提供重組
serveronly 對一個連接的服務器端提供重組
noalerts 對於插入和逃避攻擊事件不發出報警
ports - 一個空格分隔的執行重組的端口列表,all將對所有的端口進行重組。缺省對如下端口重組: 21 23 25 53 80 110 111 143 和 513

注: 在配置文件中僅僅設置stream4和stream4_reassemble 命令而沒有參數,它們將會使用缺省的參數配置。Stream4引入了一個新的命令行參數:-z 。在TCP流量中,如果指定了 –z 參數,snort將只對那些通過三次握手建立的流以及那些協作的雙向活動的流(即,一些流量走一個方向而其他一些除了一個RST或FIN外走相反方向)檢測報警。當設置了-z 選項後snort就完全忽略基於TCP的stick/snot攻擊。

Conversation

Conversation 預處理器使Snort 能夠得到關於協議的基本的會話狀態而不僅僅是由spp_stream4處理的TCP狀態。

目前它使用和stream4相同的內存保護機制,所以它能保護自己免受DOS攻擊。當它接收到一個你的網絡不允許的協議的數據包時,它也能產生一個報警信息。要做到這一點,請在IP協議列表中設置你允許的IP協議,並且當它收到一個不允許的數據包時,它將報警並記錄這個數據包。

格式:
preprocessor conversation: [allowed_ip_protocols ], [timeout ], [alert_odd_protocols], [max_conversations ]

Portscan2

這個模塊將檢測端口掃描。它要求包含Conversation預處理器以便判定一個會話是什麼時間開始的。它的目的是能夠檢測快速掃描,例如,快速的nmap掃描。

格式:
preprocessor portscan2: [scanners_max ], [targets_max ], [target_limit ], [port_limit ], [timeout ]

  • scaners_max 一次所支持的掃描一個網絡的主機數
  • targets_max 分配代表主機的節點的最大數
  • target_limit 在一個掃描觸發前,一個掃描器所允許掃描的最大的主機數
  • port_limit 在一個掃描觸發前,一個掃描器所允許掃描的最大的端口數
  • timeout 一個掃描行爲被忘記的秒數

Telnet Decode
telnet_decode 預處理器使snort能夠標準化telnet會話數據的控制協議字符。它把數據包規格和成單獨的數據緩存,這樣原始數據就能夠通過rawbytes content 修飾詞來記錄或者檢驗了。缺省情況下,它運行在21, 23, 25, 和119端口.

格式:
preprocessor telnet_decode:

RPC Decode

Rpc_decode 預處理器將RPC的多個碎片記錄組合成一個完整的記錄。它是通過將數據包放在標準緩存中來做到這一點的。如果打開stream4預處理器功能。它將只處理客戶端的流量。它缺省運行在 111和 32771端口。

格式:
preprocessor rpc_decode: [ alert_fragments ] [no_alert_multiple_requests] [no_alert_large_fragments] [no_alert_incomplete]

Perf Monitor

這個模塊是用來評估snort各方面性能的一個工具。它的輸出格式和參數格式都是變化的,在這裏就不給出註釋了。

Http Flow

使用這個模塊可以忽略HTTP頭後面的HTTP服務響應。

第四章 輸出插件

    輸出插件使得Snort在向用戶提供格式化輸出時更加靈活。輸出插件在Snort的告警和記錄子系統被調用時運行,在預處理程序和探測引擎之後。規則文件中指令的格式非常類似於預處理程序。

    注意:如果在運行時指定了命令行的輸出開關,在Snort規則文件中指定的輸出插件會被替代。例如,如果在規則文件中指定了alert_syslog插件,但在命令行中使用了"-A fast"選項,則alert_syslog插件會被禁用而使用命令行開關。多個輸出插件是在snort的配置文件中指定的。當指定多個輸出插件時,它們被壓入棧並且在事件發生時按順序調用。關於標準的記錄和報警系統,輸出模塊缺省把數據發送到 /var/log/snort.或者通過使用-l命令行參數輸出到一個用戶指定的目錄。在規則文件中通過指定output關鍵字,使得在運行時加載輸出模塊。

格式:
output :

例子:
output alert_syslog: LOG_AUTH LOG_ALERT

Alert_syslog

該插件向syslog設備發送告警(很像命令行中的-s開關)。該插件也允許用戶指定記錄設備,優先於Snort規則文件中的設定,從而在記錄告警方面給用戶更大的靈活性。
可用關鍵字:

選項(Options)
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
設備(Facilities)
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL2
LOG_LOCAL3
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
LOG_USER
優先級(Priorities)
LOG_EMERG
LOG_ALERT
LOG_CRIT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
格式:
alert_syslog:

Alert_fast
將報警信息快速的打印在指定文件的一行裏。它是一種快速的報警方法,因爲不需要打印數據包頭的所有信息。

格式:
alert_fast:

例子:
output alert_fast: alert.fast

Alert_full

打印數據包頭所有信息的報警。這些報警信息寫到缺省的日誌目錄(/var/log/snort)或者寫到命令行指定的目錄。在日誌目錄內,每個IP 都創建一個目錄。產生報警的數據包被解碼後寫到這個目錄下的文件裏。這些文件的創建將大大降低snort的性能。所以這種輸出方法對大多數不適用,但那些輕量級的網絡環境還是可以使用的。

格式:
alert_full:

例子:
output alert_full: alert.full

Alert_smb

這個插件將把WinPopup報警信息發送給NETBIOS命名的機器上的一個文件。並不鼓勵使用這個插件,因爲它以snort權限執行了一個外部可執行二進制程序,通常是root權限。那個工作站上接受報警信息的文件每行存放一條報警信息。

格式:
alert_smb:

例子;
output alert_smb: workstation.list

Alert_unixsock

打開一個UNIX套接字,並且把報警信息發送到那裏。外部的程序/進程會在這個套接字上偵聽並實時接收這些報警數據。

格式:
alert_unixsock
例子:
output alert_unixsock

Log_tcpdump

log_tcpdump插件將數據包記錄到tcpdump格式的文件中。這便於使用已有的多種檢查tcpdump格式文件的工具,來對收集到的流量數據進行後處理工作。該插件只接受一個參數,即輸出文件名

格式:
log_tcpdump:

例子:
output log_tcpdump: snort.log

database

該插件由Jed Pickel提供將Snort數據記錄到Postgres SQL數據庫中。更多的有關安裝和配置該插件的信息可以在Incident.org (http://www.incident.org/snortdb)找到。這個插件的參數是數據庫名稱和一個參數列表。參數由格式parameter = argument來指定。可用參數如下:

host - 連接主機。如果指定了一個非零字串,就使用TCP/IP通訊。如果不指定主機名,就會使用Unix domain socket連接。
port - 連接服務器主機的端口號,或者是Unix-domain連接的socket文件名擴展。
dbname - 數據庫名。
user – 數據庫中身份認證用的用戶名。
password - 如果數據庫要求口令認證,就使用這個口令。
sensor_name 爲snort指定一個你自己的名字。如果你不指定,這裏就自動產生一個。
encoding 因爲數據包負載和選項都是二進制的,所以沒有一個輕便簡單的方法把它存儲在數據庫中。沒有使用BLOBS,因爲它們在穿越數據庫時不是那麼輕便的。所以,我們提供了一個encoding 選項給你。你可以從下面的選項中選擇。它們有各自的優缺點。
hex (default) 把二進制數據表示成十六進制字符串
storage requirements – 二進制的二倍容量
searchability – 很好用
human readability – 不是很好讀除非你很滑稽,要求郵件處理。
base64 把二進制數據表示成以64爲基的字符串。
storage requirements二進制的1.3倍容量。
searchability – 沒有郵件處理是不可能的。
human readability –不易讀,要求郵件處理。
ascii 把二進制數據表示成 ascii 碼字符串。這是唯一的可以釋放數據的選項。非ascii碼數據用… 代替。即使你選擇了這個選項,ip和tcp選項數據還將用十六進制表示,因爲那些數據用ascii碼標上沒有任何意義。
storage requirements – 稍微比二進制大,因爲避免了一些字符(&,<,>)。
searchability – 對於搜索文本字符串很好用,而搜索二進制串是不可能的。
human readability – 很好用。
detail 你想存儲多少細節數據,有如下選項:
full (缺省值)記錄一個引起報警數據包的所有的細節(包括ip/tcp選項和負載)。
fast 只記錄少量數據。如果選擇了這個選項,你將削減了潛在的分析能力,但這仍是一些應用的最佳選項。這將記錄下面的字段(timestamp, signature, source ip, destination ip, source port, destination port, tcp flags, and protocol)
此外,還必須定義一個記錄方法和數據庫類型。有兩種記錄方法,log和alert。設置爲log類型,將啓動這個程序的數據庫記錄功能。如果你設置爲log類型,輸出鏈表將調用這個插件。設置爲alert類型,將啓動這個程序的數據庫報警輸出功能。
當前共有四種數據庫類型:MySQL, PostgreSQL, Oracle, 和 unixODBC-兼容數據庫。

格式:
output database: log, mysql, dbname=snort user=snort host=localhost password=xyz

CSV

CSV輸出插件可以將報警數據以一種方便的形式輸出到一個數據庫。這個插件要求兩個參數,一個全路徑文件名和輸出模式選項。下面是模式選項列表。如果模式選項缺省,就按模式選項列表中的順序輸出。

timestamp
msg
proto
src
srcport
dst
dstport
ethsrc
ethdst
ethlen
tcpflags
tcpseq
tcpack
tcplen
tcpwindow
ttl
tos
id
dgmlen
iplen
icmptype
icmpcode
icmpid
icmpseq

格式:
output alert_CSV:

例子:
output alert_CSV: /var/log/alert.csv default
output alert_CSV: /var/log/alert.csv timestamp, msg

Unified

Unified輸出插件被設計成儘可能快的事件記錄方法。它記錄一個事件到一個報警文件和一個數據包到一個日誌文件。報警文件包含一個事件的主要信息(ips, protocol, port, message id)。日誌文件包含數據包信息的細節(一個數據包考貝及相關的事件ID)。

這兩個文件都是以spo_unified.h文件中描述的二進制形式寫的。以unix秒爲單位的時間將附加到每個文件的後面寫出。

格式
output alert_unified:
output log_unified:

例子:
??搠?敧?捯浵???o??< output alert_unified: snort.alert
output log_unified: snort.log

Log Null

有時創建這樣的規則是必要的,即在某些情況下能夠發出報警而不記錄數據包。當使用log_null插件時就相當於命令行的-N選項,但這個插件可以工作在一個規則類型上。

格式:
output log_null

ruletype info {
type alert
output alert_fast: info.alert
output log_null
}
 

自己動手編寫好的規則

當編寫snort規則時,首先考慮的是效率和速度。

好的規則要包含content選項。2.0版本以後,snort改變了檢測引擎的工作方式,在第一階段就作一個集合模式匹配。一個content選項越長,這個匹配就越精確。如果一條規則不包含content選項,它們將使整個系統慢下來。

當編寫規則時,儘量要把目標定位在攻擊的地方(例如,將目標定位在1025的偏移量等等)而不僅僅是泛泛的指定(如,在這匹配腳本代碼)。 Content規則是大小寫敏感的(除非你使用了nocase選項)。不要忘記content是大小寫敏感的和大多數程序的命令都是大寫字母。FTP就是一個很好的例子。考慮如下的規則:

alert tcp any any -> 192.168.1.0/24 21 (content: "user root"; msg: "FTP root login";)
alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; msg: "FTP root login";)

上面的第二條規則能檢測出大多數的自動以root登陸的嘗試,而第一條規則就不行。Internet 守護進程在接受輸入時是很隨便的。在編寫規則時,很好的理解協議規範將降低錯過攻擊的機會。
 

加速含有內容選項的規則

探測引擎運用規則的順序和它們在規則中的書寫順序無關。內容規則選項總是最後一個被檢驗。利用這個事實,應該先運用別的快速規則選項,由這些選項決定是否需要檢查數據包的內容。例如:在TCP會話建立起來後,從客戶端發來的數據包,PSH和ACK這兩個TCP標誌總是被置位的。如果想檢驗從客戶端到服務器的有效載荷,利用這個事實,就可以先進行一次TCP標誌檢驗,這比模式匹配算法(pattern match algorithm)在計算上節約許多。使用內容選項的規則要加速的一個簡便方法就是也進行一次標誌檢驗。基本思想是,如果PSH和ACK標誌沒有置位,就不需要對數據包的有效載荷進行檢驗。如果這些標誌置位,檢驗標誌而帶來的計算能力消耗是可以忽略不計的。

alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; flags: PA; msg: "CGI-PHF probe";)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章