简介

masscan 是一个互联网规模的端口扫描器。它可以扫描整个互联网在 5 分钟内,每秒传输 1000 万个数据包, 来自一台机器。

它的用法(参数、输出)类似于 nmap,最著名的端口扫描器。如有疑问,请尝试其中一项功能——支持广泛使用的功能 支持多机扫描,同时支持单机深度扫描机器则不然。

内部使用异步传输,类似于端口扫描器喜欢 scanrand, unicornscan, 和 ZMap。它更加灵活,允许 任意端口和地址范围。

注意:masscan 使用自己的专用 TCP/IP 堆栈 。除了简单的端口扫描可能会导致与本地 TCP/IP 堆栈发生冲突。这意味着你需要使用 --src-ip 选项从不同的 IP 地址运行,或者使用 --src-port 配置 Masscan 使用的源端口,然后还配置内部防火墙(例如 pf 或者 iptables)对这些端口进行防火墙 来自操作系统的其余部分。 

MASSCAN 是传输 SYN 数据包的 TCP 端口扫描器异步并产生类似于 nmap 的结果, 最著名的端口扫描器。在内部,它运行更像是 scanrand、unicornscan 和 ZMap,使用异步传输。 它是一个灵活的实用程序,允许任意地址和端口范围。 

安装

源码安装

我们通过以下命令先克隆项目到本地,建议挂好代理。

git clone https://github.com/robertdavidgraham/masscan.git

之后进入masscan目录,查看一下

cd masscan/
ls

输入make,编译源码。

make

运行以下命令将程序放入 bin/masscan 子目录中

sudo make install

输入以下命令,如果出现这个界面就说明安装成功了。

masscan -h

APT包管理器安装

masscan 默认在Kali Linux里面安装好了。也可以通过以下命令进行安装

sudo apt install masscan

使用

1. -h / --help

查看 masscan 的帮助信息

masscan -h

masscan --help

2. 常规使用

用法 : masscan [options] [<IP|RANGE>... -pPORT[,PORT...]]

masscan 192.168.174.139 -p80

3. <ip/range>

命令行中任何不以 '-' 为前缀的内容都被视为 IP 地址或范围。有三种有效格式。

第一种是单个 IPv4 地址,如“192.168.0.1”。

masscan 192.168.174.145 -p80


第二种是范围,如“10.0.0.1-10.0.0.100”。

masscan 192.168.174.100-192.168.174.150 -p80

 

第三种是 CIDR 地址,如“0.0.0.0/0”。必须指定至少一个目标。可以指定多个目标。可以将其指定为用空格分隔的多个选项,也可以用逗号分隔为单个选项,例如 10.0.0.0/8,192.168.0.1

masscan 192.168.174.0/24 -p80

4. --range <ip/range>

与上面描述的目标范围规范相同,只是作为命名参数而不是未命名参数。

masscan --range 192.168.174.100-192.168.174.200 -p80

5. -p <ports, --ports <ports>

指定要扫描的端口。可以指定单个端口,如 -p80。可以指定端口范围,如 -p 20-25。可以指定端口/范围列表,如 -p80,20-25。还可以指定 UDP 端口,如 --ports U:161,U:1024-1100

masscan 204.79.197.200 -p80

masscan 204.79.197.200 -p 50-80

masscan 192.168.174.132 -p80,20-25

masscan 204.79.197.200 --ports U:161,U:1024-1100

6.  --banners

指定应抓取的横幅,如 HTTP 服务器版本、HTML 标题字段等。仅支持少数协议。

masscan 204.79.197.200 -p80 --banners

7. --rate <packets-per-second>

指定传输数据包所需的速率。这个值可以是非常小的数字,例如 0.1,表示以每 10 秒一个的速率传输数据包;也可以是非常大的数字,例如 10000000,表示尝试以每秒 1000 万个数据包的速度传输数据包。根据我的经验,Windows 可以达到每秒 25 万个数据包,而最新版本的 Linux 可以达到每秒 250 万个数据包。要达到每秒 2500 万个数据包的速度,需要 PF_RING 驱动程序。

masscan --range 192.168.174.0/24 -p80,1000-2000 --rate 10000

8. -c <filename>, --conf <filename>

读入配置文件。配置文件的格式如下所述。

masscan -c config.conf

 通过扫描可以看到我们输出了结果文件。

9. --resume <filename>

--conf 相同,但会自动设置一些选项,例如 --append-output。配置文件的格式如下所述。

当用户按下 ctrl-c 时,扫描将停止,并且扫描的当前状态将保存在文件“paused.conf”中。可以使用 --resume 选项恢复扫描:

masscan --resume paused.conf

程序不会立即退出,而是会等待默认的 10 秒以从互联网接收结果并保存结果,然后完全退出。可以使用 --wait 选项更改此时间。

10. --echo

不运行,而是将当前配置转储到文件中。然后可以将此文件与 -c 选项一起使用。此输出的格式在下文的“配置文件”中描述。

masscan --range 192.168.174.0/24 -p80,8000-8100 --echo > xxx.conf

11. -e <ifname>, --adapter <ifname>

使用命名的原始网络接口,例如“eth0”或“dna1”。如果未指定,则将使用找到的第一个具有默认网关的网络接口。

masscan --range 192.168.174.0/24 -p 1-1000 --rate 10000 -e eth0

12. --adapter-ip <ip-address>

使用此 IP 地址发送数据包。如果未指定,则将使用绑定到网络接口的第一个 IP 地址。可以指定一个范围,而不是单个 IP 地址。注意:范围的大小必须是 2 的偶数次方,例如 1、2、4、8、16、1024 等地址。

masscan --range 39.156.66.10 -p 1-100 --rate 10000 --adapter-ip 192.168.174.134

13. --adapter-port <port>

使用此端口号作为源发送数据包。如果未指定,将在 40000 到 60000 范围内随机选择一个端口。此端口应由主机防火墙(如 iptables)过滤,以防止主机网络堆栈干扰到达的数据包。可以指定一个范围,而不是单个端口,如 40000-40003。注意:范围的大小必须是 2 的偶数幂,例如上面的例子总共有 4 个地址。

masscan --range 39.156.66.10 -p 1-1000 --rate 10000 --adapter-port 40000

14. --adapter-mac <mac-address>

使用此地址作为源 MAC 地址发送数据包。如果未指定,则将使用绑定到网络接口的第一个 MAC 地址。

masscan --range 39.156.66.10 -p 1-10000 --rate 10000 --adapter-mac 00-11-22-33-44-55

15. --router-mac <mac address>

将数据包发送到此 MAC 地址作为目的地。如果未指定,则将对网络接口的网关地址进行 ARP。

masscan --range 39.156.66.10 -p 1-10000 --rate 10000 --router-mac 66-55-44-33-22-11

16. --ping

表示扫描应包含 ICMP 回显请求。这可能包含在 TCP 和 UDP 扫描中。

masscan --range 192.168.174.0/24 -p 1-10000 --rate 10000 --ping

17. --exclude <ip/range>

将 IP 地址或范围列入黑名单,防止其被扫描。这将覆盖任何目标规范,保证不会扫描此地址/范围。其格式与常规目标规范相同。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --exclude 192.168.174.145

18. --excludefile <filename>

以上述相同的目标格式读入排除范围列表。这些范围将覆盖任何目标,防止其被扫描。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --excludefile exclude.txt

19. --append-output

使输出附加到文件,而不是覆盖文件。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --append-output

20. --iflist

列出可用的网络接口,然后退出。

masscan --iflist

21. --retries

发送重试次数,间隔 1 秒。请注意,由于此扫描仪是无状态的,因此无论是否已收到回复,都会发送重试。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --retries 3

22. --nmap

打印有关这些选项的 nmap 兼容性替代方案的帮助。

masscan --nmap

23. --pcap-payloads

从包含数据包的 libpcap 文件中读取数据包并提取 UDP 有效负载,并将这些有效负载与目标端口关联。然后,在发送具有匹配目标端口的 UDP 数据包时将使用这些有效负载。每个端口只会记住一个有效负载。类似于 --nmap-payloads

masscan 192.168.1.0/24 -p53 --rate=1000 --pcap-payloads udp_packets.pcap

24. --nmap-payloads <filename>

以与 nmap 文件 nmap-payloads 相同的格式读取文件。这包含 UDP 有效负载,以便我们可以发送有用的 UDP 数据包而不是空数据包。类似于 --pcap-payloads

masscan 192.168.1.0/24 -p161 --rate=500 --nmap-payloads nmap-payloads

25. --http-user-agent <user-agent>

在执行 HTTP 请求时,用指示的值替换现有的 user-agent字段。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --http-user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

26. --open-only

仅报告开放端口,不报告关闭端口。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --open-only

27.  --pcap <filename>

将接收到的数据包(但不发送的数据包)保存到 libpcap 格式的文件中。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --pcap output.pcap

 通过输出,我们得到pacp文件。

我们可以使用 WireShark 去打开查看文件。

28. --packet-trace

打印发送和接收的数据包的摘要。这在低速率(例如每秒几个数据包)下很有用,但在高速率下会使终端不堪重负。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --packet-trace

29. --pfring

强制使用 PF_RING 驱动程序。如果 PF_RING DNA 驱动程序不可用,程序将退出。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --pfring

30. --resume-index

扫描暂停时的点。

masscan --range 192.168.174.0/24 -p80 --rate 1000 --resume-index 10

31. --resume-count

退出前要发送的最大探测数。这在与 --resume-index 一起使用时很有用,可以分割扫描并将其拆分到多个实例中,尽​​管 --shards 选项可能更好。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --resume-index 100 --resume-count 50

32. --shards <x>/<y>

在实例之间拆分扫描。x 是此扫描的 ID,而 y 是实例总数。例如,--shards 1/2 指示实例发送每隔一个数据包,从索引 0 开始。同样,--shards 2/2 发送每隔一个数据包,但从索引 1 开始,这样它就不会与第一个示例重叠。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --shards 1/2

33. --rotate <time>

旋转输出文件,使用当前时间戳重命名,将其移动到单独的目录。时间以秒数指定,例如“3600”表示一小时。或者,可以指定时间单位,例如“ hourly ”或“ 6hours ”或“ 10min ”。时间在偶数边界上对齐,因此如果指定“ daily ”,则文件将在每天午夜旋转。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --rotate 3600

34. --rotate-offset <time>

时间偏移量。这是为了适应时区。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --rotate 3600 --rotate-offset 30min

35. --rotate-dir <directory>

旋转文件时,指定将文件移动到哪个目录。一个有用的目录是 /var/log/masscan。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --rotate 3600 --rotate-dir /var/log/masscan

36. --seed <integer>

为随机数生成器设定种子的整数。使用不同的种子将导致数据包以不同的随机顺序发送。除了整数,还可以指定字符串 time,该字符串使用本地时间戳设定种子,自动生成不同的随机扫描顺序。如果没有指定种子,则 time 为默认值。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --seed 23

37. --regress

运行回归测试,成功时返回“0”,失败时返回“1”。

masscan --regress

38.  --ttl <num>

指定传出数据包的 TTL,默认为 255。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --ttl 255

39. --wait <seconds>

指定在传输完成后等待接收数据包的秒数,然后退出程序。默认值为 10 秒。可以指定字符串 forever,表示永不终止。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --wait 10

40. --offline

实际上不传输数据包。这在低速率和 --packet-trace 时很有用,可以查看可能已传输的数据包。或者,使用 --rate 100000000 来测试传输速度(假设零开销驱动程序)。PF_RING 比离线模式的基准测试结果慢约 20%。

masscan 192.168.1.0/24 -p80 --rate=10 --offline --packet-trace

41. -sL

这不会进行扫描,而是创建一个随机地址列表。这对于导入到其他工具中很有用。选项 --shard--resume-index--resume-count 可以与此功能一起使用。

masscan --range 192.168.174.0/24 -p22 --rate 1000 -sL

42. --interactive

在控制台上实时显示结果。如果与 --output-format 或 --output-filename 一起使用,则无效。

masscan --range 192.168.174.0/24 -p22 --rate 1000 --interactive

43. --output-format <fmt>

表示输出文件的格式,可以是 xmlbinarygrepablelistJSON。必须指定选项 --output-filename

44. --output-filename <filename>

保存结果的文件。如果未指定参数 --output-format,则将使用默认的 xml

masscan --range 192.168.174.0/24 -p22 --rate 1000 --output-format xml --output-filename output.xml

45. -oB <filename>

将输出格式设置为二进制并将输出保存在给定的文件名中。这相当于使用 --output-format--output-filename 参数。然后可以使用选项 --readscan 读取二进制文件。二进制文件比 XML 等效文件小得多,但需要单独的步骤才能转换回 XML 或其他可读格式。

masscan --range 192.168.174.0/24 -p22 --rate 1000 -oB result

masscan --readscan result

46. -oX <filename>

将输出格式设置为 XML 并将输出保存在给定的文件名中。这相当于使用 --output-format xml--output-filename 参数。

masscan --range 192.168.174.0/24 -p22 --rate 1000 -oX xml_result

47. -oG <filename>

将输出格式设置为 grepable 并将输出保存在给定的文件名中。这相当于使用 --output-format grepable 和 --output-filename 参数。

masscan --range 192.168.174.0/24 -p22 --rate 1000 -oG grepable_result

48. -oJ <filename>

将输出格式设置为 JSON 并将输出保存在给定的文件名中。这相当于使用 --output-format json 和 --output-filename 参数。

 masscan --range 192.168.174.0/24 -p22 --rate 1000 -oJ json_result

49. -oL <filename>

将输出格式设置为简单列表格式并将输出保存在给定的文件名中。这相当于使用 --output-format list 和 --output-filename 参数。

masscan --range 192.168.174.0/24 -p22 --rate 1000 -oL list_result

50. --readscan <binary-files>

从扫描中读取由 -oB 选项创建的文件,然后根据命令行参数以其他格式之一输出它们。换句话说,它可以获取输出的二进制版本并将其转换为XML 或 JSON 格式。

masscan --readscan result

简单示例

1. 以下示例扫描所有私有网络中的 Web 服务器,并打印找到的所有开放端口。

masscan 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 -p80 --open-only

2. 以下示例扫描整个 Internet 中的 DNS 服务器,获取其版本,然后将结果保存在 XML 文件中。

masscan 0.0.0.0/0 --excludefile no-dod.txt -pU:53 --banners --output-filename dns.xml

您应该能够将 XML 导入数据库等。

3. 以下示例读取名为 bin-test.scan 的二进制扫描结果文件,并将结果打印到控制台。

masscan --readscan bin-test.scan

4. 以下示例读取名为 bin-test.scan 的二进制扫描结果文件并创建名为 bin-test.xml 的 XML 输出文件。

masscan --readscan bin-test.scan -oX bin-test.xml

高级示例

1. 假设您要扫描整个互联网并将扫描分散到三台机器上。使用以下命令行可在所有三台机器上启动 Masscan:

masscan 0.0.0.0/0 -p0-65535 --shard 1/3 --seed 100 --exclude 255.255.255.255
masscan 0.0.0.0/0 -p0-65535 --shard 2/3 --seed 100 --exclude 255.255.255.255
masscan 0.0.0.0/0 -p0-65535 --shard 3/3 --seed 100 --exclude 255.255.255.255

2. 另一种方法是使用“恢复”功能。扫描具有内部索引,该索引从零到端口数乘以 IP 地址数。以下示例显示将扫描拆分为每 1000 个项目的块:

masscan 0.0.0.0/0 -p0-65535 --exclude 255.255.255.255 --resume-index 0 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --exclude 255.255.255.255 --resume-index 1000 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --exclude 255.255.255.255 --resume-index 2000 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --exclude 255.255.255.255 --resume-index 3000 --resume-count 1000

脚本可以使用它将较小的任务拆分到许多其他机器上,例如 Amazon EC2 实例。当每个实例完成一项作业时,脚本可能会向中央协调服务器发送请求以完成更多工作。

虚假重置

使用适配器的默认 IP 地址扫描 TCP 时,内置堆栈将生成 RST 数据包。这将防止横幅抓取。有两种方法可以解决这个问题。第一种方法是创建一个防火墙规则,阻止堆栈看到该端口。其工作原理取决于操作系统,但在 Linux 上,它看起来像:

iptables -A INPUT -p tcp -i eth0 --dport 61234 -j DROP

然后,在扫描时,必须使用相同的端口作为源:

masscan 10.0.0.0/8 -p80 --banners --adapter-port 61234

另一种方法是“欺骗”不同的 IP 地址。此 IP 地址必须在本地网络范围内,但不得被您自己的计算机或网络上的其他计算机使用。例如:

masscan 10.0.0.0/8 -p80 --banners --adapter-ip 192.168.1.101

以这种方式设置源 IP 地址是运行此扫描仪的首选方式。

总结

Masscan是一款高效的端口扫描工具,其强大的并发能力和灵活的参数配置适用于大规模网络扫描。合理使用Masscan能极大提升渗透测试效率,但需遵守法律与道德规范,避免滥用。

在此特别强调,本教程仅在合法授权的情况下进行测试和研究,请勿用于其他用途。未经授权使用此类工具可能会侵犯他人隐私,触犯相关法律,任何因此引发的法律或利益纠纷与本人无关。

欢迎各位大佬,小白来找我交流。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐