From 8f74fdaf466d2ce504f127b590de6fbf97109d11 Mon Sep 17 00:00:00 2001 From: lgandx Date: Fri, 16 Apr 2021 21:42:22 -0300 Subject: [PATCH] forgot to add packets.py --- packets.py | 345 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 286 insertions(+), 59 deletions(-) diff --git a/packets.py b/packets.py index 8a293c1..903310c 100644 --- a/packets.py +++ b/packets.py @@ -40,10 +40,6 @@ class Packet(): def __str__(self): return "".join(map(str, self.fields.values())) -def GenerateCallbackName(): - return ''.join([random.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(11)]) - - # NBT Answer Packet class NBT_Ans(Packet): fields = OrderedDict([ @@ -132,7 +128,7 @@ class DNS_SRV_Ans(Packet): self.fields["QuestionName"] = DNSName #Want to be detected that easily by xyz sensor? - self.fields["TargetPrefix"] = "win-"+GenerateCallbackName() + self.fields["TargetPrefix"] = settings.Config.MachineName #two last parts of the domain are the actual Domain name.. eg: contoso.com self.fields["TargetSuffix"] = SplitFQDN[-2] @@ -154,6 +150,7 @@ class DNS_SRV_Ans(Packet): if "kerberos" in DNSName: self.fields["Port"] = StructWithLenPython2or3(">h", 88) + # LLMNR Answer Packet class LLMNR_Ans(Packet): fields = OrderedDict([ @@ -221,22 +218,22 @@ class NTLM_Challenge(Packet): ("TargetInfoMaxLen", "\x7e\x00"), ("TargetInfoOffset", "\x3e\x00\x00\x00"), ("NTLMOsVersion", "\x05\x02\xce\x0e\x00\x00\x00\x0f"), - ("TargetNameStr", "SMB"), + ("TargetNameStr", settings.Config.Domain), ("Av1", "\x02\x00"),#nbt name ("Av1Len", "\x06\x00"), - ("Av1Str", "SMB"), + ("Av1Str", settings.Config.Domain), ("Av2", "\x01\x00"),#Server name ("Av2Len", "\x14\x00"), - ("Av2Str", "SMB-TOOLKIT"), + ("Av2Str", settings.Config.MachineName), ("Av3", "\x04\x00"),#Full Domain name ("Av3Len", "\x12\x00"), - ("Av3Str", "smb.local"), + ("Av3Str", settings.Config.DomainName), ("Av4", "\x03\x00"),#Full machine domain name ("Av4Len", "\x28\x00"), - ("Av4Str", "server2003.smb.local"), + ("Av4Str", settings.Config.MachineName+'.'+settings.Config.DomainName), ("Av5", "\x05\x00"),#Domain Forest Name ("Av5Len", "\x12\x00"), - ("Av5Str", "smb.local"), + ("Av5Str", settings.Config.DomainName), ("Av6", "\x00\x00"),#AvPairs Terminator ("Av6Len", "\x00\x00"), ]) @@ -529,22 +526,22 @@ class MSSQLNTLMChallengeAnswer(Packet): ("TargetInfoMaxLen", "\x7e\x00"), ("TargetInfoOffset", "\x3e\x00\x00\x00"), ("NTLMOsVersion", "\x05\x02\xce\x0e\x00\x00\x00\x0f"), - ("TargetNameStr", "SMB"), + ("TargetNameStr", settings.Config.Domain), ("Av1", "\x02\x00"),#nbt name ("Av1Len", "\x06\x00"), - ("Av1Str", "SMB"), + ("Av1Str", settings.Config.Domain), ("Av2", "\x01\x00"),#Server name ("Av2Len", "\x14\x00"), - ("Av2Str", "SMB-TOOLKIT"), + ("Av2Str", settings.Config.MachineName), ("Av3", "\x04\x00"),#Full Domain name ("Av3Len", "\x12\x00"), - ("Av3Str", "smb.local"), + ("Av3Str", settings.Config.DomainName), ("Av4", "\x03\x00"),#Full machine domain name ("Av4Len", "\x28\x00"), - ("Av4Str", "server2003.smb.local"), + ("Av4Str", settings.Config.MachineName+'.'+settings.Config.DomainName), ("Av5", "\x05\x00"),#Domain Forest Name ("Av5Len", "\x12\x00"), - ("Av5Str", "smb.local"), + ("Av5Str", settings.Config.DomainName), ("Av6", "\x00\x00"),#AvPairs Terminator ("Av6Len", "\x00\x00"), ]) @@ -587,7 +584,7 @@ class SMTPGreeting(Packet): fields = OrderedDict([ ("Code", "220"), ("Separator", "\x20"), - ("Message", "smtp01.local ESMTP"), + ("Message", settings.Config.DomainName+" ESMTP"), ("CRLF", "\x0d\x0a"), ]) @@ -595,7 +592,7 @@ class SMTPAUTH(Packet): fields = OrderedDict([ ("Code0", "250"), ("Separator0", "\x2d"), - ("Message0", "smtp01.local"), + ("Message0", settings.Config.DomainName), ("CRLF0", "\x0d\x0a"), ("Code", "250"), ("Separator", "\x20"), @@ -790,22 +787,22 @@ class LDAPNTLMChallenge(Packet): ("NegTokenInitSeqMechMessageVersionBuilt", "\xce\x0e"), ("NegTokenInitSeqMechMessageVersionReserved", "\x00\x00\x00"), ("NegTokenInitSeqMechMessageVersionNTLMType", "\x0f"), - ("NTLMSSPNtWorkstationName", "SMB12"), + ("NTLMSSPNtWorkstationName", settings.Config.Domain), ("NTLMSSPNTLMChallengeAVPairsId", "\x02\x00"), ("NTLMSSPNTLMChallengeAVPairsLen", "\x0a\x00"), - ("NTLMSSPNTLMChallengeAVPairsUnicodeStr", "smb12"), + ("NTLMSSPNTLMChallengeAVPairsUnicodeStr", settings.Config.Domain), ("NTLMSSPNTLMChallengeAVPairs1Id", "\x01\x00"), ("NTLMSSPNTLMChallengeAVPairs1Len", "\x1e\x00"), - ("NTLMSSPNTLMChallengeAVPairs1UnicodeStr", "SERVER2008"), + ("NTLMSSPNTLMChallengeAVPairs1UnicodeStr", settings.Config.MachineName), ("NTLMSSPNTLMChallengeAVPairs2Id", "\x04\x00"), ("NTLMSSPNTLMChallengeAVPairs2Len", "\x1e\x00"), - ("NTLMSSPNTLMChallengeAVPairs2UnicodeStr", "smb12.local"), + ("NTLMSSPNTLMChallengeAVPairs2UnicodeStr", settings.Config.MachineName+'.'+settings.Config.DomainName), ("NTLMSSPNTLMChallengeAVPairs3Id", "\x03\x00"), ("NTLMSSPNTLMChallengeAVPairs3Len", "\x1e\x00"), - ("NTLMSSPNTLMChallengeAVPairs3UnicodeStr", "SERVER2008.smb12.local"), + ("NTLMSSPNTLMChallengeAVPairs3UnicodeStr", settings.Config.DomainName), ("NTLMSSPNTLMChallengeAVPairs5Id", "\x05\x00"), ("NTLMSSPNTLMChallengeAVPairs5Len", "\x04\x00"), - ("NTLMSSPNTLMChallengeAVPairs5UnicodeStr", "smb12.local"), + ("NTLMSSPNTLMChallengeAVPairs5UnicodeStr", settings.Config.DomainName), ("NTLMSSPNTLMChallengeAVPairs6Id", "\x00\x00"), ("NTLMSSPNTLMChallengeAVPairs6Len", "\x00\x00"), ]) @@ -813,7 +810,7 @@ class LDAPNTLMChallenge(Packet): def calculate(self): ###### Convert strings to Unicode first - self.fields["NTLMSSPNtWorkstationName"] = self.fields["NTLMSSPNtWorkstationName"].encode('utf-16le') + self.fields["NTLMSSPNtWorkstationName"] = self.fields["NTLMSSPNtWorkstationName"].encode('utf-16le').decode('latin-1') self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"].encode('utf-16le').decode('latin-1') self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"].encode('utf-16le').decode('latin-1') self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"].encode('utf-16le').decode('latin-1') @@ -908,7 +905,6 @@ class CLDAPNetlogon(Packet): ]) def calculate(self): - ###### LDAP Packet Len CalculatePacketLen = str(self.fields["MessageIDASNID"])+str(self.fields["MessageIDASNLen"])+str(self.fields["MessageIDASNStr"])+str(self.fields["OpHeadASNID"])+str(self.fields["OpHeadASNIDLenOfLen"])+str(self.fields["OpHeadASNIDLen"])+str(self.fields["Status"])+str(self.fields["StatusASNLen"])+str(self.fields["StatusASNStr"])+str(self.fields["SequenceHeader"])+str(self.fields["SequenceHeaderLen"])+str(self.fields["SequenceHeaderLenOfLen"]) OperationPacketLen = str(self.fields["Status"])+str(self.fields["StatusASNLen"])+str(self.fields["StatusASNStr"])+str(self.fields["SequenceHeader"])+str(self.fields["SequenceHeaderLen"])+str(self.fields["SequenceHeaderLenOfLen"]) @@ -1132,15 +1128,16 @@ class SMBNegoAnsLM(Packet): ("Keylength", "\x08"), ("Bcc", "\x10\x00"), ("Key", ""), - ("Domain", "SMB"), + ("Domain", settings.Config.Domain), ("DomainNull", "\x00\x00"), - ("Server", "SMB-TOOLKIT"), + ("Server", settings.Config.MachineName), ("ServerNull", "\x00\x00"), ]) + def calculate(self): - self.fields["Domain"] = self.fields["Domain"].encode('utf-16le') - self.fields["Server"] = self.fields["Server"].encode('utf-16le') + self.fields["Domain"] = self.fields["Domain"].encode('utf-16le').decode('latin-1') + self.fields["Server"] = self.fields["Server"].encode('utf-16le').decode('latin-1') CompleteBCCLen = str(self.fields["Key"])+str(self.fields["Domain"])+str(self.fields["DomainNull"])+str(self.fields["Server"])+str(self.fields["ServerNull"]) self.fields["Bcc"] = StructWithLenPython2or3("H", self.fields["TowerPortNumberStr"]) + self.fields["TowerIPAddressStr"] = RespondWithIPAton() + + Data= str(self.fields["TowerTotalLen"])+str(self.fields["Tower1Len"])+str(self.fields["Tower1FloorsCount"])+str(self.fields["Tower1ByteCount"])+str(self.fields["Tower1IntUID"])+str(self.fields["Tower1UID"])+str(self.fields["Tower1Version"])+str(self.fields["Tower1VersionMinBC"])+str(self.fields["Tower1VersionMinimum"])+str(self.fields["Tower2ByteCount"])+str(self.fields["Tower2IntUID"])+str(self.fields["Tower2UID"])+str(self.fields["Tower2Version"])+str(self.fields["Tower2VersionMinBC"])+str(self.fields["Tower2VersionMinimum"])+str(self.fields["TowerRpcByteCount"])+str(self.fields["TowerRpctIdentifier"])+str(self.fields["TowerRpcByteCount2"])+str(self.fields["TowerRpcMinimum"])+str(self.fields["TowerPortNumberBC"])+str(self.fields["TowerPortNumberOpcode"])+str(self.fields["TowerPortNumberBC2"])+str(self.fields["TowerPortNumberStr"])+str(self.fields["TowerIPAddressBC"])+str(self.fields["TowerIPAddressOpcode"])+str(self.fields["TowerIPAddressBC2"])+str(self.fields["TowerIPAddressStr"]) + + self.fields["Data"] = Data + +class NTLMChallenge(Packet): + fields = OrderedDict([ + ("NTLMSSPSignature", "NTLMSSP"), + ("NTLMSSPSignatureNull", "\x00"), + ("NTLMSSPMessageType", "\x02\x00\x00\x00"), + ("NTLMSSPNtWorkstationLen", "\x1e\x00"), + ("NTLMSSPNtWorkstationMaxLen", "\x1e\x00"), + ("NTLMSSPNtWorkstationBuffOffset", "\x38\x00\x00\x00"), + ("NTLMSSPNtNegotiateFlags", "\x15\x82\x8a\xe2"), + ("NTLMSSPNtServerChallenge", "\x81\x22\x33\x34\x55\x46\xe7\x88"), + ("NTLMSSPNtReserved", "\x00\x00\x00\x00\x00\x00\x00\x00"), + ("NTLMSSPNtTargetInfoLen", "\x94\x00"), + ("NTLMSSPNtTargetInfoMaxLen", "\x94\x00"), + ("NTLMSSPNtTargetInfoBuffOffset", "\x56\x00\x00\x00"), + ("NegTokenInitSeqMechMessageVersionHigh", "\x05"), + ("NegTokenInitSeqMechMessageVersionLow", "\x02"), + ("NegTokenInitSeqMechMessageVersionBuilt", "\xce\x0e"), + ("NegTokenInitSeqMechMessageVersionReserved", "\x00\x00\x00"), + ("NegTokenInitSeqMechMessageVersionNTLMType", "\x0f"), + ("NTLMSSPNtWorkstationName", settings.Config.Domain), + ("NTLMSSPNTLMChallengeAVPairsId", "\x02\x00"), + ("NTLMSSPNTLMChallengeAVPairsLen", "\x0a\x00"), + ("NTLMSSPNTLMChallengeAVPairsUnicodeStr", settings.Config.Domain), + ("NTLMSSPNTLMChallengeAVPairs1Id", "\x01\x00"), + ("NTLMSSPNTLMChallengeAVPairs1Len", "\x1e\x00"), + ("NTLMSSPNTLMChallengeAVPairs1UnicodeStr", settings.Config.MachineName), + ("NTLMSSPNTLMChallengeAVPairs2Id", "\x04\x00"), + ("NTLMSSPNTLMChallengeAVPairs2Len", "\x1e\x00"), + ("NTLMSSPNTLMChallengeAVPairs2UnicodeStr", settings.Config.MachineName+'.'+settings.Config.DomainName), + ("NTLMSSPNTLMChallengeAVPairs3Id", "\x03\x00"), + ("NTLMSSPNTLMChallengeAVPairs3Len", "\x1e\x00"), + ("NTLMSSPNTLMChallengeAVPairs3UnicodeStr", settings.Config.DomainName), + ("NTLMSSPNTLMChallengeAVPairs5Id", "\x05\x00"), + ("NTLMSSPNTLMChallengeAVPairs5Len", "\x04\x00"), + ("NTLMSSPNTLMChallengeAVPairs5UnicodeStr", settings.Config.DomainName), + ("NTLMSSPNTLMChallengeAVPairs6Id", "\x00\x00"), + ("NTLMSSPNTLMChallengeAVPairs6Len", "\x00\x00"), + ]) + + def calculate(self): + ###### Convert strings to Unicode first + self.fields["NTLMSSPNtWorkstationName"] = self.fields["NTLMSSPNtWorkstationName"].encode('utf-16le').decode('latin-1') + self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"].encode('utf-16le').decode('latin-1') + self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"].encode('utf-16le').decode('latin-1') + self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"].encode('utf-16le').decode('latin-1') + self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"].encode('utf-16le').decode('latin-1') + self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"] = self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"].encode('utf-16le').decode('latin-1') + + ###### Workstation Offset + CalculateOffsetWorkstation = str(self.fields["NTLMSSPSignature"])+str(self.fields["NTLMSSPSignatureNull"])+str(self.fields["NTLMSSPMessageType"])+str(self.fields["NTLMSSPNtWorkstationLen"])+str(self.fields["NTLMSSPNtWorkstationMaxLen"])+str(self.fields["NTLMSSPNtWorkstationBuffOffset"])+str(self.fields["NTLMSSPNtNegotiateFlags"])+str(self.fields["NTLMSSPNtServerChallenge"])+str(self.fields["NTLMSSPNtReserved"])+str(self.fields["NTLMSSPNtTargetInfoLen"])+str(self.fields["NTLMSSPNtTargetInfoMaxLen"])+str(self.fields["NTLMSSPNtTargetInfoBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"]) + ###### AvPairs Offset + CalculateLenAvpairs = str(self.fields["NTLMSSPNTLMChallengeAVPairsId"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsLen"])+str(self.fields["NTLMSSPNTLMChallengeAVPairsUnicodeStr"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs1UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs2Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs2UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs3Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs3UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs5Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5Len"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs5UnicodeStr"])+(self.fields["NTLMSSPNTLMChallengeAVPairs6Id"])+str(self.fields["NTLMSSPNTLMChallengeAVPairs6Len"]) + + ##### Workstation Offset Calculation: + self.fields["NTLMSSPNtWorkstationBuffOffset"] = StructWithLenPython2or3("