基于TCP的活跃主机发现技术
Kubrnete 102 4

TCP的概念

TCP是一位传输层的协议。它是一种面向连接的、可靠的、基于字节流的传输层通讯协议。

TCP的特点是使用三次握手协议连接。当主动发出SYN连接请求后,等待对方回答TCP的三次握手SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的链接,TCP三次握手的过程如下。

第一步:客户端发送SYN(SEQ=x)数据包给服务端,进入SYN_SEND状态,如下图所示。 在这里插入图片描述 第二步:服务端收到SYN数据包,回应一个SYN(SEQ=y)+ACK(ACK=x+1)数据包,进入SYN_RECV状态,如下图所示: 在这里插入图片描述 第三步:客户端收到服务器的SYN数据包,回应一个ACK(ACK=y+1)数据包,进入Established状态。三次握手完成,TCP客户端和服务器成果地建立连接,可以开始传输数据,如下图所示: 在这里插入图片描述 TCP和ARP、ICMP等协议并不处于同一层,而是位于他们的上一层传输层。在这一层中出现了“端口”的概念。也就是port,可以认为是设备与未接通讯交流的出口。

如果检测到一台主机的某个端口有回应,也一样可以判断这台主机是活跃主机。需要注意的是,如果一台主机处于活跃状态,那么它的端口即使是关闭的,在收到请求时,也会给出一个回应,只不过并不是一个“SYN+ACK”数据包,而是一个拒绝连接的“RST”数据包。

这样在检测目标主机是否活跃的时候,就可以像目标的80端口发送一个SYN数据包,之后的情形可能有如下三种。

第一种:主机发送的SYN数据包到达了目标的80端口处,但是目标端口关闭了,所以目标主机会发送一个RST数据包,这个过程如下图所示。 在这里插入图片描述 第二种:主机发送的SYN数据包到达目标的80端口处,而且目标端口开放,所以目标主机会发送一个“SYN+ACK”的数据包,这个过程如下图。 在这里插入图片描述

第三种:主机发送的SYN数据包到达不了目标,这时就不会收到任何回应,这个过程如下图。 在这里插入图片描述 也就是说,只要收到了TCP回应,就可以判断该主机为活跃状态。

利用TCP实现活跃主机扫描

现在编写一个利用TCP实现的活跃主机扫描程序,这个程序有很多中方式可以实现,首先借助Scapy库来完成。

核心的思想就是要产生一个TCP请求。

首先查看Scapy库中TCP类型数据包中需要的参数。

ls(TCP())

在这里插入图片描述 这里绝大多数参数都不需要设置,需要考虑的是sport、dport和flags。

sport是源端口,dport是目的端口,而flags是标准位,可能的值包括SYN(建立连接)、FIN(关闭连接)、ACK(响应)、PSH(有DATA数据传输)、RST(连接重置)。

此处将flags设置为“S”,也就是SYN。

另外,TCP并没有目标地址和源地址,所以需要在IP层进行设置。

接下来构造一个发往192.168.3.1的80端口的SYN请求数据包并将其发送出去。

data = IP(dst="192.168.3.1") / TCP(dport=80, flags=80)
ans, unans = sr(data)
ans.summary()

运行结果: 在这里插入图片描述 这里我们将构造的数据包发送出去了后,不止得到了回应,还将回应利用summary()给输出出来了。

按照之前的思路,需要对这个请求的回应进行监听,如果得到了回应,就证明目标在线,并打印出这个主机的IP地址。

from scapy.all import *

data = IP(dst="192.168.3.1") / TCP(dport=80, flags=80)
ans, unans = sr(data, timeout=3)
if unans:
    print("无回应!")
    exit()
for s, r in ans:
    ip_s = s[IP].dst
    ip_r = r[IP].src
    if ip_s == ip_r:
        print("[*] 目标:%s" % ip_s)
        print("[*] 存活!")

运行结果: 在这里插入图片描述

预览图
评论区

索引目录