最近产品提了个新需求,需要检测端口扫描行为,提到端口扫描必须绕不开端口扫描之王——Nmap。所以除了基于流量五元组统计建立统计模型的检测方案之外,识别Nmap的流量特征就成了关键了。
Nmap是网络安全人员常用的信息收集工具,主要用来探测主机、扫描端口和服务,内置了多种扫描方式。每种方式的工作原理不同,其数据包和通讯特征也不尽相同。
端口扫描,通常是指在信息收集阶段利用TCP、UDP等方式,去检测操作系统类型及开放的服务,为进一步的攻击做好准备。通常蠕虫病毒、网络攻击等常见的影响网络安全的行为,都是从扫描开始的。所以我们首先通过网络流量分析,对几种最常见扫描方式进行分析和特征提取。
-sS (TCP SYN扫描)
SYN扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的。 它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口。SYN扫描相对来说不张扬,不易被注意到,因为它不完成完整的TCP三次握手连接,可以应对任何兼容的 TCP协议栈,扫描速度快,效率高。 它还可以明确可靠地区分端口open(开放的), closed(关闭的),和filtered(被过滤的) 状态。
SYN扫描常常被称为半开放扫描, 因为它不打开一个完全的TCP连接。它发送一个SYN报文,但是它不会产生任何会话,目标主机几乎不会把连接记入系统日志。 SYN/ACK表示端口在监听 (开放),而RST (复位)表示没有监听者。如果数次重发后仍没响应,该端口就被标记为被过滤。
如下图,SYN扫描到关闭端口的TCP时序图,以固定端口与被扫描IP尝试连接,且会话大多具有相同的特征。
-sT (TCP connect()扫描)
当SYN扫描不能用时,TCP Connect()扫描就是默认的TCP扫描。当用户没有权限发送原始报文或者扫描IPv6网络时,就是这种情况。 Nmap通过创建connect() 系统调用要求操作系统和目标机以及端口建立连接,而不像其它扫描类型直接发送原始报文。 这是和Web浏览器,P2P客户端以及大多数其它网络应用程序用以建立连接一样的高层系统调用。
当Nmap连接,然后不发送数据又关闭连接, 许多普通UNIX系统上的服务会在syslog留下记录,有时候是一条加密的错误消息。所以TCP connect()扫描会在目标主机的日志中会记录大批的连接请求以及错误信息,极容易被侦测到。
如下图,抓包分析所示,TCP 完全连接扫描,直接与被扫描端口进行TCP三次握手。如果端口开放,则三次握手成功;如果端口不开放,主机则返回RST ACK包。
-sU (UDP扫描)
互联网上很多流行的服务都运行在TCP 协议上,当然也有一部分UDP服务,DNS,SNMP,和DHCP (注册的端口是53,161/162,和67/68)是最常见的三个。UDP扫描,通常与ICMP相结合进行。在给目标主机发送没有携带任何数据的UDP数据包时,如果返回信息为“ICMP端口不可达”(类型为3,代码为3)的提示,则表示目标端口是关闭的,但主机是存活的;如果某服务响应一个UDP报文,则表明该端口是开放的。
由于UDP是无连接的,所以会面临响应探测问题,探测时的端口是否开放还是被过滤的判断,会让Nmap超时然后再探测,以防探测帧或者响应丢失,导致探测时间增长。所以UDP扫描会发现明显存在速度慢的问题,实际应用通常需要并发扫描或先扫描主要端口。
UDP扫描在流量分析中的特征表现:出现大量UDP会话,且不携带任何数据,另外会有大量ICMP端口不可达的报文,如下图所示。
-sN (Null扫描)
Null扫描是将一个没有设置任何标志位的数据包发送给TCP端口,在正常的通信中至少要设置一个标志位。根据RFC 793,主机发送一个没有任何标志位的TCP包,如果目标主机的对应端口是关闭的话,则会返回一个RST数据包,如果没有响应则表示该端口是开放的。
所以Null扫描,如果TCP端口处于关闭则响应一个RST数据包,若处于开放则无相应,如下图所示,大量没有任何标志位的数据包(tcp flags全为0)。
-sF (FIN扫描)
有些时候防火墙为了防止网络扫描探测会过滤TCP SYN数据包,这时候可以使用TCP FIN扫描。这种方式和Null扫描原理一样,发送TCP FIN数据包到待测端口。如果返回RST数据包,则说明该端口关闭,如果无返回则说明该端口开放。
所以发起FIN扫描在流量上的表现就是存在大量特征相同的FIN的数据包,如下图流量时序图所示。同理ACK扫描则是存在大量ACK数据包。因为Windows系统和许多基于BSD的系统,不是完全遵守RFC 793协议,会丢弃FIN+ACK探测数据包,所以FIN/ACK扫描并不适用于扫描windows、Cisco的一些服务器。
上述我们分析了一些最常见的端口扫描方式,实际应用中为了更好更全面的收集信息,往往都会多种组合方式自定义扫描,比如使用SYN、ACK、UDP等的各种组合进行发包,或者同时结合一些其他的参数比如-sV (版本检测)、-O (系统检测)来获取目标系统更多的信息。网络安全总是伴随着攻防对抗的过程,网络管理员会使用防火墙或者IDS/IPS等发现或阻止恶意扫描和网络探测行为,所以目前主流IDS产品均对Nmap流量加入了特征库,而在攻击者的角度则是想办法绕过防火墙规则或者入侵检测系统的规则。
我们以Emerging Threats rules入侵检测规则中一些针对端口扫描比较典型的检测规则为例,分析实际攻防过程中可能被绕过的检测点。
如图示为ET规则集检测Nmap SYN扫描的规则,主要通过检查数据包flags标识确定SYN报文,window 关键字用于检查特定的TCP窗口大小。我们在分析过程中确实发现Nmap默认sS参数做SYN扫描时Windows的窗口值值固定是1024,实际真实业务连接特定端口时则可以看到window值明显不一样。
了解这个检测机制之后,其实绕过这个检测就很容易,修改Nmap源码 tcpip.cc,调整tcp窗口大小即可,同时避开已公开规则中窗口大小如3072、4096等。
另外在Nmap做端口扫描时如果加了-O参数,则会发送tcp,udp,icmp协议,扫描端口的同时去探测操作系统信息,目前IDS检测一般都是根据UDP data区域填充的'C'字符串,如下图规则所示。
实际Nmap扫描抓包分析流量如下,
所以源码osscan2.cc修改为如下所示,将0X43修改为其他值则UDP及ICMP填充的值就会相应变更,绕过IDS默认检测规则。
此外,Nmap扫描探测服务过程中如有HTTP协议,则User-Agent也会有明显的特征,这也是日常安全设备监测中最常碰到的告警内容。
同理研究了Nmap主要源码架构后,也可以在nselib/http.lua中找到配置UA信息的地方,修改为正常的UA信息就可以躲避安全设备基于UA特征的检测。
基于篇幅限制,本次仅选取了最常见的一些扫描方式进行分析以及ET规则集中一些主流的检测特征提供给大家参考,主要提供攻防对抗的思路。我们可以发现基于单一和静态流量特征检测的方式越来越难以对抗高级攻击和未知威胁,这也是近来各类基于流量的安全检测类设备持续优化演进的方向,基于网络异常行为、关联分析、威胁情报加持及各类威胁建模基本成为目前基于流量分析的入侵检测系统必备的功能及卖点。