Masscan TCP 端口扫描器

MASSCAN:海量 IP 端口扫描器

这是一款互联网级端口扫描器。它可以在 5 分钟内扫描整个互联网,每秒从一台机器传输 1000 万个数据包。

nmap它的用法(参数、输出)与最著名的端口扫描程序类似。如有疑问,请尝试其中一项功能 – 支持对多台机器进行广泛扫描的功能,但不支持对单台机器进行深入扫描。

其内部采用异步传输,类似于 scanrandunicornscan和 等端口扫描器ZMap。它更加灵活,允许任意端口和地址范围。

注意:masscan 使用自己的临时 TCP/IP 堆栈。除简单端口扫描之外的任何操作都可能导致与本地 TCP/IP 堆栈发生冲突。这意味着您需要使用选项--src-ip从不同的 IP 地址运行,或使用--src-port配置 masscan 使用的源端口,然后配置内部防火墙(如pfiptables)以将这些端口与操作系统的其余部分隔离开来。

此工具是免费的,但请考虑为其开发捐款:比特币钱包地址:1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T

构建

gcc 在 Debian/Ubuntu 上,它类似于以下内容。除了 C 编译器(例如或clang)之外,它实际上没有任何依赖项。

sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

这会将程序放入masscan/bin子目录中。要安装它(在 Linux 上),请运行:

make install

源代码包含许多小文件,因此使用多线程构建可以加快构建速度。这需要 Raspberry Pi 上超过 2GB 的内存(并且会中断),因此您可以使用较小的线程数,而-j4不是所有可能的线程。

make -j

虽然 Linux 是主要目标平台,但代码在许多其他系统(Windows、macOS 等)上运行良好。以下是一些其他构建信息:

  • 装有 Visual Studio 的 Windows:使用 VS10 项目
  • Windows 上安装 MinGW 时只需输入make
  • Windows 系统无法运行 cygwin
  • Mac OS X /w XCode:使用 XCode4 项目
  • Mac OS X /w cmdline:只需输入make
  • FreeBSD:类型gmake
  • 其他:尝试将所有文​​件编译在一起,cc src/*.c -o bin/masscan

在 macOS 上,x86 二进制文件在 ARM 仿真下似乎运行得一样快。

用法

使用方法与类似nmap。扫描某个网段的某些端口:

# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112

这将:

  • 扫描10.x.x.x子网和2603:3001:2d00:da00::x子网
  • 扫描两个子网上的 80 端口以及 8000 至 8100 范围(即总共 102 个端口)
  • 打印输出到<stdout>可以重定向到文件

要查看完整的选项列表,请使用该--echo功能。这将转储当前配置并退出。此输出可用作程序的输入:

# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000

端口检查

Masscan 的功能不仅仅只是检测端口是否开放,它还可以完成 TCP 连接并与该端口上的应用程序进行交互,以获取简单的“端口”信息。

Masscan 支持以下协议的端口检查:

  • FTP
  • HTTP
  • IMAP4
  • memcached
  • POP3
  • 邮件传输协议
  • SSH
  • SSL
  • 安全块版本1
  • SMB版本2
  • 远程登录
  • 远程桌面协议
  • 虚拟网络计算机

问题在于,masscan 包含自己的 TCP/IP 堆栈,独立于您运行它的系统。当本地系统从被探测目标收到 SYN-ACK 时,它会以 RST 数据包进行响应,从而在 masscan 抓取端口之前终止连接。

防止这种情况的最简单方法是为 masscan 分配一个单独的 IP 地址。这看起来像以下示例之一:

# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
  # masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d

您选择的地址必须位于本地子网中,并且不能被其他系统使用。Masscan 会警告您犯了一个错误,但您可能已经扰乱了其他机器的通信几分钟,所以要小心。

在某些情况下,例如 WiFi,这是不可能的。在这些情况下,您可以对 masscan 使用的端口进行防火墙保护。这可以防止本地 TCP/IP 堆栈看到数据包,但 masscan 仍然可以看到它,因为它绕过了本地堆栈。对于 Linux,这看起来像:

# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000

您可能希望选择与 Linux 可能选择的源端口不冲突的端口。您可以通过查看文件来查看 Linux 使用的范围并重新配置该范围:

/proc/sys/net/ipv4/ip_local_port_range

在最新版本的 Kali Linux(2018 年 8 月)中,该范围是 32768 到 60999,因此您应该选择低于 32768 或 61000 及以上的端口。

设置iptables规则仅持续到下次重启。您需要根据您的发行版查找如何保存配置,例如使用iptables-save 和/或iptables-persistent

在 Mac OS X 和 BSD 上,步骤类似。要找出要避免的范围,请使用以下命令:

# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last

在 FreeBSD 和较旧的 MacOS 上,使用ipfw命令:

# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000

在较新的 MacOS 和 OpenBSD 上,使用pf数据包过滤器实用程序。编辑文件/etc/pf.conf以添加如下行:

block in proto tcp from any to any port 40000:40015

然后启用防火墙,运行以下命令:

# pfctl -E    

如果防火墙已在运行,则使用以下命令重新启动或重新加载规则:

# pfctl -f /etc/pf.conf

Windows 不会使用 RST 数据包进行响应,因此这两种技术都不是必需的。但是,masscan 仍设计为使用自己的 IP 地址工作效果最佳,因此您应该尽可能以这种方式运行,即使不是绝对必要的。

其他检查也需要同样的事情,比如该--heartbleed检查只是横幅检查的一种形式。

如何扫描整个互联网

虽然该程序适用于较小的内部网络,但它实际上是为整个互联网设计的。它可能看起来像这样:

# masscan 0.0.0.0/0 -p0-65535

扫描整个互联网是不好的。一方面,互联网的某些部分对扫描反应不佳。另一方面,一些网站会跟踪扫描并将您添加到禁止列表中,这将使您无法访问互联网的有用部分。因此,您需要排除许多范围。要将范围列入黑名单或排除,您需要使用以下语法:

# 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 小时)即可扫描整个 Internet(减去排除)。

关于此命令行需要注意的是,这些都是nmap 兼容的选项。此外,nmap 还为您设置了兼容的“不可见”选项:-sS -Pn -n --randomize-hosts --send-eth。同样,XML 文件的格式也受到启发nmap。当然,存在很多差异,因为程序的异步性质导致了解决问题的根本不同方法。

上面的命令行有点麻烦。不必将所有内容都放在命令行上,而是可以将其存储在文件中。上面的设置如下所示:

# 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 首先加载配置文件 /etc/masscan/masscan.conf。任何后续配置参数都会覆盖此默认配置文件中的内容。我将“excludefile”参数放在那里,这样我就不会忘记它。它会自动运行。

获取输出

默认情况下,masscan 会生成相当大的文本文件,但很容易将它们转换为任何其他格式。支持五种输出格式:

  1. xml: 只需使用参数-oX <filename>。或者,使用参数--output-format xml--output-filename <filename>
  2. 二进制:这是 masscan 内置格式。它生成的文件小得多,因此当我扫描互联网时我的磁盘不会填满。但它们需要解析。命令行选项--readscan将读取二进制扫描文件。使用--readscan-oX选项将生成结果文件的 XML 版本。
  3. grepable:这是 Nmap -oG 输出的实现,可以通过命令行工具轻松解析。只需使用参数-oG <filename>。或者,使用参数--output-format grepable和 --output-filename <filename>
  4. json:这会以 JSON 格式保存结果。只需使用参数-oJ <filename>。或者,使用参数--output-format json和 --output-filename <filename>
  5. 列表:这是一个简单列表,每行一个主机和端口对。只需使用参数-oL <filename>。或者,使用参数 --output-format list--output-filename <filename>。格式为:<port state> <protocol> <port number> <IP address> <POSIX timestamp> open tcp 80 XXX.XXX.XXX.XXX 1390380064

与 Nmap 的比较

在合理的情况下,我们尽一切努力让nmap用户熟悉该程序,尽管它本质上是不同的。Masscan 适用于对大量机器进行大范围扫描,而 nmap 则适用于对单个机器或小范围进行密集扫描。

两个重要的区别是:

  • 没有默认端口可供扫描,您必须指定-p <ports>
  • 目标主机是 IP 地址或简单范围,而不是 DNS 名称,也不是可以使用的奇怪子网范围nmap(如10.0.0-255.0-255)。

您可以认为masscan以下设置已永久启用:

  • -sS:这仅执行 SYN 扫描(目前,将来会改变)
  • -Pn:不首先 ping 主机,这是异步操作的基础
  • -n:没有发生 DNS 解析
  • --randomize-hosts:扫描完全随机,始终,您无法更改此设置
  • --send-eth:使用 raw 发送libpcap

如果您需要更多兼容设置的列表nmap,请使用以下命令:

# masscan --nmap

传输速率(重要!!)

这个程序输出数据包的速度非常快。在 Windows 或虚拟机上,它每秒可以输出 300,000 个数据包。在 Linux(无虚拟化)上,它每秒可以输出 160 万个数据包。这个速度足以让大多数网络瘫痪。

请注意,它只会破坏您自己的网络。它会随机化目标 IP 地址,这样就不会破坏任何远程网络。

默认情况下,速率设置为 100 数据包/秒。要将速率提高到一百万,请使用类似 的命令--rate 1000000

扫描 IPv4 互联网时,您将扫描许多子网,因此即使传出的数据包速率很高,每个目标子网也会接收到少量的传入数据包。

然而,使用 IPv6 扫描时,您往往会关注具有数十亿个地址的单个目标子网。因此,您的默认行为将压垮目标网络。网络经常在 masscan 产生的负载下崩溃。

国内下载链接

© 版权声明
THE END
喜欢就支持一下吧
点赞103 分享