端口扫描 - scapy - 全链接扫描
欢迎加我微信:fageweiketang,朋友圈不定期干货分享,一起交流讨论,一起学习进步。
0x00:介绍
端口扫描分为隐蔽扫描、全链接扫描、僵尸扫描。
全链接扫描:隐蔽扫描是直接发的 syn 包,只进行第一次握手,通过返回的信息判断端口是否开放。全链接扫描顾名思义,像正常的请求一样去访问目标服务器,也就是要进行三次握手。
有时候会受一些防火墙的影像,直接发送 syn 导致没有信息返回,判断不准确的情况,这时候可以用全链接方式进行扫描。弊端在于大量的全链接请求,而请求后又没有进行后续的操作,很容易被一些设备检测到。
0x01:scapy 全链接扫描端口
首先,先来看一个问题:
当使用脚本发包时,第一次握手给目标服务器发了 syn 包,第二次服务器返回了 syn/ack 包,在自己准备给服务器发送第三次的确认包 ack 时,自己的机器会先发一个 rst 包过去。
其原因在于自己发了 syn 时,自己机器并不知情,当服务器返回 syn/ack 时,自己的机器看来这个包是莫名其妙的,当收到一个莫名其妙的 syn/ack 时,自己机器会返回一个 rst 包。
当自己机器返回 rst 包后,这个连接就终端了,这时自己再向目标服务器发送 ack 确认包时,目标服务器突然收到一个 ack 不能理解,就会返回一个 rst,这时端口情况就扫描不出来了。
明确整个流程后,再来看下脚本,python 脚本如下:
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
SYN=IP(dst="172.168.1.101")/TCP(dport=21,flags='S')
print "-- Send SYN --"
SYN.display()
print"\n\n-- SYN Received --"
response = sr1(SYN,timeout=1,verbose=0)
response.display()
if int(response[TCP].flags) == 18:
print"\n\n-- Sent ACK --"
A = IP(dst="172.168.1.101")/TCP(dport=21,flags='A',ack=(response[TCP].seq+1))
A.display()
print"\n\n-- ACK Received --"
response2 = sr1(A,timeout=1,verbose=0)
response2.display()
else:
print"SYN/ACK not returned"
以上就是 scapy 通过全链接扫描的 python 脚本,首先是造好了一个 syn 包,然后接收了返回的包,判断返回包 flags 是否是 18 也就是 SA 标志,如果是 SA 则造 ACK 确认包发送,否则的话直接就 pass 掉。
执行过程如下,首先是发送 syn 包的过程如下:
然后就是目标服务器返回的 syn/ack 包,如下:
然后就是自己机器收到 syn/ack 后,发送的 ack 包,如下:
因为自己机器莫名其妙的收到了一个 syn/ack,所以会先发一个 rst,这时目标服务器莫名其妙的收到了一个 rst,也会回一个 rst,如下:
通过 wireshark 抓包如下:
通过 wireshark 的抓包结果可以看出之前所述的过程。那么应该如何阻止自己的机器返回 rst 包,从而完整的完成全链接的三次握手呢。这个可以通过 iptables 来设置防火墙,阻止其内核向目标服务器发送 rst 包,其示例如下:
iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 1.1.1.1 -j DROP
其中 - A 代表是加一条规则,OUTPUT 代表的是出站,-P 代表的协议,--tcp-flags 代表 tcp 的 flags,-d 代表目标地址,-j 代表的是要执行的动作,drop 也就是丢掉的意思。整个 iptables 意思就是添加一条出站规则协议是 tcp 的 flags 是 RST 的目标地址是 1.1.1.1 的包,然后丢掉。这样在自己机器收到 syn/ack 时,发送的 rst 包就会被 iptables 直接丢掉。
可以通过 - L 参数来查看一下 iptables 当前的规则列表,如下图:
添加规则后重新执行脚本,前几个包都一样,最后一个包返回的就不在是 rst 了,而是 ack 包,如下:
这时,再通过 wireshark 抓包看下脚本的执行过程,如下:
0x02:总结
通过之前的 scapy 总结,不论是各个层的主机发现,还是 udp 和 tcp 的端口发现,都很强大很好用。但 scapy 在全链接端口扫描时,可以发现其实是有点麻烦的,当隐蔽扫描无法正常扫描时,可以考虑使用全链接的方式,相对还有一个强大的方便的工具,就是 nmap 了,nmap 下篇继续介绍。
更多关于代码审计、WEB渗透、网络安全的运维的知识,请关注微信公众号:发哥微课堂。