【1.7.2】使用TCP协议扫描主机或端口

一、使用TCP协议扫描主机

通常,用户通过 ping 命令判断目标主机是否开启;但是,很多主机都是禁止使用 ping 命令的。如果目标主机开放,并有程序在运行和监听特定的 TCP 端口,那么就可以通过 TCP 协议连接该端口从而判断主机是否运行。

1.1 构造 TCP Ping 包实施扫描

构造 TCP Ping 包实质上是构建一个 [SYN] 包,它模拟 TCP 连接中的第 1 次握手,向目标主机的端口发出请求。如果指定的端口开放,将返回第 2 次握手包[SYN,ACK];如果端口未开放,将返回 [RST,ACK] 包。

可以借助 netwox 工具中编号为 51 的模块进行构建 TCP Ping 包。

【实例】在主机 192.168.59.131 上构建 TCP Ping 包,对目标主机进行扫描,判断主机是否启用。

  1. 判断目标主机 192.168.59.135 是否启用,执行命令如下:

    root@daxueba:~# netwox 51 -i 192.168.59.135

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…  #省略其他信息

该模块默认向目标主机的 80 端口发送 SYN 包。上述输出信息中持续显示 OK,表示目标主机的 80 端口返回了响应,从而确定该主机已启用。

  1. 如果目标主机开放的不是 80 端口,就需要指定其他端口号。例如,基于 5352 端口,判断目标主机是否开启。执行命令如下:

    root@daxueba:~# netwox 51 -i 192.168.59.135 -p 5352

执行命令后,将会向目标主机的 5352 端口发送 SYN 请求包。

  1. 为了验证发送的 SYN 包情况,通过抓包进行查看,如图所示。

其中,第 1 个数据包的源IP地址为 192.168.59.131,目标 IP 地址为 192.168.59.135,源端口为随机端口 56980,目标端口为要探测的端口 5352。

在 Info 列中可以看到 [SYN],表示该数据包为向目标主机发送的第 1 次握手包。第 2 个数据包的源 IP 地址为 192.168.59.135,目标 IP 地址为 192.168.59.131,源端口为 5352,目标端口为 56980,Info 列中包含 [SYN,ACK],表示该数据包是第 1 个数据包的响应包。

这说明目标主机上的 5352 端口是开放的,从而判定目标主机也是开启的。

  1. 如果目标主机上的端口不开放,将返回 [RST,ACK] 包。例如,连接不开放的端口 5533,如图所示。

其中,第 1 个数据包为向目标主机 5533 端口发送的第 1 次握手包,第 2 个数据包为对应的响应包,该包不是 [SYN,ACK] 包,而是 [RST,ACK] 包。这表示目标主机端口没有进行回复,目标端口 5533 没有启用。

1.2 伪造TCP Ping包实施扫描

通过构造 TCP Ping 包来判断目标主机是否开启,很容易被发现。为了避免被发现,可以伪造 TCP Ping 包实施扫描。

【实例】在主机 192.168.59.131 上伪造 TCP Ping 包,尝试访问目标主机的 81 端口。

  1. 伪造 IP 地址为 192.168.59.150,MAC 地址为 ab:bc:cd:12:23:34。执行命令如下:

    root@daxueba:~# netwox 52 -i 192.168.59.135 -p 81 -E ab:bc:cd:12:23:34 -I 192.168.59.150 -e 00:0c:29:ca:e4:66

输出信息如下:

Ok
Ok
Ok
Ok
Ok
…  #省略其他信息
  1. 通过抓包验证发送的 TCP Ping 包,并查看伪造的地址,如图所示。

其中,第 1 个数据包为发送的 [SYN] 包,可以看到源 IP 地址为 192.168.59.150(伪造的),目标 IP 地址为 192.168.59.135。

在 Ethernet II 部分中可以看到源 MAC 地址为 ab:bc:cd:12:23:34(伪造的)。

第 2 个数据包为对应的响应包 [SYN,ACK],表示目标端口 81 开放。

二、使用TCP协议批量扫描端口

在 TCP 协议中,计算机与计算机之间的通信都是通过端口识别进行传输的,不同的应用程序使用的端口也不同,通过判断开放的端口,可以了解目标主机运行哪些程序。

通过构造 TCP Ping 包实施扫描可以判断端口是否开放,但它一次只能判断一个端口。下面将讲解如何批量扫描端口,以判断端口的开放情况。

2.1 构造 TCP 端口扫描包

TCP 端口扫描也是构造的是 TCP 连接中的第 1 次握手包 [SYN] 包。如果端口开放,将返回第二次握手包 [SYN,ACK];如果端口未开放,将返回 [RST,ACK] 包。

用户可以借助 netwox 工具中编号为 67 的模块构造 TCP 端口扫描包。

【实例】在主机 192.168.59.133 上进行实施 TCP 端口扫描,探测目标主机 192.168.59.156 的端口开放情况。

  1. 判断端口 20~25 的开放情况,执行命令如下:

    root@daxueba:~# netwox 67 -i 192.168.59.156 -p 20-25

输出信息如下:

192.168.59.156 - 20 : closed
192.168.59.156 - 21 : closed
192.168.59.156 - 22 : closed
192.168.59.156 - 23 : closed
192.168.59.156 - 24 : closed
192.168.59.156 - 25 : closed

上述输出信息显示对端口 20~25 进行了扫描,closed表示这些端口都是关闭状态。

  1. 通过抓包,可以捕获扫描发送的 TCP SYN 请求包和返回的 TCP RST-ACK 包,如图所示。

这里,捕获到 12 个数据包。其中,第 1~3 个和第 5~7 个包分别为向端口 20~25 发送的 SYN 请求包。其中,源 IP 地址为 192.168.59.133(实施主机地址)。

由于这些端口关闭,每个请求都返回了 RST-ACK 响应包。其中,第 4 个和第 8~12 个包为返回的响应包,表示端口未开放。

  1. 判断端口 81 的开放情况,执行命令如下:

    root@daxueba:~# netwox 67 -i 192.168.59.156 -p 81

输出信息如下:

192.168.59.156 - 81 : open

上述输出信息表示端口 81 是开放的。

  1. 此时捕获到的数据包,将返回的是 SYN-ACK 包,如图所示。

其中,第 5 个数据包为发送的 SYN 请求包;第 6 个数据包为返回的 SYN-ACK 包,表示端口 81 是开放的。

2.2 伪造 TCP 扫描包

直接基于本机构造 TCP 端口扫描包,很容易被发现。为了避免被发现,可以伪造 TCP 包实施扫描,如伪造 IP 地址和 MAC 地址。

【实例】在主机 192.168.59.133 上构造 TCP 扫描包,探测目标主机 192.168.59.156 的端口开放情况。

  1. 伪造 IP 地址为 192.168.59.136,MAC 地址为 11:22:33:44:55:66,判断端口 20~25 的开放情况,执行命令如下:

    root@daxueba:~# netwox 68 -i 192.168.59.156 -p 20-25 -E 11:22:33:44:55:66 -I 192.168.59.136

输出信息如下:

192.168.59.156 - 20 : closed
192.168.59.156 - 21 : closed
192.168.59.156 - 22 : closed
192.168.59.156 - 23 : closed
192.168.59.156 - 24 : closed
192.168.59.156 - 25 : closed
  1. 当目标主机捕获到数据包时,发现的地址是虚假的地址,如图所示。

上图中请求数据包的 IP 地址都为 192.168.59.136(伪造的 IP 地址),MAC 地址为 11:22:33:44:55:66(伪造的 MAC 地址)。

三、防止使用TCP协议扫描端口

为了防御攻击者对主机端口的扫描,可以干扰攻击者的判断。例如,当扫描未开放的端口时,也返回 [SYN,ACK] 包,使攻击者认为该端口是开放的。

防御扫描干扰需要使用 netwox 工具中编号为 79 的模块。

【实例】已知主机 A 的 IP 地址为 192.168.59.135,主机 B 的 IP 地址为 192.168.59.131。在主机 192.168.59.135 上实施防御扫描。

  1. 查看主机 A 当前监听的端口,执行命令如下:

    root@daxueba:~# netstat -l

输出信息如下:

Active Internet connections (only servers)
Proto            Recv-Q       Send-Q   Local Address        Foreign Address         State
tcp              0            0        0.0.0.0:5227            0.0.0.0:*            LISTEN
tcp              0            0        0.0.0.0:5228            0.0.0.0:*            LISTEN
tcp              0            0        0.0.0.0:5229            0.0.0.0:*            LISTEN
udp              19584        0        0.0.0.0:bootpc          0.0.0.0:*
raw6             0            0        [::]:ipv6-icmp           [::]:*                   7
Active UNIX domain sockets (only servers)

上述输出信息表示主机A当前开启了端口 5227、5228、5229 这 3 个端口。

  1. 干扰主机 B,使主机 B 认为除了上述 3 个端口以外,其他端口都是开放状态,执行命令如下:

    root@daxueba:~# netwox 79 -i 192.168.59.135 -p 1-5226,5230-65535

执行命令后没有任何输出信息,但是会对命令中指定的端口都进行响应,返回 [SYN,ACK] 包。

  1. 目标主机 B 对主机 A 进行扫描,例如,对端口 21、25、53、80、443 进行扫描,执行命令如下:

    root@daxueba:~# netwox 67 -i 192.168.59.135 -p 21,25,53,80,443

输出信息如下:

192.168.59.135 - 21 : open
192.168.59.135 - 25 : open
192.168.59.135 - 53 : open
192.168.59.135 - 80 : open
192.168.59.135 - 443 : open

以上输出信息表示目标主机 A 的 21、25、53、80、443 端口都是开放状态,而实际并没有开放。

  1. 通过抓包,查看捕获的数据包,如图所示。

从上图中可以看到,主机 B 对主机 A 的 21、25、53、80、443 端口依次发送了 TCP[SYN] 包,并且都得到了对应的 [SYN,ACK] 响应包,表示这些端口是开放的。

通常,目标主机上都有自己的内核防火墙。当攻击主机对目标主机端口扫描时,内核防火墙也会向攻击主机回复响应包。这时,不仅 netwox 工具会发出响应包,内核防火墙也会进行回复,导致发送响应包 [SYN,ACK] 和 [RST]。

例如,上述对端口 21、25、53、80、443 进行扫描,将会得到的响应包,如图所示。

图中第 13~17 个数据包,分别是端口 21、25、53、80、443 给出的 [SYN,ACK] 响应包,第 18~22 个数据包,分别是端口 21、25、53、80、443 给出的 [RST] 响应包。

为了能够使 netwox 工具起到干扰作用,需要在目标主机上内核防火墙中进行配置,丢弃接收的数据包,执行命令如下:

root@daxueba:~# iptables -P INPUT DROP

如果继续接收进入的数据包,执行命令如下:

root@daxueba:~# iptables -P INPUT ACCEPT

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn