您现在的位置:e-works > 智造书屋 > 书籍列表 > 网络安全编程技术与实例 > 端口扫描实现

第三章 网络安全扫描编程

第一十零节 端口扫描实现

    3.10.1  ICMP扫描实现

    ICMP扫描是利用ICMP协议来实现的,在本例子中使用了基本的ICMP Echo查询报文和Echo应答报文来实现。其基本流程如图3-17所示。

  ICMP Echo扫描流程

图3-17  ICMP Echo扫描流程

基本流程

基本流程

基本流程

基本流程

    程序运行结果如图3-18所示。

  ICMP Echo扫描

图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所示。

  TCP连接扫描流程

图3-19  TCP连接扫描流程

    代码如下所示:

 TCP连接扫描流程

 TCP连接扫描流程

    此实例的运行结果如图3-20所示。

 TCP连接扫描结果

图3-20  TCP连接扫描结果

    在本程序中核心部分是判断是否连接成功,可以比较简单地判断connet()函数的返回值状态,如果返回SOCKET_ERROR表示执行错误,也就是对方端口是关闭的,不能够正常进行TCP的连接。如果返回成功,表示对方端口是开放的。

TCP连接扫描结果

    在判断端口开放之后,不需要进行数据传输,所以马上把端口关闭,然后再进行下一个端口的扫描。

    2.TCP SYN扫描实现

    TCP SYN扫描应用非常广泛,是最好的TCP扫描形式,其速度很快,效率高,而且也比较安全隐蔽。

    TCP SYN扫描是构造含有SYN标志的TCP数据包,然后判断返回数据包的内容。本程序实现了TCP SYN扫描,其流程如图3-21所示。

 TCP SYN扫描流程

图3-21  TCP SYN扫描流程

    代码如下所示:

代码

代码

代码

代码

代码

代码

代码

代码

代码

代码

程序   

程序运行的结果如图3-22所示。

 TCP SYN扫描结果

图3-22  TCP SYN扫描结果

    本程序的核心内容是构造TCP SYN数据包,然后计算其校验和,把构造的数据包通过sendto()发送给远程目标主机。然后通过监听返回的网络包,分析判断数据包的内容。

分析判断数据包的内容

UDP扫描程序流程   

    首先要捕获的协议数据是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所示。

 UDP扫描程序流程

图3-23  UDP扫描程序流程

    代码如下所示:

代码

代码

代码

代码

代码

代码

代码

代码

代码

代码

代码

代码

    此实例的运行结果如图3-24所示。

 UDP扫描结果

图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扫描就失去了作用。