PortScan_preprocessor
向标准记录设备中记录从一个源IP地址来的端口扫描的开始和结束。如果指定了一个记录文件,在记录扫描类型的同时也记录目的IP地址和端口。端口扫描定义为在时间T(秒)之内向超过P个端口进行TCP连接尝试,或者在时间T(秒)之内向超过P个端口发送UDP数据包。端口扫描可以是对任一IP 地址的多个端口,也可以是对多个IP地址的同一端口进行。现在这个版本可以处理一对一和一对多方式的端口扫描,分布式的端口扫描(多对一或多对多)。端口扫描也包括单一的秘密扫描(stealth scan)数据包,比如NULL,FIN,SYNFIN,XMAS等。如果包括秘密扫描的话,端口扫描模块会对每一个扫描数据包告警。为避免这种情况,可以在Snort标准发行版中的scan-lib文件里把有关秘密扫描数据包的小节注释掉,这样对每次扫描就只记录一次。如果使用外部记录特性,可以在记录文件中看到(端口扫描的)技术和类型。
支持的端口扫描大类:
- Portscan
端口扫描是基本的一个主机对于另外一个主机的多个端口的扫描行为。如果有少数主机试图连接大量主机的大量端口或者存在大量的异常连接,我们就认为它在进行端口扫描。
- Decoy Portscan
在大量主机试图连接同一主机的不同端口的时候我们会认为他是分布式的端口扫描,
- Distributed Portscan
是分布式端口扫描的一种,与其不同是扫描主机试图多次连接被扫描的主机的特定端口。我们可以得到其扫描的轨迹。
- Portsweep
是某一主机试图连接一群主机的一部分端口。如果某一主机连接了很多主机的同一端口,我们认为它在进行Portsweep。
参数的详细设置:
typedef struct s_PS_ALERT_CONF
{
short connection_count; //连接通过的数据包数
short priority_count; //优先级
short u_ip_count; // ip个数
short u_port_count; // 端口个数
} PS_ALERT_CONF;
统计时间
PostSCAN.c line:654
LOW 60s
MID 90s
HIGHT 600s
static PS_ALERT_CONF g_tcp_low_ps = {0,5,25,5};
static PS_ALERT_CONF g_tcp_low_decoy_ps = {0,15,50,30};
static PS_ALERT_CONF g_tcp_low_sweep = {0,5,5,15};
static PS_ALERT_CONF g_tcp_low_dist_ps = {0,15,50,15};
static PS_ALERT_CONF g_tcp_med_ps = {200,10,60,15};
static PS_ALERT_CONF g_tcp_med_decoy_ps = {200,30,120,60};
static PS_ALERT_CONF g_tcp_med_sweep = {30,7,7,10};
static PS_ALERT_CONF g_tcp_med_dist_ps = {200,30,120,30};
static PS_ALERT_CONF g_tcp_hi_ps = {200,5,100,10};
static PS_ALERT_CONF g_tcp_hi_decoy_ps = {200,7,200,60};
static PS_ALERT_CONF g_tcp_hi_sweep = {30,3,3,10};
static PS_ALERT_CONF g_tcp_hi_dist_ps = {200,5,200,10};
/*
** UDP alert configurations
*/
static PS_ALERT_CONF g_udp_low_ps = {0,5,25,5};
static PS_ALERT_CONF g_udp_low_decoy_ps = {0,15,50,30};
static PS_ALERT_CONF g_udp_low_sweep = {0,5,5,15};
static PS_ALERT_CONF g_udp_low_dist_ps = {0,15,50,15};
static PS_ALERT_CONF g_udp_med_ps = {200,10,60,15};
static PS_ALERT_CONF g_udp_med_decoy_ps = {200,30,120,60};
static PS_ALERT_CONF g_udp_med_sweep = {30,5,5,20};
static PS_ALERT_CONF g_udp_med_dist_ps = {200,30,120,30};
static PS_ALERT_CONF g_udp_hi_ps = {200,3,100,10};
static PS_ALERT_CONF g_udp_hi_decoy_ps = {200,7,200,60};
static PS_ALERT_CONF g_udp_hi_sweep = {30,3,3,10};
static PS_ALERT_CONF g_udp_hi_dist_ps = {200,3,200,10};
/*
** IP Protocol alert configurations
*/
static PS_ALERT_CONF g_ip_low_ps = {0,10,10,50};
static PS_ALERT_CONF g_ip_low_decoy_ps = {0,40,50,25};
static PS_ALERT_CONF g_ip_low_sweep = {0,10,10,10};
static PS_ALERT_CONF g_ip_low_dist_ps = {0,15,25,50};
static PS_ALERT_CONF g_ip_med_ps = {200,10,10,50};
static PS_ALERT_CONF g_ip_med_decoy_ps = {200,40,50,25};
static PS_ALERT_CONF g_ip_med_sweep = {30,10,10,10};
static PS_ALERT_CONF g_ip_med_dist_ps = {200,15,25,50};
static PS_ALERT_CONF g_ip_hi_ps = {200,3,3,10};
static PS_ALERT_CONF g_ip_hi_decoy_ps = {200,7,15,5};
static PS_ALERT_CONF g_ip_hi_sweep = {30,3,3,7};
static PS_ALERT_CONF g_ip_hi_dist_ps = {200,3,11,10};
/*
** ICMP alert configurations
*/
static PS_ALERT_CONF g_icmp_low_sweep = {0,5,5,5};
static PS_ALERT_CONF g_icmp_med_sweep = {20,5,5,5};
static PS_ALERT_CONF g_icmp_hi_sweep = {10,3,3,5};
如何认定扫描和扫描类型
对于某一priority_count大于规定的IPSET节点
在规定的时间间隔内:
Ps : scanned 少于u_ip_count个主机,多于u_port_coun个连接
decoy_ps: scanned 大于u_ip_count个主机,多于u_port_coun个连接
dist_ps: scanned 少于u_ip_count个主机,多于u_port_coun个连接
g_ip_low_sweep:scanner 大于u_ip_count个主机,多于u_port_coun个连接
scanned 被扫描的主机
scanner 发起扫描的主机
priority_count的计算
TCP
关心三种类型的TCP数据包
开始的数据包:(注意,这里并不关心flags,只是关心流(FLOW)最开始收到的那个数据包)
TCP三次握手的数据包
未确立的stream中的reset数据包
开始的数据包
开始的数据包的有效性由stream4预处理器确定,我们在这里只是在确定发起者和相应者。
如果是开始的数据包,建立一个session
如果是结束的数据包(FIN),减少一个session
如果是RST,priority_count ++
如果sever回应,open ports +1
如果是ICMP unreachable priority_count ++
如果不满足以上条件,session中通过的数据包加1
IP包
如果是ICMP包
如果收到ICMP_DEST_UNREACH&& ICMP_PROT_UNREACH priority_count ++
如果属于某一个流
如果源自初始方,session中通过的数据包加1
如果源自应答方,session中通过的数据包减1
UDP包
如果是ICMP包
如果收到ICMP_DEST_UNREACH&& ICMP_PROT_UNREACH priority_count ++
如果属于某一个流
如果源自初始方,session中通过的数据包加1
如果源自应答方,session中通过的数据包减1
ICMP包
case ICMP_ECHO:
case ICMP_TIMESTAMP:
case ICMP_ADDRESS:
case ICMP_INFO_REQUEST:
session中通过的数据包加1
case ICMP_DEST_UNREACH:
priority_count ++