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

通过前面几篇关于有效ip发现的文章介绍后,接下来就是对于这些活着的主机进行端口扫描的介绍了 。
端口对应了网络服务及应用端程序,服务的程序的漏洞通过端口攻入;通过开放的端口,可以进行更具体、更高效的攻击 。
UDP端口扫描一般都会假设ICMP Port Unreachable响应代表端口关闭,不过当目标系统设置了不响应ICMP Port Unreachable时,就会存在误判的情况 。
当然还可以通过完整的UDP应用层请求来进行端口扫描,虽然能提升准确性,但是会消耗大量时间 。
UDP端口扫描:scapy最好去了解每一种基于UDP的应用层包结构,对于使用udp来进行端口扫描的工作会很有帮助 。
直接上代码吧:
#!/usr/bin/Python3import logginglogging.getLogger('scapy.runtime').setLevel(logging.ERROR)import timeimport sysfrom scapy.all import *if len(sys.argv) != 4: print('Usage ./udp_port_scan.py [Target-IP] [First Port] [Last Port]') print('Example ./udp_port_scan.py 172.18.14.1 1 100') print('Example will UDP 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)/UDP(dport=port), timeout=5, verbose=0) time.sleep(1) if a == None:print(port) else:pass执行结果就是这样:

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

文章插图
执行结果
可以看到结果显示没有一个端口是开放的,这个结果可能有问题,将端口范围加大一些再试试:
网络安全中端口扫描的一些方案介绍

文章插图
./udp_port_scan.py 192.168.31.168 1 150
扫出一个开放的端口,可以参考一下,但不要完全相信 。
UDP端口扫描:nmap使用nmap进行udp的端口扫描,需要传的参数是-sU,不指定端口的话以前默认是扫描1000个常用的端口,如果通过-p指定端口的话,就只会对指定端口进行扫描:
网络安全中端口扫描的一些方案介绍

文章插图
nmap -sU 192.168.31.168
当然通过-p也是可以传递端口范围的,比如这样:
网络安全中端口扫描的一些方案介绍

文章插图
nmap -sU 192.168.31.168 -p1-100
也能通过-iL传递指定文档里的ip进行端口扫描:
网络安全中端口扫描的一些方案介绍

文章插图
nmap -iL ip.txt -sU -p1-100
TCP端口扫描使用tcp端口扫描,主要是基于连接协议,基于三次握手的 。可以实现隐蔽扫描、僵尸扫描、全连接扫描,所有的tcp扫描方式,都是基于三次握手的变化来判断目标端口状态 。
隐蔽扫描是只发syn包,不建立完整连接,应用日志不记录扫描行为,所以相对比较隐蔽,在网络层还是会留下记录 。
僵尸扫描比前一个隐蔽扫描更加隐蔽,实施条件比较苛刻(现在伪造来源地址比较困难),可伪造来源地址,选择僵尸机(闲置系统、系统使用递增的IPID,IPID不可以是0或者随机产生的)
网络安全中端口扫描的一些方案介绍

文章插图
僵尸扫描目标端口打开
1.扫描者向僵尸机发送一个SYN/ACK,僵尸机回复一个RST,并取得僵尸机的IPID,假设为x;
2.扫描者伪造来源为僵尸机,向目标主机发送一个SYN,然后目标主机给僵尸机返回一个SYN/ACK的RST,僵尸机收到后给目标主机返回一个RST,并且IPID加1;
3.然后扫描者再次向僵尸机发送一个SYN/ACK,如果收到僵尸机返回的RST中IPID比第1步中收到IPID大2,就是目标机器端口处于打开状态,如果大1则处于关闭状态 。
网络安全中端口扫描的一些方案介绍

文章插图
僵尸扫描目标端口关闭
隐蔽的端口扫描:scapy隐蔽端口扫描的定义已经在前面说过了,这里直接用scapy来演示具体操作:
网络安全中端口扫描的一些方案介绍

文章插图
a = sr1(IP(dst='36.152.44.96')/TCP(flags='S',dport=80), timeout=1, verbose=0)
从结果来看,目标机器的80端口是开放的 。
然后通过抓包工具看一下:
网络安全中端口扫描的一些方案介绍

文章插图
wireshark抓包
可以看到我的机器又回来一个rst包给目标主机,这个不是scapy发的,是当前机器的系统内核自动发送的,后面会讲到如何处理这种rst包,避免对后续安全工作的干扰 。
如果遇到端口没有开放会有两种可能,第一种就是啥都不回复,另一种就是回复一个flags为RA的数据包 。
用前面的内容写一个python脚本:


推荐阅读