Snort preprocessor http_inspect

http_inspect

http_inspect是用在使用者應用程式的http解碼器,
指定一個資料緩衝區,http_inspect會在緩衝區內解碼,以取得http的欄位並依標準取得欄位內容
http_inspect運作在用戶端請求與伺服器回應的兩者間

目前http_inspect版本只能處理stateless processing(無狀態行程)
意思就是http_inspect使用封包by封包為基礎的方法尋找http欄位,但是若封包沒被重組就會被欺騙
當有一個模組在負責重組時這運作的很好,但協定分析上是有極限的
在未來的版本將會支援stateful processing(全狀態行程),並整合進各種模組

http_inspect有非常豐富的使用者組態
使用者可透過多樣化的選項設定個別的server,這些選項可以讓使用者模擬各種類型的server
這些選項主要分為兩大類:global及server

………………………………………………………………………………………………………………………………

global configuration


global組態負責處理http_inspect全域功能的組態
ps:You can only have a single global configuration,you’ll get an error if you try otherwise
參數如下
preprocessor http_inspect : global
ex:
preprocessor http_inspect:global
 iis_unicode_map unicode.map 1252

iis_unicode_map < map_filename> [codemap < integer> ]
指定Unicode codepoint map的檔案,該檔案的用途是告訴http_inspect當unicode字元被解碼要使用那一個codepage(字碼頁).預設上是使用snort安裝來源目錄etc內的檔案unicode.map,該檔案屬於Microsoft US Unicode codepoint map.若想自訂snort的unicode maps可使用”ms-unicode-generator.c”
在US server上,codemap通常為1252.
ps:檔案位置可使用snort.conf指定的相對路徑也可使用絕對路
ps:該選項是用在global IIS Unicode map,個別server可指定他們自己的iis unicode map
[detect_anomalous_servers]
啟用該選項可使用通用http伺服器流量檢查非http的port,並在發現流量時警報
若沒在server configuration中指定使用者可存取的所有http server的port,請不要啟用該選項
未來該選項可配合指定的網路會更加有用,但現在他會檢查所有的網路流量
[proxy_alert]
啟用該功能後,偵測到使用proxy時會警報
透過設定http_inspect:server並啟動allow_proxy_use,可針對未知proxy server與rouge proxy的使用做警報
要注意的一點是,若使用者沒被要求設定web proxy則會得到很多proxy警報
所以只能在傳統的proxy環境中使用這功能
ps:Blind firewall proxies don’t count
[max_gzip_mem < num>]
指定使用多少記憶體可用來解壓縮,單位為bytes,可設範圍為3276byte~100mb
這選項會隨著compress_depth和decompress_depth影響gzip session的解壓縮,在任何指定時刻
預設值是838860
[compress_depth < num>]
指定封包payload解壓縮的最大數量,可設範圍為1~20480,預設值是1460
[decompress_depth < num>]
指定從壓縮封包payload取得的解壓縮資料最大數量,可設範圍為1~20480,預設值是2920
ps:
gzip session的設定建議
max gzip session=max gzip mem/(decompress depth + compress depth)
disabled
關閉http_inspect前置處理器
但是當這3個參數”max gzip mem”,”compress depth”,”decompress depth”被設定時還是會有影響,而其他參數被設定時則不被使用

……………………………………………………………………………………………………………………………….

Server Configuration

ps:有yes或no的選項只是決定是否輸出警報,而不是要求http_inspect啟用某些分析做檢查

參數如下
preprocessor http_inspect_server
ex:
preprocessor http_inspect_server:
server { 10.1.1.1 10.2.2.0/24 } profile all ports { 80 }

server < target type>
有兩種類型設定方式
 default,將設定套用在所有server
 by ip,將設定套用在指定的server,可以指定1個或多個
  指定一個ip格式:server < ip>
  指定多個ip格式,以空白分隔:server { network1/cidr ipaddr1 }

profile < all|apache|iis|iis5_0|iis4_0>
使用者可以用之前配置好的profile設定http_inspect,雖然這可以很方便的根據不同類型的server做設定,但這些設定並不見得都是最好的
有5種先前配置好的profile可用,分別為all,apache,iis,iis5_0,iis4_0
 all
 使用常見的技巧normalize(正規化)URI
 對嚴重的逃避型式更會發出警報
 對於偵測所有類型的攻擊而這是一個很好的profile,不論是那種http server
 apache
 用於apache server
 與iis不同的地方在於只允許UTF-8標準Unicode編碼和不同意backslashes(倒斜線)當做合法的斜線
 和iis一樣的地方是都允許tab當做空白
 iis
 可模擬iis server,所以我們可以用iis unicode codemap在每個server上,像是%u encoding,bare-byte encoding,double decoding,backslashes,…等
 iis4_0,iis5_0
 在iis4和iis5有double decoding弱點,這兩個profile和iis是相同的,不同在於,若該url存在double decoding則預設會警報
 Double decode在iis5.1之後的版本都不在支援,所以在預設是關閉
 default
 若profile未指定則使用default
ps:
注意事項
profile必須設定在http_inspect : server之後選項的第一個,而且不可以和其他選項一起使用
但以下option可和profile組合使用
ports
iis unicode map
allow proxy use
server flow depth
client flow depth
post depth
no alerts
inspect uri only
oversize dir length
normalize headers
normalize cookies
max header length
max headers
extended response inspection
enable cookie
inspect gzip
ex:option port可以與profile組合使用
preprocessor http_inspect_server:
server 1.1.1.1 profile all
ports { 80 3128 }

ps:
各profile預設option
port =80[default]
server_flow_depth =300 [all,apache,iis,default]
client_flow_depth =300 [all,apache,iis,default]
post_depth =0 [all,apache,iis,default]
chunk encoding =alert on chunks larger than 500000bytes [all,apache,iis,default]
iis_unicode_map =codepoint map in the global configuration [all,iis]
ascii decoding =on,alert off [all,apache,iis,default]
multiple slash =on,alert off [all,apache,iis,default]
directory normalization =on,alert off [all,apache,iis,default]
apache whitespace =on,alert off [all,default] =on,alert on [apache,iis]
double decoding =on,alert on [all,iis]
%u decoding =on,alert on [all,iis]
bare byte decoding =on,alert on [all,iis]
iis unicode codepoints =on,alert on [all,iis]
iis backslash =on,alert off [all,iis,default]
iis delimiter =on,alert off [all,default] =on,alert on[iis]
webroot =on,alert on [all,apache,iis,default]
utf_8 encoding =on,alert off [apache,default]
non_strict URL parsing =on [all,apache,iis,default]
tab_uri_delimiter =is set [all,apache]
max_header_length =0,header length not checked [all,apache,iis,default]
max_headers =0,number of headers not checked [all,apache,iis,default]

其他參數
ports {< port> [< port> < …>]}
設定用那一個port偵測http server,不過https流量被加密而且所以無法被http_inspect解碼,若要忽略https流量則需使用ssl preprocessor
iis_unicode_map < map filename> codemap < integer>
iis_unicode_map是透過ms_unicode_generator.c程式產生的,該程式被放在http://www.snort.org/dl/contrib/
執行這支程式可為你正在運作的系統產生一份unicode map
所以,若要從iis server得到指定的unicode map,必須在該server上執行這支程式,並在組態檔中使用該unicode map
當使用這選項時,需要指定包含unicode map的檔案,而且也要指定使用該unicode map
在us server,codemap通常是1252,但是ms_unicode_generator程式會指出那一個codemap是server要用的,該程式使用ANSI code page
可以從ms_unicode_generator程式輸出可用的code page中選擇一個正確的
extended_response_inspection
擴大http回應檢查,http_inspect預設是不檢查http回應的各種欄位,啟用該選項後將會徹底檢查
預設的http欄位,像是status code,status message,headers,cookie(當enable_cookie被設定時),body,都會被解開並放入緩衝區
不同的規則選項可用來檢查那些緩衝區
enable_cookie
從http的要求和回應中解析cookie,預設是關閉解析和檢查
inspect_gzip
要求http_inspect從http回應中解壓縮compressed data(gzip/deflate),在啟用該選項前應該要先啟用選項extended_response_inspection
從封包中進行解壓縮時,整個過程會依選項compress_depth和decompress_depth指定的值己達到而結束,而資料解壓縮完也會結束
當壓縮的資料是在多個封包中時,最後一個封包解開的狀態是用來解開下一個封包的資料
但這解開的資料分別被檢查(例如從不同封包中解開的資料在檢查中是不會被結合的)
也就是檢查解開資料的數量將取決於server_flow_depth組態
ps:若要壓縮http server回應,snort在configure時要在加 -enable-zlib
server_flow_depth < integer>
指定檢查server回應payload的數量,該選項顯然會增加IDS效能,因為忽略了網路流量的一大部份(http server response payloads)
snort規則有一小部份針對這些流量,而那些snort規則會因小的flow_depth值而可能導致false negatives
大部份規則的目標若不是http header,那就像是前100個的內容,或非header的bytes
header通常是小於300bytes,但mileage(里程)可能多樣化
integer可設定-1到2920之間
-1表示忽略所有定義在選項port中的server流量
相反的0表示檢查所有定義在選項port中http server payload(這將降低IDS效能)
1以上的值則要求在server回應中檢查第一個封包bytes的量
當inspect_gzip啟用時,建議設定成最大值或是和decompress_depth一樣
ps:server_flow_depth和未來不使用的flow_depth是功能相同的
client_flow_depth < integer>
指定檢查raw client request payload的數量,該選項類似server_flow_depth,預設值為300
它主要消除snort檢查較大的http cookie,這些cookie出現在多個client要求header的結束後
post_depth < integer>
指定檢查client post message的數量,integer可設定0到65495之間,預設值是0
若只檢查post message中指定的bytes可增加效能
ascii < yes|no>
是否解碼或編碼ascii字元,例如%2f=斜線,%2e=點
在url中使用ascii編碼很正常,建議關閉該選項以防http_inspect警報
extended_ascii_uri
在HTTP request URI中支援extended ascii codes,預設是關閉,且沒在任何profile中
utf_8 < yes|no>
是否解碼在uri中的standard UTF-8 Unicode,這尊循unicode標準並只用%編碼,
apache使用這樣的標準,因此在任何apache server都應該要確保該選項是開啟的
至於警報,你可能有興趣知道何時會有UTF8編碼的URI
但是當合法的web client使用這類型的編碼是很容易發生誤報的
當utf_8啟用時,也會啟用ascii解碼以加強正確性
u_encode < yes|no>
該選項模擬IIS %u encoding scheme(編碼體系)
該編碼體系結構為%u< 4char>,這4char是與iis unicode codepoint有關的hex-encoded(16進制編碼)值,這些可以是ascii,像是,%u002f=斜線,%u0041=‘A’
若沒有iis_unicode_map被指定,則使用預設的codemap
建議警報%u編碼,因為任何使用這些編碼的合法客戶端無法察覺到,所以一些嘗試隱蔽的人是最有可能的
ps:因為%u編碼不是標準編碼,所以一般的IDS無法解碼%u,所以能繞過IDS的檢測
bare_byte < yes|no>
bare byte編碼是用在iis的跪計,當在解碼utf8時,它會使用非ascii字元充當合法值
這不是http標準,因為所有非ascii編碼必須用%
bare byte編碼讓使用者模擬一個iis伺服器並正確地解釋非標準編碼
建議開啟該警報,因為沒有合法客戶端用utf8方法編碼,因為他是非標準的
base36 < yes|no>
解碼base36編碼字元,若u_encoding被啟用,該選項不會運作,
啟用該項必須搭配啟用utf_8
當base36啟用後,ascii也會被啟用以加強正確性
iis_unicode < yes|no>
啟用unicode codepoint對映,若在server config中沒有指定iis_unicode_map,則會使用預設的codemap
該選項處理iis可接受的非ascii codepoints對映,並解碼正常utf8要求
該選項應該要啟用,因為主要可發現攻擊和逃避的意圖
該選項啟用後,ascii和utf8編碼也會被啟用以執行正確地解碼,
若utf_8解碼要警報,必須將utf_8設為yes
double_decode < yes|no>
該選項一樣是用在iis上,並模擬iis功能,iis在uri請求會做2次,每次都會做一次解碼
第一次,似乎所有類型的iis編碼己完成:utf-8 unicode,ascii,bare byte,%u
第二次,這些編碼被完成:ascii,bare byte,%u ,
之所以省略utf8的原因是,%u encoded utf-8在第一次被解碼成為unicode byte,然後utf8在第二次被解碼
無論如何,這十分複雜而且增加字元在不同編碼的負擔
當double_decode被啟用,那ascii也會被啟用以增加解碼正確性
non_rfc_char {< byte> [< byte…>]}
若某個非rfc字元被用在uri請求則發出警報,
例如,可設定若出現null byte在uri請求中則警報
使用此選項要小心,因為可以設定警報每個斜線或類似像那些的,它非常彈性所以要注意
multi_slash < yes|no>
將一行中的多個斜線恢復正常,像foo/////bar恢復正常後變成foo/far
當發現多個斜線時要發出警報就設yes
iis_backslash < yes|no>
將反斜線恢復成正常的斜線,這在一次模擬iis
像/foobar恢復正常後變成/foo/bar
directory < yes|no>
該選項將directory traversals和self-referential directories(自我參照目錄)恢復正常
像/foo/fake_dir/../bar恢復正常後變成/foo/bar
像/foo/./bar恢復正常後變成/foo/bar
若發現時警報則設定成yes,警報可能誤判,因為一些網站會使用directory traversals引用檔案
apache_whitespace < yes|no>
該選項處理使用tab當空白分隔的非rfc標準,apache使用這個,所以若網站是apache就啟用
該選項的警報可能很有趣,但也可能都是誤判
iis_delimiter < yes|no>
這是iis專屬的,但apache認為此非標準的分隔符號很好,因為這很普及且常被當做標準,且大部份的網頁伺服器也接受
若發現後仍然要警報則設成yes
chunk_length < non-zero positive integer>
該選項專門偵測異常大的chunk,這是apache chunk編碼弱點,在使用chunk編碼的http通道可能會警報
ps:client可利用chunk的弱點對舊版的apache server做緩沖區溢位攻擊
no_pipeline_req
該選項停用http管線解碼,並在需要時增強效能,預設上,管線要求被用來檢查攻擊
當該選項使用後,管線要求不被解碼也不分析每個http協定欄位,而只是一般特徵比對的檢查
non_strict
該選項啟用不嚴格的URI解析, 讓apache伺服器用破壞的方法解碼
若server允許這樣uri,像是”get /index.html alsjdfk alsj lj aj la jsj sn”,一定要使用該選項,它會將URI定義為”/index.html”
即使沒有合法HTTP識別符號在第二個空白之後,它也假設URI是在第一個和第二個空白之間
allow_proxy_use
此為特殊功能,這允許使用者在server上使用proxy,
若global選項的proxy_alert啟用,那該選項後將不會讓警報產生
若global選項的proxy_alert沒被啟用,那該選項不會做任何事
該選項僅僅只是用於己認證的server而停止未認證的proxy
no_alerts
關閉所有透過http inspect前置處理器所產生的模組,這不會影響在規則集中的http規則,
沒有參數被指定
oversize_dir_length < non-zero positive integer>
該選項使用非零正整數當參數,該參數指定url目錄中最大字元目錄長度,若url目錄大於這參數大小則會產生警報
好的參數值是300個字元,這應該可以限制IDS欺騙攻擊的警報,像是whisker -i 4
inspect_uri_only
這是效能優化,當啟動時,只有http請求的uri部份要檢查是否為攻擊
因為該欄位通常包含90-95%的web攻擊,所以可以捕捉到大部份的攻擊
所以若需要額外的效能就啟用優化,
有一點很重要,若該選項沒有用在任何uricontent規則,那檢查的動作將不會發生
這很明顯,因為uri只在uricontent規則才被檢查,而且假如沒有可以用的那什麼檢查都不會做
例如以下規則
alert tcp any any -> any 80 ( msg:”content”; content: “foo”; )
檢查以下的uri
get /foo.htm http/1.0rnrn
在inspect_uri_only啟用時不會有任何警報產生,該選項除了uricontent檢查外,全部形式的檢查都關閉
max_header_length < positive integer up to 65535>
該選項使用整數當參數,該整數是允許http client請求header欄位的最大長度,若超過則會產生long header警報
該選項預設被關閉,指定參數的1-65535之間的值即可啟動,但若指定0一樣表示關閉該選項
webroot < yes|no>
當directory traversals到web伺服器的根目錄時會產生警報
這產生的誤判比directory選項更少,因為在web伺服器目錄結構中進行directory traversals時它不會警報
它只警報當directory traversals經過web伺服器的根目錄,因為這和某些web攻擊有關
tab_uri_delimiter
該選項啟用URI使用0X09當作tab的識別標誌,apache同意tab當作一個識別標誌,但iis不接受,IIS使用其他字元來代替URI的tab
不管該選項是開或關,若一個空白字元(0x20)在它之前,那tab會被當做是空白空間
不用指定參數
normalize_headers
該選項將HTTP header欄位恢復正常,但不包括cookis(使用像multi-slash,directory,..等uri normalization相同的參數)
對於出現在http header引用的URI恢復正常很有幫助
normalize_cookies
該選項將HTTP cookie欄位恢復正常(使用像multi-slash,directory,..等uri normalization相同的參數)
對於將己編碼的http cookies資料恢復正常很有幫助
max_headers < positive integer up to 1024>
該選項參數為整數,該數值表示http client 請求header欄位的最大值
若一個請求所包含header欄位值大於參數的設定將產生一個max header警報
該警報預設是關閉,只要指定一個1到1024間的整數即可開啟警報,若設為0會被視為關閉警報

…………………………………..

預設組態
preprocessor http_inspect: global iis_unicode_map unicode.map 1252
preprocessor http_inspect_server:
server default
apache_whitespace no
ascii no
bare_byte no
chunk_length 500000
flow_depth 1460
directory no
double_decode no
iis_backslash no
iis_delimiter no
iis_unicode no
multi_slash no
non_strict
oversize_dir_length 500
ports { 80 2301 3128 7777 7779 8000 8008 8028 8080 8180 8888 9999 }
u_encode yes
non_rfc_char { 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 }
webroot no

………………………………………………………………………………………………………………………………

http_inspect alert type

119-1 ASCII ENCODING
Affected Systems:All web servers.
An attacker may try to encode an attack by using the hexadecimal representation of the ascii characters used in an attempt to evade detection by IDS.
False Positives:These encodings can be relatively prevalent in normal web traffic.
119-2 DOUBLE DECODING ATTACK
Affected Systems :Microsoft IIS Servers.
1.This is abnormal behavior and may be an indicator of a possible attack against a vulnerable system.
2.This may also be an attempt to evade an IDS.
3.this may then evade an IDS monitoring traffic and could then launch a successful attack without being detected.
119-3 U ENCODING
Affected Systems :Microsoft IIS Servers.
1.This may indicate an attempt to evade an IDS in an attempted attack against the server.
2.No known browsers use unicode encoding, it is likely that this event indicates a malicious request.
3.this may then evade an IDS monitoring traffic and he could then launch a successful attack without being detected.
ps:preprocessor http_inspect_server: u_encode yes
119-4 BARE BYTE UNICODE ENCODING
Affected Systems :Microsoft IIS Servers.
1.This event may indicate an attack against a web server or at the least an attempt to evade an IDS
2.No web clients encode UTF-8 characters in this way. This is most likely a malicious request.
ps:preprocessor http_inspect_server: bare byte < yes|no>
119-5 BASE36 ENCODING
Affected Systems :Microsoft IIS Servers(Asian)
This may be used in an attempt to obfuscate an attack against a webserver or to evade an IDS.
119-6 UTF-8 ENCODING
Affected Systems:All web servers.
This may indicate an attempt to evade an IDS by obfuscating the request using UTF-8.
False Positives:This may be legitimate behavior. Web clients may use this encoding.
119-7 IIS UNICODE CODEPOINT ENCODING
Affected Systems :Microsoft IIS Servers.
This may be an indicator of an obfuscated attack against a server as well as an attempt to evade an IDS.
The Unicode map for the target servers can be generated for specific servers. Refer to the documentation for http_inspect for instructions.
119-8 MULTI_SLASH ENCODING
Affected Systems:All web servers.
This may be an attempt to obfuscate an attack and may also indicate an attempt to evade an IDS.
119 -9 IIS BACKSLASH EVASION
Affected Systems :Microsoft IIS Servers. Microsoft ASP.NET enabled servers.
1.This may be an attempt to obfuscate an attack or an attempt to evade an IDS.
2.It may also be possible for an attacker to gain access to objects in the Application folder by supplying a direct path to the object in a URI. This would not allow for code execution but may give the attacker access to information on the application that may be used in further attacks.
ps:This event is enabled by using ‘iis_backslash yes’ in the server configuration section of http_inspect.
119-10 SELF DIRECTORY TRAVERSAL
Affected Systems :Microsoft IIS Servers.
This may be an attempt to escape the web root directory or it may be an attempt to evade an IDS.
False Positives:This event may be generated if a web site uses “../” in links to other files on the site.
119-11 DIRECTORY TRAVERSAL
Affected Systems :Microsoft IIS Servers.
This may be an attempt to escape the web root directory or it may be an attempt to evade an IDS.
False Positives:This event may be generated if a web site uses “../” in links to other files on the site.
119-12 APACHE WHITESPACE (TAB)
Affected Systems:Apache web servers
119-13 NON-RFC HTTP DELIMITER
Affected Systems:All web servers.
119-14 NON-RFC DEFINED CHAR
Affected Systems:All web servers.
An attacker may use non-standard characters in a request in an attempt to evade an IDS in the course of an attack against a web server.
preprocessor http_inspect_server: non_rfc_char { 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 }
119-15 OVERSIZE REQUEST-URI DIRECTORY
Affected Systems:All web servers.
1.allows remote attackers to execute arbitrary code via a long URL that triggers the overflow in a URI worker map routine.
2.An attacker may supply an over-long URI in an attempt to evade an IDS or in a possible attack against a web server.
preprocessor http_inspect_server: oversize_dir_length 500
119-16 OVERSIZE CHUNK ENCODING
Affected Systems:Apache web servers
This may be an indicator of an attack against a web server.
preprocessor http_inspect_server: chunk_length 500000
119-17 UNAUTHORIZED PROXY USE DETECTED
Affected Systems:All client systems.
An attacker may use non-standard characters in a request in an attempt to evade an IDS in the course of an attack against a web server.
119-18 WEBROOT DIRECTORY TRAVERSAL
Affected Systems:All web servers.
An attacker may employ a directory traversal technique to escape the root directory of a web server in an attempt to access protected system files.
ps:
120-1 ANOMALOUS HTTP SERVER ON UNDEFINED HTTP PORT
the http_inspect pre-processor detects the presence of a web server running on a non-defined port.
Web server ports are defined in snort.conf as the variable $HTTP_PORTS and also in the section for http_inspect. When a server is accessed on a port not defined in snort.conf the presence of web traffic generates an event. This may indicate the presence of an unauthorized web server.
Affected Systems:All web servers.
A web server may be used to transfer files from inside the protected network to unauthorized recipients on the outside.

更多資訊請參考http://www.snort.org/search/sid/119-1到18 

資料來源參考http://www.snort.org/docs