由 Sourcefire 开发的 sfPortscan 模块,旨在检测网络攻击的第一阶段:侦察(Reconnaissance)。在侦察阶段,攻击者确定主机支持何种类型的网络协议或服务。这个阶段是攻击主机事先不知道目标所支持的协议或服务的情况下,否则,这个阶段就没有必要了。
由于攻击者事先并不知道它的预定目标,因此攻击者发送的大多数查询将是拒绝(negative)的(意味着服务端口被关闭)。在合法的网络通信中,来自主机的拒绝响应是很少见的,而且在给定的时间内出现多次拒绝响应的情况更少见。我们检测端口扫描的主要目的是检测和跟踪这些拒绝响应。
目前使用的最常见的端口扫描工具之一是 Nmap。Nmap 包含许多当前的端口扫描技术。sfPortscan 被设计为能够检测 Nmap 产生的不同类型的扫描。
sfPortscan 当前会对以下类型的 Nmap 扫描发出警告:
这些警报是针对一对一端口扫描,这是传统类型的扫描,一台主机扫描另一台主机上的多个端口。
大多数请求都是被拒绝的,因为大多数主机提供的服务相对较少,意味着开放的端口较少。
sfPortscan 亦会对下列类型的诱骗(decoy)端口扫描进行报警:
诱骗端口扫描与上面描述的 Nmap 端口扫描非常相似,只是攻击者拥有一个混合了真实扫描地址的欺骗源地址。这种策略有助于隐藏攻击者的真实身份。
sfPortscan 也可以针对下列类型的分布式端口扫描发出警报:
这是多对一端口扫描。当多个主机查询一个主机以获取打开的服务时,就会发生分布式端口扫描。这是用来逃避 IDS 及混淆命令和控制主机。
注意: 拒绝查询将分布在扫描主机之间,因此我们通过被扫描主机跟踪这种类型的扫描。
sfPortscan 也可以针对以下类型的 Portsweep 发出警报:
这些警报是针对一对多端口扫描。一台主机扫描多台主机上的一个端口。这通常发生在出现新漏洞并且攻击者正在寻找特定服务时。
注意: portsweep 扫描的特性可能不会导致许多拒绝响应。例如,如果攻击者对端口80进行端口扫描,我们很可能不会看到很多拒绝响应。
sfPortscan 对以下已过滤的 portcans 和 portsweeps 发出警报:
“Filtered” 警报表明没有网络错误(ICMP不可达或TCP RSTs),或关闭端口上的响应被抑制。它还可以很好地指示警报是否只是一个非常活跃的合法主机。活动主机,如NATs,可以触发这些警报,因为它们可以在非常短的时间内发送许多连接尝试。在收到来自远程主机的响应之前,过滤后的警报可能会发出(go off)。
sfPortscan 仅在时间窗口内为每个有问题的主机对生成一个警报(下面有更多时间窗口的介绍)。在 TCP 扫描警报中, sfPortscan 还将显示所有已扫描的开放端口。 但是,在 TCP 扫描警报上,sfPortscan 仅在触发警报后才跟踪开放的端口。 开放端口事件不是单个警报,而是基于原始扫描警报的标签。
sfPortscan 需要使用 Stream5 预处理器。在无连接协议,如ICMP和UDP,Stream 给 Portscan 指明方向。您应该在 snort.conf 中启用 Stream 预处理器。
可用于配置 portscan 模块的参数有:
proto
可用选项:
scan_type
可用选项:
sense_level
可用选项:
watch_ip
定义需要监视主机的 ip、网络和端口。该列表是一个逗号分隔的 IP 地址列表,IP地址使用CIDR表示法。端口被指定在IP地址/CIDR之后,可以是单一的端口,也可以是一个破折号连接表示的范围,是可选的。如果使用此选项,不属于此范围的 ip 或网络将被忽略。
ignore_scanners
忽略来自指定地址的扫描警报。参数的格式与 watch_ip 相同。
ignore_scanned
忽略目的地为指定地址的扫描警报。参数的格式与 watch_ip 相同。
logfile
此选项将把端口扫描事件输出到指定的文件。如果文件不包含前导斜杠,则该文件将放在 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 }
为了获取与警报一起记录的所有 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 有效负载中的其他信息。
日志文件输出以以下格式显示,后面将进一步解释:
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计数)来确定一对一端口扫描和一对一诱骗端口扫描之间的区别。
在检测端口扫描时,最重要的方面是根据您的网络,调优检测引擎。下面是一些调优技巧:
使用 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,因为这些更容易出现误报。
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 |