安全技术|DNSLOG平台搭建从0到1

百家 作者:锦行科技 2020-05-21 14:01:50

点击上方蓝字关注我们

DNSLOG是一种回显机制,常用于在某些漏洞无法回显但可以发起DNS请求的情况下,利用此方式外带数据,以解决某些漏洞由于无回显而难以利用的问题。主要利用场景有SQL盲注、无回显的命令执行、无回显的SSRF。本文介绍一种搭建DNSLOG平台的方法,旨在为渗透测试提供一些帮助。



前期准备

一个域名,一台vps


本文使用的是:阿里云购买的域名和云服务器ECS

域名:example.icu

vps ip:100.100.100.100


实验过程

01

添加DNS解析

在云解析DNS处添加一条A记录和一条NS记录,如图所示:


02

对外开放53端口

在云服务器ECS安全组规则里添加对外开发53端口的规则,协议是udp。


03

DNSLOG代码

dnslog.py

运行在python2下,无需安装依赖包。


#!/usr/bin/env python

# -*- coding: utf-8 -*-


import SocketServer

import struct

import socket as socketlib


# DNS Query

class SinDNSQuery:

??? def __init__(self, data):

??????? i = 1

??????? self.name = ''

??????? while True:

??????????? d = ord(data[i])

??????????? if d == 0:

??????????????? break;

??????????? if d < 32:

??????????????? self.name = self.name + '.'

??????????? else:

??????????????? self.name = self.name + chr(d)

??????????? i = i + 1

??????? self.querybytes = data[0:i + 1]

??????? (self.type, self.classify) = struct.unpack('>HH', data[i + 1:i + 5])

??????? self.len = i + 5

??? def getbytes(self):

??????? return self.querybytes + struct.pack('>HH', self.type, self.classify)


# DNS Answer RRS

class SinDNSAnswer:

??? def __init__(self, ip):

??????? self.name = 49164

??????? self.type = 1

??????? self.classify = 1

??????? self.timetolive = 190

??????? self.datalength = 4

??????? self.ip = ip

??? def getbytes(self):

??????? res = struct.pack('>HHHLH', self.name, self.type, self.classify, self.timetolive, self.datalength)

??????? s = self.ip.split('.')

??????? res = res + struct.pack('BBBB', int(s[0]), int(s[1]), int(s[2]), int(s[3]))

??????? return res


# DNS frame

class SinDNSFrame:

??? def __init__(self, data):

??????? (self.id, self.flags, self.quests, self.answers, self.author, self.addition) = struct.unpack('>HHHHHH', data[0:12])

??????? self.query = SinDNSQuery(data[12:])

??? def getname(self):

????? ??return self.query.name

??? def setip(self, ip):

??????? self.answer = SinDNSAnswer(ip)

??????? self.answers = 1

??????? self.flags = 33152

??? def getbytes(self):

??????? res = struct.pack('>HHHHHH', self.id, self.flags, self.quests, self.answers, self.author, self.addition)

??????? res = res + self.query.getbytes()

??????? if self.answers != 0:

??????????? res = res + self.answer.getbytes()

??????? return res


# A UDPHandler to handle DNS query

class SinDNSUDPHandler(SocketServer.BaseRequestHandler):

? ??def handle(self):

??????? data = self.request[0].strip()

??????? dns = SinDNSFrame(data)

??????? socket = self.request[1]

??????? namemap = SinDNSServer.namemap

??????? if(dns.query.type==1):

??????????? # If this is query a A record, then response it?? ??????

??????????? name = dns.getname();

??????????? toip = namemap['*']

??????????? dns.setip(toip)

??????????? print '%s: %s-->%s'%(self.client_address[0], name, toip)

??????????? socket.sendto(dns.getbytes(), self.client_address)

??????? else:

???????? ???# If this is not query a A record, ignore it

??????????? socket.sendto(data, self.client_address)


# DNS Server

class SinDNSServer:

??? def __init__(self, port=53):

??????? SinDNSServer.namemap = {}

??????? self.port = port

??? def addname(self, name, ip):

??????? SinDNSServer.namemap[name] = ip

??? def start(self):

??????? HOST, PORT = "0.0.0.0", self.port

??????? server = SocketServer.UDPServer((HOST, PORT), SinDNSUDPHandler)

??????? server.serve_forever()


if __name__ == "__main__":

??? sev = SinDNSServer()

??? sev.addname('*', '127.0.0.1') # default address

???sev.start() # start DNS server


在vps上直接运行dnslog.py,一个简易的DNSLOG平台就搭起来了。

运行效果如下图:

回显的ip地址可通过sev.addname('*', '127.0.0.1')自定义。


////////

//////////////////////////////////////////////////


WEB界面

使用tornado框架写一个web界面。

项目已上传至github: https://github.com/sa1tor/dnslog


pip安装tornado之后直接运行server.py即可,也可以使用Nginx+Tornado+Supervisor来进行部署。


pip install tornado

python server.py


默认在8000端口,浏览器访问http://ip:8000/ 即可看到web界面。

此处指定了6002端口,python server.py --port=6002


界面比较简单,只有3个按钮,getsubdomain按钮用来获取随机子域名,refresh按钮用来刷新页面,delete all按钮用来删除所有记录。












网上的相关实验大多数都是使用两个域名来实现的,一个域名修改DNS服务器,另一个域名修改NS记录。不过其实只用一个域名也是可以的。

修改DNS服务器如下图:




锦行,

致力于成为最值得信赖的网络安全企业


关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接