中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣進行DNSLOG平臺搭建

發布時間:2021-12-10 19:22:55 來源:億速云 閱讀:786 作者:柒染 欄目:網絡安全

怎樣進行DNSLOG平臺搭建,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1 前言

       DNSLOG是一種回顯機制,常用于在某些漏洞無法回顯但可以發起DNS請求的情況下,利用此方式外帶數據,以解決某些漏洞由于無回顯而難以利用的問題。主要利用場景有SQL盲注、無回顯的命令執行、無回顯的SSRF。本文介紹一種搭建DNSLOG平臺的方法,旨在為滲透測試提供一些幫助。

2 前期準備

       一個域名,一臺vps

       本文使用的是:阿里云購買的域名和云服務器ECS

       域名:example.icu

       vps ip:100.100.100.100

3 實驗過程

3.1 添加DNS解析

       在云解析DNS處添加一條A記錄和一條NS記錄,如圖所示:

怎樣進行DNSLOG平臺搭建

3.2 對外開放53端口

       在云服務器ECS安全組規則里添加對外開發53端口的規則,協議是udp。

怎樣進行DNSLOG平臺搭建

3.3 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, 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平臺就搭起來了。

       運行效果如下圖: 怎樣進行DNSLOG平臺搭建        回顯的ip地址可通過sev.addname('*', '127.0.0.1')自定義。

4 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

怎樣進行DNSLOG平臺搭建 

       界面比較簡單,只有3個按鈕,getsubdomain按鈕用來獲取隨機子域名,refresh按鈕用來刷新頁面,delete all按鈕用來刪除所有記錄。

5 后記

       網上的相關實驗大多數都是使用兩個域名來實現的,一個域名修改DNS服務器,另一個域名修改NS記錄。不過其實只用一個域名也是可以的。

       修改DNS服務器如下圖:

怎樣進行DNSLOG平臺搭建

 

看完上述內容,你們掌握怎樣進行DNSLOG平臺搭建的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

偃师市| 中牟县| 左权县| 吉隆县| 宣化县| 十堰市| 双城市| 宁南县| 保靖县| 汝南县| 宁陕县| 牡丹江市| 新竹市| 岑溪市| 兴海县| 佛山市| 来安县| 曲靖市| 陇南市| 乐亭县| 抚顺县| 资中县| 龙川县| 禄丰县| 富顺县| 岳池县| 宿州市| 益阳市| 阿拉善右旗| 都昌县| 林甸县| 泾川县| 资兴市| 兰坪| 张家界市| 五寨县| 灵川县| 芮城县| 乡城县| 土默特左旗| 华坪县|