文章目錄
1 sfPortscan 預處理器簡介
由 Sourcefire 開發的 sfPortscan 模塊,旨在檢測網絡攻擊的第一階段:偵察(Reconnaissance)。在偵察階段,攻擊者確定主機支持何種類型的網絡協議或服務。這個階段是攻擊主機事先不知道目標所支持的協議或服務的情況下,否則,這個階段就沒有必要了。
由於攻擊者事先並不知道它的預定目標,因此攻擊者發送的大多數查詢將是拒絕(negative)的(意味着服務端口被關閉)。在合法的網絡通信中,來自主機的拒絕響應是很少見的,而且在給定的時間內出現多次拒絕響應的情況更少見。我們檢測端口掃描的主要目的是檢測和跟蹤這些拒絕響應。
目前使用的最常見的端口掃描工具之一是 Nmap。Nmap 包含許多當前的端口掃描技術。sfPortscan 被設計爲能夠檢測 Nmap 產生的不同類型的掃描。
2 sfPortscan 預處理器支持的端口掃描類型
2.1 Portscan
sfPortscan 當前會對以下類型的 Nmap 掃描發出警告:
- TCP Portscan
- UDP Portscan
- IP Portscan
這些警報是針對一對一端口掃描,這是傳統類型的掃描,一臺主機掃描另一臺主機上的多個端口。
大多數請求都是被拒絕的,因爲大多數主機提供的服務相對較少,意味着開放的端口較少。
2.2 Decoy Portscan
sfPortscan 亦會對下列類型的誘騙(decoy)端口掃描進行報警:
- TCP Decoy Portscan
- UDP Decoy Portscan
- IP Decoy Portscan
誘騙端口掃描與上面描述的 Nmap 端口掃描非常相似,只是攻擊者擁有一個混合了真實掃描地址的欺騙源地址。這種策略有助於隱藏攻擊者的真實身份。
2.3 Distributed Portscan
sfPortscan 也可以針對下列類型的分佈式端口掃描發出警報:
- TCP Distributed Portscan
- UDP Distributed Portscan
- IP Distributed Portscan
這是多對一端口掃描。當多個主機查詢一個主機以獲取打開的服務時,就會發生分佈式端口掃描。這是用來逃避 IDS 及混淆命令和控制主機。
注意: 拒絕查詢將分佈在掃描主機之間,因此我們通過被掃描主機跟蹤這種類型的掃描。
2.4 Portsweep
sfPortscan 也可以針對以下類型的 Portsweep 發出警報:
- TCP Portsweep
- UDP Portsweep
- IP Portsweep
- ICMP Portsweep
這些警報是針對一對多端口掃描。一臺主機掃描多臺主機上的一個端口。這通常發生在出現新漏洞並且攻擊者正在尋找特定服務時。
注意: portsweep 掃描的特性可能不會導致許多拒絕響應。例如,如果攻擊者對端口80進行端口掃描,我們很可能不會看到很多拒絕響應。
2.5 Filtered Portscan And Filtered Portsweep
sfPortscan 對以下已過濾的 portcans 和 portsweeps 發出警報:
- TCP Filtered Portscan
- UDP Filtered Portscan
- IP Filtered Portscan
- TCP Filtered Decoy Portscan
- UDP Filtered Decoy Portscan
- IP Filtered Decoy Portscan
- TCP Filtered Portsweep
- UDP Filtered Portsweep
- IP Filtered Portsweep
- ICMP Filtered Portsweep
- TCP Filtered Distributed Portscan
- UDP Filtered Distributed Portscan
- IP Filtered Distributed Portscan
“Filtered” 警報表明沒有網絡錯誤(ICMP不可達或TCP RSTs),或關閉端口上的響應被抑制。它還可以很好地指示警報是否只是一個非常活躍的合法主機。活動主機,如NATs,可以觸發這些警報,因爲它們可以在非常短的時間內發送許多連接嘗試。在收到來自遠程主機的響應之前,過濾後的警報可能會發出(go off)。
sfPortscan 僅在時間窗口內爲每個有問題的主機對生成一個警報(下面有更多時間窗口的介紹)。在 TCP 掃描警報中, sfPortscan 還將顯示所有已掃描的開放端口。 但是,在 TCP 掃描警報上,sfPortscan 僅在觸發警報後纔跟蹤開放的端口。 開放端口事件不是單個警報,而是基於原始掃描警報的標籤。
3 sfPortscan 預處理器的配置
sfPortscan 需要使用 Stream5 預處理器。在無連接協議,如ICMP和UDP,Stream 給 Portscan 指明方向。您應該在 snort.conf 中啓用 Stream 預處理器。
可用於配置 portscan 模塊的參數有:
-
proto <protocol>
可用選項:- TCP
- UDP
- ICMP
- ip proto
- all
-
scan_type <scan type>
可用選項:- portscan
- portsweep
- decoy portscan
- distributed portscan
- all
-
sense_level <level>
可用選項:- low - “低” 警報僅在從目標主機發送的錯誤數據包上生成,並且由於錯誤響應的性質,此設置應該很少出現誤報。但是,由於缺少錯誤響應,此設置將永遠不會觸發 “Filtered Scan” 警報。 此設置基於60秒的靜態時間窗口,此後重置此窗口。
- medium - “中級” 警報跟蹤連接計數(connection counts),因此將生成 “Filtered Scan” 警報。 此設置在活動主機(NAT,代理,DNS緩存等)上可能會產生誤報,因此用戶可能需要使用 “Ignore” 選項來進行調優。
- high - “高” 警報使用時間窗口連續跟蹤網絡上的主機,以評估該主機的端口掃描統計信息。 該設置會由於持續監控而捕獲一些慢速掃描,但對活動主機非常敏感。 這絕對需要用戶調優 sfPortscan。
-
watch_ip <ip1|ip2/cidr[ [port|port2-port3]]>
定義需要監視主機的 ip、網絡和端口。該列表是一個逗號分隔的 IP 地址列表,IP地址使用CIDR表示法。端口被指定在IP地址/CIDR之後,可以是單一的端口,也可以是一個破折號連接表示的範圍,是可選的。如果使用此選項,不屬於此範圍的 ip 或網絡將被忽略。 -
ignore_scanners <ip1|ip2/cidr[ [port|port2-port3]]>
忽略來自指定地址的掃描警報。參數的格式與 watch_ip 相同。 -
ignore_scanned <ip1|ip2/cidr[ [port|port2-port3]]>
忽略目的地爲指定地址的掃描警報。參數的格式與 watch_ip 相同。 -
logfile <file>
此選項將把端口掃描事件輸出到指定的文件。如果文件不包含前導斜槓,則該文件將放在 Snort 配置目錄中。 -
include_midstream
此選項將包括 Stream 模塊在中途拾取的會話。這可能導致錯誤警報,尤其是在數據包丟失的高負載下。這就是爲什麼該選項默認關閉的原因。 -
detect_ack_scans
此選項將包括 Stream 模塊在中途拾取的會話,這對於檢測 ACK 掃描是必需的。 但是,這可能導致錯誤警報,尤其是在數據包丟失的高負載下。這就是爲什麼該選項默認關閉的原因。 -
memcap { positive integer }
爲端口掃描檢測分配的最大字節數。這個數字越高,可以跟蹤的節點就越多。 -
disabled
任何策略都允許使用這個可選關鍵字來避免包處理。此選項禁用預處理器。當預處理器被禁用時,只有 memcap 選項在配置中指定時被應用。其他選項將被解析但不使用。任何有效的配置都可能添加了“禁用”。
格式:
preprocessor sfportscan: proto <protocols> \
scan_type <portscan|portsweep|decoy_portscan|distributed_portscan|all> \
sense_level <low|medium|high> \
watch_ip <IP or IP/CIDR> \
ignore_scanners <IP list> \
ignore_scanned <IP list> \
logfile <path and filename> \
disabled
舉例:
preprocessor flow: stats_interval 0 hash 2
preprocessor sfportscan:\
proto { all } \
scan_type { all } \
sense_level { low }
4 sfPortscan 警報輸出
4.1 Unified Output
爲了獲取與警報一起記錄的所有 portcan 信息,snort 會生成一個僞數據包,並使用有效負載部分來存儲額外的 portcan 信息,包括優先級計數,連接計數,IP計數,端口計數,IP範圍和端口範圍。 數據包的特徵是:
Src/Dst MAC Addr == MACDAD
IP Protocol == 255
IP TTL == 0
除此之外,該包看起來像導致生成 portscan 警報的包的 IP 部分。這包括任何 IP 選項,等等。數據包的有效負載和有效負載大小等於記錄的附加 portscan 信息的長度。大小一般在100-200字節左右。
開放端口警報不同於其他 portscan 警報,因爲開放端口警報利用帶標記的包輸出系統。這意味着,如果使用了不打印標記包的輸出系統,那麼用戶將看不到開放端口警報。開放端口信息存儲在IP負載中,幷包含已開放的端口。
sfPortscan 警報輸出旨在與 Unified2 數據包日誌記錄一起使用,因此可以擴展喜歡的 Snort GUI,使用上述數據包特徵顯示 portscan 警報和 IP 有效負載中的其他信息。
4.2 Log File Output
日誌文件輸出以以下格式顯示,後面將進一步解釋:
Time: 09/08-15:07:31.603880
event_id: 2
192.168.169.3 -> 192.168.169.5 (portscan) TCP Filtered Portscan
Priority Count: 0
Connection Count: 200
IP Count: 2
Scanner IP Range: 192.168.169.3:192.168.169.4
Port/Proto Count: 200
Port/Proto Range: 20:47557
如果目標上有開放端口,則將附加一個或多個帶標記的數據包:
Time: 09/08-15:07:31.603881
event_ref: 2
192.168.169.3 -> 192.168.169.5 (portscan) Open Port
Open Port: 38458
上述名詞解釋:
-
Event id/Event ref
These fields are used to link an alert with the corresponding Open Port tagged packet
這些字段用於將警報與相應的帶開放端口標記的包鏈接起來 -
Priority Count
優先級計數跟蹤不良響應(resets, unreachables)。優先級計數越高,收到的不良響應就越多。 -
Connection Count
連接計數列出主機(src or dst)上活動的連接數。這對於基於連接的協議來說是準確的,對於其他協議來說是一個估計值。在此確定是否對端口掃描進行過濾。高連接計數和低優先級計數表明已過濾(沒有收到來自目標的響應)。 -
IP Count
IP 計數跟蹤與主機聯繫的最後一個IP,如果下一個IP不同,則增加計數。對於一對一掃描,這是一個小數目。對於活動主機,無論如何這個數字都會很高,並且一對一掃描可能會作爲分佈式掃描出現。 -
Scanned/Scanner IP Range
此字段根據警報類型而改變。Portsweep (一對多)掃描顯示被掃描的IP範圍。Portscans (一對一)顯示掃描儀的 IP。 -
Port Count
端口計數跟蹤最後一個已接觸的端口,並在該端口更改時增加該數字。我們使用這個計數(連同IP計數)來確定一對一端口掃描和一對一誘騙端口掃描之間的區別。
5 sfPortscan 調優
在檢測端口掃描時,最重要的方面是根據您的網絡,調優檢測引擎。下面是一些調優技巧:
-
使用 watch_ip, ignore_scanners, ignore_scanned 選項
正確設置這些選項很重要。watch_ip 選項很容易理解。分析師應該將此選項設置爲他們想要觀察的 CIDR 區塊和 ip 的列表。如果沒有定義 watch_ip, sfPortscan 將監視所有網絡流量。ignore_scanners 和 ignore_scanned 選項在清除網絡上非常活躍的合法主機時起作用。一些最常見的例子是 NAT IPs、DNS 緩存服務器、syslog 服務器和 nfs 服務器。sfPortscan 可能不會爲這些類型的主機生成誤報,但是在第一次爲這些 ip 調優sfPortscan 時要注意。根據主機生成的警報類型,分析人員需要知道忽略哪個警報。如果主機正在生成 portsweep 事件,則將其添加到 ignore_scanners 選項中。如果主機正在生成 portscan 警報(並且是正在被掃描的主機),則將其添加到 ignore_scanned 掃描選項中。
-
Filtered scan alerts 更容易出現誤報
在確定誤報時,警報類型非常重要。sfPortscan 生成的大部分誤報可能都屬於 filtered scan alert 類型。所以要對過濾過的端口掃描多加懷疑。很多時候,這只是表明主機在問題時間段內非常活躍。如果主機持續生成這些類型的警報,請將其添加到 ignore_scanners 或使用較低的靈敏度級別。 -
利用Priority Count, Connection Count, IP Count, Port Count, IP Range, and Port Range來確定誤報
Connection Count / IP Count:這個比率表示每個IP的平均連接數。對於portscans,這個比率應該很高,越高越好。對於portsweep,這個比率應該很低
Port Count / IP Count:這個比率表示每個IP連接的端口的估計平均值。對於端口掃描,這個比率應該很高,並表明被掃描主機的端口連接的ip較少。對於portsweep,這個比率應該很低,表明掃描主機連接到很少的端口,但是在很多主機上。
Connection Count / Port Count:這個比率表示每個端口的估計平均連接數。對於端口掃描,這個比率應該很低。這表示每個連接都連接到不同的端口。對於portsweep,這個比率應該很高。這表明同一端口有許多連接。
Priority Count 不包含的原因是,優先級計數包含在連接計數中,上面的比較將其考慮在內。優先級計數在調優中發揮重要作用,因爲優先級計數越高,它越有可能是真正的portscan或portsweep(除非主機被防火牆保護)。
-
如果以上方法都失敗,調低 sensitivity_level
如果這些其他調優技術都不起作用,或者分析師沒有時間進行調優,那麼降低靈敏度級別。敏感性級別越高,您得到的保護就越好。但是 portscan 檢測引擎生成的報警,能夠給分析師提供有用的信息同樣也很重要。低靈敏度級別僅根據錯誤響應生成警報。這些響應表明 portscan,由低靈敏度級別生成的警報是高度準確的,需要最少的調優。低靈敏度水平不能捕捉 filtered scans,因爲這些更容易出現誤報。
6 sfPortscan 報警
sfPortscan 使用 GID 122,可以生成如下報警:
SID | Description |
---|---|
1 | TCP Portscan |
2 | TCP Decoy Portscan |
3 | TCP Portsweep |
4 | TCP Distributed Portscan |
5 | TCP Filtered Portscan |
6 | TCP Filtered Decoy Portscan |
7 | TCP Filtered Portsweep |
8 | TCP Filtered Distributed Portscan |
9 | IP Protocol Scan |
10 | IP Decoy Protocol Scan |
11 | IP Protocol Sweep |
12 | IP Distributed Protocol Scan |
13 | IP Filtered Protocol Scan |
14 | IP Filtered Decoy Protocol Scan |
15 | IP Filtered Protocol Sweep |
16 | IP Filtered Distributed Protocol Scan |
17 | UDP Portscan |
18 | UDP Decoy Portscan |
19 | UDP Portsweep |
20 | UDP Distributed Portscan |
21 | UDP Filtered Portscan |
22 | UDP Filtered Decoy Portscan |
23 | UDP Filtered Portsweep |
24 | UDP Filtered Distributed Portscan |
25 | ICMP Sweep |
26 | ICMP Filtered Sweep |
27 | Open Port |