渗透测试之端口扫描

端口扫描和攻击面分析

在网络安全中,端口扫描是一种常见的技术,用于发现目标系统开放的端口以及对应的网络服务和应用程序。通过对服务端程序的漏洞进行扫描,攻击者可以通过端口入侵目标系统。在端口扫描中,有两种常见的方式:UDP端口扫描和TCP端口扫描。

UDP端口扫描

UDP端口扫描是一种基于UDP协议的扫描方式。扫描者发送UDP数据包到目标系统的指定端口,根据收到的回包进行判断。如果收到ICMP端口不可达的回包,表示端口关闭;如果没有收到回包,则证明端口是开放的。与三层扫描的IP判断方式相反,UDP端口扫描是基于应用层的判断。

使用Scapy工具进行UDP端口扫描的命令示例:

sr1(IP(dst="192.168.45.129")/UDP(dport=53),timeout=1,verbose=1)

另外,nmap工具也提供了UDP扫描的功能:

nmap -sU 192.168.45.129

TCP端口扫描

TCP端口扫描是一种基于连接的协议的扫描方式。它利用正常的三次握手过程来发现目标系统是否在线。TCP端口扫描有几种常见的方式,包括隐蔽扫描、僵尸扫描和全连接扫描。

  • 隐蔽扫描:发送不完整的数据包,不建立完整的连接,如ACK包、SYN包。它不会在应用层访问,因此在应用层日志中不会记录扫描行为,非常隐蔽。但在网络层审计中可能会被发现迹象。
  • 僵尸扫描:不与目标系统产生交互,极为隐蔽。实施条件较为苛刻,需要实现地址伪造,并且使用闲置系统(具有递增的IPID)。早期的Windows XP和Windows 2000系统的IPID是递增的,而现在的Linux和Windows系统都是随机产生的IPID。
  1. 扫描者向僵尸机发送SYN+ACY数据包,僵尸机判断未进行三次握手,返回RST包。在RST数据包内有一个IPID,记为X,扫描者通过这个IPID可以得知被扫描者的IPID。
  2. 扫描者向目标服务器发送SYN数据包,并伪装源地址为僵尸机。如果目标服务器端口开放,就会向僵尸机发送SYN+ACK数据包,此时僵尸机也会发送RST数据包,其IPID为X+1。
  3. 扫描者再次向僵尸机发送SYN+ACK数据包,僵尸机再次发送RST数据包,IPID为X+2。如果扫描者收到僵尸机的IPID为X+2,就可以判断目标服务器端口开放。

使用Scapy工具发送数据包的示例:

首先开启三台虚拟机:
- Kali虚拟机: 192.168.45.128
- Linux虚拟机: 192.168.45.129
- Windows虚拟机: 192.168.45.132

发送SYN数据包:
通过抓包可以查看Kali向Linux发送的SYN数据包。Linux虚拟机返回SYN+ACK数据包给Kali,但Kali并不知道发送了SYN包,却收到了SYN+ACK数据包,于是发送RST包断开连接。

也可以使用以下命令查看收到的数据包的信息,如果收到对方相应的SYN+ACK数据包,Scapy默认从本机的80端口向目标系统的20号端口发送。当然,也可以修改端口号:

如果向目标系统发送一个随机端口:
通过抓包可以得到以下信息:
1. Kali向Linux发送SYN数据包,目标端口为23456。
2. Linux系统由自己的23456端口向Kali系统的20号端口返回RST+ACK数据包,表示系统端口未开放,会话结束。

使用Python脚本进行Scapy扫描。

隐蔽端口扫描工具

  • nmap工具可以进行隐蔽端口扫描,示例命令如下:

  • 扫描固定的端口:nmap -sS 192.168.45.129 -p 80,21,110,443

  • 扫描指定IP地址下的1-65535端口,并只显示开放的端口:nmap -sS 192.168.45.129 -p 1-65535 --open

  • 只显示开放的端口:nmap -sS 192.168.45.129 -p --open

  • 从iplist.txt文件中读取IP地址进行扫描:nmap -sS -iL iplist.txt -p 80

  • hping3工具也可以进行隐蔽端口扫描,示例命令如下:

  • 扫描单个或多个端口,-S表示进行SYN扫描:hping3 192.168.45.129 --scan 80 -S

  • 扫描1-65535端口:hping3 192.168.45.129 --scan 1-65535 -S

全连接端口扫描

全连接端口扫描是一种与目标系统建立完整的三次握手连接的扫描方式,结果最准确,但容易被入侵检测系统发现。

使用Scapy工具进行全连接端口扫描的示例命令:

response = sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="S"))
reply = sr1(IP(dst="192.168.45.129")/TCP(dport=80,flags="A",ack=(response[TCP].seq+1)))

全连接端口扫描的抓包情况如下:
首先,Kali向Linux发送SYN,Linux回复SYN+ACK给Kali。但Kali的系统内核不清楚Kali曾向Linux发送过SYN数据包,因此Kali莫名其妙收到SYN+ACK包,于是返回RST请求断开数据包给Linux,中断了三次握手。现在,Kali再次向Linux发送ACK确认数据包,Linux莫名其妙收到了ACK数据包,当然也会返回RST请求断开数据包。

如果Kali内核在收到SYN+ACK数据包之后不发送RST数据包,就可以建立完整的TCP三次握手,从而判断目标主机端口是否开放。通过配置iptables来禁用内核发送RST数据包,可以实现这一点。

使用nmap工具进行全连接端口扫描的示例命令(如果不指定端口,nmap默认会扫描1000个常用的端口,而不是1-1000号端口)。

使用dmitry工具进行全连接端口扫描的示例命令:
dmitry是一个功能简单但方便的工具,默认扫描150个最常用的端口。

使用nc工具进行全连接端口扫描的示例命令:

nc -nv -w 1 -z 192.168.45.129 1-100

以上是关于端口扫描和攻击面分析的内容。

赞(0)