MASSCAN – 海量IP端口扫描仪
MASSCAN是一个Internet端口扫描程序。它可以在6分钟内扫描整个互联网,每秒传输1000万个数据包。
它产生类似于“ nmap ”的结果,这是最着名的端口扫描器。内部,它的操作更像“ scanrand ”,“ unicornscan ”和“ ZMAP ”,使用异步传输。主要区别在于它比其他扫描仪更快。此外,它更灵活,允许任意地址范围和端口范围。
它使用自定义TCP / IP堆栈。除简单端口扫描之外的任何其他操作都将导致与本地TCP / IP堆栈冲突。这意味着您需要使用-S选项来使用单独的IP地址,或者将操作系统配置为防火墙MASSCAN使用的端口。
这个程序非常快速地发出数据包。在Windows或VM上,它可以执行300,000个数据包/秒。在Linux(没有虚拟化)上,它每秒会产生160万个数据包。这足以让大多数网络融化。
请注意,它只会融化您自己的网络。它使目标IP地址随机化,以便它不会压倒任何远程网络。
默认情况下,速率设置为100包/秒。要将速率提高到一百万,请使用像--rate 1000000这样的东西。
建造在Debian / Ubuntu上,它是这样的:
$ sudo apt-get install git gcc make libpcap-dev$ git clone https://github.com/robertdavidgraham/masscan$ cd masscan$ make这将程序放在masscan / bin子目录中。如果要将其安装在系统的其他位置,则必须手动将其复制到/ usr / local / bin之类的内容。
源包含许多小文件,因此使用多线程构建可以更快地构建:
$ make -j
虽然Linux是主要的目标平台,但代码在许多其他系统上运行良好。这是一些额外的构建信息:
-
Windows w / Visual Studio:使用VS10项目
-
Windows与MingGW:只需键入make
-
Windows w / cygwin:不起作用
-
Mac OS X / w XCode:使用XCode4项目
-
Mac OS X / w cmdline:只需键入make
-
FreeBSD:输入gmake
要超过200万包/秒,您需要一个Intel 10-gbps以太网适配器和一个称为“ PF_RING ZC ” 的特殊驱动程序。为了使用PF_RING,不需要重建MASSCAN。要使用PF_RING,您需要构建以下组件:
-
libpfring.so(安装在/usr/lib/libpfring.so中)
-
pf_ring.ko(他们的内核驱动程序)
-
ixgbe.ko(他们的英特尔10-gbps以太网驱动程序版本)
您不需要构建他们的libpcap.so版本。
当MASSCAN检测到适配器的名称类似于zc:enp1s0而不是类似enp1s0时,它将自动切换到PF_RING ZC模式。
回归测试该项目包含一个内置的自测:
$ make退步bin / masscan - regress自测:成功!
这测试了很多棘手的代码。你应该在建造之后这样做。
性能测试要测试性能,请执行以下操作:
$ bin / masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11伪造的--router-mac将数据包保存在本地网段上,这样它们就不会出在Internet上。
您还可以在“离线”模式下进行测试,这是程序在没有传输开销的情况下运行的速度:
$ bin / masscan 0.0.0.0/4 -p80 --rate 100000000 --offline第二个基准测
大致显示了程序在使用PF_RING时运行的速度,PF_RING的开销几乎为零。
用法用法类似于nmap。要扫描某些端口的网段:
#masscan -p80,8000-8100 10.0.0.0/8这将扫描10.xxx子网,所有1600万个地址,扫描端口80和范围8000到8100,或总共102个地址,并打印输出到<stdout>,可以重定向到文件。
要查看完整的选项列表,请使用--echo功能。这会转储当前配置并退出。此输出可用作程序的输入:
#masscan -p80,8000-8100 10.0.0.0/8 --echo> xxx.conf#masscan -c xxx.conf - 1000
横幅检查MASSCAN可以做的不仅仅是检测端口是否打开。它还可以完成TCP连接以及与该端口上的应用程序的交互,以获取简单的“横幅”信息。
这个问题是MASSCAN包含自己的TCP / IP堆栈,与您运行它的系统分开。当本地系统从被探测目标接收到SYN-ACK时,它会响应一个RST数据包,该数据包在MASSCAN可以获取横幅之前终止连接。
防止这种情况的最简单方法是为MASSCAN分配一个单独的IP地址。这将如下所示:
#masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200您选择的地址必须位于本地子网上,否则不会被其他系统使用。
在某些情况下,例如WiFi,这是不可能的。在这些情况下,您可以防火墙MASSCAN使用的端口。这可以防止本地TCP / IP堆栈看到数据包,但是MASSCAN仍然可以看到它,因为它绕过了本地堆栈。对于Linux,这看起来像:
#iptables -A INPUT -p tcp --dport 60000 -j DROP#masscan 10.0.0.0/8 -p80 --banners --source-port 60000在Mac OS X和BSD上,它可能如下所示:
#sudo ipfw从任何60000 in中添加1 deny tcp#masscan 10.0.0.0/8 -p80 --banners --source-port 60000Windows不响应RST数据包,因此这些技术都不是必需的。但是,MASSCAN仍然设计为使用自己的IP地址工作得最好,所以你应该在可能的情况下运行,即使它不是绝对必要的。
其他检查也需要同样的事情,例如--heartbleed check,这只是一种横幅检查。
如何扫描整个Internet虽然对于较小的内部网络很有用,但该程序的设计考虑了整个互联网。它可能看起来像这样:
#masscan 0.0.0.0/0 -p0-65535扫描整个互联网很糟糕。首先,互联网的某些部分对扫描的反应很糟糕。另一方面,一些网站会跟踪扫描并将您添加到禁止列表中,这将使您从Internet的有用部分中获取防火墙。因此,您想要排除很多范围。要将黑名单排除或排除范围,您需要使用以下语法:
#masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt这只是将结果打印到命令行。您可能希望将它们保存到文件中。因此,您需要以下内容:
#masscan 0.0.0.0/0 -p0-65535 -oX scan.xml这会将结果保存在XML文件中,使您可以轻松地将结果转储到数据库或其他内容中。
但是,这只是默认速率为100包/秒,这将永远扫描互联网。你需要加快速度:
#masscan 0.0.0.0/0 -p0-65535 --max-rate 100000这会将速率提高到100,000个数据包/秒,这将扫描整个互联网(减去排除)每个端口大约10个小时(如果扫描所有端口则为655,360小时)。
关于这个命令行的注意事项是这些都是nmap兼容的选项。此外,还为您设置了与nmap兼容的“隐形”选项:-sS -Pn -n --randomize-hosts --send-eth。同样,XML文件的格式受nmap的启发。当然,存在很多差异,因为程序的异步性质导致了对问题的根本不同的方法。
上面的命令行有点麻烦。它可以存储在文件中,而不是将所有内容放在命令行上。以上设置如下所示:
#我的扫描率= 100000.00output-format = xmloutput-status = alloutput-filename = scan.xmlports = 0-65535range = 0.0.0.0-255.255.255.255excludefile = exclude.txt要使用此配置文件,请使用-c:
#masscan -c myscan.conf重复扫描时,这也使事情变得更容易。
默认情况下,MASSCAN首先加载配置文件/etc/masscan/masscan.conf。任何后续配置参数都会覆盖此默认配置文件中的内容。这就是我放置“ excludefile ”参数的地方,所以我永远不会忘记它。它只是自动工作。
产量默认情况下,MASSCAN会生成相当大的文本文件,但很容易将它们转换为任何其他格式。有五种支持的输出格式:
-
xml:只需使用参数-oX <filename>。或者,使用参数--output-format xml和--output-filename <filename>。
-
binary:这是MASSCAN内置格式。它会生成更小的文件,因此当我扫描Internet时,我的磁盘不会填满。但是,它们需要被解析。命令行选项--readscan将读取二进制扫描文件。将--readscan与-oX选项一起使用将生成结果文件的XML版本。
-
grepable:这是Nmap -oG输出的一个实现,可以通过命令行工具轻松解析。只需使用参数-oG <filename>。或者,使用参数--output-format grepable和--output-filename <filename>。
-
json:这会以JSON格式保存结果。只需使用参数-oJ <filename>。或者,使用参数--output-format json和--output-filename <filename>。
-
list:这是一个简单的列表,每行有一个主机和端口对。只需使用参数-oL <filename>。或者,使用参数--output-format list和--output-filename <filename>。
-
格式为:
<端口状态> <协议> <端口号> <IP地址> <POSIX时间戳> 打开tcp 80 XXX.XXX.XXX.XXX 1390380064
下载链接::https://github.com/robertdavidgraham/masscan/releases