mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 09:21:50 -05:00
tests: make Impacket (SMB server) Python 3 compatible
Closes #3731 Fixes #3289
This commit is contained in:
parent
cd3edb0827
commit
aba1c51553
@ -46,7 +46,6 @@ problems may have been fixed or changed somewhat since this was written!
|
||||
4.5 Improve --data-urlencode space encoding
|
||||
|
||||
5. Build and portability issues
|
||||
5.1 tests not compatible with python3
|
||||
5.2 curl-config --libs contains private details
|
||||
5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
|
||||
5.4 Cannot compile against a static build of OpenLDAP
|
||||
@ -372,12 +371,6 @@ problems may have been fixed or changed somewhat since this was written!
|
||||
|
||||
5. Build and portability issues
|
||||
|
||||
5.1 tests not compatible with python3
|
||||
|
||||
The smb test server still needs python2.
|
||||
|
||||
See https://github.com/curl/curl/issues/3289
|
||||
|
||||
5.2 curl-config --libs contains private details
|
||||
|
||||
"curl-config --libs" will include details set in LDFLAGS when configure is
|
||||
|
@ -1,3 +1,5 @@
|
||||
from __future__ import print_function
|
||||
from __future__ import absolute_import
|
||||
# Copyright (c) 2003-2016 CORE Security Technologies
|
||||
#
|
||||
# This software is provided under under a slightly modified version
|
||||
@ -40,7 +42,7 @@ from random import randint
|
||||
from struct import pack, unpack
|
||||
import time
|
||||
|
||||
from structure import Structure
|
||||
from .structure import Structure
|
||||
|
||||
CVS_REVISION = '$Revision: 526 $'
|
||||
|
||||
@ -454,7 +456,7 @@ class NetBIOS:
|
||||
except socket.error:
|
||||
pass
|
||||
if not has_bind:
|
||||
raise NetBIOSError, ( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN )
|
||||
raise NetBIOSError( 'Cannot bind to a good UDP port', ERRCLASS_OS, errno.EAGAIN)
|
||||
self.__sock = s
|
||||
|
||||
# Set the default NetBIOS domain nameserver.
|
||||
@ -531,15 +533,15 @@ class NetBIOS:
|
||||
if res.get_rcode() == 0x03:
|
||||
return None
|
||||
else:
|
||||
raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
|
||||
raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
|
||||
|
||||
if res.get_ancount() != 1:
|
||||
raise NetBIOSError( 'Malformed response')
|
||||
|
||||
return NBPositiveNameQueryResponse(res.get_answers())
|
||||
except select.error, ex:
|
||||
except select.error as ex:
|
||||
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
|
||||
raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
|
||||
raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
|
||||
raise
|
||||
|
||||
|
||||
@ -570,25 +572,25 @@ class NetBIOS:
|
||||
else:
|
||||
try:
|
||||
data, _ = self.__sock.recvfrom(65536, 0)
|
||||
except Exception, e:
|
||||
raise NetBIOSError, "recvfrom error: %s" % str(e)
|
||||
except Exception as e:
|
||||
raise NetBIOSError("recvfrom error: %s" % str(e))
|
||||
self.__sock.close()
|
||||
res = NetBIOSPacket(data)
|
||||
if res.get_trn_id() == p.get_trn_id():
|
||||
if res.get_rcode():
|
||||
if res.get_rcode() == 0x03:
|
||||
# I'm just guessing here
|
||||
raise NetBIOSError, "Cannot get data from server"
|
||||
raise NetBIOSError("Cannot get data from server")
|
||||
else:
|
||||
raise NetBIOSError, ( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode() )
|
||||
raise NetBIOSError( 'Negative name query response', ERRCLASS_QUERY, res.get_rcode())
|
||||
answ = NBNodeStatusResponse(res.get_answers())
|
||||
self.mac = answ.get_mac()
|
||||
return answ.get_node_names()
|
||||
except select.error, ex:
|
||||
except select.error as ex:
|
||||
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
|
||||
raise NetBIOSError, ( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0] )
|
||||
except socket.error, ex:
|
||||
raise NetBIOSError, 'Connection error: %s' % str(ex)
|
||||
raise NetBIOSError( 'Error occurs while waiting for response', ERRCLASS_OS, ex[0])
|
||||
except socket.error as ex:
|
||||
raise NetBIOSError('Connection error: %s' % str(ex))
|
||||
|
||||
# Perform first and second level encoding of name as specified in RFC 1001 (Section 4)
|
||||
def encode_name(name, type, scope):
|
||||
@ -841,7 +843,7 @@ class NetBIOSTCPSession(NetBIOSSession):
|
||||
af, socktype, proto, canonname, sa = socket.getaddrinfo(peer[0], peer[1], 0, socket.SOCK_STREAM)[0]
|
||||
sock = socket.socket(af, socktype, proto)
|
||||
sock.connect(sa)
|
||||
except socket.error, e:
|
||||
except socket.error as e:
|
||||
raise socket.error("Connection error (%s:%s)" % (peer[0], peer[1]), e)
|
||||
return sock
|
||||
|
||||
@ -866,7 +868,7 @@ class NetBIOSTCPSession(NetBIOSSession):
|
||||
while 1:
|
||||
p = self.recv_packet(timeout)
|
||||
if p.get_type() == NETBIOS_SESSION_NEGATIVE_RESPONSE:
|
||||
raise NetBIOSError, ( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]) )
|
||||
raise NetBIOSError( 'Cannot request session', ERRCLASS_SESSION, ord(p.get_trailer()[0]))
|
||||
elif p.get_type() == NETBIOS_SESSION_POSITIVE_RESPONSE:
|
||||
break
|
||||
else:
|
||||
@ -896,13 +898,13 @@ class NetBIOSTCPSession(NetBIOSSession):
|
||||
|
||||
received = self._sock.recv(bytes_left)
|
||||
if len(received) == 0:
|
||||
raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
|
||||
raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
|
||||
|
||||
data = data + received
|
||||
bytes_left = read_length - len(data)
|
||||
except select.error, ex:
|
||||
except select.error as ex:
|
||||
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
|
||||
raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
|
||||
raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
|
||||
|
||||
return data
|
||||
|
||||
@ -919,13 +921,13 @@ class NetBIOSTCPSession(NetBIOSSession):
|
||||
|
||||
received = self._sock.recv(bytes_left)
|
||||
if len(received) == 0:
|
||||
raise NetBIOSError, ( 'Error while reading from remote', ERRCLASS_OS, None)
|
||||
raise NetBIOSError( 'Error while reading from remote', ERRCLASS_OS, None)
|
||||
|
||||
data = data + received
|
||||
bytes_left = read_length - len(data)
|
||||
except select.error, ex:
|
||||
except select.error as ex:
|
||||
if ex[0] != errno.EINTR and ex[0] != errno.EAGAIN:
|
||||
raise NetBIOSError, ( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0] )
|
||||
raise NetBIOSError( 'Error occurs while reading from remote', ERRCLASS_OS, ex[0])
|
||||
|
||||
return data
|
||||
|
||||
@ -974,7 +976,7 @@ def main():
|
||||
|
||||
|
||||
n = get_netbios_host_by_name("some-host")
|
||||
print n
|
||||
print(n)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import print_function
|
||||
# Copyright (c) 2003-2016 CORE Security Technologies:
|
||||
#
|
||||
# This software is provided under under a slightly modified version
|
||||
@ -17,8 +18,8 @@ from impacket.structure import Structure
|
||||
from impacket import LOG
|
||||
|
||||
|
||||
# This is important. NTLMv2 is not negotiated by the client or server.
|
||||
# It is used if set locally on both sides. Change this item if you don't want to use
|
||||
# This is important. NTLMv2 is not negotiated by the client or server.
|
||||
# It is used if set locally on both sides. Change this item if you don't want to use
|
||||
# NTLMv2 by default and fall back to NTLMv1 (with EXTENDED_SESSION_SECURITY or not)
|
||||
# Check the following links:
|
||||
# http://davenport.sourceforge.net/ntlm.html
|
||||
@ -209,7 +210,7 @@ class AV_PAIRS():
|
||||
self.fields[key] = (len(value),value)
|
||||
|
||||
def __getitem__(self, key):
|
||||
if self.fields.has_key(key):
|
||||
if key in self.fields:
|
||||
return self.fields[key]
|
||||
return None
|
||||
|
||||
@ -236,16 +237,16 @@ class AV_PAIRS():
|
||||
|
||||
def dump(self):
|
||||
for i in self.fields.keys():
|
||||
print "%s: {%r}" % (i,self[i])
|
||||
print("%s: {%r}" % (i,self[i]))
|
||||
|
||||
def getData(self):
|
||||
if self.fields.has_key(NTLMSSP_AV_EOL):
|
||||
if NTLMSSP_AV_EOL in self.fields:
|
||||
del self.fields[NTLMSSP_AV_EOL]
|
||||
ans = ''
|
||||
for i in self.fields.keys():
|
||||
ans+= struct.pack('<HH', i, self[i][0])
|
||||
ans+= self[i][1]
|
||||
|
||||
|
||||
# end with a NTLMSSP_AV_EOL
|
||||
ans += struct.pack('<HH', NTLMSSP_AV_EOL, 0)
|
||||
|
||||
@ -260,7 +261,7 @@ class NTLMAuthMixin:
|
||||
minor_v = struct.unpack('B',self['os_version'][1])[0]
|
||||
build_v = struct.unpack('H',self['os_version'][2:4])
|
||||
return (mayor_v,minor_v,build_v)
|
||||
|
||||
|
||||
class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
|
||||
|
||||
structure = (
|
||||
@ -276,7 +277,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
|
||||
('os_version',':'),
|
||||
('host_name',':'),
|
||||
('domain_name',':'))
|
||||
|
||||
|
||||
def __init__(self):
|
||||
Structure.__init__(self)
|
||||
self['flags']= (
|
||||
@ -293,7 +294,7 @@ class NTLMAuthNegotiate(Structure, NTLMAuthMixin):
|
||||
self['host_name']=''
|
||||
self['domain_name']=''
|
||||
self['os_version']=''
|
||||
|
||||
|
||||
def getData(self):
|
||||
if len(self.fields['host_name']) > 0:
|
||||
self['flags'] |= NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED
|
||||
@ -342,7 +343,7 @@ class NTLMAuthChallenge(Structure):
|
||||
('TargetInfoFields_len','<H-TargetInfoFields'),
|
||||
('TargetInfoFields_max_len','<H-TargetInfoFields'),
|
||||
('TargetInfoFields_offset','<L'),
|
||||
('VersionLen','_-Version','self.checkVersion(self["flags"])'),
|
||||
('VersionLen','_-Version','self.checkVersion(self["flags"])'),
|
||||
('Version',':'),
|
||||
('domain_name',':'),
|
||||
('TargetInfoFields',':'))
|
||||
@ -365,11 +366,11 @@ class NTLMAuthChallenge(Structure):
|
||||
self['TargetInfoFields'] = self['TargetInfoFields'][:self['TargetInfoFields_len']]
|
||||
# We gotta process the TargetInfoFields
|
||||
#if self['TargetInfoFields_len'] > 0:
|
||||
# av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
|
||||
# av_pairs = AV_PAIRS(self['TargetInfoFields'][:self['TargetInfoFields_len']])
|
||||
# self['TargetInfoFields'] = av_pairs
|
||||
|
||||
return self
|
||||
|
||||
|
||||
class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
|
||||
structure = (
|
||||
@ -394,7 +395,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
('session_key_max_len','<H-session_key'),
|
||||
('session_key_offset','<L'),
|
||||
('flags','<L'),
|
||||
('VersionLen','_-Version','self.checkVersion(self["flags"])'),
|
||||
('VersionLen','_-Version','self.checkVersion(self["flags"])'),
|
||||
('Version',':=""'),
|
||||
('MICLen','_-MIC','self.checkMIC(self["flags"])'),
|
||||
('MIC',':=""'),
|
||||
@ -424,7 +425,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
# NTLMSSP_TARGET |
|
||||
0)
|
||||
# Here we do the stuff
|
||||
if username and ( lmhash != '' or nthash != ''):
|
||||
if username and ( lmhash != '' or nthash != ''):
|
||||
self['lanman'] = get_ntlmv1_response(lmhash, challenge)
|
||||
self['ntlm'] = get_ntlmv1_response(nthash, challenge)
|
||||
elif (username and password):
|
||||
@ -450,7 +451,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
if flags & NTLMSSP_NEGOTIATE_VERSION == 0:
|
||||
return 0
|
||||
return 16
|
||||
|
||||
|
||||
def getData(self):
|
||||
self['domain_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])
|
||||
self['user_offset']=64+self.checkMIC(self["flags"])+self.checkVersion(self["flags"])+len(self['domain_name'])
|
||||
@ -463,7 +464,7 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
def fromString(self,data):
|
||||
Structure.fromString(self,data)
|
||||
# [MS-NLMP] page 27
|
||||
# Payload data can be present in any order within the Payload field,
|
||||
# Payload data can be present in any order within the Payload field,
|
||||
# with variable-length padding before or after the data
|
||||
|
||||
domain_offset = self['domain_offset']
|
||||
@ -478,15 +479,15 @@ class NTLMAuthChallengeResponse(Structure, NTLMAuthMixin):
|
||||
user_end = self['user_len'] + user_offset
|
||||
self['user_name'] = data[ user_offset: user_end ]
|
||||
|
||||
ntlm_offset = self['ntlm_offset']
|
||||
ntlm_end = self['ntlm_len'] + ntlm_offset
|
||||
ntlm_offset = self['ntlm_offset']
|
||||
ntlm_end = self['ntlm_len'] + ntlm_offset
|
||||
self['ntlm'] = data[ ntlm_offset : ntlm_end ]
|
||||
|
||||
lanman_offset = self['lanman_offset']
|
||||
lanman_offset = self['lanman_offset']
|
||||
lanman_end = self['lanman_len'] + lanman_offset
|
||||
self['lanman'] = data[ lanman_offset : lanman_end]
|
||||
|
||||
#if len(data) >= 36:
|
||||
#if len(data) >= 36:
|
||||
# self['os_version'] = data[32:36]
|
||||
#else:
|
||||
# self['os_version'] = ''
|
||||
@ -607,11 +608,11 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
|
||||
# Let's start with the original flags sent in the type1 message
|
||||
responseFlags = type1['flags']
|
||||
|
||||
# Token received and parsed. Depending on the authentication
|
||||
# Token received and parsed. Depending on the authentication
|
||||
# method we will create a valid ChallengeResponse
|
||||
ntlmChallengeResponse = NTLMAuthChallengeResponse(user, password, ntlmChallenge['challenge'])
|
||||
|
||||
clientChallenge = "".join([random.choice(string.digits+string.letters) for i in xrange(8)])
|
||||
clientChallenge = "".join([random.choice(string.digits+string.letters) for i in range(8)])
|
||||
|
||||
serverName = ntlmChallenge['TargetInfoFields']
|
||||
|
||||
@ -647,7 +648,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
|
||||
if ntlmChallenge['flags'] & NTLMSSP_NEGOTIATE_KEY_EXCH:
|
||||
# not exactly what I call random tho :\
|
||||
# exportedSessionKey = this is the key we should use to sign
|
||||
exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in xrange(16)])
|
||||
exportedSessionKey = "".join([random.choice(string.digits+string.letters) for i in range(16)])
|
||||
#exportedSessionKey = "A"*16
|
||||
#print "keyExchangeKey %r" % keyExchangeKey
|
||||
# Let's generate the right session key based on the challenge flags
|
||||
@ -677,7 +678,7 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
|
||||
ntlmChallengeResponse['domain_name'] = domain.encode('utf-16le')
|
||||
ntlmChallengeResponse['lanman'] = lmResponse
|
||||
ntlmChallengeResponse['ntlm'] = ntResponse
|
||||
if encryptedRandomSessionKey is not None:
|
||||
if encryptedRandomSessionKey is not None:
|
||||
ntlmChallengeResponse['session_key'] = encryptedRandomSessionKey
|
||||
|
||||
return ntlmChallengeResponse, exportedSessionKey
|
||||
@ -688,13 +689,13 @@ def getNTLMSSPType3(type1, type2, user, password, domain, lmhash = '', nthash =
|
||||
def generateSessionKeyV1(password, lmhash, nthash):
|
||||
if POW:
|
||||
hash = POW.Digest(POW.MD4_DIGEST)
|
||||
else:
|
||||
else:
|
||||
hash = MD4.new()
|
||||
hash.update(NTOWFv1(password, lmhash, nthash))
|
||||
return hash.digest()
|
||||
|
||||
|
||||
def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, domain, user, password, lmhash='', nthash='', use_ntlmv2 = USE_NTLMv2):
|
||||
if (user == '' and password == ''):
|
||||
if (user == '' and password == ''):
|
||||
# Special case for anonymous authentication
|
||||
lmResponse = ''
|
||||
ntResponse = ''
|
||||
@ -713,7 +714,7 @@ def computeResponseNTLMv1(flags, serverChallenge, clientChallenge, serverName, d
|
||||
else:
|
||||
ntResponse = get_ntlmv1_response(nthash,serverChallenge)
|
||||
lmResponse = get_ntlmv1_response(lmhash, serverChallenge)
|
||||
|
||||
|
||||
sessionBaseKey = generateSessionKeyV1(password, lmhash, nthash)
|
||||
return ntResponse, lmResponse, sessionBaseKey
|
||||
|
||||
@ -727,7 +728,7 @@ def compute_lmhash(password):
|
||||
def NTOWFv1(password, lmhash = '', nthash=''):
|
||||
if nthash != '':
|
||||
return nthash
|
||||
return compute_nthash(password)
|
||||
return compute_nthash(password)
|
||||
|
||||
def LMOWFv1(password, lmhash = '', nthash=''):
|
||||
if lmhash != '':
|
||||
@ -738,13 +739,15 @@ def compute_nthash(password):
|
||||
# This is done according to Samba's encryption specification (docs/html/ENCRYPTION.html)
|
||||
try:
|
||||
password = unicode(password).encode('utf_16le')
|
||||
except NameError: # unicode() was removed in Python 3
|
||||
password = str(password).encode('utf_16le')
|
||||
except UnicodeDecodeError:
|
||||
import sys
|
||||
password = password.decode(sys.getfilesystemencoding()).encode('utf_16le')
|
||||
|
||||
if POW:
|
||||
hash = POW.Digest(POW.MD4_DIGEST)
|
||||
else:
|
||||
else:
|
||||
hash = MD4.new()
|
||||
hash.update(password)
|
||||
return hash.digest()
|
||||
@ -780,7 +783,7 @@ def MAC(flags, handle, signingKey, seqNum, message):
|
||||
messageSignature['SeqNum'] = handle('\x00\x00\x00\x00')
|
||||
messageSignature['SeqNum'] = struct.unpack('<i',messageSignature['SeqNum'])[0] ^ seqNum
|
||||
messageSignature['RandomPad'] = 0
|
||||
|
||||
|
||||
return messageSignature
|
||||
|
||||
def SEAL(flags, signingKey, sealingKey, messageToSign, messageToEncrypt, seqNum, handle):
|
||||
@ -863,7 +866,7 @@ def KXKEY(flags, sessionBaseKey, lmChallengeResponse, serverChallenge, password,
|
||||
raise "Can't create a valid KXKEY!"
|
||||
|
||||
return keyExchangeKey
|
||||
|
||||
|
||||
def hmac_md5(key, data):
|
||||
if POW:
|
||||
h = POW.Hmac(POW.MD5_DIGEST, key)
|
||||
@ -878,7 +881,7 @@ def hmac_md5(key, data):
|
||||
|
||||
def NTOWFv2( user, password, domain, hash = ''):
|
||||
if hash != '':
|
||||
theHash = hash
|
||||
theHash = hash
|
||||
else:
|
||||
theHash = compute_nthash(password)
|
||||
return hmac_md5(theHash, user.upper().encode('utf-16le') + domain.encode('utf-16le'))
|
||||
@ -907,7 +910,7 @@ def computeResponseNTLMv2(flags, serverChallenge, clientChallenge, serverName,
|
||||
#aTime = '\x00'*8
|
||||
av_pairs[NTLMSSP_AV_TIME] = aTime
|
||||
serverName = av_pairs.getData()
|
||||
|
||||
|
||||
######################
|
||||
#aTime = '\x00'*8
|
||||
######################
|
||||
@ -937,20 +940,20 @@ class NTLM_HTTP(object):
|
||||
if msg_64 != '':
|
||||
msg = base64.b64decode(msg_64[5:]) # Remove the 'NTLM '
|
||||
msg_type = ord(msg[8])
|
||||
|
||||
|
||||
for _cls in NTLM_HTTP.__subclasses__():
|
||||
if msg_type == _cls.MSG_TYPE:
|
||||
instance = _cls()
|
||||
instance.fromString(msg)
|
||||
return instance
|
||||
|
||||
|
||||
|
||||
class NTLM_HTTP_AuthRequired(NTLM_HTTP):
|
||||
commonHdr = ()
|
||||
# Message 0 means the first HTTP request e.g. 'GET /bla.png'
|
||||
MSG_TYPE = 0
|
||||
|
||||
def fromString(self,data):
|
||||
def fromString(self,data):
|
||||
pass
|
||||
|
||||
|
||||
@ -968,4 +971,3 @@ class NTLM_HTTP_AuthChallengeResponse(NTLM_HTTP, NTLMAuthChallengeResponse):
|
||||
|
||||
def __init__(self):
|
||||
NTLMAuthChallengeResponse.__init__(self)
|
||||
|
||||
|
@ -629,9 +629,9 @@ class SharedFile:
|
||||
@staticmethod
|
||||
def __convert_smbtime(t):
|
||||
x = t >> 32
|
||||
y = t & 0xffffffffL
|
||||
y = t & 0xffffffff
|
||||
geo_cal_offset = 11644473600.0 # = 369.0 * 365.25 * 24 * 60 * 60 - (3.0 * 24 * 60 * 60 + 6.0 * 60 * 60)
|
||||
return (x * 4.0 * (1 << 30) + (y & 0xfff00000L)) * 1.0e-7 - geo_cal_offset
|
||||
return (x * 4.0 * (1 << 30) + (y & 0xfff00000)) * 1.0e-7 - geo_cal_offset
|
||||
|
||||
|
||||
# Contain information about a SMB machine
|
||||
@ -676,12 +676,12 @@ class NewSMBPacket(Structure):
|
||||
def __init__(self, **kargs):
|
||||
Structure.__init__(self, **kargs)
|
||||
|
||||
if self.fields.has_key('Flags2') is False:
|
||||
if ('Flags2' in self.fields) is False:
|
||||
self['Flags2'] = 0
|
||||
if self.fields.has_key('Flags1') is False:
|
||||
if ('Flags1' in self.fields) is False:
|
||||
self['Flags1'] = 0
|
||||
|
||||
if not kargs.has_key('data'):
|
||||
if 'data' not in kargs:
|
||||
self['Data'] = []
|
||||
|
||||
def addCommand(self, command):
|
||||
@ -709,9 +709,9 @@ class NewSMBPacket(Structure):
|
||||
return 1
|
||||
elif self.isMoreProcessingRequired():
|
||||
return 1
|
||||
raise SessionError, ("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
|
||||
raise SessionError("SMB Library Error", self['ErrorClass'] + (self['_reserved'] << 8), self['ErrorCode'], self['Flags2'] & SMB.FLAGS2_NT_STATUS)
|
||||
else:
|
||||
raise UnsupportedFeature, ("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
|
||||
raise UnsupportedFeature("Unexpected answer from server: Got %d, Expected %d" % (self['Command'], cmd))
|
||||
|
||||
|
||||
class SMBCommand(Structure):
|
||||
@ -2550,7 +2550,7 @@ class SMB:
|
||||
if s.get_error_class() == 0x00 and s.get_error_code() == 0x00:
|
||||
return 1
|
||||
else:
|
||||
raise SessionError, ( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS )
|
||||
raise SessionError( "SMB Library Error", s.get_error_class()+ (s.get_reserved() << 8), s.get_error_code() , s.get_flags2() & SMB.FLAGS2_NT_STATUS)
|
||||
else:
|
||||
break
|
||||
return 0
|
||||
@ -2583,7 +2583,7 @@ class SMB:
|
||||
self.__server_name = self._dialects_data['ServerName']
|
||||
|
||||
if self._dialects_parameters['DialectIndex'] == 0xffff:
|
||||
raise UnsupportedFeature,"Remote server does not know NT LM 0.12"
|
||||
raise UnsupportedFeature("Remote server does not know NT LM 0.12")
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
@ -2734,7 +2734,7 @@ class SMB:
|
||||
self._SigningSessionKey = key
|
||||
|
||||
def get_encryption_key(self):
|
||||
if self._dialects_data.fields.has_key('Challenge'):
|
||||
if 'Challenge' in self._dialects_data.fields:
|
||||
return self._dialects_data['Challenge']
|
||||
else:
|
||||
return None
|
||||
@ -3241,7 +3241,7 @@ class SMB:
|
||||
pass
|
||||
|
||||
# Parse Version to know the target Operating system name. Not provided elsewhere anymore
|
||||
if ntlmChallenge.fields.has_key('Version'):
|
||||
if 'Version' in ntlmChallenge.fields:
|
||||
version = ntlmChallenge['Version']
|
||||
|
||||
if len(version) >= 4:
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import print_function
|
||||
# Copyright (c) 2003-2016 CORE Security Technologies
|
||||
#
|
||||
# This software is provided under under a slightly modified version
|
||||
@ -231,13 +232,13 @@ class SMB3:
|
||||
self.negotiateSession(preferredDialect)
|
||||
|
||||
def printStatus(self):
|
||||
print "CONNECTION"
|
||||
print("CONNECTION")
|
||||
for i in self._Connection.items():
|
||||
print "%-40s : %s" % i
|
||||
print
|
||||
print "SESSION"
|
||||
print("%-40s : %s" % i)
|
||||
print()
|
||||
print("SESSION")
|
||||
for i in self._Session.items():
|
||||
print "%-40s : %s" % i
|
||||
print("%-40s : %s" % i)
|
||||
|
||||
def getServerName(self):
|
||||
return self._Session['ServerName']
|
||||
@ -308,7 +309,7 @@ class SMB3:
|
||||
packet['SessionID'] = self._Session['SessionID']
|
||||
|
||||
# Default the credit charge to 1 unless set by the caller
|
||||
if packet.fields.has_key('CreditCharge') is False:
|
||||
if ('CreditCharge' in packet.fields) is False:
|
||||
packet['CreditCharge'] = 1
|
||||
|
||||
# Standard credit request after negotiating protocol
|
||||
@ -318,7 +319,7 @@ class SMB3:
|
||||
messageId = packet['MessageID']
|
||||
|
||||
if self._Session['SigningActivated'] is True and self._Connection['SequenceWindow'] > 2:
|
||||
if packet['TreeID'] > 0 and self._Session['TreeConnectTable'].has_key(packet['TreeID']) is True:
|
||||
if packet['TreeID'] > 0 and (packet['TreeID'] in self._Session['TreeConnectTable']) is True:
|
||||
if self._Session['TreeConnectTable'][packet['TreeID']]['EncryptData'] is False:
|
||||
packet['Flags'] = SMB2_FLAGS_SIGNED
|
||||
self.signSMB(packet)
|
||||
@ -350,7 +351,7 @@ class SMB3:
|
||||
|
||||
def recvSMB(self, packetID = None):
|
||||
# First, verify we don't have the packet already
|
||||
if self._Connection['OutstandingResponses'].has_key(packetID):
|
||||
if packetID in self._Connection['OutstandingResponses']:
|
||||
return self._Connection['OutstandingResponses'].pop(packetID)
|
||||
|
||||
data = self._NetBIOSSession.recv_packet(self._timeout)
|
||||
@ -727,7 +728,7 @@ class SMB3:
|
||||
pass
|
||||
|
||||
# Parse Version to know the target Operating system name. Not provided elsewhere anymore
|
||||
if ntlmChallenge.fields.has_key('Version'):
|
||||
if 'Version' in ntlmChallenge.fields:
|
||||
version = ntlmChallenge['Version']
|
||||
|
||||
if len(version) >= 4:
|
||||
@ -785,7 +786,7 @@ class SMB3:
|
||||
|
||||
#print self._Session['TreeConnectTable']
|
||||
share = share.split('\\')[-1]
|
||||
if self._Session['TreeConnectTable'].has_key(share):
|
||||
if share in self._Session['TreeConnectTable']:
|
||||
# Already connected, no need to reconnect
|
||||
treeEntry = self._Session['TreeConnectTable'][share]
|
||||
treeEntry['NumberOfUses'] += 1
|
||||
@ -837,10 +838,10 @@ class SMB3:
|
||||
return packet['TreeID']
|
||||
|
||||
def disconnectTree(self, treeId):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
if self._Session['TreeConnectTable'].has_key(treeId):
|
||||
if treeId in self._Session['TreeConnectTable']:
|
||||
# More than 1 use? descrease it and return, if not, send the packet
|
||||
if self._Session['TreeConnectTable'][treeId]['NumberOfUses'] > 1:
|
||||
treeEntry = self._Session['TreeConnectTable'][treeId]
|
||||
@ -862,7 +863,7 @@ class SMB3:
|
||||
return True
|
||||
|
||||
def create(self, treeId, fileName, desiredAccess, shareMode, creationOptions, creationDisposition, fileAttributes, impersonationLevel = SMB2_IL_IMPERSONATION, securityFlags = 0, oplockLevel = SMB2_OPLOCK_LEVEL_NONE, createContexts = None):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
fileName = string.replace(fileName, '/', '\\')
|
||||
@ -885,7 +886,7 @@ class SMB3:
|
||||
# Is this file NOT on the root directory?
|
||||
if len(fileName.split('\\')) > 2:
|
||||
parentDir = ntpath.dirname(pathName)
|
||||
if self.GlobalFileTable.has_key(parentDir):
|
||||
if parentDir in self.GlobalFileTable:
|
||||
LOG.critical("Don't know what to do now! :-o")
|
||||
raise
|
||||
else:
|
||||
@ -957,9 +958,9 @@ class SMB3:
|
||||
return str(createResponse['FileID'])
|
||||
|
||||
def close(self, treeId, fileId):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -988,9 +989,9 @@ class SMB3:
|
||||
# This function should NOT be used for reading files directly, but another higher
|
||||
# level function should be used that will break the read into smaller pieces
|
||||
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1030,9 +1031,9 @@ class SMB3:
|
||||
# This function should NOT be used for writing directly to files, but another higher
|
||||
# level function should be used that will break the writes into smaller pieces
|
||||
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1071,9 +1072,9 @@ class SMB3:
|
||||
return bytesWritten
|
||||
|
||||
def queryDirectory(self, treeId, fileId, searchString = '*', resumeIndex = 0, informationClass = FILENAMES_INFORMATION, maxBufferSize = None, enumRestart = False, singleEntry = False):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1124,12 +1125,12 @@ class SMB3:
|
||||
self.sendSMB(packet)
|
||||
|
||||
def ioctl(self, treeId, fileId = None, ctlCode = -1, flags = 0, inputBlob = '', maxInputResponse = None, maxOutputResponse = None, waitAnswer = 1):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if fileId is None:
|
||||
fileId = '\xff'*16
|
||||
else:
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1165,9 +1166,9 @@ class SMB3:
|
||||
return smbIoctlResponse['Buffer']
|
||||
|
||||
def flush(self,treeId, fileId):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1186,9 +1187,9 @@ class SMB3:
|
||||
return True
|
||||
|
||||
def lock(self, treeId, fileId, locks, lockSequence = 0):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1248,9 +1249,9 @@ class SMB3:
|
||||
return True
|
||||
|
||||
def queryInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0, flags = 0 ):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1280,9 +1281,9 @@ class SMB3:
|
||||
return queryResponse['Buffer']
|
||||
|
||||
def setInfo(self, treeId, fileId, inputBlob = '', infoType = SMB2_0_INFO_FILE, fileInfoClass = SMB2_FILE_STANDARD_INFO, additionalInformation = 0 ):
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if self._Session['OpenTable'].has_key(fileId) is False:
|
||||
if (fileId in self._Session['OpenTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
||||
packet = self.SMB_PACKET()
|
||||
@ -1385,7 +1386,7 @@ class SMB3:
|
||||
files.append(smb.SharedFile(fileInfo['CreationTime'],fileInfo['LastAccessTime'],fileInfo['LastChangeTime'],fileInfo['EndOfFile'],fileInfo['AllocationSize'],fileInfo['ExtFileAttributes'],fileInfo['FileName'].decode('utf-16le'), fileInfo['FileName'].decode('utf-16le')))
|
||||
nextOffset = fileInfo['NextEntryOffset']
|
||||
res = res[nextOffset:]
|
||||
except SessionError, e:
|
||||
except SessionError as e:
|
||||
if (e.get_error_code()) != STATUS_NO_MORE_FILES:
|
||||
raise
|
||||
break
|
||||
@ -1512,7 +1513,7 @@ class SMB3:
|
||||
|
||||
def waitNamedPipe(self, treeId, pipename, timeout = 5):
|
||||
pipename = ntpath.basename(pipename)
|
||||
if self._Session['TreeConnectTable'].has_key(treeId) is False:
|
||||
if (treeId in self._Session['TreeConnectTable']) is False:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
if len(pipename) > 0xffff:
|
||||
raise SessionError(STATUS_INVALID_PARAMETER)
|
||||
|
@ -54,6 +54,12 @@ from impacket.nt_errors import STATUS_NO_MORE_FILES, STATUS_NETWORK_NAME_DELETED
|
||||
STATUS_SMB_BAD_UID = 0x005B0002
|
||||
STATUS_SMB_BAD_TID = 0x00050002
|
||||
|
||||
try:
|
||||
unicode # Python 2
|
||||
except NameError:
|
||||
unicode = str # Python 3
|
||||
|
||||
|
||||
# Utility functions
|
||||
# and general functions.
|
||||
# There are some common functions that can be accessed from more than one SMB
|
||||
@ -80,7 +86,7 @@ def outputToJohnFormat(challenge, username, domain, lmresponse, ntresponse):
|
||||
else:
|
||||
# NTLMv1
|
||||
ret_value = {'hash_string':'%s::%s:%s:%s:%s' % (username, domain, hexlify(lmresponse), hexlify(ntresponse), hexlify(challenge)), 'hash_version':'ntlm'}
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
LOG.error("outputToJohnFormat: %s" % e)
|
||||
pass
|
||||
|
||||
@ -183,7 +189,7 @@ def openFile(path,fileName, accessMode, fileAttributes, openMode):
|
||||
if sys.platform == 'win32':
|
||||
mode |= os.O_BINARY
|
||||
fid = os.open(pathName, mode)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
LOG.error("openFile: %s,%s" % (pathName, mode) ,e)
|
||||
fid = 0
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
@ -442,7 +448,7 @@ def queryPathInformation(path, filename, level):
|
||||
else:
|
||||
# NOT FOUND
|
||||
return None, STATUS_OBJECT_NAME_NOT_FOUND
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
LOG.error('queryPathInfo: %s' % e)
|
||||
raise
|
||||
|
||||
@ -486,7 +492,7 @@ class TRANSCommands:
|
||||
# (beto) If offset == 0 it crashes explorer.exe on windows 7
|
||||
entry['RemarkOffsetLow'] = 20 * len(shares) + len(tailData)
|
||||
respData += entry.getData()
|
||||
if shares[i].has_key('comment'):
|
||||
if 'comment' in shares[i]:
|
||||
tailData += shares[i]['comment'] + '\x00'
|
||||
else:
|
||||
tailData += '\x00'
|
||||
@ -511,7 +517,7 @@ class TRANSCommands:
|
||||
shareInfo['NetworkName'] = request['ShareName'].upper() + '\x00'
|
||||
shareInfo['Type'] = int(share['share type'])
|
||||
respData = shareInfo.getData()
|
||||
if share.has_key('comment'):
|
||||
if 'comment' in share:
|
||||
shareInfo['RemarkOffsetLow'] = len(respData)
|
||||
respData += share['comment'] + '\x00'
|
||||
respParameters['TotalBytesAvailable'] = len(respData)
|
||||
@ -538,7 +544,7 @@ class TRANSCommands:
|
||||
# Extract the FID
|
||||
fid = struct.unpack('<H', transParameters['Setup'][2:])[0]
|
||||
|
||||
if connData['OpenedFiles'].has_key(fid):
|
||||
if fid in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][fid]['FileHandle']
|
||||
if fileHandle != PIPE_FILE_DESCRIPTOR:
|
||||
os.write(fileHandle,data)
|
||||
@ -566,7 +572,7 @@ class TRANS2Commands:
|
||||
respData = ''
|
||||
errorCode = STATUS_SUCCESS
|
||||
setPathInfoParameters = smb.SMBSetPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
fileName = decodeSMBString(recvPacket['Flags2'], setPathInfoParameters['FileName'])
|
||||
fileName = os.path.normpath(fileName.replace('\\','/'))
|
||||
@ -619,8 +625,8 @@ class TRANS2Commands:
|
||||
errorCode = STATUS_SUCCESS
|
||||
setFileInfoParameters = smb.SMBSetFileInformation_Parameters(parameters)
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if connData['OpenedFiles'].has_key(setFileInfoParameters['FID']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
if setFileInfoParameters['FID'] in connData['OpenedFiles']:
|
||||
fileName = connData['OpenedFiles'][setFileInfoParameters['FID']]['FileName']
|
||||
informationLevel = setFileInfoParameters['InformationLevel']
|
||||
if informationLevel == smb.SMB_SET_FILE_DISPOSITION_INFO:
|
||||
@ -675,8 +681,8 @@ class TRANS2Commands:
|
||||
|
||||
queryFileInfoParameters = smb.SMBQueryFileInformation_Parameters(parameters)
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if connData['OpenedFiles'].has_key(queryFileInfoParameters['FID']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
if queryFileInfoParameters['FID'] in connData['OpenedFiles']:
|
||||
fileName = connData['OpenedFiles'][queryFileInfoParameters['FID']]['FileName']
|
||||
|
||||
infoRecord, errorCode = queryFileInformation('', fileName, queryFileInfoParameters['InformationLevel'])
|
||||
@ -704,11 +710,11 @@ class TRANS2Commands:
|
||||
|
||||
queryPathInfoParameters = smb.SMBQueryPathInformation_Parameters(flags = recvPacket['Flags2'], data = parameters)
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
try:
|
||||
infoRecord, errorCode = queryPathInformation(path, decodeSMBString(recvPacket['Flags2'], queryPathInfoParameters['FileName']), queryPathInfoParameters['InformationLevel'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("queryPathInformation: %s" % e,logging.ERROR)
|
||||
|
||||
if infoRecord is not None:
|
||||
@ -726,7 +732,7 @@ class TRANS2Commands:
|
||||
connData = smbServer.getConnectionData(connId)
|
||||
errorCode = 0
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
data = queryFsInformation(connData['ConnectedShares'][recvPacket['Tid']]['path'], '', struct.unpack('<H',parameters)[0])
|
||||
|
||||
smbServer.setConnectionData(connId, connData)
|
||||
@ -744,8 +750,8 @@ class TRANS2Commands:
|
||||
findNext2Parameters = smb.SMBFindNext2_Parameters(flags = recvPacket['Flags2'], data = parameters)
|
||||
|
||||
sid = findNext2Parameters['SID']
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if connData['SIDs'].has_key(sid):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
if sid in connData['SIDs']:
|
||||
searchResult = connData['SIDs'][sid]
|
||||
respParameters = smb.SMBFindNext2Response_Parameters()
|
||||
endOfSearch = 1
|
||||
@ -790,7 +796,7 @@ class TRANS2Commands:
|
||||
respData = ''
|
||||
findFirst2Parameters = smb.SMBFindFirst2_Parameters( recvPacket['Flags2'], data = parameters)
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
|
||||
searchResult, searchCount, errorCode = findFirst2(path,
|
||||
@ -881,7 +887,7 @@ class SMBCommands:
|
||||
else:
|
||||
command = struct.unpack('<H', transParameters['Setup'][:2])[0]
|
||||
|
||||
if transCommands.has_key(command):
|
||||
if command in transCommands:
|
||||
# Call the TRANS subcommand
|
||||
setup = ''
|
||||
parameters = ''
|
||||
@ -893,7 +899,7 @@ class SMBCommands:
|
||||
transData['Trans_Parameters'],
|
||||
transData['Trans_Data'],
|
||||
transParameters['MaxDataCount'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
#print 'Transaction: %s' % e,e
|
||||
smbServer.log('Transaction: (%r,%s)' % (command, e), logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
@ -1018,7 +1024,7 @@ class SMBCommands:
|
||||
|
||||
# Call the handler for this TRANSACTION
|
||||
command = NTTransParameters['Function']
|
||||
if transCommands.has_key(command):
|
||||
if command in transCommands:
|
||||
# Call the NT TRANS subcommand
|
||||
setup = ''
|
||||
parameters = ''
|
||||
@ -1030,7 +1036,7 @@ class SMBCommands:
|
||||
NTTransData['NT_Trans_Parameters'],
|
||||
NTTransData['NT_Trans_Data'],
|
||||
NTTransParameters['MaxDataCount'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('NTTransaction: (0x%x,%s)' % (command, e), logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
#raise
|
||||
@ -1157,7 +1163,7 @@ class SMBCommands:
|
||||
|
||||
# Call the handler for this TRANSACTION
|
||||
command = struct.unpack('<H', trans2Parameters['Setup'])[0]
|
||||
if transCommands.has_key(command):
|
||||
if command in transCommands:
|
||||
# Call the TRANS2 subcommand
|
||||
try:
|
||||
setup, parameters, data, errorCode = transCommands[command](connId,
|
||||
@ -1166,7 +1172,7 @@ class SMBCommands:
|
||||
trans2Data['Trans_Parameters'],
|
||||
trans2Data['Trans_Data'],
|
||||
trans2Parameters['MaxDataCount'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('Transaction2: (0x%x,%s)' % (command, e), logging.ERROR)
|
||||
#import traceback
|
||||
#traceback.print_exc()
|
||||
@ -1282,7 +1288,7 @@ class SMBCommands:
|
||||
|
||||
comClose = smb.SMBClose_Parameters(SMBCommand['Parameters'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(comClose['FID']):
|
||||
if comClose['FID'] in connData['OpenedFiles']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
fileHandle = connData['OpenedFiles'][comClose['FID']]['FileHandle']
|
||||
try:
|
||||
@ -1290,7 +1296,7 @@ class SMBCommands:
|
||||
connData['OpenedFiles'][comClose['FID']]['Socket'].close()
|
||||
elif fileHandle != VOID_FILE_DESCRIPTOR:
|
||||
os.close(fileHandle)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("comClose %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1298,7 +1304,7 @@ class SMBCommands:
|
||||
if connData['OpenedFiles'][comClose['FID']]['DeleteOnClose'] is True:
|
||||
try:
|
||||
os.remove(connData['OpenedFiles'][comClose['FID']]['FileName'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("comClose %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
del(connData['OpenedFiles'][comClose['FID']])
|
||||
@ -1326,7 +1332,7 @@ class SMBCommands:
|
||||
comWriteParameters = smb.SMBWrite_Parameters(SMBCommand['Parameters'])
|
||||
comWriteData = smb.SMBWrite_Data(SMBCommand['Data'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(comWriteParameters['Fid']):
|
||||
if comWriteParameters['Fid'] in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][comWriteParameters['Fid']]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
@ -1340,7 +1346,7 @@ class SMBCommands:
|
||||
sock = connData['OpenedFiles'][comWriteParameters['Fid']]['Socket']
|
||||
sock.send(comWriteData['Data'])
|
||||
respParameters['Count'] = comWriteParameters['Count']
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('smbComWrite: %s' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1367,12 +1373,12 @@ class SMBCommands:
|
||||
|
||||
comFlush = smb.SMBFlush_Parameters(SMBCommand['Parameters'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(comFlush['FID']):
|
||||
if comFlush['FID'] in connData['OpenedFiles']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
fileHandle = connData['OpenedFiles'][comFlush['FID']]['FileHandle']
|
||||
try:
|
||||
os.fsync(fileHandle)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("comFlush %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1400,7 +1406,7 @@ class SMBCommands:
|
||||
comCreateDirectoryData= smb.SMBCreateDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comCreateDirectoryData['DirectoryName']).replace('\\','/'))
|
||||
@ -1417,7 +1423,7 @@ class SMBCommands:
|
||||
else:
|
||||
try:
|
||||
os.mkdir(pathName)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("smbComCreateDirectory: %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1444,7 +1450,7 @@ class SMBCommands:
|
||||
|
||||
comRenameData = smb.SMBRename_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
oldFileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comRenameData['OldFileName']).replace('\\','/'))
|
||||
@ -1466,7 +1472,7 @@ class SMBCommands:
|
||||
else:
|
||||
try:
|
||||
os.rename(oldPathName,newPathName)
|
||||
except OSError, e:
|
||||
except OSError as e:
|
||||
smbServer.log("smbComRename: %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1494,7 +1500,7 @@ class SMBCommands:
|
||||
comDeleteData = smb.SMBDelete_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteData['FileName']).replace('\\','/'))
|
||||
@ -1510,7 +1516,7 @@ class SMBCommands:
|
||||
else:
|
||||
try:
|
||||
os.remove(pathName)
|
||||
except OSError, e:
|
||||
except OSError as e:
|
||||
smbServer.log("smbComDelete: %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1538,7 +1544,7 @@ class SMBCommands:
|
||||
comDeleteDirectoryData= smb.SMBDeleteDirectory_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
fileName = os.path.normpath(decodeSMBString(recvPacket['Flags2'],comDeleteDirectoryData['DirectoryName']).replace('\\','/'))
|
||||
@ -1554,7 +1560,7 @@ class SMBCommands:
|
||||
else:
|
||||
try:
|
||||
os.rmdir(pathName)
|
||||
except OSError, e:
|
||||
except OSError as e:
|
||||
smbServer.log("smbComDeleteDirectory: %s" % e,logging.ERROR)
|
||||
if e.errno == errno.ENOTEMPTY:
|
||||
errorCode = STATUS_DIRECTORY_NOT_EMPTY
|
||||
@ -1593,13 +1599,13 @@ class SMBCommands:
|
||||
writeAndXData.fromString(SMBCommand['Data'])
|
||||
|
||||
|
||||
if connData['OpenedFiles'].has_key(writeAndX['Fid']):
|
||||
if writeAndX['Fid'] in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][writeAndX['Fid']]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
if fileHandle != PIPE_FILE_DESCRIPTOR:
|
||||
offset = writeAndX['Offset']
|
||||
if writeAndX.fields.has_key('HighOffset'):
|
||||
if 'HighOffset' in writeAndX.fields:
|
||||
offset += (writeAndX['HighOffset'] << 32)
|
||||
# If we're trying to write past the file end we just skip the write call (Vista does this)
|
||||
if os.lseek(fileHandle, 0, 2) >= offset:
|
||||
@ -1611,7 +1617,7 @@ class SMBCommands:
|
||||
|
||||
respParameters['Count'] = writeAndX['DataLength']
|
||||
respParameters['Available']= 0xff
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('smbComWriteAndx: %s' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1637,7 +1643,7 @@ class SMBCommands:
|
||||
|
||||
comReadParameters = smb.SMBRead_Parameters(SMBCommand['Parameters'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(comReadParameters['Fid']):
|
||||
if comReadParameters['Fid'] in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][comReadParameters['Fid']]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
@ -1651,7 +1657,7 @@ class SMBCommands:
|
||||
respParameters['Count'] = len(content)
|
||||
respData['DataLength'] = len(content)
|
||||
respData['Data'] = content
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('smbComRead: %s ' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1680,13 +1686,13 @@ class SMBCommands:
|
||||
else:
|
||||
readAndX = smb.SMBReadAndX_Parameters(SMBCommand['Parameters'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(readAndX['Fid']):
|
||||
if readAndX['Fid'] in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][readAndX['Fid']]['FileHandle']
|
||||
errorCode = 0
|
||||
try:
|
||||
if fileHandle != PIPE_FILE_DESCRIPTOR:
|
||||
offset = readAndX['Offset']
|
||||
if readAndX.fields.has_key('HighOffset'):
|
||||
if 'HighOffset' in readAndX.fields:
|
||||
offset += (readAndX['HighOffset'] << 32)
|
||||
os.lseek(fileHandle,offset,0)
|
||||
content = os.read(fileHandle,readAndX['MaxCount'])
|
||||
@ -1698,7 +1704,7 @@ class SMBCommands:
|
||||
respParameters['DataOffset'] = 59
|
||||
respParameters['DataCount_Hi'] = 0
|
||||
respData = content
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('smbComReadAndX: %s ' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -1725,7 +1731,7 @@ class SMBCommands:
|
||||
queryInformation= smb.SMBQueryInformation_Data(flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
fileSize, lastWriteTime, fileAttributes = queryFsInformation(
|
||||
connData['ConnectedShares'][recvPacket['Tid']]['path'],
|
||||
decodeSMBString(recvPacket['Flags2'],queryInformation['FileName']))
|
||||
@ -1755,7 +1761,7 @@ class SMBCommands:
|
||||
respData = ''
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
totalUnits, freeUnits = queryDiskInformation(
|
||||
connData['ConnectedShares'][recvPacket['Tid']]['path'])
|
||||
|
||||
@ -1807,7 +1813,7 @@ class SMBCommands:
|
||||
respParameters = ''
|
||||
respData = ''
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['Tid'],connData['ConnectedShares'][recvPacket['Tid']]['shareName']))
|
||||
del(connData['ConnectedShares'][recvPacket['Tid']])
|
||||
errorCode = STATUS_SUCCESS
|
||||
@ -1854,7 +1860,7 @@ class SMBCommands:
|
||||
|
||||
queryInformation2 = smb.SMBQueryInformation2_Parameters(SMBCommand['Parameters'])
|
||||
errorCode = 0xFF
|
||||
if connData['OpenedFiles'].has_key(queryInformation2['Fid']):
|
||||
if queryInformation2['Fid'] in connData['OpenedFiles']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
pathName = connData['OpenedFiles'][queryInformation2['Fid']]['FileName']
|
||||
try:
|
||||
@ -1873,7 +1879,7 @@ class SMBCommands:
|
||||
if os.path.isfile(pathName):
|
||||
attribs = smb.SMB_FILE_ATTRIBUTE_NORMAL
|
||||
respParameters['FileAttributes'] = attribs
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('smbComQueryInformation2 %s' % e,logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
|
||||
@ -1904,14 +1910,14 @@ class SMBCommands:
|
||||
# respParameters['VolumeGUID'] = '\x00'
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
# If we have a rootFid, the path is relative to that fid
|
||||
errorCode = STATUS_SUCCESS
|
||||
if ntCreateAndXParameters['RootFid'] > 0:
|
||||
path = connData['OpenedFiles'][ntCreateAndXParameters['RootFid']]['FileName']
|
||||
LOG.debug("RootFid present %s!" % path)
|
||||
else:
|
||||
if connData['ConnectedShares'][recvPacket['Tid']].has_key('path'):
|
||||
if 'path' in connData['ConnectedShares'][recvPacket['Tid']]:
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
else:
|
||||
path = 'NONE'
|
||||
@ -1947,7 +1953,7 @@ class SMBCommands:
|
||||
else:
|
||||
mode |= os.O_CREAT
|
||||
elif createDisposition & smb.FILE_OPEN == smb.FILE_OPEN:
|
||||
if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
|
||||
if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
|
||||
errorCode = STATUS_NO_SUCH_FILE
|
||||
|
||||
if errorCode == STATUS_SUCCESS:
|
||||
@ -1969,7 +1975,7 @@ class SMBCommands:
|
||||
# Let's create the directory
|
||||
os.mkdir(pathName)
|
||||
mode = os.O_RDONLY
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
if createOptions & smb.FILE_NON_DIRECTORY_FILE == smb.FILE_NON_DIRECTORY_FILE:
|
||||
@ -1989,13 +1995,13 @@ class SMBCommands:
|
||||
else:
|
||||
if sys.platform == 'win32':
|
||||
mode |= os.O_BINARY
|
||||
if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
|
||||
if unicode(pathName) in smbServer.getRegisteredNamedPipes():
|
||||
fid = PIPE_FILE_DESCRIPTOR
|
||||
sock = socket.socket()
|
||||
sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
|
||||
else:
|
||||
fid = os.open(pathName, mode)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("NTCreateAndX: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
|
||||
#print e
|
||||
fid = 0
|
||||
@ -2074,7 +2080,7 @@ class SMBCommands:
|
||||
openAndXData = smb.SMBOpenAndX_Data( flags = recvPacket['Flags2'], data = SMBCommand['Data'])
|
||||
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['Tid']):
|
||||
if recvPacket['Tid'] in connData['ConnectedShares']:
|
||||
path = connData['ConnectedShares'][recvPacket['Tid']]['path']
|
||||
openedFile, mode, pathName, errorCode = openFile(path,
|
||||
decodeSMBString(recvPacket['Flags2'],openAndXData['FileName']),
|
||||
@ -2223,7 +2229,7 @@ class SMBCommands:
|
||||
mechType = blob['MechTypes'][0]
|
||||
if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
|
||||
# Nope, do we know it?
|
||||
if MechTypes.has_key(mechType):
|
||||
if mechType in MechTypes:
|
||||
mechStr = MechTypes[mechType]
|
||||
else:
|
||||
mechStr = hexlify(mechType)
|
||||
@ -2431,7 +2437,7 @@ class SMBCommands:
|
||||
_dialects_parameters = smb.SMBNTLMDialect_Parameters()
|
||||
_dialects_data= smb.SMBNTLMDialect_Data()
|
||||
_dialects_data['Payload'] = ''
|
||||
if connData.has_key('EncryptionKey'):
|
||||
if 'EncryptionKey' in connData:
|
||||
_dialects_data['Challenge'] = connData['EncryptionKey']
|
||||
_dialects_parameters['ChallengeLength'] = len(str(_dialects_data))
|
||||
else:
|
||||
@ -2463,7 +2469,7 @@ class SMBCommands:
|
||||
connData['_dialects_data'] = _dialects_data
|
||||
connData['_dialects_parameters'] = _dialects_parameters
|
||||
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
# No NTLM throw an error
|
||||
smbServer.log('smbComNegotiate: %s' % e, logging.ERROR)
|
||||
respSMBCommand['Data'] = struct.pack('<H',0xffff)
|
||||
@ -2570,7 +2576,7 @@ class SMB2Commands:
|
||||
mechType = blob['MechTypes'][0]
|
||||
if mechType != TypesMech['NTLMSSP - Microsoft NTLM Security Support Provider']:
|
||||
# Nope, do we know it?
|
||||
if MechTypes.has_key(mechType):
|
||||
if mechType in MechTypes:
|
||||
mechStr = MechTypes[mechType]
|
||||
else:
|
||||
mechStr = hexlify(mechType)
|
||||
@ -2781,10 +2787,10 @@ class SMB2Commands:
|
||||
|
||||
respSMBCommand['Buffer'] = '\x00'
|
||||
# Get the Tid associated
|
||||
if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
|
||||
if recvPacket['TreeID'] in connData['ConnectedShares']:
|
||||
# If we have a rootFid, the path is relative to that fid
|
||||
errorCode = STATUS_SUCCESS
|
||||
if connData['ConnectedShares'][recvPacket['TreeID']].has_key('path'):
|
||||
if 'path' in connData['ConnectedShares'][recvPacket['TreeID']]:
|
||||
path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
|
||||
else:
|
||||
path = 'NONE'
|
||||
@ -2820,7 +2826,7 @@ class SMB2Commands:
|
||||
else:
|
||||
mode |= os.O_CREAT
|
||||
elif createDisposition & smb2.FILE_OPEN == smb2.FILE_OPEN:
|
||||
if os.path.exists(pathName) is not True and smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)) is not True:
|
||||
if os.path.exists(pathName) is not True and (unicode(pathName) in smbServer.getRegisteredNamedPipes()) is not True:
|
||||
errorCode = STATUS_NO_SUCH_FILE
|
||||
|
||||
if errorCode == STATUS_SUCCESS:
|
||||
@ -2842,7 +2848,7 @@ class SMB2Commands:
|
||||
# Let's create the directory
|
||||
os.mkdir(pathName)
|
||||
mode = os.O_RDONLY
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
if createOptions & smb2.FILE_NON_DIRECTORY_FILE == smb2.FILE_NON_DIRECTORY_FILE:
|
||||
@ -2862,13 +2868,13 @@ class SMB2Commands:
|
||||
else:
|
||||
if sys.platform == 'win32':
|
||||
mode |= os.O_BINARY
|
||||
if smbServer.getRegisteredNamedPipes().has_key(unicode(pathName)):
|
||||
if unicode(pathName) in smbServer.getRegisteredNamedPipes():
|
||||
fid = PIPE_FILE_DESCRIPTOR
|
||||
sock = socket.socket()
|
||||
sock.connect(smbServer.getRegisteredNamedPipes()[unicode(pathName)])
|
||||
else:
|
||||
fid = os.open(pathName, mode)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("SMB2_CREATE: %s,%s,%s" % (pathName,mode,e),logging.ERROR)
|
||||
#print e
|
||||
fid = 0
|
||||
@ -2939,14 +2945,14 @@ class SMB2Commands:
|
||||
|
||||
if str(closeRequest['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(closeRequest['FileID'])
|
||||
else:
|
||||
fileID = str(closeRequest['FileID'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(fileID):
|
||||
if fileID in connData['OpenedFiles']:
|
||||
errorCode = STATUS_SUCCESS
|
||||
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
|
||||
pathName = connData['OpenedFiles'][fileID]['FileName']
|
||||
@ -2957,7 +2963,7 @@ class SMB2Commands:
|
||||
elif fileHandle != VOID_FILE_DESCRIPTOR:
|
||||
os.close(fileHandle)
|
||||
infoRecord, errorCode = queryFileInformation(os.path.dirname(pathName), os.path.basename(pathName), smb2.SMB2_FILE_NETWORK_OPEN_INFO)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_INVALID_HANDLE
|
||||
else:
|
||||
@ -2968,7 +2974,7 @@ class SMB2Commands:
|
||||
shutil.rmtree(connData['OpenedFiles'][fileID]['FileName'])
|
||||
else:
|
||||
os.remove(connData['OpenedFiles'][fileID]['FileName'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("SMB2_CLOSE %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
|
||||
@ -3004,15 +3010,15 @@ class SMB2Commands:
|
||||
|
||||
if str(queryInfo['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(queryInfo['FileID'])
|
||||
else:
|
||||
fileID = str(queryInfo['FileID'])
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
|
||||
if connData['OpenedFiles'].has_key(fileID):
|
||||
if recvPacket['TreeID'] in connData['ConnectedShares']:
|
||||
if fileID in connData['OpenedFiles']:
|
||||
fileName = connData['OpenedFiles'][fileID]['FileName']
|
||||
|
||||
if queryInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
|
||||
@ -3055,16 +3061,16 @@ class SMB2Commands:
|
||||
|
||||
if str(setInfo['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(setInfo['FileID'])
|
||||
else:
|
||||
fileID = str(setInfo['FileID'])
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
|
||||
if recvPacket['TreeID'] in connData['ConnectedShares']:
|
||||
path = connData['ConnectedShares'][recvPacket['TreeID']]['path']
|
||||
if connData['OpenedFiles'].has_key(fileID):
|
||||
if fileID in connData['OpenedFiles']:
|
||||
pathName = connData['OpenedFiles'][fileID]['FileName']
|
||||
|
||||
if setInfo['InfoType'] == smb2.SMB2_0_INFO_FILE:
|
||||
@ -3104,7 +3110,7 @@ class SMB2Commands:
|
||||
try:
|
||||
os.rename(pathName,newPathName)
|
||||
connData['OpenedFiles'][fileID]['FileName'] = newPathName
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("smb2SetInfo: %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -3145,14 +3151,14 @@ class SMB2Commands:
|
||||
|
||||
if str(writeRequest['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(writeRequest['FileID'])
|
||||
else:
|
||||
fileID = str(writeRequest['FileID'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(fileID):
|
||||
if fileID in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
@ -3168,7 +3174,7 @@ class SMB2Commands:
|
||||
|
||||
respSMBCommand['Count'] = writeRequest['Length']
|
||||
respSMBCommand['Remaining']= 0xff
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('SMB2_WRITE: %s' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -3188,14 +3194,14 @@ class SMB2Commands:
|
||||
|
||||
if str(readRequest['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(readRequest['FileID'])
|
||||
else:
|
||||
fileID = str(readRequest['FileID'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(fileID):
|
||||
if fileID in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][fileID]['FileHandle']
|
||||
errorCode = 0
|
||||
try:
|
||||
@ -3211,7 +3217,7 @@ class SMB2Commands:
|
||||
respSMBCommand['DataLength'] = len(content)
|
||||
respSMBCommand['DataRemaining']= 0
|
||||
respSMBCommand['Buffer'] = content
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('SMB2_READ: %s ' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -3227,12 +3233,12 @@ class SMB2Commands:
|
||||
respSMBCommand = smb2.SMB2Flush_Response()
|
||||
flushRequest = smb2.SMB2Flush(recvPacket['Data'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(str(flushRequest['FileID'])):
|
||||
if str(flushRequest['FileID']) in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][str(flushRequest['FileID'])]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
os.fsync(fileHandle)
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log("SMB2_FLUSH %s" % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -3251,21 +3257,21 @@ class SMB2Commands:
|
||||
respSMBCommand['Buffer'] = '\x00'
|
||||
|
||||
# The server MUST locate the tree connection, as specified in section 3.3.5.2.11.
|
||||
if connData['ConnectedShares'].has_key(recvPacket['TreeID']) is False:
|
||||
if (recvPacket['TreeID'] in connData['ConnectedShares']) is False:
|
||||
return [smb2.SMB2Error()], None, STATUS_NETWORK_NAME_DELETED
|
||||
|
||||
# Next, the server MUST locate the open for the directory to be queried
|
||||
# If no open is found, the server MUST fail the request with STATUS_FILE_CLOSED
|
||||
if str(queryDirectoryRequest['FileID']) == '\xff'*16:
|
||||
# Let's take the data from the lastRequest
|
||||
if connData['LastRequest'].has_key('SMB2_CREATE'):
|
||||
if 'SMB2_CREATE' in connData['LastRequest']:
|
||||
fileID = connData['LastRequest']['SMB2_CREATE']['FileID']
|
||||
else:
|
||||
fileID = str(queryDirectoryRequest['FileID'])
|
||||
else:
|
||||
fileID = str(queryDirectoryRequest['FileID'])
|
||||
|
||||
if connData['OpenedFiles'].has_key(fileID) is False:
|
||||
if (fileID in connData['OpenedFiles']) is False:
|
||||
return [smb2.SMB2Error()], None, STATUS_FILE_CLOSED
|
||||
|
||||
# If the open is not an open to a directory, the request MUST be failed
|
||||
@ -3383,7 +3389,7 @@ class SMB2Commands:
|
||||
|
||||
respSMBCommand = smb2.SMB2TreeDisconnect_Response()
|
||||
|
||||
if connData['ConnectedShares'].has_key(recvPacket['TreeID']):
|
||||
if recvPacket['TreeID'] in connData['ConnectedShares']:
|
||||
smbServer.log("Disconnecting Share(%d:%s)" % (recvPacket['TreeID'],connData['ConnectedShares'][recvPacket['TreeID']]['shareName']))
|
||||
del(connData['ConnectedShares'][recvPacket['TreeID']])
|
||||
errorCode = STATUS_SUCCESS
|
||||
@ -3420,7 +3426,7 @@ class SMB2Commands:
|
||||
ioctlRequest = smb2.SMB2Ioctl(recvPacket['Data'])
|
||||
|
||||
ioctls = smbServer.getIoctls()
|
||||
if ioctls.has_key(ioctlRequest['CtlCode']):
|
||||
if ioctlRequest['CtlCode'] in ioctls:
|
||||
outputData, errorCode = ioctls[ioctlRequest['CtlCode']](connId, smbServer, ioctlRequest)
|
||||
if errorCode == STATUS_SUCCESS:
|
||||
respSMBCommand['CtlCode'] = ioctlRequest['CtlCode']
|
||||
@ -3475,7 +3481,7 @@ class Ioctls:
|
||||
|
||||
ioctlResponse = ''
|
||||
|
||||
if connData['OpenedFiles'].has_key(str(ioctlRequest['FileID'])):
|
||||
if str(ioctlRequest['FileID']) in connData['OpenedFiles']:
|
||||
fileHandle = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['FileHandle']
|
||||
errorCode = STATUS_SUCCESS
|
||||
try:
|
||||
@ -3485,7 +3491,7 @@ class Ioctls:
|
||||
sock = connData['OpenedFiles'][str(ioctlRequest['FileID'])]['Socket']
|
||||
sock.sendall(ioctlRequest['Buffer'])
|
||||
ioctlResponse = sock.recv(ioctlRequest['MaxOutputResponse'])
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
smbServer.log('fsctlPipeTransceive: %s ' % e, logging.ERROR)
|
||||
errorCode = STATUS_ACCESS_DENIED
|
||||
else:
|
||||
@ -3551,7 +3557,7 @@ class SMBSERVERHandler(SocketServer.BaseRequestHandler):
|
||||
# a single packet
|
||||
for i in resp:
|
||||
session.send_packet(str(i))
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
self.__SMB.log("Handle: %s" % e)
|
||||
#import traceback
|
||||
#traceback.print_exc()
|
||||
@ -3734,7 +3740,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
def getConnectionData(self, connId, checkStatus = True):
|
||||
conn = self.__activeConnections[connId]
|
||||
if checkStatus is True:
|
||||
if conn.has_key('Authenticated') is not True:
|
||||
if ('Authenticated' in conn) is not True:
|
||||
# Can't keep going further
|
||||
raise Exception("User not Authenticated!")
|
||||
return conn
|
||||
@ -3747,13 +3753,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
return True
|
||||
|
||||
def unregisterNamedPipe(self, pipeName):
|
||||
if self.__registeredNamedPipes.has_key(pipeName):
|
||||
if pipeName in self.__registeredNamedPipes:
|
||||
del(self.__registeredNamedPipes[unicode(pipeName)])
|
||||
return True
|
||||
return False
|
||||
|
||||
def unregisterTransaction(self, transCommand):
|
||||
if self.__smbTransCommands.has_key(transCommand):
|
||||
if transCommand in self.__smbTransCommands:
|
||||
del(self.__smbTransCommands[transCommand])
|
||||
|
||||
def hookTransaction(self, transCommand, callback):
|
||||
@ -3788,7 +3794,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
# respData: the data reponse of the transaction
|
||||
# errorCode: the NT error code
|
||||
|
||||
if self.__smbTransCommands.has_key(transCommand):
|
||||
if transCommand in self.__smbTransCommands:
|
||||
originalCommand = self.__smbTransCommands[transCommand]
|
||||
else:
|
||||
originalCommand = None
|
||||
@ -3797,13 +3803,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
return originalCommand
|
||||
|
||||
def unregisterTransaction2(self, transCommand):
|
||||
if self.__smbTrans2Commands.has_key(transCommand):
|
||||
if transCommand in self.__smbTrans2Commands:
|
||||
del(self.__smbTrans2Commands[transCommand])
|
||||
|
||||
def hookTransaction2(self, transCommand, callback):
|
||||
# Here we should add to __smbTrans2Commands
|
||||
# Same description as Transaction
|
||||
if self.__smbTrans2Commands.has_key(transCommand):
|
||||
if transCommand in self.__smbTrans2Commands:
|
||||
originalCommand = self.__smbTrans2Commands[transCommand]
|
||||
else:
|
||||
originalCommand = None
|
||||
@ -3812,13 +3818,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
return originalCommand
|
||||
|
||||
def unregisterNTTransaction(self, transCommand):
|
||||
if self.__smbNTTransCommands.has_key(transCommand):
|
||||
if transCommand in self.__smbNTTransCommands:
|
||||
del(self.__smbNTTransCommands[transCommand])
|
||||
|
||||
def hookNTTransaction(self, transCommand, callback):
|
||||
# Here we should add to __smbNTTransCommands
|
||||
# Same description as Transaction
|
||||
if self.__smbNTTransCommands.has_key(transCommand):
|
||||
if transCommand in self.__smbNTTransCommands:
|
||||
originalCommand = self.__smbNTTransCommands[transCommand]
|
||||
else:
|
||||
originalCommand = None
|
||||
@ -3827,7 +3833,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
return originalCommand
|
||||
|
||||
def unregisterSmbCommand(self, smbCommand):
|
||||
if self.__smbCommands.has_key(smbCommand):
|
||||
if smbCommand in self.__smbCommands:
|
||||
del(self.__smbCommands[smbCommand])
|
||||
|
||||
def hookSmbCommand(self, smbCommand, callback):
|
||||
@ -3866,7 +3872,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
# transCommands: a list of transaction subcommands already registered
|
||||
#
|
||||
|
||||
if self.__smbCommands.has_key(smbCommand):
|
||||
if smbCommand in self.__smbCommands:
|
||||
originalCommand = self.__smbCommands[smbCommand]
|
||||
else:
|
||||
originalCommand = None
|
||||
@ -3875,11 +3881,11 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
return originalCommand
|
||||
|
||||
def unregisterSmb2Command(self, smb2Command):
|
||||
if self.__smb2Commands.has_key(smb2Command):
|
||||
if smb2Command in self.__smb2Commands:
|
||||
del(self.__smb2Commands[smb2Command])
|
||||
|
||||
def hookSmb2Command(self, smb2Command, callback):
|
||||
if self.__smb2Commands.has_key(smb2Command):
|
||||
if smb2Command in self.__smb2Commands:
|
||||
originalCommand = self.__smb2Commands[smb2Command]
|
||||
else:
|
||||
originalCommand = None
|
||||
@ -3969,13 +3975,13 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
packet,
|
||||
self.__smbTransCommands)
|
||||
else:
|
||||
if self.__smbCommands.has_key(packet['Command']):
|
||||
if packet['Command'] in self.__smbCommands:
|
||||
if self.__SMB2Support is True:
|
||||
if packet['Command'] == smb.SMB.SMB_COM_NEGOTIATE:
|
||||
try:
|
||||
respCommands, respPackets, errorCode = self.__smb2Commands[smb2.SMB2_NEGOTIATE](connId, self, packet, True)
|
||||
isSMB2 = True
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
self.log('SMB2_NEGOTIATE: %s' % e, logging.ERROR)
|
||||
# If something went wrong, let's fallback to SMB1
|
||||
respCommands, respPackets, errorCode = self.__smbCommands[packet['Command']](
|
||||
@ -4006,7 +4012,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
else:
|
||||
done = False
|
||||
while not done:
|
||||
if self.__smb2Commands.has_key(packet['Command']):
|
||||
if packet['Command'] in self.__smb2Commands:
|
||||
if self.__SMB2Support is True:
|
||||
respCommands, respPackets, errorCode = self.__smb2Commands[packet['Command']](
|
||||
connId,
|
||||
@ -4025,7 +4031,7 @@ smb.SMB.TRANS_TRANSACT_NMPIPE :self.__smbTransHandler.transactNamedPipe
|
||||
else:
|
||||
done = True
|
||||
|
||||
except Exception, e:
|
||||
except Exception as e:
|
||||
#import traceback
|
||||
#traceback.print_exc()
|
||||
# Something wen't wrong, defaulting to Bad user ID
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import print_function
|
||||
# Copyright (c) 2003-2016 CORE Security Technologies
|
||||
#
|
||||
# This software is provided under under a slightly modified version
|
||||
@ -13,7 +14,7 @@
|
||||
from struct import pack, unpack, calcsize
|
||||
|
||||
############### GSS Stuff ################
|
||||
GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
|
||||
GSS_API_SPNEGO_UUID = '\x2b\x06\x01\x05\x05\x02'
|
||||
ASN1_SEQUENCE = 0x30
|
||||
ASN1_AID = 0x60
|
||||
ASN1_OID = 0x06
|
||||
@ -33,59 +34,59 @@ MechTypes = {
|
||||
TypesMech = dict((v,k) for k, v in MechTypes.iteritems())
|
||||
|
||||
def asn1encode(data = ''):
|
||||
#res = asn1.SEQUENCE(str).encode()
|
||||
#import binascii
|
||||
#print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
|
||||
if 0 <= len(data) <= 0x7F:
|
||||
res = pack('B', len(data)) + data
|
||||
elif 0x80 <= len(data) <= 0xFF:
|
||||
res = pack('BB', 0x81, len(data)) + data
|
||||
elif 0x100 <= len(data) <= 0xFFFF:
|
||||
res = pack('!BH', 0x82, len(data)) + data
|
||||
elif 0x10000 <= len(data) <= 0xffffff:
|
||||
res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
|
||||
elif 0x1000000 <= len(data) <= 0xffffffff:
|
||||
res = pack('!BL', 0x84, len(data)) + data
|
||||
else:
|
||||
raise Exception('Error in asn1encode')
|
||||
return str(res)
|
||||
#res = asn1.SEQUENCE(str).encode()
|
||||
#import binascii
|
||||
#print '\nalex asn1encode str: %s\n' % binascii.hexlify(str)
|
||||
if 0 <= len(data) <= 0x7F:
|
||||
res = pack('B', len(data)) + data
|
||||
elif 0x80 <= len(data) <= 0xFF:
|
||||
res = pack('BB', 0x81, len(data)) + data
|
||||
elif 0x100 <= len(data) <= 0xFFFF:
|
||||
res = pack('!BH', 0x82, len(data)) + data
|
||||
elif 0x10000 <= len(data) <= 0xffffff:
|
||||
res = pack('!BBH', 0x83, len(data) >> 16, len(data) & 0xFFFF) + data
|
||||
elif 0x1000000 <= len(data) <= 0xffffffff:
|
||||
res = pack('!BL', 0x84, len(data)) + data
|
||||
else:
|
||||
raise Exception('Error in asn1encode')
|
||||
return str(res)
|
||||
|
||||
def asn1decode(data = ''):
|
||||
len1 = unpack('B', data[:1])[0]
|
||||
data = data[1:]
|
||||
if len1 == 0x81:
|
||||
pad = calcsize('B')
|
||||
len2 = unpack('B',data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
elif len1 == 0x82:
|
||||
pad = calcsize('H')
|
||||
len2 = unpack('!H', data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
elif len1 == 0x83:
|
||||
pad = calcsize('B') + calcsize('!H')
|
||||
len2, len3 = unpack('!BH', data[:pad])
|
||||
data = data[pad:]
|
||||
ans = data[:len2 << 16 + len3]
|
||||
elif len1 == 0x84:
|
||||
pad = calcsize('!L')
|
||||
len2 = unpack('!L', data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
# 1 byte length, string <= 0x7F
|
||||
else:
|
||||
pad = 0
|
||||
ans = data[:len1]
|
||||
return ans, len(ans)+pad+1
|
||||
len1 = unpack('B', data[:1])[0]
|
||||
data = data[1:]
|
||||
if len1 == 0x81:
|
||||
pad = calcsize('B')
|
||||
len2 = unpack('B',data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
elif len1 == 0x82:
|
||||
pad = calcsize('H')
|
||||
len2 = unpack('!H', data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
elif len1 == 0x83:
|
||||
pad = calcsize('B') + calcsize('!H')
|
||||
len2, len3 = unpack('!BH', data[:pad])
|
||||
data = data[pad:]
|
||||
ans = data[:len2 << 16 + len3]
|
||||
elif len1 == 0x84:
|
||||
pad = calcsize('!L')
|
||||
len2 = unpack('!L', data[:pad])[0]
|
||||
data = data[pad:]
|
||||
ans = data[:len2]
|
||||
# 1 byte length, string <= 0x7F
|
||||
else:
|
||||
pad = 0
|
||||
ans = data[:len1]
|
||||
return ans, len(ans)+pad+1
|
||||
|
||||
class GSSAPI:
|
||||
# Generic GSSAPI Header Format
|
||||
# Generic GSSAPI Header Format
|
||||
def __init__(self, data = None):
|
||||
self.fields = {}
|
||||
self['UUID'] = GSS_API_SPNEGO_UUID
|
||||
if data:
|
||||
self.fromString(data)
|
||||
self.fromString(data)
|
||||
pass
|
||||
|
||||
def __setitem__(self,key,value):
|
||||
@ -115,27 +116,27 @@ class GSSAPI:
|
||||
if next_byte != ASN1_AID:
|
||||
raise Exception('Unknown AID=%x' % next_byte)
|
||||
data = data[1:]
|
||||
decode_data, total_bytes = asn1decode(data)
|
||||
decode_data, total_bytes = asn1decode(data)
|
||||
# Now we should have a OID tag
|
||||
next_byte = unpack('B',decode_data[:1])[0]
|
||||
next_byte = unpack('B',decode_data[:1])[0]
|
||||
if next_byte != ASN1_OID:
|
||||
raise Exception('OID tag not found %x' % next_byte)
|
||||
decode_data = decode_data[1:]
|
||||
# Now the OID contents, should be SPNEGO UUID
|
||||
uuid, total_bytes = asn1decode(decode_data)
|
||||
uuid, total_bytes = asn1decode(decode_data)
|
||||
self['OID'] = uuid
|
||||
# the rest should be the data
|
||||
self['Payload'] = decode_data[total_bytes:]
|
||||
#pass
|
||||
|
||||
|
||||
def dump(self):
|
||||
for i in self.fields.keys():
|
||||
print "%s: {%r}" % (i,self[i])
|
||||
print("%s: {%r}" % (i,self[i]))
|
||||
|
||||
def getData(self):
|
||||
ans = pack('B',ASN1_AID)
|
||||
ans += asn1encode(
|
||||
pack('B',ASN1_OID) +
|
||||
pack('B',ASN1_OID) +
|
||||
asn1encode(self['UUID']) +
|
||||
self['Payload'] )
|
||||
return ans
|
||||
@ -163,7 +164,7 @@ class SPNEGO_NegTokenResp:
|
||||
def __init__(self, data = None):
|
||||
self.fields = {}
|
||||
if data:
|
||||
self.fromString(data)
|
||||
self.fromString(data)
|
||||
pass
|
||||
|
||||
def __setitem__(self,key,value):
|
||||
@ -198,7 +199,7 @@ class SPNEGO_NegTokenResp:
|
||||
if next_byte != ASN1_MECH_TYPE:
|
||||
# MechType not found, could be an AUTH answer
|
||||
if next_byte != ASN1_RESPONSE_TOKEN:
|
||||
raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
|
||||
raise Exception('MechType/ResponseToken tag not found %x' % next_byte)
|
||||
else:
|
||||
decode_data2 = decode_data[1:]
|
||||
decode_data2, total_bytes = asn1decode(decode_data2)
|
||||
@ -245,30 +246,30 @@ class SPNEGO_NegTokenResp:
|
||||
|
||||
def dump(self):
|
||||
for i in self.fields.keys():
|
||||
print "%s: {%r}" % (i,self[i])
|
||||
|
||||
print("%s: {%r}" % (i,self[i]))
|
||||
|
||||
def getData(self):
|
||||
ans = pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_RESP)
|
||||
if self.fields.has_key('NegResult') and self.fields.has_key('SupportedMech'):
|
||||
if 'NegResult' in self.fields and 'SupportedMech' in self.fields:
|
||||
# Server resp
|
||||
ans += asn1encode(
|
||||
pack('B', ASN1_SEQUENCE) +
|
||||
asn1encode(
|
||||
pack('B',SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
|
||||
asn1encode(
|
||||
pack('B',ASN1_ENUMERATED) +
|
||||
pack('B',ASN1_ENUMERATED) +
|
||||
asn1encode( self['NegResult'] )) +
|
||||
pack('B',ASN1_SUPPORTED_MECH) +
|
||||
asn1encode(
|
||||
asn1encode(
|
||||
pack('B',ASN1_OID) +
|
||||
asn1encode(self['SupportedMech'])) +
|
||||
pack('B',ASN1_RESPONSE_TOKEN ) +
|
||||
asn1encode(
|
||||
pack('B', ASN1_OCTET_STRING) + asn1encode(self['ResponseToken']))))
|
||||
elif self.fields.has_key('NegResult'):
|
||||
elif 'NegResult' in self.fields:
|
||||
# Server resp
|
||||
ans += asn1encode(
|
||||
pack('B', ASN1_SEQUENCE) +
|
||||
pack('B', ASN1_SEQUENCE) +
|
||||
asn1encode(
|
||||
pack('B', SPNEGO_NegTokenResp.SPNEGO_NEG_TOKEN_TARG) +
|
||||
asn1encode(
|
||||
@ -285,24 +286,24 @@ class SPNEGO_NegTokenResp:
|
||||
return ans
|
||||
|
||||
class SPNEGO_NegTokenInit(GSSAPI):
|
||||
# http://tools.ietf.org/html/rfc4178#page-8
|
||||
# http://tools.ietf.org/html/rfc4178#page-8
|
||||
# NegTokeInit :: = SEQUENCE {
|
||||
# mechTypes [0] MechTypeList,
|
||||
# mechTypes [0] MechTypeList,
|
||||
# reqFlags [1] ContextFlags OPTIONAL,
|
||||
# mechToken [2] OCTET STRING OPTIONAL,
|
||||
# mechToken [2] OCTET STRING OPTIONAL,
|
||||
# mechListMIC [3] OCTET STRING OPTIONAL,
|
||||
# }
|
||||
SPNEGO_NEG_TOKEN_INIT = 0xa0
|
||||
def fromString(self, data = 0):
|
||||
GSSAPI.fromString(self, data)
|
||||
payload = self['Payload']
|
||||
next_byte = unpack('B', payload[:1])[0]
|
||||
next_byte = unpack('B', payload[:1])[0]
|
||||
if next_byte != SPNEGO_NegTokenInit.SPNEGO_NEG_TOKEN_INIT:
|
||||
raise Exception('NegTokenInit not found %x' % next_byte)
|
||||
payload = payload[1:]
|
||||
decode_data, total_bytes = asn1decode(payload)
|
||||
# Now we should have a SEQUENCE Tag
|
||||
next_byte = unpack('B', decode_data[:1])[0]
|
||||
next_byte = unpack('B', decode_data[:1])[0]
|
||||
if next_byte != ASN1_SEQUENCE:
|
||||
raise Exception('SEQUENCE tag not found %x' % next_byte)
|
||||
decode_data = decode_data[1:]
|
||||
@ -321,14 +322,14 @@ class SPNEGO_NegTokenInit(GSSAPI):
|
||||
# And finally we should have the MechTypes
|
||||
self['MechTypes'] = []
|
||||
while decode_data:
|
||||
next_byte = unpack('B', decode_data[:1])[0]
|
||||
if next_byte != ASN1_OID:
|
||||
# Not a valid OID, there must be something else we won't unpack
|
||||
break
|
||||
decode_data = decode_data[1:]
|
||||
item, total_bytes = asn1decode(decode_data)
|
||||
self['MechTypes'].append(item)
|
||||
decode_data = decode_data[total_bytes:]
|
||||
next_byte = unpack('B', decode_data[:1])[0]
|
||||
if next_byte != ASN1_OID:
|
||||
# Not a valid OID, there must be something else we won't unpack
|
||||
break
|
||||
decode_data = decode_data[1:]
|
||||
item, total_bytes = asn1decode(decode_data)
|
||||
self['MechTypes'].append(item)
|
||||
decode_data = decode_data[total_bytes:]
|
||||
|
||||
# Do we have MechTokens as well?
|
||||
decode_data = remaining_data[total_bytes3:]
|
||||
@ -352,7 +353,7 @@ class SPNEGO_NegTokenInit(GSSAPI):
|
||||
|
||||
mechToken = ''
|
||||
# Do we have tokens to send?
|
||||
if self.fields.has_key('MechToken'):
|
||||
if 'MechToken' in self.fields:
|
||||
mechToken = pack('B', ASN1_MECH_TOKEN) + asn1encode(
|
||||
pack('B', ASN1_OCTET_STRING) + asn1encode(
|
||||
self['MechToken']))
|
||||
@ -363,10 +364,9 @@ class SPNEGO_NegTokenInit(GSSAPI):
|
||||
asn1encode(
|
||||
pack('B', ASN1_MECH_TYPE) +
|
||||
asn1encode(
|
||||
pack('B', ASN1_SEQUENCE) +
|
||||
pack('B', ASN1_SEQUENCE) +
|
||||
asn1encode(mechTypes)) + mechToken ))
|
||||
|
||||
|
||||
self['Payload'] = ans
|
||||
return GSSAPI.getData(self)
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from __future__ import print_function
|
||||
# Copyright (c) 2003-2016 CORE Security Technologies
|
||||
#
|
||||
# This software is provided under under a slightly modified version
|
||||
@ -97,18 +98,18 @@ class Structure:
|
||||
|
||||
def packField(self, fieldName, format = None):
|
||||
if self.debug:
|
||||
print "packField( %s | %s )" % (fieldName, format)
|
||||
print("packField( %s | %s )" % (fieldName, format))
|
||||
|
||||
if format is None:
|
||||
format = self.formatForField(fieldName)
|
||||
|
||||
if self.fields.has_key(fieldName):
|
||||
if fieldName in self.fields:
|
||||
ans = self.pack(format, self.fields[fieldName], field = fieldName)
|
||||
else:
|
||||
ans = self.pack(format, None, field = fieldName)
|
||||
|
||||
if self.debug:
|
||||
print "\tanswer %r" % ans
|
||||
print("\tanswer %r" % ans)
|
||||
|
||||
return ans
|
||||
|
||||
@ -119,8 +120,8 @@ class Structure:
|
||||
for field in self.commonHdr+self.structure:
|
||||
try:
|
||||
data += self.packField(field[0], field[1])
|
||||
except Exception, e:
|
||||
if self.fields.has_key(field[0]):
|
||||
except Exception as e:
|
||||
if field[0] in self.fields:
|
||||
e.args += ("When packing field '%s | %s | %r' in %s" % (field[0], field[1], self[field[0]], self.__class__),)
|
||||
else:
|
||||
e.args += ("When packing field '%s | %s' in %s" % (field[0], field[1], self.__class__),)
|
||||
@ -136,16 +137,16 @@ class Structure:
|
||||
self.rawData = data
|
||||
for field in self.commonHdr+self.structure:
|
||||
if self.debug:
|
||||
print "fromString( %s | %s | %r )" % (field[0], field[1], data)
|
||||
print("fromString( %s | %s | %r )" % (field[0], field[1], data))
|
||||
size = self.calcUnpackSize(field[1], data, field[0])
|
||||
if self.debug:
|
||||
print " size = %d" % size
|
||||
print(" size = %d" % size)
|
||||
dataClassOrCode = str
|
||||
if len(field) > 2:
|
||||
dataClassOrCode = field[2]
|
||||
try:
|
||||
self[field[0]] = self.unpack(field[1], data[:size], dataClassOrCode = dataClassOrCode, field = field[0])
|
||||
except Exception,e:
|
||||
except Exception as e:
|
||||
e.args += ("When unpacking field '%s | %s | %r[:%d]'" % (field[0], field[1], data, size),)
|
||||
raise
|
||||
|
||||
@ -175,7 +176,7 @@ class Structure:
|
||||
|
||||
def pack(self, format, data, field = None):
|
||||
if self.debug:
|
||||
print " pack( %s | %r | %s)" % (format, data, field)
|
||||
print(" pack( %s | %r | %s)" % (format, data, field))
|
||||
|
||||
if field:
|
||||
addressField = self.findAddressFieldFor(field)
|
||||
@ -206,7 +207,7 @@ class Structure:
|
||||
try:
|
||||
return self.pack(two[0], data)
|
||||
except:
|
||||
if (self.fields.has_key(two[1])) and (self[two[1]] is not None):
|
||||
if (two[1] in self.fields) and (self[two[1]] is not None):
|
||||
return self.pack(two[0], id(self[two[1]]) & ((1<<(calcsize(two[0])*8))-1) )
|
||||
else:
|
||||
return self.pack(two[0], 0)
|
||||
@ -228,7 +229,7 @@ class Structure:
|
||||
if two[0]:
|
||||
if two[0].isdigit():
|
||||
if int(two[0]) != len(data):
|
||||
raise Exception, "Array field has a constant size, and it doesn't match the actual value"
|
||||
raise Exception("Array field has a constant size, and it doesn't match the actual value")
|
||||
else:
|
||||
return self.pack(two[0], len(data))+answer
|
||||
return answer
|
||||
@ -256,7 +257,7 @@ class Structure:
|
||||
return '%s\0\0\0\0%s%s' % (l,l,data)
|
||||
|
||||
if data is None:
|
||||
raise Exception, "Trying to pack None"
|
||||
raise Exception("Trying to pack None")
|
||||
|
||||
# literal specifier
|
||||
if format[:1] == ':':
|
||||
@ -267,7 +268,7 @@ class Structure:
|
||||
|
||||
def unpack(self, format, data, dataClassOrCode = str, field = None):
|
||||
if self.debug:
|
||||
print " unpack( %s | %r )" % (format, data)
|
||||
print(" unpack( %s | %r )" % (format, data))
|
||||
|
||||
if field:
|
||||
addressField = self.findAddressFieldFor(field)
|
||||
@ -288,7 +289,7 @@ class Structure:
|
||||
if format[:1] == "'" or format[:1] == '"':
|
||||
answer = format[1:]
|
||||
if answer != data:
|
||||
raise Exception, "Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer)
|
||||
raise Exception("Unpacked data doesn't match constant value '%r' should be '%r'" % (data, answer))
|
||||
return answer
|
||||
|
||||
# address specifier
|
||||
@ -334,13 +335,13 @@ class Structure:
|
||||
# asciiz specifier
|
||||
if format == 'z':
|
||||
if data[-1] != '\x00':
|
||||
raise Exception, ("%s 'z' field is not NUL terminated: %r" % (field, data))
|
||||
raise Exception("%s 'z' field is not NUL terminated: %r" % (field, data))
|
||||
return data[:-1] # remove trailing NUL
|
||||
|
||||
# unicode specifier
|
||||
if format == 'u':
|
||||
if data[-2:] != '\x00\x00':
|
||||
raise Exception, ("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
|
||||
raise Exception("%s 'u' field is not NUL-NUL terminated: %r" % (field, data))
|
||||
return data[:-2] # remove trailing NUL
|
||||
|
||||
# DCE-RPC/NDR string specifier
|
||||
@ -392,7 +393,7 @@ class Structure:
|
||||
answer = 0
|
||||
if two[0].isdigit():
|
||||
if int(two[0]) != len(data):
|
||||
raise Exception, "Array field has a constant size, and it doesn't match the actual value"
|
||||
raise Exception("Array field has a constant size, and it doesn't match the actual value")
|
||||
elif two[0]:
|
||||
answer += self.calcPackSize(two[0], len(data))
|
||||
|
||||
@ -428,7 +429,7 @@ class Structure:
|
||||
|
||||
def calcUnpackSize(self, format, data, field = None):
|
||||
if self.debug:
|
||||
print " calcUnpackSize( %s | %s | %r)" % (field, format, data)
|
||||
print(" calcUnpackSize( %s | %s | %r)" % (field, format, data))
|
||||
|
||||
# void specifier
|
||||
if format[:1] == '_':
|
||||
@ -487,7 +488,7 @@ class Structure:
|
||||
|
||||
# "printf" string specifier
|
||||
if format[:1] == '%':
|
||||
raise Exception, "Can't guess the size of a printf like specifier for unpacking"
|
||||
raise Exception("Can't guess the size of a printf like specifier for unpacking")
|
||||
|
||||
# asciiz specifier
|
||||
if format[:1] == 'z':
|
||||
@ -520,7 +521,7 @@ class Structure:
|
||||
for field in self.commonHdr+self.structure:
|
||||
if field[0] == fieldName:
|
||||
return field[1]
|
||||
raise Exception, ("Field %s not found" % fieldName)
|
||||
raise Exception("Field %s not found" % fieldName)
|
||||
|
||||
def findAddressFieldFor(self, fieldName):
|
||||
descriptor = '&%s' % fieldName
|
||||
@ -558,7 +559,7 @@ class Structure:
|
||||
def dump(self, msg = None, indent = 0):
|
||||
if msg is None: msg = self.__class__.__name__
|
||||
ind = ' '*indent
|
||||
print "\n%s" % msg
|
||||
print("\n%s" % msg)
|
||||
fixedFields = []
|
||||
for field in self.commonHdr+self.structure:
|
||||
i = field[0]
|
||||
@ -566,18 +567,18 @@ class Structure:
|
||||
fixedFields.append(i)
|
||||
if isinstance(self[i], Structure):
|
||||
self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
|
||||
print "%s}" % ind
|
||||
print("%s}" % ind)
|
||||
else:
|
||||
print "%s%s: {%r}" % (ind,i,self[i])
|
||||
print("%s%s: {%r}" % (ind,i,self[i]))
|
||||
# Do we have remaining fields not defined in the structures? let's
|
||||
# print them
|
||||
remainingFields = list(set(self.fields) - set(fixedFields))
|
||||
for i in remainingFields:
|
||||
if isinstance(self[i], Structure):
|
||||
self[i].dump('%s%s:{' % (ind,i), indent = indent + 4)
|
||||
print "%s}" % ind
|
||||
print("%s}" % ind)
|
||||
else:
|
||||
print "%s%s: {%r}" % (ind,i,self[i])
|
||||
print("%s%s: {%r}" % (ind,i,self[i]))
|
||||
|
||||
|
||||
class _StructureTest:
|
||||
@ -589,23 +590,23 @@ class _StructureTest:
|
||||
return self.theClass(alignment = self.alignment)
|
||||
|
||||
def run(self):
|
||||
print
|
||||
print "-"*70
|
||||
print()
|
||||
print("-"*70)
|
||||
testName = self.__class__.__name__
|
||||
print "starting test: %s....." % testName
|
||||
print("starting test: %s....." % testName)
|
||||
a = self.create()
|
||||
self.populate(a)
|
||||
a.dump("packing.....")
|
||||
a_str = str(a)
|
||||
print "packed: %r" % a_str
|
||||
print "unpacking....."
|
||||
print("packed: %r" % a_str)
|
||||
print("unpacking.....")
|
||||
b = self.create(a_str)
|
||||
b.dump("unpacked.....")
|
||||
print "repacking....."
|
||||
print("repacking.....")
|
||||
b_str = str(b)
|
||||
if b_str != a_str:
|
||||
print "ERROR: original packed and repacked don't match"
|
||||
print "packed: %r" % b_str
|
||||
print("ERROR: original packed and repacked don't match")
|
||||
print("packed: %r" % b_str)
|
||||
|
||||
class _Test_simple(_StructureTest):
|
||||
class theClass(Structure):
|
||||
@ -732,7 +733,7 @@ if __name__ == '__main__':
|
||||
try:
|
||||
_Test_fixedLength().run()
|
||||
except:
|
||||
print "cannot repack because length is bogus"
|
||||
print("cannot repack because length is bogus")
|
||||
|
||||
_Test_simple_aligned4().run()
|
||||
_Test_nested().run()
|
||||
|
@ -17,9 +17,14 @@ import re
|
||||
from random import randrange
|
||||
from struct import pack, unpack
|
||||
|
||||
try:
|
||||
long # Python 2
|
||||
except NameError:
|
||||
long = int # Python 3
|
||||
|
||||
def generate():
|
||||
# UHm... crappy Python has an maximum integer of 2**31-1.
|
||||
top = (1L<<31)-1
|
||||
top = (1<<31)-1
|
||||
return pack("IIII", randrange(top), randrange(top), randrange(top), randrange(top))
|
||||
|
||||
def bin_to_string(uuid):
|
||||
@ -49,16 +54,16 @@ def bin_to_uuidtup(bin):
|
||||
return uuidstr, "%d.%d" % (maj, min)
|
||||
|
||||
#input: string
|
||||
#output: tuple (uuid,version)
|
||||
#output: tuple (uuid,version)
|
||||
#if version is not found in the input string "1.0" is returned
|
||||
#example:
|
||||
# "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
|
||||
#example:
|
||||
# "00000000-0000-0000-0000-000000000000 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000 version 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000 v 3.0" returns ('00000000-0000-0000-0000-000000000000','3.0')
|
||||
# "10000000-2000-3000-4000-500000000000" returns ('00000000-0000-0000-0000-000000000000','1.0')
|
||||
def string_to_uuidtup(s):
|
||||
g = re.search("([A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}).*?([0-9]{1,5}\.[0-9]{1,5})",s+" 1.0")
|
||||
if g:
|
||||
if g:
|
||||
(u,v) = g.groups()
|
||||
return (u,v)
|
||||
return
|
||||
|
Loading…
x
Reference in New Issue
Block a user