端口扫描技术的分类
端口扫描的第一步是向目标主机的TCP/UDP端口发送探测数据包,然后根据对方的回应判断端口是否开放。由于网络环境的差异以及操作系统对连接请求的应答并不一致,在端口扫描中支持多种扫描方式,以保证扫描的准确和快速。
- TCP connect() 扫描
也称全连接扫描。扫描主机通过TCP/IP 协议的三次握手与目标主机的指定端口建立一次完整的连接。连接由系统调用connect() 开始。如果端口开放,则连接将建立成功;否则,若返回-1 则表示端口关闭。建立连接成功:响应扫描主机的SYN/ACK 连接请求,这一响应表明目标端口处于监听( 打开) 的状态。如果目标端口处于关闭状态,则目标主机会向扫描主机发送RST 的响应。 - TCP SYN 扫描
也称“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP 连接。扫描程序发送的是一个SYN 数据包,好象准备打开一个实际的连接并等待反应一样( 参考TCP 的三次握手建立一个TCP 连接的过程) 。一个SYN|ACK 的返回信息表示端口处于侦听状态。一个RST 返回,表示端口没有处于侦听态。如果收到一个SYN|ACK ,则扫描程序必须再发送一个RST 信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是,必须要有root 权限才能建立自己的SYN 数据包。 - TCP FIN 扫描
有的时候有可能SYN 扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。相反, FIN 数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST 来回复FIN 数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系。有的系统不管端口是否打开,都回复RST ,这样,这种扫描方法就不适用了。并且这种方法在区分Unix 和NT 时,是十分有用的。 - TCP 反向ident扫描
ident协议允许看到通过TCP 连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如,连接到http 端口,然后用identd来发现服务器是否正在以root 权限运行。这种方法只能在和目标端口建立了一个完整的TCP 连接后才能看到。 - UDP ICMP端口不可到达扫描
这是使用UDP协议,向一个端口发送UDP包。一个打开的UDP端口不会发送任何回应,如果端口是关闭的,有些系统会返回ICMP_PORT_UNREACH信息。由于UDP不是可靠的,所以这种扫描也不是很可靠,且速度会比较慢。