SYN/ACK扫描和FIN扫描均绕过TCP三次握手过程的第一步,直接给目的端口发送SYN/ACK包或者FIN包。因为TCP是基于连接的协议,目标主机认为发送方在第一步中应该发送的SYN包没有送出,从而定义这次连接过程错误,会发送一个RST包以重置连接。而这正是扫描者需要的结果—只要有响应,就说明目标系统存在,且目标端口处于关闭状态。
XMAS扫描和NULL扫描:这两类扫描正好相反,XMAS扫描设置TCP包中所有标志位(URG、ACK、RST、PSH、SYN、FIN),而NULL扫描则关闭TCP包中的所有标志位。
2.2.2 UDP端口扫描
UDP协议是数据包协议,为了要发现正在服务的UDP端口,通常的扫描方式是构造一个内容为空的UDP数据包送往目的端口。若目的端口上有服务正在等待,则目的端口返回错误的消息;若目的端口处于关闭状态,则目的主机返回ICMP端口不可达消息。因为UDP端口扫描软件要计算传输中丢包的数量,所以UDP端口扫描的速度很慢。
2.3 0S探测
OS探测有双重目的:一是探测目标主机的0S信息,二是探测提供服务的计算机程序的信息。比如OS探测的结果是:OS是Windows XP sp3,服务器平台是IIS 4.0。
2.3.1二进制信息探测
通过登录目标主机,从主机返回的banner中得知OS类型、版本等,这是最简单的0S探测技术。
图1 二进制信息
从图l可以看出,在telnet连上FTP服务器后,服务器返回的banner已经提供了server的信息,在执行ftp的syst命令后可得到更具体的信息。
2.3.2 HTTP响应分析
在和目标主机建立HTTP连接后,可以分析服务器的响应包得出OS类型。比如响应包中可能包含如下信息:
图2 响应包分析
从图2中对响应包中的数据分析,可以得到server的信息。
2.3.3栈指纹分析
网络上的主机都会通过TCP/IP或类似的协议栈来互通互联。由于0S开发商不唯一,系统架构多样,甚至是软件版本的差异,都导致了协议栈具体实现上的不同。对错误包的响应,默认值等都可以作为区分0S的依据。
(1)主动栈指纹探测
主动栈指纹探测是主动向主机发起连接,并分析收到的响应,从而确定OS类型的技术。
1)FIN探测。跳过TCP三次握手的顺序,给目标主机发送一个FIN包。RFC793规定,正确的处理是没有响应,但有些OS,如MS Windows,CISC0,HP/UX等会响应一个RST包。
2)Bogus标志探测。某些OS会设置SYN包中TCP头的未定义位(一般为64或128),而某些0S在收到设置了这些Bogus位的SYN包后,会重置连接。
3)统计ICMP ERROR报文。RFCl812中规定了ICMP ERROR消息的发送速度。Linux设定了目标不可达消息上限为80个/4秒。0S探测时可以向随机的高端UDP端口大量发包,然后统计收到的目标不可达消息。用此技术进行OS探测时时间会长一些,因为要大量发包,并且还要等待响应,同时也可能出现网络中丢包的情况。
4)ICMPERROR报文引用。RFC文件中规定,ICMP ERROR消息要引用导致该消息的ICMP消息的部分内容。例如对于端口不可达消息,某些OS返回收到的IP头及后续的8个字节,Solaris返回的ERROR消息中则引用内容更多一些,而Linux比Solaris还要多。
(2)被动栈指纹探测
被动栈指纹探测是在网络中监听,分析系统流量,用默认值来猜测0S类型的技术。
1)TCP初始化窗口尺寸。通过分析响应中的初始窗口大小来猜测OS的技术比较可靠,因为很多0S的初始窗口尺寸不同。比如AIX设置的初始窗口尺寸是0x3F25,而Windows NT5、OpenBSD、FreeBSD设置的值是0x402E。
2)Don't Fragment位。为了增进性能,某些0S在发送的包中设置了DF位,可以从DF位的设置情况中做大概的判断。
3)TCPISN采样。建立TCP连接时,SYN/ACK中初始序列号ISN的生成存在规律,比如固定不变、随机增加(Solaris,FreeBSD等),真正的随机(Linux 2.0.*),而Windows使用的是时间相关模型,ISN在每个不同时间段都有固定的增量。
2.4脆弱点扫描
从对黑客攻击行为的分析和脆弱点的分类,绝大多数扫描都是针对特定操作系统中特定的网络服务来进行,即针对主机上的特定端口。脆弱点扫描使用的技术主要有基于脆弱点数据库和基于插件两种。
2.4.1基于脆弱点数据库的扫描
首先构造扫描的环境模型,对系统中可能存在的脆弱点、过往黑客攻击案例和系统管理员的安全配置进行建模与分析。其次基于分析的结果,生成一套标准的脆弱点数据库及匹配模式。最后由程序基于脆弱点数据库及匹配模式自动进行扫描工作。脆弱点扫描的准确性取决于脆弱点数据库的完整性及有效性。