mirror of
https://github.com/lgandx/Responder.git
synced 2025-07-16 10:02:53 -07:00
Added SMB2 support for RunFinger and various other checks.
This commit is contained in:
parent
af7d27ac8c
commit
d2e5642d58
2 changed files with 371 additions and 56 deletions
|
@ -19,14 +19,16 @@ import datetime
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
from socket import *
|
from socket import *
|
||||||
from odict import OrderedDict
|
from odict import OrderedDict
|
||||||
|
import errno
|
||||||
import optparse
|
import optparse
|
||||||
from RunFingerPackets import *
|
from RunFingerPackets import *
|
||||||
__version__ = "1.0"
|
__version__ = "1.2"
|
||||||
|
|
||||||
parser = optparse.OptionParser(usage='python %prog -i 10.10.10.224\nor:\npython %prog -i 10.10.10.0/24', version=__version__, prog=sys.argv[0])
|
parser = optparse.OptionParser(usage='python %prog -i 10.10.10.224\nor:\npython %prog -i 10.10.10.0/24', version=__version__, prog=sys.argv[0])
|
||||||
|
|
||||||
parser.add_option('-i','--ip', action="store", help="Target IP address or class C", dest="TARGET", metavar="10.10.10.224", default=None)
|
parser.add_option('-i','--ip', action="store", help="Target IP address or class C", dest="TARGET", metavar="10.10.10.224", default=None)
|
||||||
parser.add_option('-g','--grep', action="store_true", dest="grep_output", default=False, help="Output in grepable format")
|
#Way better to have grepable output by default...
|
||||||
|
#parser.add_option('-g','--grep', action="store_true", dest="grep_output", default=False, help="Output in grepable format")
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
|
|
||||||
if options.TARGET is None:
|
if options.TARGET is None:
|
||||||
|
@ -36,6 +38,7 @@ if options.TARGET is None:
|
||||||
|
|
||||||
Timeout = 2
|
Timeout = 2
|
||||||
Host = options.TARGET
|
Host = options.TARGET
|
||||||
|
SMB1 = "Enabled"
|
||||||
|
|
||||||
class Packet():
|
class Packet():
|
||||||
fields = OrderedDict([
|
fields = OrderedDict([
|
||||||
|
@ -80,14 +83,67 @@ def longueur(payload):
|
||||||
length = StructWithLenPython2or3(">i", len(''.join(payload)))
|
length = StructWithLenPython2or3(">i", len(''.join(payload)))
|
||||||
return length
|
return length
|
||||||
|
|
||||||
|
def ParseNegotiateSMB2Ans(data):
|
||||||
|
if data[4:8] == b"\xfeSMB":
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def WorkstationFingerPrint(data):
|
||||||
|
return {
|
||||||
|
b"\x04\x00" :"Windows 95",
|
||||||
|
b"\x04\x0A" :"Windows 98",
|
||||||
|
b"\x04\x5A" :"Windows ME",
|
||||||
|
b"\x05\x00" :"Windows 2000",
|
||||||
|
b"\x05\x01" :"Windows XP",
|
||||||
|
b"\x05\x02" :"Windows XP(64-Bit)/Windows 2003",
|
||||||
|
b"\x06\x00" :"Windows Vista/Server 2008",
|
||||||
|
b"\x06\x01" :"Windows 7/Server 2008R2",
|
||||||
|
b"\x06\x02" :"Windows 8/Server 2012",
|
||||||
|
b"\x06\x03" :"Windows 8.1/Server 2012R2",
|
||||||
|
b"\x0A\x00" :"Windows 10/Server 2016/2019 (check build)",
|
||||||
|
}.get(data, 'Other than Microsoft')
|
||||||
|
|
||||||
|
def GetOsBuildNumber(data):
|
||||||
|
ProductBuild = struct.unpack("<h",data)[0]
|
||||||
|
return ProductBuild
|
||||||
|
|
||||||
|
def ParseSMBNTLM2Exchange(data, host, bootime): #Parse SMB NTLMSSP Response
|
||||||
|
data = data.encode('latin-1')
|
||||||
|
SSPIStart = data.find(b'NTLMSSP')
|
||||||
|
SSPIString = data[SSPIStart:]
|
||||||
|
TargetNameLen = struct.unpack('<H',data[SSPIStart+12:SSPIStart+14])[0]
|
||||||
|
TargetNameOffset = struct.unpack('<L',data[SSPIStart+16:SSPIStart+20])[0]
|
||||||
|
Domain = SSPIString[TargetNameOffset:TargetNameOffset+TargetNameLen].decode('UTF-16LE')
|
||||||
|
|
||||||
|
AvPairsLen = struct.unpack('<H',data[SSPIStart+40:SSPIStart+42])[0]
|
||||||
|
AvPairsOffset = struct.unpack('<L',data[SSPIStart+44:SSPIStart+48])[0]
|
||||||
|
#AvPairs = SSPIString[AvPairsOffset:AvPairsOffset+AvPairsLen].decode('UTF-16LE')
|
||||||
|
WindowsVers = WorkstationFingerPrint(data[SSPIStart+48:SSPIStart+50])
|
||||||
|
WindowsBuildVers = GetOsBuildNumber(data[SSPIStart+50:SSPIStart+52])
|
||||||
|
DomainGrab((host, 445))
|
||||||
|
print(("[SMB2]:['{}', Os:'{}', Build:'{}', Domain:'{}', Bootime: '{}', RDP:'{}', SMB1:'{}']".format(host, WindowsVers, str(WindowsBuildVers), Domain, Bootime, IsRDPOn((host,3389)),SMB1)))
|
||||||
|
|
||||||
def GetBootTime(data):
|
def GetBootTime(data):
|
||||||
try:
|
data = data.encode('latin-1')
|
||||||
Filetime = int(struct.unpack('<q',data)[0])
|
Filetime = int(struct.unpack('<q',data)[0])
|
||||||
t = divmod(Filetime - 116444736000000000, 10000000)
|
if Filetime == 0: # server may not disclose this info
|
||||||
time = datetime.datetime.fromtimestamp(t[0])
|
return 0, "Unknown"
|
||||||
return time, time.strftime('%Y-%m-%d %H:%M:%S')
|
t = divmod(Filetime - 116444736000000000, 10000000)
|
||||||
except:
|
time = datetime.datetime.fromtimestamp(t[0])
|
||||||
pass
|
return time, time.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
|
||||||
|
def IsDCVuln(t, host):
|
||||||
|
if t[0] == 0:
|
||||||
|
return ("Unknown")
|
||||||
|
Date = datetime.datetime(2014, 11, 17, 0, 30)
|
||||||
|
if t[0] < Date:
|
||||||
|
return("This system may be vulnerable to MS14-068")
|
||||||
|
Date = datetime.datetime(2017, 3, 14, 0, 30)
|
||||||
|
if t[0] < Date:
|
||||||
|
return("This system may be vulnerable to MS17-010")
|
||||||
|
return("Last restart: "+t[1])
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
|
|
||||||
|
@ -117,36 +173,38 @@ def OsNameClientVersion(data):
|
||||||
|
|
||||||
def GetHostnameAndDomainName(data):
|
def GetHostnameAndDomainName(data):
|
||||||
try:
|
try:
|
||||||
Time = GetBootTime(data[60:68])
|
|
||||||
data = NetworkRecvBufferPython2or3(data)
|
data = NetworkRecvBufferPython2or3(data)
|
||||||
DomainJoined, Hostname = tuple([e.replace("\x00", "") for e in data[81:].split('\x00\x00\x00')[:2]])
|
DomainJoined, Hostname = tuple([e.replace("\x00", "") for e in data[81:].split('\x00\x00\x00')[:2]])
|
||||||
#If max length domain name, there won't be a \x00\x00\x00 delineator to split on
|
#If max length domain name, there won't be a \x00\x00\x00 delineator to split on
|
||||||
if Hostname == '':
|
if Hostname == '':
|
||||||
DomainJoined = data[81:110].decode('latin-1')
|
DomainJoined = data[81:110].decode('latin-1')
|
||||||
Hostname = data[113:].decode('latin-1')
|
Hostname = data[113:].decode('latin-1')
|
||||||
return Hostname, DomainJoined, Time
|
return Hostname, DomainJoined
|
||||||
except:
|
except:
|
||||||
|
pass
|
||||||
return "Could not get Hostname.", "Could not get Domain joined"
|
return "Could not get Hostname.", "Could not get Domain joined"
|
||||||
|
|
||||||
def DomainGrab(Host):
|
def DomainGrab(Host):
|
||||||
s = socket(AF_INET, SOCK_STREAM)
|
global SMB1
|
||||||
try:
|
try:
|
||||||
s.settimeout(Timeout)
|
s = socket(AF_INET, SOCK_STREAM)
|
||||||
s.connect(Host)
|
s.settimeout(0.7)
|
||||||
except:
|
s.connect(Host)
|
||||||
pass
|
h = SMBHeaderLanMan(cmd="\x72",mid="\x01\x00",flag1="\x00", flag2="\x00\x00")
|
||||||
try:
|
n = SMBNegoDataLanMan()
|
||||||
h = SMBHeaderLanMan(cmd="\x72",mid="\x01\x00",flag1="\x00", flag2="\x00\x00")
|
packet0 = str(h)+str(n)
|
||||||
n = SMBNegoDataLanMan()
|
buffer0 = longueur(packet0)+packet0
|
||||||
packet0 = str(h)+str(n)
|
s.send(NetworkSendBufferPython2or3(buffer0))
|
||||||
buffer0 = longueur(packet0)+packet0
|
data = s.recv(2048)
|
||||||
s.send(NetworkSendBufferPython2or3(buffer0))
|
s.close()
|
||||||
data = s.recv(2048)
|
if data[8:10] == b'\x72\x00':
|
||||||
s.close()
|
return GetHostnameAndDomainName(data)
|
||||||
if data[8:10] == b'\x72\x00':
|
except IOError as e:
|
||||||
return GetHostnameAndDomainName(data)
|
if e.errno == errno.ECONNRESET:
|
||||||
except:
|
SMB1 = "Disabled"
|
||||||
pass
|
return False
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def SmbFinger(Host):
|
def SmbFinger(Host):
|
||||||
s = socket(AF_INET, SOCK_STREAM)
|
s = socket(AF_INET, SOCK_STREAM)
|
||||||
|
@ -218,41 +276,89 @@ def check_smb_null_session(host):
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
##################
|
||||||
|
#SMB2 part:
|
||||||
|
|
||||||
|
def ConnectAndChoseSMB(host):
|
||||||
|
try:
|
||||||
|
s = socket(AF_INET, SOCK_STREAM)
|
||||||
|
s.settimeout(0.7)
|
||||||
|
s.connect(host)
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
h = SMBHeader(cmd="\x72",flag1="\x00")
|
||||||
|
n = SMBNego(Data = SMB2NegoData())
|
||||||
|
n.calculate()
|
||||||
|
packet0 = str(h)+str(n)
|
||||||
|
buffer0 = longueur(packet0)+packet0
|
||||||
|
s.send(NetworkSendBufferPython2or3(buffer0))
|
||||||
|
data = s.recv(4096)
|
||||||
|
if ParseNegotiateSMB2Ans(data):
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
s.send(NetworkSendBufferPython2or3(handle(data.decode('latin-1'), host)))
|
||||||
|
data = s.recv(4096)
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def handle(data, host):
|
||||||
|
if data[28] == "\x00":
|
||||||
|
a = SMBv2Head()
|
||||||
|
a.calculate()
|
||||||
|
b = SMBv2Negotiate()
|
||||||
|
b.calculate()
|
||||||
|
packet0 =str(a)+str(b)
|
||||||
|
buffer0 = longueur(packet0)+packet0
|
||||||
|
return buffer0
|
||||||
|
|
||||||
|
if data[28] == "\x01":
|
||||||
|
global Bootime
|
||||||
|
Bootime = IsDCVuln(GetBootTime(data[116:124]), host[0])
|
||||||
|
a = SMBv2Head(SMBv2Command="\x01\x00",CommandSequence= "\x02\x00\x00\x00\x00\x00\x00\x00")
|
||||||
|
a.calculate()
|
||||||
|
b = SMBv2Session1()
|
||||||
|
b.calculate()
|
||||||
|
packet0 =str(a)+str(b)
|
||||||
|
buffer0 = longueur(packet0)+packet0
|
||||||
|
return buffer0
|
||||||
|
|
||||||
|
if data[28] == "\x02":
|
||||||
|
ParseSMBNTLM2Exchange(data, host[0], Bootime)
|
||||||
|
|
||||||
##################
|
##################
|
||||||
#run it
|
#run it
|
||||||
def ShowResults(Host):
|
def ShowResults(Host):
|
||||||
try:
|
if ConnectAndChoseSMB((Host,445)) == False:
|
||||||
Hostname, DomainJoined, Time = DomainGrab((Host, 445))
|
try:
|
||||||
Signing, OsVer, LanManClient = SmbFinger((Host, 445))
|
Hostname, DomainJoined = DomainGrab((Host, 445))
|
||||||
NullSess = check_smb_null_session((Host, 445))
|
Signing, OsVer, LanManClient = SmbFinger((Host, 445))
|
||||||
print(("Retrieving information for %s..."%(Host)))
|
NullSess = check_smb_null_session((Host, 445))
|
||||||
print(("SMB signing: %s"%(Signing)))
|
print(("Retrieving information for %s..."%(Host)))
|
||||||
print(("Null Sessions Allowed: %s"%(NullSess)))
|
print(("SMB signing: %s"%(Signing)))
|
||||||
print(("Server Time: %s"%(Time[1])))
|
print(("Null Sessions Allowed: %s"%(NullSess)))
|
||||||
print(("OS version: '%s'\nLanman Client: '%s'"%(OsVer, LanManClient)))
|
print(("OS version: '%s'\nLanman Client: '%s'"%(OsVer, LanManClient)))
|
||||||
print(("Machine Hostname: '%s'\nThis machine is part of the '%s' domain"%(Hostname, DomainJoined)))
|
print(("Machine Hostname: '%s'\nThis machine is part of the '%s' domain"%(Hostname, DomainJoined)))
|
||||||
print(("RDP port open: '%s'\n"%(IsRDPOn((Host,3389)))))
|
print(("RDP port open: '%s'\n"%(IsRDPOn((Host,3389)))))
|
||||||
except:
|
except:
|
||||||
pass
|
return False
|
||||||
|
|
||||||
|
|
||||||
def ShowSmallResults(Host):
|
def ShowSmallResults(Host):
|
||||||
s = socket(AF_INET, SOCK_STREAM)
|
if ConnectAndChoseSMB((Host,445)) == False:
|
||||||
try:
|
try:
|
||||||
s.settimeout(Timeout)
|
Hostname, DomainJoined = DomainGrab((Host, 445))
|
||||||
s.connect((Host, 445))
|
Signing, OsVer, LanManClient = SmbFinger((Host, 445))
|
||||||
except:
|
NullSess = check_smb_null_session((Host, 445))
|
||||||
return False
|
print(("[SMB1]:['{}', Os:'{}', Domain:'{}', Signing:'{}', Null Session: '{}', RDP:'{}']".format(Host, OsVer, DomainJoined, Signing, NullSess,IsRDPOn((Host,3389)))))
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
try:
|
|
||||||
Hostname, DomainJoined, Time = DomainGrab((Host, 445))
|
|
||||||
Signing, OsVer, LanManClient = SmbFinger((Host, 445))
|
|
||||||
NullSess = check_smb_null_session((Host, 445))
|
|
||||||
print(("['{}', Os:'{}', Domain:'{}', Signing:'{}', Time:'{}', Null Session: '{}', RDP:'{}']".format(Host, OsVer, DomainJoined, Signing, Time[1],NullSess,IsRDPOn((Host,3389)))))
|
|
||||||
except Exception as err:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def IsRDPOn(Host):
|
def IsRDPOn(Host):
|
||||||
s = socket(AF_INET, SOCK_STREAM)
|
s = socket(AF_INET, SOCK_STREAM)
|
||||||
|
@ -274,10 +380,13 @@ def RunFinger(Host):
|
||||||
mask = int(mask)
|
mask = int(mask)
|
||||||
net = atod(net)
|
net = atod(net)
|
||||||
threads = []
|
threads = []
|
||||||
|
"""
|
||||||
if options.grep_output:
|
if options.grep_output:
|
||||||
func = ShowSmallResults
|
func = ShowSmallResults
|
||||||
else:
|
else:
|
||||||
func = ShowResults
|
func = ShowResults
|
||||||
|
"""
|
||||||
|
func = ShowSmallResults
|
||||||
for host in (dtoa(net+n) for n in range(0, 1<<32-mask)):
|
for host in (dtoa(net+n) for n in range(0, 1<<32-mask)):
|
||||||
p = multiprocessing.Process(target=func, args=((host),))
|
p = multiprocessing.Process(target=func, args=((host),))
|
||||||
threads.append(p)
|
threads.append(p)
|
||||||
|
|
|
@ -16,6 +16,20 @@ def StructWithLenPython2or3(endian,data):
|
||||||
#Python3...
|
#Python3...
|
||||||
else:
|
else:
|
||||||
return struct.pack(endian, data).decode('latin-1')
|
return struct.pack(endian, data).decode('latin-1')
|
||||||
|
|
||||||
|
|
||||||
|
def NetworkSendBufferPython2or3(data):
|
||||||
|
if PY2OR3 == "PY2":
|
||||||
|
return str(data)
|
||||||
|
else:
|
||||||
|
return bytes(str(data), 'latin-1')
|
||||||
|
|
||||||
|
def NetworkRecvBufferPython2or3(data):
|
||||||
|
if PY2OR3 == "PY2":
|
||||||
|
return str(data)
|
||||||
|
else:
|
||||||
|
return str(data.decode('latin-1'))
|
||||||
|
|
||||||
class Packet():
|
class Packet():
|
||||||
fields = OrderedDict([
|
fields = OrderedDict([
|
||||||
])
|
])
|
||||||
|
@ -416,3 +430,195 @@ class SMBTransRAPData(Packet):
|
||||||
##Bcc Buff Len
|
##Bcc Buff Len
|
||||||
BccComplete = str(self.fields["Terminator"])+str(self.fields["PipeName"])+str(self.fields["PipeTerminator"])+str(self.fields["Data"])
|
BccComplete = str(self.fields["Terminator"])+str(self.fields["PipeName"])+str(self.fields["PipeTerminator"])+str(self.fields["Data"])
|
||||||
self.fields["Bcc"] = StructWithLenPython2or3("<i", len(BccComplete))[:2]
|
self.fields["Bcc"] = StructWithLenPython2or3("<i", len(BccComplete))[:2]
|
||||||
|
|
||||||
|
######################FindSMBTime.py##########################
|
||||||
|
class SMBHeaderReq(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Proto", "\xff\x53\x4d\x42"),
|
||||||
|
("Cmd", "\x72"),
|
||||||
|
("Error-Code", "\x00\x00\x00\x00" ),
|
||||||
|
("Flag1", "\x10"),
|
||||||
|
("Flag2", "\x00\x00"),
|
||||||
|
("Pidhigh", "\x00\x00"),
|
||||||
|
("Signature", "\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
("Reserved", "\x00\x00"),
|
||||||
|
("TID", "\x00\x00"),
|
||||||
|
("PID", "\xff\xfe"),
|
||||||
|
("UID", "\x00\x00"),
|
||||||
|
("MID", "\x00\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
class SMB2NegoReq(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Wordcount", "\x00"),
|
||||||
|
("Bcc", "\x62\x00"),
|
||||||
|
("Data", "")
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self):
|
||||||
|
self.fields["Bcc"] = StructWithLenPython2or3("<H",len(str(self.fields["Data"])))
|
||||||
|
|
||||||
|
class SMB2NegoDataReq(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("StrType","\x02" ),
|
||||||
|
("dialect", "NT LM 0.12\x00"),
|
||||||
|
("StrType1","\x02"),
|
||||||
|
("dialect1", "SMB 2.002\x00"),
|
||||||
|
("StrType2","\x02"),
|
||||||
|
("dialect2", "SMB 2.???\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
##################################################################
|
||||||
|
# SMB2 Finger #
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
class SMB2NegoData(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("separator1","\x02" ),
|
||||||
|
("dialect1", "\x50\x43\x20\x4e\x45\x54\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31\x2e\x30\x00"),
|
||||||
|
("separator2","\x02"),
|
||||||
|
("dialect2", "\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00"),
|
||||||
|
("separator3","\x02"),
|
||||||
|
("dialect3", "\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61\x00"),
|
||||||
|
("separator4","\x02"),
|
||||||
|
("dialect4", "\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00"),
|
||||||
|
("separator5","\x02"),
|
||||||
|
("dialect5", "\x4c\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00"),
|
||||||
|
("separator6","\x02"),
|
||||||
|
("dialect6", "\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00"),
|
||||||
|
("separator7","\x02"),
|
||||||
|
("dialect7", "\x53\x4d\x42\x20\x32\x2e\x30\x30\x32\x00"),
|
||||||
|
("separator8","\x02"),
|
||||||
|
("dialect8", "\x53\x4d\x42\x20\x32\x2e\x3f\x3f\x3f\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
class SMBv2Head(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Server", "\xfe\x53\x4d\x42"),
|
||||||
|
("HeadLen", "\x40\x00"),
|
||||||
|
("CreditCharge", "\x00\x00"),
|
||||||
|
("NTStatus","\x00\x00\x00\x00"),
|
||||||
|
("SMBv2Command","\x00\x00"),
|
||||||
|
("CreditRequested","\x00\x00"),
|
||||||
|
("Flags","\x00\x00\x00\x00"),
|
||||||
|
("ChainOffset","\x00\x00\x00\x00"),
|
||||||
|
("CommandSequence","\x01\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
("ProcessID","\xff\xfe\x00\x00"),
|
||||||
|
("TreeID","\x00\x00\x00\x00"),
|
||||||
|
("SessionID","\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
("Signature","\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self):
|
||||||
|
data1 = str(self.fields["Server"])+str(self.fields["HeadLen"])+str(self.fields["CreditCharge"])+str(self.fields["NTStatus"])+str(self.fields["SMBv2Command"])+str(self.fields["CreditRequested"])+str(self.fields["Flags"])+str(self.fields["ChainOffset"])+str(self.fields["CommandSequence"])+str(self.fields["ProcessID"])+str(self.fields["TreeID"])+str(self.fields["SessionID"])+str(self.fields["Signature"])
|
||||||
|
|
||||||
|
self.fields["HeadLen"] = StructWithLenPython2or3("<h", len(data1))
|
||||||
|
|
||||||
|
class SMBv2Negotiate(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Len", "\x24\x00"),
|
||||||
|
("DialectCount", "\x02\x00"),
|
||||||
|
("SecurityMode", "\x01\x00"),
|
||||||
|
("Reserved","\x00\x00"),
|
||||||
|
("Capabilities","\x00\x00\x00\x00"),
|
||||||
|
("ClientGUID","\xd5\xa1\x5f\x6e\x9a\x75\xe1\x11\x87\x82\x00\x01\x4a\xf1\x18\xee"),
|
||||||
|
("ClientStartTime","\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
("Dialect1","\x02\x02"),
|
||||||
|
("Dialect2","\x10\x02"),
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self):
|
||||||
|
data1 = str(self.fields["Len"])+str(self.fields["DialectCount"])+str(self.fields["SecurityMode"])+str(self.fields["Reserved"])+str(self.fields["Capabilities"])+str(self.fields["ClientGUID"])+str(self.fields["ClientStartTime"])
|
||||||
|
|
||||||
|
self.fields["Len"] = StructWithLenPython2or3("<h", len(data1))
|
||||||
|
|
||||||
|
class SMBv2Session1(Packet):
|
||||||
|
fields = OrderedDict([
|
||||||
|
("Len", "\x19\x00"),
|
||||||
|
("VCNumber", "\x00"),
|
||||||
|
("SecurityMode", "\x01"),
|
||||||
|
("Capabilities","\x01\x00\x00\x00"),
|
||||||
|
("Channel","\x00\x00\x00\x00"),
|
||||||
|
("SecurityBufferOffset","\x58\x00"),
|
||||||
|
("SecurityBufferLen","\x4a\x00"),
|
||||||
|
("PreviousSessionId","\x00\x00\x00\x00\x00\x00\x00\x00"),
|
||||||
|
|
||||||
|
("ApplicationHeaderTag","\x60"),
|
||||||
|
("ApplicationHeaderLen","\x48"),
|
||||||
|
("AsnSecMechType","\x06"),
|
||||||
|
("AsnSecMechLen","\x06"),
|
||||||
|
("AsnSecMechStr","\x2b\x06\x01\x05\x05\x02"),
|
||||||
|
("ChoosedTag","\xa0"),
|
||||||
|
("ChoosedTagStrLen","\x3e"),
|
||||||
|
("NegTokenInitSeqHeadTag","\x30"),
|
||||||
|
("NegTokenInitSeqHeadLen","\x3c"),
|
||||||
|
("NegTokenInitSeqHeadTag1","\xA0"),
|
||||||
|
("NegTokenInitSeqHeadLen1","\x0e"),
|
||||||
|
("NegTokenInitSeqNLMPTag","\x30"),
|
||||||
|
("NegTokenInitSeqNLMPLen","\x0c"),
|
||||||
|
("NegTokenInitSeqNLMPTag1","\x06"),
|
||||||
|
("NegTokenInitSeqNLMPTag1Len","\x0a"),
|
||||||
|
("NegTokenInitSeqNLMPTag1Str","\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"),
|
||||||
|
("NegTokenInitSeqNLMPTag2","\xa2"),
|
||||||
|
("NegTokenInitSeqNLMPTag2Len","\xa2"),
|
||||||
|
("NegTokenInitSeqNLMPTag2Octet","\x04"),
|
||||||
|
("NegTokenInitSeqNLMPTag2OctetLen","\x28"),
|
||||||
|
("NegTokenInitSeqMechSignature","\x4E\x54\x4c\x4d\x53\x53\x50\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageType","\x01\x00\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageFlags","\x97\x82\x08\xe2"),
|
||||||
|
("NegTokenInitSeqMechMessageDomainNameLen","\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageDomainNameMaxLen","\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageDomainNameBuffOffset","\x00\x00\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageWorkstationNameLen","\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageWorkstationNameMaxLen","\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageWorkstationNameBuffOffset","\x00\x00\x00\x00"),
|
||||||
|
|
||||||
|
("NegTokenInitSeqMechMessageVersionHigh","\x06"),
|
||||||
|
("NegTokenInitSeqMechMessageVersionLow","\x01"),
|
||||||
|
("NegTokenInitSeqMechMessageVersionBuilt","\xB1\x1D"),
|
||||||
|
("NegTokenInitSeqMechMessageVersionReserved","\x00\x00\x00"),
|
||||||
|
("NegTokenInitSeqMechMessageVersionNTLMType","\x0f"),
|
||||||
|
])
|
||||||
|
|
||||||
|
def calculate(self):
|
||||||
|
|
||||||
|
|
||||||
|
data1 = str(self.fields["Len"])+str(self.fields["VCNumber"])+str(self.fields["SecurityMode"])+str(self.fields["Capabilities"])+str(self.fields["Channel"])+str(self.fields["SecurityBufferOffset"])+str(self.fields["SecurityBufferLen"])+str(self.fields["PreviousSessionId"])
|
||||||
|
|
||||||
|
data2 = str(self.fields["ApplicationHeaderTag"])+str(self.fields["ApplicationHeaderLen"])+str(self.fields["AsnSecMechType"])+str(self.fields["AsnSecMechLen"])+str(self.fields["AsnSecMechStr"])+str(self.fields["ChoosedTag"])+str(self.fields["ChoosedTagStrLen"])+str(self.fields["NegTokenInitSeqHeadTag"])+str(self.fields["NegTokenInitSeqHeadLen"])+str(self.fields["NegTokenInitSeqHeadTag1"])+str(self.fields["NegTokenInitSeqHeadLen1"])+str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])+str(self.fields["NegTokenInitSeqNLMPTag2"])+str(self.fields["NegTokenInitSeqNLMPTag2Len"])+str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data3 = str(self.fields["AsnSecMechType"])+str(self.fields["AsnSecMechLen"])+str(self.fields["AsnSecMechStr"])+str(self.fields["ChoosedTag"])+str(self.fields["ChoosedTagStrLen"])+str(self.fields["NegTokenInitSeqHeadTag"])+str(self.fields["NegTokenInitSeqHeadLen"])+str(self.fields["NegTokenInitSeqHeadTag1"])+str(self.fields["NegTokenInitSeqHeadLen1"])+str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])+str(self.fields["NegTokenInitSeqNLMPTag2"])+str(self.fields["NegTokenInitSeqNLMPTag2Len"])+str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data4 = str(self.fields["NegTokenInitSeqHeadTag"])+str(self.fields["NegTokenInitSeqHeadLen"])+str(self.fields["NegTokenInitSeqHeadTag1"])+str(self.fields["NegTokenInitSeqHeadLen1"])+str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])+str(self.fields["NegTokenInitSeqNLMPTag2"])+str(self.fields["NegTokenInitSeqNLMPTag2Len"])+str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data5 = str(self.fields["NegTokenInitSeqHeadTag1"])+str(self.fields["NegTokenInitSeqHeadLen1"])+str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])+str(self.fields["NegTokenInitSeqNLMPTag2"])+str(self.fields["NegTokenInitSeqNLMPTag2Len"])+str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data6 = str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])+str(self.fields["NegTokenInitSeqNLMPTag2"])+str(self.fields["NegTokenInitSeqNLMPTag2Len"])+str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data7 = str(self.fields["NegTokenInitSeqNLMPTag2Octet"])+str(self.fields["NegTokenInitSeqNLMPTag2OctetLen"])+str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
data8 = str(self.fields["NegTokenInitSeqMechSignature"])+str(self.fields["NegTokenInitSeqMechMessageType"])+str(self.fields["NegTokenInitSeqMechMessageFlags"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageDomainNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameMaxLen"])+str(self.fields["NegTokenInitSeqMechMessageWorkstationNameBuffOffset"])+str(self.fields["NegTokenInitSeqMechMessageVersionHigh"])+str(self.fields["NegTokenInitSeqMechMessageVersionLow"])+str(self.fields["NegTokenInitSeqMechMessageVersionBuilt"])+str(self.fields["NegTokenInitSeqMechMessageVersionReserved"])+str(self.fields["NegTokenInitSeqMechMessageVersionNTLMType"])
|
||||||
|
|
||||||
|
#Buff Offset
|
||||||
|
self.fields["SecurityBufferOffset"] = StructWithLenPython2or3("<h", len(data1)+64)
|
||||||
|
##Buff Len
|
||||||
|
self.fields["SecurityBufferLen"] = StructWithLenPython2or3("<h", len(data2))
|
||||||
|
##App Header
|
||||||
|
self.fields["ApplicationHeaderLen"] = StructWithLenPython2or3("<B", len(data3))
|
||||||
|
##Asn Field 1
|
||||||
|
self.fields["AsnSecMechLen"] = StructWithLenPython2or3("<B", len(str(self.fields["AsnSecMechStr"])))
|
||||||
|
##Asn Field 1
|
||||||
|
self.fields["ChoosedTagStrLen"] = StructWithLenPython2or3("<B", len(data4))
|
||||||
|
##SpNegoTokenLen
|
||||||
|
self.fields["NegTokenInitSeqHeadLen"] = StructWithLenPython2or3("<B", len(data5))
|
||||||
|
##NegoTokenInitcodecs.decode(RandomStr,'hex')
|
||||||
|
self.fields["NegTokenInitSeqHeadLen1"] = StructWithLenPython2or3("<B", len(str(self.fields["NegTokenInitSeqNLMPTag"])+str(self.fields["NegTokenInitSeqNLMPLen"])+str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])))
|
||||||
|
## Tag0 Len
|
||||||
|
self.fields["NegTokenInitSeqNLMPLen"] = StructWithLenPython2or3("<B", len(str(self.fields["NegTokenInitSeqNLMPTag1"])+str(self.fields["NegTokenInitSeqNLMPTag1Len"])+str(self.fields["NegTokenInitSeqNLMPTag1Str"])))
|
||||||
|
## Tag0 Str Len
|
||||||
|
self.fields["NegTokenInitSeqNLMPTag1Len"] = StructWithLenPython2or3("<B", len(str(self.fields["NegTokenInitSeqNLMPTag1Str"])))
|
||||||
|
## Tag2 Len
|
||||||
|
self.fields["NegTokenInitSeqNLMPTag2Len"] = StructWithLenPython2or3("<B", len(data7))
|
||||||
|
## Tag3 Len
|
||||||
|
self.fields["NegTokenInitSeqNLMPTag2OctetLen"] = StructWithLenPython2or3("<B", len(data8))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue