Zmap详细用户手册和DDOS的可行性

0x00 背景

Zmap是美国密歇根大学研究者开发出一款工具。在第22届USENIX安全研讨会,以超过nmap 1300倍的扫描速度声名鹊起。相比大名鼎鼎的nmap全网扫描速度是他最大的亮点。在千兆网卡状态下,45分钟内扫描全网络IPv4地址。关于Zmap为什么能扫描的如此之快,可以看看《为什么ZMap用一个小时内就能扫遍整个互联网

安装:

64位版本

Debian/Ubuntu 系列(安装步骤)

32版本 (zmap 主页只说适用于64位linux,这里用BT5r3 32位同样安装成功,建议还是尽量选用64版本的)

Debian/Ubuntu 系列

Fedora, Red Hat Enterprise Linux, or CentOS版本:

只把step2替换成

如果想使用 redis用来存储则需要首先安装 Hiredis,并在step5中

不是以root权限运行则需要配置:

0x01 使用介绍:

安装完后,可直接调用zmap

1.最简单的调用

-B 是指的是带宽 -p 端口 -n 扫描多少个目标 -o 输出结果

整句表示利用10M带宽扫描100000IP地址的端口,并将结果输出到results.txt中。

我BT5 R3 测试时,必须加入-G 参数

-G 是指定出口的mac地址,必须为网关的实际mac地址,否则返回数据找不到信息。

如果扫到IP地址开了80端口,就会按照下列格式进行保存。

2.用的最多的指令

检测全网络SSL/STL使用状况,ZMAP几个研究项目都与此有关。

enter image description here

可见我使用的扫描全网的所得大约9小时16分钟,网络为10MADSL带宽,ADSL上行速度只有100k左右,导致时间加倍延迟。

3.常用参数

指定扫描的目标端口

把结果写入指定文件 -o result.txt

IP地址黑名单,例如192.168.0.0/16 表示 192.168.x.x将不被扫描,默认提供一份 RFC 1918保留和内网地址供参考,存放位置在 conf/blacklist.conf

最大扫描IP地址数量,-n 100 表示总归扫描100个IP地址。也可指定 –n 0.1%形式,表示扫描除去黑名单列表里面全网段的0.1%数量的IP地址。

最大扫描到结果的IP数量,-N 100 表示扫描到100个存在的结果就停止。

最大扫描时间,-t 10 表示程序运行10s结束。

设置每秒发送包的数量 –r 10000 表示每秒发送10k个包。

设置每秒发送包的大小,-B 10M 表示每秒发送10Mbps 支持单位(GMK)。

设置数据包发送完之后多长时间开始接受数据(response),默认8s,TCP连接异步接受。

设置扫描随机地址的顺序,C语言中的伪随机种子,指定 定值每次随机扫描的IP地址顺序是一样。

设置扫描线程。默认是1,经测试单线程基本是把网络带宽充分利用。

设置往每个IP发送包的数量,默认为1。(DDOS的参数之一)。

打印出每个包的内容,非常实用的功能。

设置扫描的源端口,可指定范围 –s 30000-50000。(DDOS的参数之一)。

设置扫描的源IP地址,可指定范围-S 100.100.0.1-200.200.200.200(DDOS的参数之一)。

设置网关的mac地址,可伪造。(DDOS的参数之一)

设置扫描模式,参数tcp_synscan(默认),icmp_echoscan(ping扫描),udp(测试速度要逊于前两个),这里可自定义自己的模块,ZMAP作者后续会增加例如自定义UDP payload 的选项。(*udp_send_msg = "GET / HTTP/1.1"; // Must be null-terminated)源码里不可直接更改 (1.0.3版本加入UDP Data Probes可进行自定义)

设置结果输出模块,参数simple_file(默认),extended_file。

Simple_file 模式如下

Extended File模式如下

 

response, saddr, daddr, sport, dport, seq, ack, in_cooldown, is_repeat, timestamp
synack, 159.174.153.144, 10.0.0.9, 80, 40555, 3050964427, 3515084203, 0, 0,2013-08-15 18:55:47.681

扫描模块和输出模块都提供了API ,可自己根据需要添加功能。

安静状态下运行,不把进度信息打印到屏幕上

输出结果汇总,对研究人员来说 非常有帮助。

0x02 三个额外的扩展应用

Banner Grab

抓取指纹,简言之抓取response 为识别类似SSH,http 401之类的信息做准备。

这里 examples / banner-grab 目录下

首先 make 生成banner-grab-tcp

向http-req 文件写入要发送的数据 (也可以自定义SSH-req 之类)

如:

(%s 保留,其他可任意构造HTTP请求,包括GET,POST)

这里扩展下 banner-grab-tcp下的参数

源码里 #define MAX_BANNER_LEN 1024 接收的每条返回数据,只接收1024字节,根据需要可自行更改。

与zmap 联合使用

例子

zmap扫描1000个80端口开放的IP地址,banner-grab-tcp 来扫描这些IP地址,扫描请求内容通过http-req可自定义 .

forge-socket

与Banner Grab功能一样,参数也类似,不再重复。

主要是安装方式不同

要先安装下列驱动

并且用iptables阻止发rst包

UDP Data Probes

1.03版本加入

详细的测试payload见

https://github.com/zmap/zmap/tree/master/examples/udp-probes

以探测mssql的1434端口为例:

pkt也可自行构造。

格式化配置

利用配置文件 简化命令行输入

上述指令上面全部有介绍。

很显然,可以通过配置文件更快速配置zmap.

使用方法:

0x03 原理分析

Know it

首先讲下TCP三次握手。

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

enter image description here

可见三次握手存在于发送-应答-发送机制,等待监听的时间势必导致发包速度很慢。

这里zmap是发送SYN,随后发送RST(重置连接),不存在监听同步操作,清空连接,再继续发下一个数据包。 而对于识别 zmap把 Ip地址和端口做了类似hash表一样的映射,当数据包返回时(可能是Syn+Ack,也可能RST),取出返回数据包里Ip和端口地址进行储存的hash表里查询,并对应处理记录。 同步变异步高效的基本原因。

0x04 发散扩展

DDoS的可行性:

作者旨在关注全网的扫描,并未提及相关DDoS 的信息。

也并未特别提供指向型发包的指令。

下面讨论可能与作者想法相违,希望各位重在技术钻研,而非一些恶意破坏。

指定ip段 和ip地址

限制只扫描文件中的下列地址或者地址段,例如:

单个Ip地址

然后利用

见下列发送的数据效果,达到预期

enter image description here

可能造成什么样的危害?

可以配置IP Spoofing,syn flood,land attack, ICMP floods, Application floods 和其他UDP 全零等多种攻击。

Zmap 的发包速度甚至可以忽略一下 随后发的这个rst 包。

也可以做得完美一点就是利用iptables

把发出去的RST包给drop掉。

可以再升一下?

毕竟有部分扩展能控制到应用层也是可以进行慢攻击。

Get 类型

Post 类型

可以把源码sizeof(value) 的值设置一个大的动态数值。 Post数据设置很小。

DDoS 流量 +连接数 +畸形包

流量基本只能硬防,拼硬件。

zmap几乎是最大限度利用网络带宽,10台G口服务器不会损耗多少,如果再利用DNS放大流量之类,很恐怖的数字。

Ps :

Zmap 某些方面和python 的scapy很像。

但zmap 纯C实现,比scapy效率要高一些。

以前老是纠结scapy 随后发送RST 问题,这里利用iptables 方式确实是个好方法。

参考其中的源码和相对规范的API接口,编写一些模块可以玩出很多花样。

LINK:

https://zmap.io/documentation.html

https://github.com/zmap/

[via@dropwooyun]