第三章 网络安全扫描编程
第一十零节 端口扫描实现
3.10.1 ICMP扫描实现
ICMP扫描是利用ICMP协议来实现的,在本例子中使用了基本的ICMP Echo查询报文和Echo应答报文来实现。其基本流程如图3-17所示。
图3-17 ICMP Echo扫描流程
程序运行结果如图3-18所示。
图3-18 ICMP Echo扫描
在本程序中,特别要注意设置超时这个步骤,因为如果目标主机不存在或者关机,就不可能得到响应,由于recvfrom()是阻塞性质的,它会一直等待数据的到达,这样程序就不会停止。
接收数据的时候,如果没有数据到达,那么会等待1s之后退出,进入超时状态,然后就可以判断对方主机是关闭的。
本程序构造了ICMP回显请求数据包。
回显请求的类型为8,代码值为0,ID号是用进程的ID填充的,然后计算机ICMP数据的校验和。
在接收数据包的时候,必须对数据包进行正确分析,发送回显请求数据包的目的是要获得正确的回显应答数据包,如果不是回显应答就抛弃。
而回显请求的数据包内容是ICMP类型为0,而且ID号也要一致,如果能够正确获得符合要求的回显应答,那么就判断目标主机是正在运行的。
3.10.2 TCP扫描实现
利用TCP扫描的种类非常多,限于篇幅,在这里只编程实现了TCP连接扫描和TCP SYN扫描。它们是非常具有代表性的,如果这些扫描的实现掌握了,其他方式的TCP扫描都可以以此类推。
1.TCP连接扫描实现
TCP连接扫描利用了TCP协议的正常连接过程,如果能够正常连接远程主机端口,表示端口是开放的,如果连接失败表示端口关闭。
本程序实现利用TCP连接扫描方法对一个端口系列进行循环扫描,判断端口是否打开或者关闭。其流程如图3-19所示。
图3-19 TCP连接扫描流程
代码如下所示:
此实例的运行结果如图3-20所示。
图3-20 TCP连接扫描结果
在本程序中核心部分是判断是否连接成功,可以比较简单地判断connet()函数的返回值状态,如果返回SOCKET_ERROR表示执行错误,也就是对方端口是关闭的,不能够正常进行TCP的连接。如果返回成功,表示对方端口是开放的。
在判断端口开放之后,不需要进行数据传输,所以马上把端口关闭,然后再进行下一个端口的扫描。
2.TCP SYN扫描实现
TCP SYN扫描应用非常广泛,是最好的TCP扫描形式,其速度很快,效率高,而且也比较安全隐蔽。
TCP SYN扫描是构造含有SYN标志的TCP数据包,然后判断返回数据包的内容。本程序实现了TCP SYN扫描,其流程如图3-21所示。
图3-21 TCP SYN扫描流程
代码如下所示:
程序运行的结果如图3-22所示。
图3-22 TCP SYN扫描结果
本程序的核心内容是构造TCP SYN数据包,然后计算其校验和,把构造的数据包通过sendto()发送给远程目标主机。然后通过监听返回的网络包,分析判断数据包的内容。
首先要捕获的协议数据是TCP协议,不是TCP协议数据包就不用分析,然后读取TCP数据内容。
pTcpHeader = (Tcp_Header*)(PacketBuffer + iIphLen);
读取TCP标志位,如果有RST,表示目标端口是关闭的,如果是SYN和ACK标志,表示目标端口是开放的。
注意在运行此程序之前,要确保目标主机是在运行的,否则不会得到任何数据内容。另外一个要注意的地方就是网络接口的选择,在本程序中使用的是默认的第一个可用的网络接口,如果要选择其他的网络接口,则要进行接口的选择编程,它的实现可参考第2章的获取网络接口编程实现过程。
3.10.3 UDP扫描实现
UDP扫描使用UDP协议,比其他的扫描技术要简单一些,但是其扫描过程是比较难控制的。由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误的数据包。但是有些主机却不是这样的,许多主机在打开的UDP端口上,会返回一个UDP数据包,但这样的机会很少。另外有些主机会在未打开的UDP端口上返回一个ICMP端口不可达数据包,
这样就可以断定哪个UDP端口是关闭的。由于UDP和ICMP数据包都不能保证能准确无误达到,因此这种扫描会有一定的困难。并且,由于操作系统中对ICMP错误消息产生的速率做了限定,所以UDP扫描实现起来速度会很慢。UDP扫描的实现过程如图3-23所示。
图3-23 UDP扫描程序流程
代码如下所示:
此实例的运行结果如图3-24所示。
图3-24 UDP扫描结果
3.10.4 木马扫描实现
典型的木马形式是基于客户端和服务器端模式的,在服务器端必须有一个监听端口,扫描此端口的开放状况,可以在某种程度上检测主机是否被植入某种木马。
当然,现今的木马形式很多,有些木马并不需要特别的监听端口。它们可以通过各种途径来与客户端通信,例如可以借助已知的进程端口,不用自己独有的端口,这样就不会被轻易发现。
在这里以冰河作为例子。冰河其实是一个远程控制程序,但如果把它用来进行入侵破坏活动,就变成了木马了。冰河的默认监听端口为7626,可以使用netstat命令查看,如图3-25所示。可以看到,在本机已经有冰河服务器程序在运行。
图3-25 冰河木马服务器运行的端口
代码如下所示:
运行结果如图3-26所示。
图3-26 木马扫描结果
3.10.5 隐秘扫描实现
TCP connect()扫描以及TCP SYN 扫描都容易被防火墙等网络安全防护软件察觉,所以它们是非隐秘扫描。相反,如果使用FIN等标志,则不会被轻易发现。这些能够隐藏扫描行为的方法称为隐秘扫描方法,而TCP FIN扫描是其中的一种。TCP FIN扫描的方法是发送一个FIN数据包给目标主机端口,目标主机对关闭的端口用适当的RST数据包返回,而打开的端口则会忽略FIN数据包的回复。但这是通常的情况。有些主机系统对于FIN数据包,无论端口打开还是关闭都返回RST数据包,这样FIN扫描就失去了作用。