Masscan 号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。
0x01 前言
Masscan 号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网。
masscan 使用的是无状态扫描的方法,TCP 连接是有状态的,需要对 SYN-ACK 包进行 seq number 的校验这个等待连接的过程需要在缓冲区占用很大的资源,因此限制了扫描的速度。
masscan 无状态的扫描则是 masscan 与目标主机不建立完整的 TCP 连接,扫描者主机先向目标主机发送一个 SYN 请求连接数据包,目标主机会向扫描者主机回复一个 SYN/ACK 确认连接数据包,当扫描者主机收到目标主机发送回来的 SYN/ACK 确认连接数据包之后,扫描者主机向目标主机发送 RST 结束连接(选项–banners 除外(因为要获取 banner 信息,必须要进行完整的三次握手)),即 masscan 不建立完整的 TCP 连接,收到 SYN/ACK 之后,发送 RST 结束连接(选项–banners 除外)。
masscan 采用异步的方式批量的把数据包发出去,然后记录有回应的 IP。因此,效率上得以大幅提高。
0x02 安装
1 | git clone https://github.com/robertdavidgraham/masscan |
0x03 参数说明
3.1 传输速度
masscan 的发包速度非常快,在 windows 中,它的发包速度可以达到每秒 30 万包;在 Linux 中,速度可以达到每秒 160 万。masscan 在扫描时会随机选择目标 IP,所以不会对远程的主机造成压力。
默认情况下,masscan 的发包速度为每秒 100 包,为了提高速度,可以设置为 –rate 100000
3.2 结果输出
主要有 5 种输出的格式
1 | XML 默认格式 使用-oX <filename> 或者使用 --output-format xml 和 --output-filename <filename>进行指定 |
3.3 详细参数
1 | <ip/range> IP地址范围,有三种有效格式,1、单独的IPv4地址 2、类似"10.0.0.1-10.0.0.233"的范围地址 3、CIDR地址 类似于"0.0.0.0/0",多个目标可以用都好隔开 |
0x04 扫描原理
4.1 无状态扫描的原理
TCP 协议中三次握手的前两次
- 客户端在向服务器第一次握手时,会组建一个数据包,设置 syn 标志位,同时生成一个数字填充 seq 序号字段。
- 服务端收到数据包,检测到了标志位的 syn 标志,知道这是客户端发来的建立连接的请求包,服务端会回复一个数据包,同时设置 syn 和 ack 标志位,服务器随机生成一个数字填充到 seq 字段。并将客户端发送的 seq 数据包+1 填充到 ack 确认号上。
- 在收到 syn 和 ack 后,我们返回一个 rst 来结束这个连接,如图所示
masscan 无状态扫描原理,就是利用了这一步,因为 seq 是可以自定义的,所以在发送数据包时填充一个特定的数字,而在返回包中可以获得相应的响应状态,即是无状态扫描的思路了。
4.2 随机化地址扫描
在读取地址后,如果进行顺序扫描,伪代码如下
1 | for (i = 0; i < range; i++) { |
但是考虑到有的网段可能对扫描进行检测从而封掉整个网段,顺序扫描效率是较低的,所以需要将地址进行随机的打乱,用算法描述就是设计一个打乱数组的算法,Masscan 是设计了一个加密算法,伪代码如下
1 | range = ip_count * port_count; |
随机种子就是 i 的值,这种加密算法能够建立一种一一对应的映射关系,即在[1…range]的区间内通过 i 来生成[1…range]内不重复的随机数。同时如果中断了扫描,只需要记住 i 的值就能重新启动,在分布式上也可以根据 i 来进行。