网络安全中端口扫描的一些方案介绍( 二 )


#!/usr/bin/python3import logginglogging.getLogger('scapy.runtime').setLevel(logging.ERROR)import sysfrom scapy.all import *if len(sys.argv) != 4: print('Usage ./syn_port_scan.py [Target-IP] [First Port] [Last Port]') print('Example ./syn_port_scan.py 172.18.14.1 1 100') print('Example will TCP SYN port scan ports 1 through 100 on 172.18.14.1') sys.exit()ip = str(sys.argv[1])start = int(sys.argv[2])end = int(sys.argv[3])for port in range(start, end): a = sr1(IP(dst=ip)/TCP(dport=port, flags='S'), timeout=1, verbose=0) if a == None:pass else:if int(a[TCP].flags) == 18:print(port)else:pass脚本中最后用18作为判断依据的原因可以看抓包中的数据:

网络安全中端口扫描的一些方案介绍

文章插图
SYN,ACK的抓包数据
可以看出来SYN,ACK转换成10进制后就是18 。
执行方式还是一样,先赋予权限,然后传入正确的参数:
网络安全中端口扫描的一些方案介绍

文章插图
./syn_port_scan.py 36.152.44.96 50 200
隐蔽的端口扫描:nmapscapy毕竟还要写好几行代码,实际工作中都是怎么简单高效怎么来 。所以我们可以选择nmap来做隐蔽的端口扫描 。
nmap使用syn做端口扫描只需要使用参数-sS:
网络安全中端口扫描的一些方案介绍

文章插图
nmap -sS 36.152.44.96 -p 1-100
有时候nmap的扫描结果里会有一些fail、close、filtered,如果不想要这些结果,只想知道open的端口的话,可以加个参数--open 。
nmap也可以通过传递指定端口集合来扫描指定的端口:
网络安全中端口扫描的一些方案介绍

文章插图
nmap 36.152.44.238 -sS -p 50,80,88,90
隐蔽的端口扫描:hping3hping3可以通过参数-S来使用syn进行扫描:
网络安全中端口扫描的一些方案介绍

文章插图
【网络安全中端口扫描的一些方案介绍】hping3 36.152.44.238 --scan 1-100 -S
hping3有一个伪装来源地址的参数--spoof:
网络安全中端口扫描的一些方案介绍

文章插图
hping3 -c 100 -S --spoof 192.168.10.13 -p ++1 36.152.44.238
其中-c表示发多少数量的包,-p ++1表示端口号每次加一,但是由于伪装了源地址,目标机器就算端口开放,发出来的synack数据包,也不会是我的主机,肯定是僵尸机 。
全连接的端口扫描:scapy全连接扫描只有在特殊情况下使用,很容易被防火墙发现 。
scapy做全连接的端口扫描其实是有点麻烦的 。因为syn扫描不需要raw packets,系统内核认为目标机器返回的syn/ack是非法包,直接发送rst终断连接 。
在不解决系统内核自动发送RST时,用下面的脚本尝试一下全连接的端口扫描:
#!/usr/bin/python3import logginglogging.getLogger('scapy.runtime').setLevel(logging.ERROR)import sysfrom scapy.all import *SYN = IP(dst='36.152.44.238')/TCP(dport=80, flags='S')print('--- SENT ---')SYN.display()print('nn ---RECEIVED---')response = sr1(SYN, timeout=1, verbose=0)response.display()if int(response[TCP].flags) == 18: print('nn --- SENT') A = IP(dst='36.152.44.238')/TCP(dport=80, flags='A', ack=(response[TCP].seq + 1)) A.display() print('nn ---RECEIVED---') response2 = sr1(A, timeout=1, verbose=0) response2.display()else: print('SYN-ACK not returned')抓包的结果:
网络安全中端口扫描的一些方案介绍

文章插图
未关闭系统内核发送RST时的执行结果
从抓包结果里看出这台目标服务器虽然没有回复RST,但是也没有真正建立连接 。不过有些服务器会将收到RST包后过来的ACK包拒绝掉,直接返回一个RST过来 。
可以通过iptables的命令将去往指定目标ip的数据包过滤掉:
iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 36.152.44.238 -j DROP 执行上面这个命令后,在执行脚本,就是这样的结果:
网络安全中端口扫描的一些方案介绍

文章插图
内核没有在发送RST数据包
虽然系统内核的确是没有发送RST数据包了,但是从执行结果看也是有问题的 。可能是目标机器的防火墙功能比较强大,也可能是脚本的逻辑存在问题,如果有同学对这个感兴趣,可以私信我一起研究一下,这里就先这样吧 。
全连接的端口扫描:nmap通过传递参数-sT来使用nmap的全连接端口扫描:
网络安全中端口扫描的一些方案介绍

文章插图
nmap 36.152.44.238 -sT -p 70-90
在抓包工具中可以看到:


推荐阅读