masscan

简介

Masscan,是 robertdavidgraham 在 Github 上开源的端口扫描工具,项目代码位于 https://github.com/robertdavidgraham/masscan。

Masscan 性能优越,极限速度可以从单机每秒发送1000万个数据包。Masscan号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。

Masscan 针对 TCP 端口进行扫描,使用 SYN 扫描的方式,不建立一个完全的 TCP 连接,而是首先发送一个 SYN 数据包到目标端口,然后等待接收。如果接收到 SYN-ACK 包,则说明该端口是开放的,此时发送一个 RST 结束建立过程即可;否则,若目标返回 RST,则端口不开放。

Masscan 在其内部使用异步传输,更为灵活,允许任意的IP和端口范围,并使用了随机化的目标扫描,使得对于非连续段IP的扫描更加高效,解决了范围切分带来的性能损失问题,且降低了对于目标网络的负载压力,提高了自由度和性能。

masscan 和 nmap

  • Masscan 使用了与另一个著名的扫描工具 nmap 类似的命令行参数,方便进行上手使用。
  • Masscan 的扫描结果类似于 nmap。在内部,它更像 scanrand, unicornscan, and ZMap,采用了异步传输的方式。它和这些扫描器最主要的区别是,它比这些扫描器更快。而且 masscan 更加灵活,它允许自定义任意的地址范和端口范围。

安装配置

Debian/Ubuntu

1
2
3
4
sudo apt-get install git gcc make libpcap-dev
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make # 您也可以使用多线程加快编译速度 make -j

注:安装完成后的可执行程序在masscan/bin中

PF_RING

如果您想获得超过两百万每秒的速度,您需要一个英特尔10-Gbps网卡和一个被称为PF_RING DNA(http://www.ntop.org/products/pf_ring/)的特殊驱动程序。masscan 使用 PF_RING 不要进行重建,你只需要建立以下组件即可:

1
2
3
4
libpfring.so (安装于 /usr/lib/libpfring.so)
pf_ring.ko (pf_ring自己的内核驱动)
ixgbe.ko (英特尔10-gbps网卡驱动)
你不要建立自己的libpcap.so

当masscan检测到网卡为dna0时,将自动切换为PF_RING模式

测试

当安装完成是可以测试一下是否安装成功:

1
2
3
make regress
bin/masscan --regress
selftest: success!

使用方法

使用方法类似于 nmap,扫描指定网段范围的指定端口

1
masscan -p80,8080-8100 10.0.0.0/8  # 扫描10.x.x.x子网,大约有1600 万个地址, 扫描端口 80 和 8000-8100 范围的端口段

Masscan 提供了echo 选项,可以把当前命令的配置保存下来,然后在其他 masscan 命令直接引用

1
# masscan -p80,8000-8100 10.0.0.0/8 --echo > xxx.conf

masscan 不仅仅只是测试端口是否开放,它还能在完成 TCP 连接的同时获取目标应用程序的 Banner 信息(–banners选项值旗标,或者指纹)。

1
masscan 10.0.0.0/8 -p80 --banners --source-ip x.x.x.x  # 扫描10.x.x.x网段80端口的开放信息,并且获取banner信息。–source-ip 是指定源IP,这个ip必须指定独立有效的IP地址。

您可以通过配置防火墙来防止 masscan 的返回不了信息的情况

Linux 可以在这样配置

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

MAC OS X 和 BSD 可以这样配置

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

扫描时忽略一些网段

我们可以通过设置黑名单来让扫描器扫描时忽略一些网段。语法如下:

1
masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt

结果输出到文件

你也可以把扫描的结果不输出到命令行,输出到指定文件中

1
masscan 0.0.0.0/0 -p0-65535 -oX scan.xml

这条命令把扫描的结果保存在一个XML文件中

提高发包速率

当前的扫描器使用的是默认的速率100包/秒,如果是扫描全网的话,需要提高速度。

1
masscan 0.0.0.0/0 -p0-65535 --max-rate 100000  # 这条命令将以每秒10万包的速率进行扫描

masscan 的发包速度非常快,在 windows 中,它的发包速度可以达到每秒 30 万包;在 Linux 中,速度可以达到每秒 160 万。masscan 在扫描时会随机选择目标 IP,所以不会对远程的主机造成压力。

我们注意到 zmap 和 masscan 都有一个控制发包速率的参数,为什么需要这个参数呢?不是越高越好吗?不是的,这个参数的设置直接影响漏报。

一般家用 adsl 的上行速度在 100kb/s-300kb/s 之间,以互联网最小包 60byte 计算,100kb/s=1746 pps,也就是说每秒发送数据包约2000 个,超出就容易丢包漏报。通过这个公式不难得出在一个家庭 adsl 环境下且保证准确度,用 zmap 扫描全部互联网需要255*255*255*255/2000/3600/24=24天

使用配置文件

上述的这些命令可能输入起来有点麻烦,我们可以通过创建配置文件,然后用加载配置文件的方式运行。配置文件的内容如下所示:

1
2
3
4
5
6
7
rate = 100000
output-format = xxx
output-status = all
output-filename = xxx.xxx
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt

扫描时,用 -c 加载配置文件,这样的话,你进行重复扫描会省很多的力气。

结果输出

主要有5种输出的格式:

  1. XML 默认格式。使用 -oX <filename> 或者使用 -output-format xml-output-filename <filename> 进行指定
  2. binary masscan 内置格式。masscan --open --banners --readscan output.txt -oX 2.txt 打开显示模式,读取 output.txt 中的数据,并以 xml 的格式写到 2.txt 中
  3. grepable nmap 格式。使用 -oG <filename> 或者 -output-format grepable-output-filename <filename> 进行指定
  4. json 使用。-oJ <filename> 或者 -output-format json-output-filename <filename> 进行指定
  5. list 简单的列表,每行一个主机端口对。使用 -oL <filename> 或者 -output-format list-output-filename <filename> 进行指定

详细参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<ip/range> IP地址范围,有三种有效格式:
1、单独的IPv4地址
2、类似"10.0.0.1-10.0.0.233"的范围地址
3CIDR地址 类似于"0.0.0.0/0",多个目标可以用都好隔开

-p <ports,--ports <ports>> 指定端口进行扫描

--banners 获取banner信息,支持少量的协议

--rate <packets-per-second> 指定发包的速率

-c <filename>, --conf <filename> 读取配置文件进行扫描

--echo 将当前的配置重定向到一个配置文件中

-e <ifname> , --adapter <ifname> 指定用来发包的网卡接口名称

--adapter-ip <ip-address> 指定发包的IP地址

--adapter-port <port> 指定发包的源端口

--adapter-mac <mac-address> 指定发包的源MAC地址

--router-mac <mac address> 指定网关的MAC地址

--exclude <ip/range> IP地址范围黑名单,防止masscan扫描

--excludefile <filename> 指定IP地址范围黑名单文件

--includefile,-iL <filename> 读取一个范围列表进行扫描

--ping 扫描应该包含ICMP回应请求

--append-output 以附加的形式输出到文件

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

--retries 发送重试的次数,以1秒为间隔

--nmap 打印与nmap兼容的相关信息

--http-user-agent <user-agent> 设置user-agent字段的值

--show [open,close] 告诉要显示的端口状态,默认是显示开放端口

--noshow [open,close] 禁用端口状态显示

--pcap <filename> 将接收到的数据包以libpcap格式存储

--regress 运行回归测试,测试扫描器是否正常运行

--ttl <num> 指定传出数据包的TTL值,默认为255

--wait <seconds> 指定发送完包之后的等待时间,默认为10秒

--offline 没有实际的发包,主要用来测试开销

-sL 不执行扫描,主要是生成一个随机地址列表

--readscan <binary-files> 读取从-oB生成的二进制文件,可以转化为XML或者JSON格式.

--connection-timeout <secs> 抓取banners时指定保持TCP连接的最大秒数,默认是30秒。

masscan
https://flepeng.github.io/081-security-software-端口扫描-masscan/
作者
Lepeng
发布于
2021年3月8日
许可协议