【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 包,对目标主机进行扫描,判断主机是否启用。
-
判断目标主机 192.168.59.135 是否启用,执行命令如下:
root@daxueba:~# netwox 51 -i 192.168.59.135
输出信息如下:
Ok
Ok
Ok
Ok
Ok
… #省略其他信息
该模块默认向目标主机的 80 端口发送 SYN 包。上述输出信息中持续显示 OK,表示目标主机的 80 端口返回了响应,从而确定该主机已启用。
-
如果目标主机开放的不是 80 端口,就需要指定其他端口号。例如,基于 5352 端口,判断目标主机是否开启。执行命令如下:
root@daxueba:~# netwox 51 -i 192.168.59.135 -p 5352
执行命令后,将会向目标主机的 5352 端口发送 SYN 请求包。
- 为了验证发送的 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 端口是开放的,从而判定目标主机也是开启的。
- 如果目标主机上的端口不开放,将返回 [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 端口。
-
伪造 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
… #省略其他信息
- 通过抓包验证发送的 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 的端口开放情况。
-
判断端口 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表示这些端口都是关闭状态。
- 通过抓包,可以捕获扫描发送的 TCP SYN 请求包和返回的 TCP RST-ACK 包,如图所示。
这里,捕获到 12 个数据包。其中,第 1~3 个和第 5~7 个包分别为向端口 20~25 发送的 SYN 请求包。其中,源 IP 地址为 192.168.59.133(实施主机地址)。
由于这些端口关闭,每个请求都返回了 RST-ACK 响应包。其中,第 4 个和第 8~12 个包为返回的响应包,表示端口未开放。
-
判断端口 81 的开放情况,执行命令如下:
root@daxueba:~# netwox 67 -i 192.168.59.156 -p 81
输出信息如下:
192.168.59.156 - 81 : open
上述输出信息表示端口 81 是开放的。
- 此时捕获到的数据包,将返回的是 SYN-ACK 包,如图所示。
其中,第 5 个数据包为发送的 SYN 请求包;第 6 个数据包为返回的 SYN-ACK 包,表示端口 81 是开放的。
2.2 伪造 TCP 扫描包
直接基于本机构造 TCP 端口扫描包,很容易被发现。为了避免被发现,可以伪造 TCP 包实施扫描,如伪造 IP 地址和 MAC 地址。
【实例】在主机 192.168.59.133 上构造 TCP 扫描包,探测目标主机 192.168.59.156 的端口开放情况。
-
伪造 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
- 当目标主机捕获到数据包时,发现的地址是虚假的地址,如图所示。
上图中请求数据包的 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 上实施防御扫描。
-
查看主机 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 个端口。
-
干扰主机 B,使主机 B 认为除了上述 3 个端口以外,其他端口都是开放状态,执行命令如下:
root@daxueba:~# netwox 79 -i 192.168.59.135 -p 1-5226,5230-65535
执行命令后没有任何输出信息,但是会对命令中指定的端口都进行响应,返回 [SYN,ACK] 包。
-
目标主机 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 端口都是开放状态,而实际并没有开放。
- 通过抓包,查看捕获的数据包,如图所示。
从上图中可以看到,主机 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