端口扫描,是网络安全中非常常用的技术手段。通过对于特定的IP范围和端口范围进行穷举扫描,发现网络中开放的端口,从而为进一步的探查提供基本信息。端口扫描一般针对TCP端口进行,利用TCP的三次握手建立连接的原理,通过连接是否成功来判断端口是否开放。端口扫描对于时间性能要求较高,耗时过长的扫描将大大降低扫描结果的可靠性。Masscan,是一个互联网级别的高性能端口扫描工具,使用SYN包检测技术,号称能够在5分钟内完成对整个互联网所有的IP进行扫描。
masscan - 互联网级别的端口扫描
Masscan,是 robertdavidgraham 在 Github 上开源的端口扫描工具,项目代码位于 https://github.com/robertdavidgraham/masscan,目前版本为 1.0.5。
Masscan 性能优越,极限速度可以从单机每秒发送1000万个数据包。Masscan 使用了与另一个著名的扫描工具 —— nmap 类似的命令行参数,方便进行上手使用。
Masscan 针对 TCP 端口进行扫描,使用 SYN 扫描的方式,不建立一个完全的 TCP 连接,而是首先发送一个 SYN 数据包到目标端口,然后等待接收。如果接收到 SYN-ACK 包,则说明该端口是开放的,此时发送一个 RST 结束建立过程即可;否则,若目标返回 RST,则端口不开放。
TCP三次握手
Masscan 在其内部使用异步传输,更为灵活,允许任意的IP和端口范围,并使用了随机化的目标扫描,使得对于非连续段IP的扫描更加高效,解决了范围切分带来的性能损失问题,且降低了对于目标网络的负载压力,提高了自由度和性能。
Github项目
Masscan 可以从源码进行编译,在 Debian/Ubuntu 平台上,使用命令:
$ sudo apt-get install git gcc make libpcap-dev
$ git clone https://github.com/robertdavidgraham/masscan
$ cd masscan
$ make
编译得到的二进制程序位于子文件夹 masscan/bin。由于代码中包含了大量的小文件,可以开启多线程模式进行编译:
$ make -j
在其他操作系统上,也可以进行相应的安装:
想要获得超过200万数据包/秒的超高扫描速度,需要使用 Intel 10-gbps 以太网适配器,以及 PF_RING ZC 驱动,编译时需要 libpfring.so,pf_ring.ko 和 ixgbe.ko。
Masscan 的主体是一个命令行工具 masscan,可以指定IP网段和端口进行扫描:
masscan -p80,8000-8100 10.0.0.0/8
在这个命令中,指定对网段 10.0.0.0/8,也即是 10.x.x.x 共约1600万IP进行扫描,扫描它们的80端口,以及从8000到8100的端口,每个IP扫描102个端口。
Masscan 提供了echo选项,可以把当前命令的配置保存下来,然后在其他masscan命令直接引用:
# masscan -p80,8000-8100 10.0.0.0/8 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
在这里,把指定的网段和端口等的配置参数使用echo进行保存,随后使用-c命令导入,方便了对于复杂参数配置的重复使用。
Masscan 提供了进一步的应用信息识别,也称banner信息,可以识别在各端口上运行的服务的类型。可以使用--banners参数,并指定一个内网IP,来实现banner扫描:
masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
如果你哪一天心血来潮,想要对整个互联网,也即是所有IPv4的IP地址,以及所有65536个TCP端口进行扫描,masscan也是可以实现的:
masscan 0.0.0.0/0 -p0-65535
当然,这并没有太大的意义,可能会产生性能问题,对你本地的网络产生难以承受的负荷,也可能会使你的IP被加入到某些网络的黑名单中。我们可以使用参数--excludefile对某些我们不需要的网络进行排除:
masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
当然,对于如此大量的数据输出,你不会想让程序输出到命令行的。可以指定输出文件:
masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
这里我们使用-oX参数把结果输出到XML文件,也可以使用其他的文件格式,支持的文件格式包括:xml、grepable、json、简单列表和二进制等。
默认情况下,masscan会把扫描速度限制在100数据包/秒,我们需要使用--max-rate指定一个更高的扫描速度:
masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
如果你觉得命令行参数太麻烦了,也可以编写配置文件:
# My Scan
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
使用-c参数引用执行:
masscan -c myscan.conf
互联网扫描
Masscan 作为一个端口扫描工具,具备优秀的性能,能够在短时间内对大量的IP和端口进行是否开放的扫描,使用简单,相比于NMAP等工具来说更容易上手,是网络安全领域的优秀工具。Masscan使用C语言编写,核心部分使用C90编写,包含了大量TCP协议相关,以及操作系统相关的底层代码,代码注释完善,十分详尽,结构清晰,是十分值得学习的C语言网络项目。