怎样进行DNSLOG平台搭建,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 DNSLOG是一种回显机制,常用于在某些漏洞无法回显但可以发起DNS请求的情况下,利用此方式外带数据,以解决某些漏洞由于无回显而难以利用的问题。主要利用场景有SQL盲注、无回显的命令执行、无回显的SSRF。本文介绍一种搭建DNSLOG平台的方法,旨在为渗透测试提供一些帮助。 一个域名,一台vps 本文使用的是:阿里云购买的域名和云服务器ECS 域名:example.icu vps ip:100.100.100.100 在云解析DNS处添加一条A记录和一条NS记录,如图所示:
在云服务器ECS安全组规则里添加对外开发53端口的规则,协议是udp。 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
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, thenresponse 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 notquery 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 DNSserver 在vps上直接运行dnslog.py,一个简易的DNSLOG平台就搭起来了。 运行效果如下图: 回显的ip地址可通过sev.addname(‘*’, ‘127.0.0.1’)自定义。 使用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服务器如下图:
看完上述内容,你们掌握怎样进行DNSLOG平台搭建的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注云编程开发博客行业资讯频道,感谢各位的阅读!
关免费云主机域名于如果减少勒索病毒的侵扰:相关推荐: linux base64加密解密怎么实现这篇“linux base64加密解密怎么实现”文章的免费云主机域名知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。