端口扫描 - scapy - 全链接扫描

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 包的过程如下:

端口扫描 - scapy - 全链接扫描_第1张图片

然后就是目标服务器返回的 syn/ack 包,如下:

端口扫描 - scapy - 全链接扫描_第2张图片

然后就是自己机器收到 syn/ack 后,发送的 ack 包,如下:

端口扫描 - scapy - 全链接扫描_第3张图片

因为自己机器莫名其妙的收到了一个 syn/ack,所以会先发一个 rst,这时目标服务器莫名其妙的收到了一个 rst,也会回一个 rst,如下:

端口扫描 - scapy - 全链接扫描_第4张图片

通过 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 当前的规则列表,如下图:

端口扫描 - scapy - 全链接扫描_第5张图片

添加规则后重新执行脚本,前几个包都一样,最后一个包返回的就不在是 rst 了,而是 ack 包,如下:

端口扫描 - scapy - 全链接扫描_第6张图片

这时,再通过 wireshark 抓包看下脚本的执行过程,如下:

请输入图片描述

0x02:总结

通过之前的 scapy 总结,不论是各个层的主机发现,还是 udp 和 tcp 的端口发现,都很强大很好用。但 scapy 在全链接端口扫描时,可以发现其实是有点麻烦的,当隐蔽扫描无法正常扫描时,可以考虑使用全链接的方式,相对还有一个强大的方便的工具,就是 nmap 了,nmap 下篇继续介绍。

公众号回复数字“8”领取CIS加固全套手册。

微 信:fageweiketang,朋友圈不定期干货分享,欢迎讨论。

公众号:发哥微课堂,专注于代码审计、WEB渗透、网络安全。

 端口扫描 - scapy - 全链接扫描_第7张图片                    端口扫描 - scapy - 全链接扫描_第8张图片

你可能感兴趣的:(渗透测试,信息搜集)