滲透基礎——埠轉發與代理
0x00 前言
在滲透測試中,經常會使用到埠轉發和代理。
埠轉發是轉發一個網路埠從一個網路節點到另一個網路節點的行為。
實際應用中需要考慮兩種情況:
·Client->Transit server->Server:Client能夠正向連線Transit server。Transit server直接轉發即可
· Client<-Transit server->Server:Client無法正向連線Transit server,但Transit server能夠反向連線Client。
如果Client要對Server的多個埠進行掃描(或是多個Server的多個埠),逐個配置轉發規則很不現實。
為了提高效率,這裡可以使用代理,配置一次規則即可。
本文將對常用方法和工具進行整理總結,分門別類,區分正向和反向連線,區分轉發和代理,分析其中的聯絡和區別,並給出應用場景,以作參考。
0x01 簡介
本文將要介紹以下內容:
· 針對Windows系統和Linux系統(Ubuntu和CentOS)下的方法
· 埠轉發——正向連線的方法
· 埠轉發——反向連線的方法
· 正向代理的方法
· 反向代理的方法
· 以上方法的應用場景
注:Go語言支援跨平臺編譯,所以本文更側重於介紹Go語言實現的工具
0x02 埠轉發——正向連線
零、應用場景
1.流量轉發的跳板
用於隱藏真實的伺服器地址
CIA Hive Beacon Infrastructure中埠轉發使用的是Linux的iptables
如下圖中的(2)
注:中轉伺服器的搭建可參考之前的文章 ofollow,noindex">《CIA Hive Beacon Infrastructure復現1——使用Apache mod_rewrite實現http流量分發》 和 《CIA Hive Beacon Infrastructure復現2——使用Apache mod_rewrite實現https流量分發》
2.建立通道
連線內網伺服器的指定埠
Client能夠正向連線到Transit server
一、測試環境
· Client: 192.168.111.136
· Server: 192.168.111.103
網路連線如下圖:
使用nc測試網路連線
Server:
nc -lvp 4444
Client:
nc -vv 192.168.111.103 4444
Client連線成功,如下圖:
二 、Windows系統下的埠轉發方法
· Transit server: 192.168.111.132
網路連線如下圖:
1、使用netsh實現埠轉發(需要管理員許可權)
(1)新增轉發規則
netsh interface portproxy add v4tov4 listenaddress=192.168.111.132 listenport=7777 connectaddress=192.168.111.103connectport=4444
(2)新增防火牆入站規則
netsh advfirewall firewall add rule name="transit test" protocol=TCP dir=in localport=7777 action=allow
注:預設配置允許出站並阻擋入站通訊,所以此處僅需要新增入站規則
測試網路連線:
Server:
nc -lvp 4444
Client:
nc -vv 192.168.111.132 7777
Client連線成功
(3)檢視埠轉發規則
netsh interface portproxy show all
(4)清除埠轉發規則
netsh interface portproxy delete v4tov4 listenaddress=192.168.111.132 listenport=7777
(5)清除防火牆規則
netsh advfirewall firewall delete rule name="transit test"
2、使用rinetd實現埠轉發
下載地址: https://boutell.com/rinetd/http/rinetd.zip
僅需要壓縮包中的rinetd.exe
(1)為rinetd.exe新增防火牆規則(管理員許可權)
netsh advfirewall firewall add rule name="transit test2" dir=in program="c:\test\rinetd.exe" action=allow
(2)編寫轉發規則
echo 0.0.0.0 7777 192.168.111.103 4444 > conf.txt
(3)啟動
rinetd.exe -c c:\test\conf.txt
(4)清除防火牆規則(管理員許可權)
netsh advfirewall firewall delete rule name="transit test2" dir=in program="c:\test\rinetd.exe"
3、使用HTran實現埠轉發
注:lcx同其功能類似
原始碼來源於網際網路,我在github做了備份,備份地址: https://raw.githubusercontent.com/3gstudent/test/master/HTran.cpp
(1)為HTran.exe新增防火牆規則(管理員許可權)
netsh advfirewall firewall add rule name="transit test3" dir=in program="c:\test\HTran.exe" action=allow
(2)開啟轉發功能
HTran.exe -tran 7777 192.168.111.103 4444
(3)清除防火牆規則(管理員許可權)
netsh advfirewall firewall delete rule name="transit test3" dir=in program="c:\test\HTran.exe"
4、使用EarthWorm實現埠轉發
下載地址: https://github.com/rootkiter/EarthWorm
(1)為ew_for_win_32.exe新增防火牆規則(管理員許可權)
netsh advfirewall firewall add rule name="transit test4" dir=in program="c:\test\ew_for_win_32.exe" action=allow
(2)開啟轉發功能
ew_for_win_32.exe -s lcx_tran -l 7777 -f 192.168.111.103 -g 4444
(3)清除防火牆規則(管理員許可權)
netsh advfirewall firewall delete rule name="transit test4" dir=in program="c:\test\ew_for_win_32.exe"
三、Linux系統(Ubuntu)下的常用埠轉發方法
· Transit server: 192.168.111.102
網路連線如下圖:
1、使用iptables實現埠轉發
(1)開啟轉發功能
echo 1 >/proc/sys/net/ipv4/ip_forward
注:該命令立即生效,重啟失效
(2)新增轉發規則
iptables -t nat -A PREROUTING -p tcp -d 192.168.111.102 --dport 8888 -j DNAT --to-destination 192.168.111.103:4444 iptables -t nat -A POSTROUTING -p tcp -d 192.168.111.103 --dport 4444 -j SNAT --to-source 192.168.111.102
(3)檢視轉發規則
iptables -L -t nat --line-number
如下圖:
測試網路連線:
Server:
nc -lvp 4444
Client:
nc -vv 192.168.111.102 8888
Client連線成功
(4)清除規則
iptables -F -t nat
(5)儲存規則
iptables-save > /etc/iptables.up.rules
(6)恢復規則
iptables-restore < /etc/iptables.up.rules
2、使用rinetd實現埠轉發
(1)編譯安裝
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz tar zxvf rinetd.tar.gz cd rinetd make
(2)編寫轉發規則
echo 0.0.0.0 8888 192.168.111.103 4444 > /etc/rinetd.conf
(3)啟動
./rinetd.exe
(4)結束程序
pkill -9 rinetd
3、使用HTran實現埠轉發
Linux版HTran(lcx)的原始碼參考如下地址: https://github.com/windworst/LCX
需要使用gcc重新編譯
(1)開啟轉發功能
./lcx -tran 8888 192.168.111.103 4444
注:go語言編寫的HTran(lcx),優點是跨平臺,支援Windows和Linux
下載地址: https://github.com/cw1997/NATBypass
4、使用EarthWorm實現埠轉發
下載地址: https://github.com/rootkiter/EarthWorm
未開源
(1)開啟轉發功能
./ew_for_linux -s lcx_tran -l 8888 -f 192.168.111.103 -g 4444
四、Linux系統(CentOS)下的常用埠轉發方法
· Transit server: 192.168.111.105
網路連線如下圖:
1、使用iptables實現埠轉發
(1)開啟轉發功能
echo 1 >/proc/sys/net/ipv4/ip_forward
注:該命令立即生效,系統重啟失效
(2)安裝iptables
systemctl stop firewalld systemctl mask firewalld yum install iptables-services systemctl enable iptables
(3)新增轉發規則
iptables -t nat -A PREROUTING -p tcp -d 192.168.111.105 --dport 8888 -j DNAT --to-destination 192.168.111.103:4444 iptables -t nat -A POSTROUTING -p tcp -d 192.168.111.103 --dport 4444 -j SNAT --to-source 192.168.111.105 service iptables save service iptables restart service iptables status
(4)檢視轉發規則
iptables -L -t nat --line-number
如下圖:
測試網路連線:
Server:
nc -lvp 4444
Client:
nc -vv 192.168.111.105 8888
Client連線成功
(4)清除規則
iptables -F -t nat
2、使用rinetd實現埠轉發
同Ubuntu,此處省略
3、使用HTran實現埠轉發
同Ubuntu,此處省略
4、使用EarthWorm實現埠轉發
同Ubuntu,此處省略
0x03 埠轉發——反向連線
零、應用場景
1.建立通道
連線內網伺服器的指定埠
測試環境如下圖:
已有Transit server許可權,想要訪問Server的3389埠
Client無法正向連線到Transit server,但Transit server能夠反向連線到Client
iptables和rinetd不再適用
一、使用HTran
支援Windows和Linux
Client:
HTran -listen 1111 2222
Transit server:
HTran -slave 1.1.1.1 1111 10.0.0.2 3389
Client:
nc -vv 127.0.0.1 2222
二、使用EarthWorm
支援Windows和Linux
Client:
ew -s lcx_listen -l 2222 -e 1111
Transit server:
ew -s lcx_slave -d 1.1.1.1 -e 1111 -f 10.0.0.2 -g 3389
Client:
nc -vv 127.0.0.1 2222
0x04 正向代理
零、應用場景
1.內網掃描
對內網的多個埠進行掃描
Client能夠正向連線到Transit server
測試環境如下圖:
要對Server1、Server2和Server3的埠進行掃描
Socks4代理只支援TCP協議,而Socks5代理支援TCP協議和UDP協議,更加全面,所以本文只介紹實現Socks5代理的方法
一、使用HTran
網上流傳HTran2.4支援Socks5代理,但我未找到開原始碼,此處作一個標記
二、使用EarthWorm
Transit server:
ew –s ssocksd –l 8888
Client使用代理工具連線Transit server的8888埠
三、使用goproxy
go實現的高效能http,https,websocket,tcp,udp,socks5,ss代理伺服器,支援正向代理、反向代理、透明代理、內網穿透、TCP/UDP埠對映、SSH中轉
下載地址: https://github.com/snail007/goproxy/
Transit server:
proxy socks -t tcp -p "0.0.0.0:8888"
Client使用代理工具連線Transit server的8888埠
四、自己使用go實現
Windows系統安裝Go: https://golang.org/dl/
安裝git: http://git-scm.com/downloads
安裝go-socks5:
go get github.com/armon/go-socks5 go build
test.go:
package main import socks5 "github.com/armon/go-socks5" func main() { conf := &socks5.Config{} server, err := socks5.New(conf) if err != nil { panic(err) } if err := server.ListenAndServe("tcp", "0.0.0.0:8888"); err != nil { panic(err) } }
編譯
go build test.go
Client使用代理工具連線Transit server的8888埠
五、使用reGeorg
下載地址: https://github.com/NoneNotNull/reGeorg
針對web伺服器,支援(aspx|ashx|jsp|php)
注:
· Windows下連線socks代理的工具可使用sockscap64
· Linux下連線socks代理的工具可使用proxychains
0x05 反向代理
零、應用場景
1.內網掃描
對內網的多個埠進行掃描
測試環境如下圖:
Client無法正向連線到Transit server,但Transit server能夠反向連線到Client
要對Server1、Server2和Server3的埠進行掃描
一、使用EarthWorm
Client:
ew -s rcsocks -l 2222 -e 1111
Transit server:
ew -s rssocks -d 1.1.1.1 -e 1111
使用代理工具連線Client的2222埠
二、使用rsocks
下載地址: https://github.com/brimstone/rsocks
Go語言編寫,支援Windows和Linux
Client:
rsocks -listen :1111 -socks 127.0.0.1:2222
Transit server:
rsocks -connect 1.1.1.1:1111
使用代理工具連線Client的2222埠
0x06 小結
本文對埠轉發和代理的常用工具和方法進行整理總結,劃分正向和反向連線兩個類別,分別介紹了應用場景和常用工具,可作為實際應用的參考。