github.com/n00py/Slackor@v0.0.0-20200610224921-d007fcea1740/impacket/tests/SMB_RPC/test_drsuapi.py (about)

     1  ###############################################################################
     2  #  Tested so far: 
     3  #
     4  # DRSBind
     5  # DRSDomainControllerInfo
     6  # hDRSDomainControllerInfo
     7  # DRSCrackNames
     8  # hDRSCrackNames
     9  # DRSGetNT4ChangeLog
    10  # DRSVerifyName
    11  #
    12  #  Not yet:
    13  #
    14  # Shouldn't dump errors against a win7
    15  #
    16  ################################################################################
    17  
    18  from __future__ import division
    19  from __future__ import print_function
    20  import unittest
    21  try:
    22      import ConfigParser
    23  except ImportError:
    24      import configparser as ConfigParser
    25  
    26  from impacket.dcerpc.v5 import transport, epm
    27  from impacket.dcerpc.v5 import drsuapi
    28  from impacket.dcerpc.v5.dtypes import NULL, LPWSTR
    29  from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, RPC_C_AUTHN_LEVEL_PKT_PRIVACY
    30  
    31  
    32  class DRSRTests(unittest.TestCase):
    33      def connect(self):
    34          rpctransport = transport.DCERPCTransportFactory(self.stringBinding )
    35          if len(self.hashes) > 0:
    36              lmhash, nthash = self.hashes.split(':')
    37          else:
    38              lmhash = ''
    39              nthash = ''
    40          if hasattr(rpctransport, 'set_credentials'):
    41              # This method exists only for selected protocol sequences.
    42              rpctransport.set_credentials(self.username,self.password, self.domain, lmhash, nthash)
    43          dce = rpctransport.get_dce_rpc()
    44          dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY)
    45          dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)
    46          dce.connect()
    47          dce.bind(drsuapi.MSRPC_UUID_DRSUAPI, transfer_syntax = self.ts)
    48  
    49          request = drsuapi.DRSBind()
    50          request['puuidClientDsa'] = drsuapi.NTDSAPI_CLIENT_GUID
    51          drs = drsuapi.DRS_EXTENSIONS_INT()
    52          drs['cb'] = len(drs) #- 4
    53          drs['dwFlags'] = drsuapi.DRS_EXT_GETCHGREQ_V6 | drsuapi.DRS_EXT_GETCHGREPLY_V6 | drsuapi.DRS_EXT_GETCHGREQ_V8 | drsuapi.DRS_EXT_STRONG_ENCRYPTION
    54          drs['SiteObjGuid'] = drsuapi.NULLGUID
    55          drs['Pid'] = 0
    56          drs['dwReplEpoch'] = 0
    57          drs['dwFlagsExt'] = drsuapi.DRS_EXT_RECYCLE_BIN
    58          drs['ConfigObjGUID'] = drsuapi.NULLGUID
    59          drs['dwExtCaps'] = 0
    60          request['pextClient']['cb'] = len(drs.getData())
    61          request['pextClient']['rgb'] = list(drs.getData())
    62          resp = dce.request(request)
    63  
    64          # Let's dig into the answer to check the dwReplEpoch. This field should match the one we send as part of
    65          # DRSBind's DRS_EXTENSIONS_INT(). If not, it will fail later when trying to sync data.
    66          drsExtensionsInt = drsuapi.DRS_EXTENSIONS_INT()
    67  
    68          # If dwExtCaps is not included in the answer, let's just add it so we can unpack DRS_EXTENSIONS_INT right.
    69          ppextServer = b''.join(resp['ppextServer']['rgb']) + b'\x00' * (
    70              len(drsuapi.DRS_EXTENSIONS_INT()) - resp['ppextServer']['cb'])
    71          drsExtensionsInt.fromString(ppextServer)
    72  
    73          if drsExtensionsInt['dwReplEpoch'] != 0:
    74              # Different epoch, we have to call DRSBind again
    75              drs['dwReplEpoch'] = drsExtensionsInt['dwReplEpoch']
    76              request['pextClient']['cb'] = len(drs.getData())
    77              request['pextClient']['rgb'] = list(drs.getData())
    78              resp = dce.request(request)
    79  
    80          resp2 = drsuapi.hDRSDomainControllerInfo(dce,  resp['phDrs'], self.domain, 2)
    81  
    82          return dce, rpctransport, resp['phDrs'], resp2['pmsgOut']['V2']['rItems'][0]['NtdsDsaObjectGuid']
    83  
    84      def connect2(self):
    85          rpctransport = transport.DCERPCTransportFactory(self.stringBinding )
    86          if len(self.hashes) > 0:
    87              lmhash, nthash = self.hashes.split(':')
    88          else:
    89              lmhash = ''
    90              nthash = ''
    91          if hasattr(rpctransport, 'set_credentials'):
    92              # This method exists only for selected protocol sequences.
    93              rpctransport.set_credentials(self.username,self.password, self.domain, lmhash, nthash)
    94          dce = rpctransport.get_dce_rpc()
    95          dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_INTEGRITY)
    96          #dce.set_auth_level(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)
    97          dce.connect()
    98          dce.bind(drsuapi.MSRPC_UUID_DRSUAPI, transfer_syntax = self.ts)
    99  
   100          return dce, rpctransport
   101  
   102      def test_DRSBind(self):
   103          dce, rpctransport, _,_ = self.connect()
   104  
   105          request = drsuapi.DRSBind()
   106          request['puuidClientDsa'] = drsuapi.NTDSAPI_CLIENT_GUID
   107          drs = drsuapi.DRS_EXTENSIONS_INT()
   108          drs['cb'] = len(drs) - 4
   109          drs['dwFlags'] = 0
   110          drs['SiteObjGuid'] = drsuapi.NULLGUID
   111          drs['Pid'] = 0x1234
   112          drs['dwReplEpoch'] = 0
   113          drs['dwFlagsExt'] = drsuapi.DRS_EXT_RECYCLE_BIN
   114          drs['ConfigObjGUID'] = drsuapi.NULLGUID
   115          drs['dwExtCaps'] = 0
   116          request['pextClient']['cb'] = len(drs)
   117          request['pextClient']['rgb'] = list(drs.getData())
   118          resp = dce.request(request)
   119          resp.dump()
   120  
   121          extension = drsuapi.DRS_EXTENSIONS_INT(b'\x00'*4 + b''.join(resp['ppextServer']['rgb'])+b'\x00'*4)
   122          extension.dump()
   123  
   124      def test_DRSDomainControllerInfo(self):
   125          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   126  
   127          request = drsuapi.DRSDomainControllerInfo()
   128          request['hDrs'] = hDrs
   129          request['dwInVersion'] = 1
   130  
   131          request['pmsgIn']['tag'] = 1
   132          request['pmsgIn']['V1']['Domain'] = self.domain + '\x00'
   133          request['pmsgIn']['V1']['InfoLevel'] = 1
   134  
   135          resp = dce.request(request)
   136          resp.dump()
   137  
   138          request['pmsgIn']['V1']['InfoLevel'] = 2
   139          resp = dce.request(request)
   140          resp.dump()
   141  
   142          request['pmsgIn']['V1']['InfoLevel'] = 3
   143          resp = dce.request(request)
   144          resp.dump()
   145  
   146          request['pmsgIn']['V1']['InfoLevel'] = 0xffffffff
   147          resp = dce.request(request)
   148          resp.dump()
   149  
   150      def test_hDRSDomainControllerInfo(self):
   151          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   152  
   153          resp = drsuapi.hDRSDomainControllerInfo(dce, hDrs, self.domain, 1)
   154          resp.dump()
   155  
   156          resp = drsuapi.hDRSDomainControllerInfo(dce, hDrs, self.domain, 2)
   157          resp.dump()
   158  
   159          resp = drsuapi.hDRSDomainControllerInfo(dce, hDrs, self.domain, 3)
   160          resp.dump()
   161  
   162          resp = drsuapi.hDRSDomainControllerInfo(dce, hDrs, self.domain, 0xffffffff)
   163          resp.dump()
   164  
   165      def test_DRSCrackNames(self):
   166          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   167  
   168          request = drsuapi.DRSCrackNames()
   169          request['hDrs'] = hDrs
   170          request['dwInVersion'] = 1
   171  
   172          request['pmsgIn']['tag'] = 1
   173          request['pmsgIn']['V1']['CodePage'] = 0
   174          request['pmsgIn']['V1']['LocaleId'] = 0
   175          request['pmsgIn']['V1']['dwFlags'] = 0
   176          request['pmsgIn']['V1']['formatOffered'] = drsuapi.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN
   177          request['pmsgIn']['V1']['formatDesired'] = drsuapi.DS_USER_PRINCIPAL_NAME_FOR_LOGON
   178          request['pmsgIn']['V1']['cNames'] = 1
   179          name = LPWSTR()
   180          #name['Data'] = 'FREEFLY-DC\x00'
   181          #name['Data'] = 'CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=FREEFLY,DC=NET\x00'
   182          #name['Data'] = 'CN=FREEFLY-DC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=FREEFLY,DC=NET\x00'
   183          name['Data'] = 'Administrator\x00'
   184          request['pmsgIn']['V1']['rpNames'].append(name)
   185  
   186          resp = dce.request(request)
   187          resp.dump()
   188  
   189      def test_hDRSCrackNames(self):
   190          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   191  
   192          name = 'Administrator'
   193          formatOffered = drsuapi.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN
   194          formatDesired = drsuapi.DS_STRING_SID_NAME
   195  
   196          resp = drsuapi.hDRSCrackNames(dce, hDrs, 0, formatOffered, formatDesired, (name,))
   197          resp.dump()
   198  
   199          name = 'CN=NTDS Settings,CN=DC1-WIN2012,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   200          resp = drsuapi.hDRSCrackNames(dce, hDrs, 0, drsuapi.DS_NAME_FORMAT.DS_FQDN_1779_NAME, drsuapi.DS_NAME_FORMAT.DS_UNIQUE_ID_NAME, (name,))
   201          resp.dump()
   202  
   203          name = 'CN=NTDS Settings,CN=DC1-WIN2012,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   204          resp = drsuapi.hDRSCrackNames(dce, hDrs, 0, drsuapi.DS_NAME_FORMAT.DS_FQDN_1779_NAME, drsuapi.DS_STRING_SID_NAME, (name,))
   205          resp.dump()
   206  
   207          name = self.domain.upper()
   208          #name = ''
   209          resp = drsuapi.hDRSCrackNames(dce, hDrs, 0, drsuapi.DS_LIST_ROLES, drsuapi.DS_NAME_FORMAT.DS_FQDN_1779_NAME, (name,))
   210          resp.dump()
   211  
   212      def test_DRSGetNT4ChangeLog(self):
   213          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   214  
   215          request = drsuapi.DRSGetNT4ChangeLog()
   216          request['hDrs'] = hDrs
   217          request['dwInVersion'] = 1
   218  
   219          request['pmsgIn']['tag'] = 1
   220          request['pmsgIn']['V1']['dwFlags'] = drsuapi.DRS_NT4_CHGLOG_GET_CHANGE_LOG | drsuapi.DRS_NT4_CHGLOG_GET_SERIAL_NUMBERS
   221          request['pmsgIn']['V1']['PreferredMaximumLength'] = 0x4000
   222          request['pmsgIn']['V1']['cbRestart'] = 0
   223          request['pmsgIn']['V1']['pRestart'] = NULL
   224  
   225          try:
   226              resp = dce.request(request)
   227              resp.dump()
   228          except Exception as e:
   229              if str(e).find('ERROR_NOT_SUPPORTED') <0:
   230                  raise
   231  
   232      def test_DRSVerifyNames(self):
   233          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   234          request = drsuapi.DRSVerifyNames()
   235  
   236          request['hDrs'] = hDrs
   237          request['dwInVersion'] = 1
   238  
   239          request['pmsgIn']['tag'] = 1
   240          request['pmsgIn']['V1']['dwFlags'] = drsuapi.DRS_VERIFY_DSNAMES
   241          request['pmsgIn']['V1']['cNames'] = 1
   242          request['pmsgIn']['V1']['PrefixTable']['pPrefixEntry'] = NULL
   243  
   244          dsName = drsuapi.PDSNAME()
   245          dsName['SidLen'] = 0
   246          dsName['Guid'] = drsuapi.NULLGUID
   247          dsName['Sid'] = ''
   248          name = 'DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   249  
   250          dsName['NameLen'] = len(name)
   251          dsName['StringName'] = (name + '\x00')
   252          dsName['structLen'] = len(dsName.getDataReferent())-4
   253  
   254          request['pmsgIn']['V1']['rpNames'].append(dsName)
   255  
   256          resp = dce.request(request)
   257          resp.dump()
   258  
   259      def test_DRSGetNCChanges(self):
   260          # Not yet working
   261          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   262  
   263          request = drsuapi.DRSGetNCChanges()
   264          request['hDrs'] = hDrs
   265          request['dwInVersion'] = 8
   266  
   267          request['pmsgIn']['tag'] = 8
   268          request['pmsgIn']['V8']['uuidDsaObjDest'] = DsaObjDest
   269          request['pmsgIn']['V8']['uuidInvocIdSrc'] = DsaObjDest
   270          #request['pmsgIn']['V8']['pNC'] = NULL
   271  
   272          dsName = drsuapi.DSNAME()
   273          dsName['SidLen'] = 0
   274          dsName['Guid'] = drsuapi.NULLGUID
   275          dsName['Sid'] = ''
   276          name = 'DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   277          dsName['NameLen'] = len(name)
   278          dsName['StringName'] = (name + '\x00')
   279  
   280          dsName['structLen'] = len(dsName.getData())
   281  
   282          request['pmsgIn']['V8']['pNC'] = dsName
   283  
   284          request['pmsgIn']['V8']['usnvecFrom']['usnHighObjUpdate'] = 0
   285          request['pmsgIn']['V8']['usnvecFrom']['usnHighPropUpdate'] = 0
   286  
   287          request['pmsgIn']['V8']['pUpToDateVecDest'] = NULL
   288  
   289          request['pmsgIn']['V8']['ulFlags'] =  drsuapi.DRS_INIT_SYNC | drsuapi.DRS_PER_SYNC  #| drsuapi.DRS_CRITICAL_ONLY
   290          request['pmsgIn']['V8']['cMaxObjects'] = 100
   291          request['pmsgIn']['V8']['cMaxBytes'] = 0
   292          request['pmsgIn']['V8']['ulExtendedOp'] = drsuapi.EXOP_REPL_OBJ | drsuapi.EXOP_REPL_SECRETS
   293  
   294          prefixTable = []
   295          oid1 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.656') # principalName
   296          oid2 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.221') #'sAMAccountName'
   297          oid3 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.90') # 'unicodePwd'
   298          oid4 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.94') # ntPwdHistory
   299          oid5 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.160') # lmPwdHistory
   300          oid6 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.125') # supplementalCreds
   301          oid7 = drsuapi.MakeAttid(prefixTable, '1.2.840.113556.1.4.146') # objectSid
   302  
   303          request['pmsgIn']['V8']['pPartialAttrSet']['dwVersion'] = 1
   304          request['pmsgIn']['V8']['pPartialAttrSet']['cAttrs'] = 7
   305          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid1)
   306          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid2)
   307          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid3)
   308          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid4)
   309          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid5)
   310          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid6)
   311          request['pmsgIn']['V8']['pPartialAttrSet']['rgPartialAttr'].append(oid7)
   312          request['pmsgIn']['V8']['pPartialAttrSetEx1'] = NULL
   313          request['pmsgIn']['V8']['PrefixTableDest']['PrefixCount'] = len(prefixTable)
   314          request['pmsgIn']['V8']['PrefixTableDest']['pPrefixEntry'] = prefixTable
   315  
   316          resp = dce.request(request)
   317          resp.dump()
   318  
   319          #moreData = 1
   320          #while moreData > 0:
   321          #    thisObject = resp['pmsgOut']['V6']['pObjects']
   322          #    done = False
   323          #    while not done:
   324          #        nextObject = thisObject['pNextEntInf']
   325          #        thisObject['pNextEntInf'] = NULL
   326          #        thisObject.dump()
   327          #        print thisObject['Entinf']['pName']['StringName']
   328          #        thisObject = nextObject
   329          #        if nextObject is '':
   330          #            done = True
   331          #    request['pmsgIn']['V8']['uuidInvocIdSrc'] = resp['pmsgOut']['V6']['uuidInvocIdSrc']
   332          #    request['pmsgIn']['V8']['usnvecFrom'] = resp['pmsgOut']['V6']['usnvecTo']
   333          #    resp = dce.request(request)
   334          #    moreData = resp['pmsgOut']['V6']['fMoreData']
   335          #print "OBJECTS ", resp['pmsgOut']['V6']['cNumObjects']
   336  
   337      def getMoreData(self, dce, request, resp):
   338          while resp['pmsgOut']['V6']['fMoreData'] > 0:
   339              #thisObject = resp['pmsgOut']['V6']['pObjects']
   340              #done = False
   341              #while not done:
   342              #    nextObject = thisObject['pNextEntInf']
   343              #    thisObject['pNextEntInf'] = NULL
   344                  #thisObject.dump()
   345                  #print '\n'
   346                  #print thisObject['Entinf']['pName']['StringName']
   347              #    thisObject = nextObject
   348              #    if nextObject is '':
   349              #        done = True
   350  
   351              request['pmsgIn']['V10']['uuidInvocIdSrc'] = resp['pmsgOut']['V6']
   352              request['pmsgIn']['V10']['usnvecFrom'] = resp['pmsgOut']['V6']['usnvecTo']
   353              resp = dce.request(request)
   354              resp.dump()
   355              print('\n')
   356  
   357  
   358      def test_DRSGetNCChanges2(self):
   359          # Not yet working
   360          dce, rpctransport, hDrs, DsaObjDest = self.connect()
   361  
   362          request = drsuapi.DRSGetNCChanges()
   363          request['hDrs'] = hDrs
   364          request['dwInVersion'] = 10
   365  
   366          request['pmsgIn']['tag'] =10
   367          request['pmsgIn']['V10']['uuidDsaObjDest'] = DsaObjDest
   368          request['pmsgIn']['V10']['uuidInvocIdSrc'] = drsuapi.NULLGUID
   369          #request['pmsgIn']['V10']['pNC'] = NULL
   370  
   371          dsName = drsuapi.DSNAME()
   372          dsName['SidLen'] = 0
   373          dsName['Guid'] = drsuapi.NULLGUID
   374          dsName['Sid'] = ''
   375  
   376          name = 'CN=Schema,CN=Configuration,DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   377          dsName['NameLen'] = len(name)
   378          dsName['StringName'] = (name + '\x00')
   379  
   380          dsName['structLen'] = len(dsName.getData())
   381  
   382          request['pmsgIn']['V10']['pNC'] = dsName
   383  
   384          request['pmsgIn']['V10']['usnvecFrom']['usnHighObjUpdate'] = 0
   385          request['pmsgIn']['V10']['usnvecFrom']['usnHighPropUpdate'] = 0
   386  
   387          request['pmsgIn']['V10']['pUpToDateVecDest'] = NULL
   388  
   389          request['pmsgIn']['V10']['ulFlags'] =  drsuapi.DRS_INIT_SYNC | drsuapi.DRS_PER_SYNC  | drsuapi.DRS_WRIT_REP | drsuapi.DRS_FULL_SYNC_NOW
   390          request['pmsgIn']['V10']['cMaxObjects'] = 100
   391          request['pmsgIn']['V10']['cMaxBytes'] = 0
   392          request['pmsgIn']['V10']['ulExtendedOp'] = 0
   393          request['pmsgIn']['V10']['pPartialAttrSet'] = NULL
   394          request['pmsgIn']['V10']['pPartialAttrSetEx1'] = NULL
   395          request['pmsgIn']['V10']['PrefixTableDest']['pPrefixEntry'] = NULL
   396          #request['pmsgIn']['V10']['ulMoreFlags'] = 0
   397          resp = dce.request(request)
   398          print(resp['pmsgOut']['V6']['pNC']['StringName'])
   399          resp.dump()
   400          print('\n')
   401          self.getMoreData(dce, request, resp)
   402  
   403          dsName = drsuapi.DSNAME(isNDR64=request._isNDR64)
   404          dsName['SidLen'] = 0
   405          dsName['Guid'] = drsuapi.NULLGUID
   406          dsName['Sid'] = ''
   407  
   408          name = 'DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   409          dsName['NameLen'] = len(name)
   410          dsName['StringName'] = (name + '\x00')
   411  
   412          dsName['structLen'] = len(dsName.getData())
   413  
   414          request['pmsgIn']['V10']['pNC'] = dsName
   415          resp = dce.request(request)
   416          print(resp['pmsgOut']['V6']['pNC']['StringName'])
   417          resp.dump()
   418          print('\n')
   419          self.getMoreData(dce, request, resp)
   420  
   421          dsName = drsuapi.DSNAME(isNDR64=request._isNDR64)
   422          dsName['SidLen'] = 0
   423          dsName['Guid'] = drsuapi.NULLGUID
   424          dsName['Sid'] = ''
   425  
   426          name = 'CN=Configuration,DC=%s,DC=%s' % (self.domain.split('.')[0],self.domain.split('.')[1])
   427          dsName['NameLen'] = len(name)
   428          dsName['StringName'] = (name + '\x00')
   429  
   430          dsName['structLen'] = len(dsName.getData())
   431  
   432          request['pmsgIn']['V10']['pNC'] = dsName
   433          resp = dce.request(request)
   434          print(resp['pmsgOut']['V6']['pNC']['StringName'])
   435          resp.dump()
   436          print('\n')
   437          self.getMoreData(dce, request, resp)
   438  
   439          #while resp['pmsgOut']['V6']['fMoreData'] > 0:
   440          #    thisObject = resp['pmsgOut']['V6']['pObjects']
   441          #    done = False
   442          #    while not done:
   443          #        nextObject = thisObject['pNextEntInf']
   444          #        thisObject['pNextEntInf'] = NULL
   445          #        #thisObject.dump()
   446          #        #print '\n'
   447          #        #print thisObject['Entinf']['pName']['StringName']
   448          #        thisObject = nextObject
   449          #        if nextObject is '':
   450          #            done = True
   451  #
   452  #            print "B"*80
   453  #            request['pmsgIn']['V10']['uuidInvocIdSrc'] = resp['pmsgOut']['V6']
   454  #            request['pmsgIn']['V10']['usnvecFrom'] = resp['pmsgOut']['V6']['usnvecTo']
   455  #            resp = dce.request(request)
   456  
   457  
   458  class SMBTransport(DRSRTests):
   459      def setUp(self):
   460          DRSRTests.setUp(self)
   461          configFile = ConfigParser.ConfigParser()
   462          configFile.read('dcetests.cfg')
   463          self.username = configFile.get('SMBTransport', 'username')
   464          self.domain   = configFile.get('SMBTransport', 'domain')
   465          self.serverName = configFile.get('SMBTransport', 'servername')
   466          self.password = configFile.get('SMBTransport', 'password')
   467          self.machine  = configFile.get('SMBTransport', 'machine')
   468          self.hashes   = configFile.get('SMBTransport', 'hashes')
   469          self.stringBinding = r'ncacn_np:%s[\PIPE\lsass]' % self.machine
   470          self.ts = ('8a885d04-1ceb-11c9-9fe8-08002b104860', '2.0')
   471  
   472  class SMBTransport64(DRSRTests):
   473      def setUp(self):
   474          DRSRTests.setUp(self)
   475          configFile = ConfigParser.ConfigParser()
   476          configFile.read('dcetests.cfg')
   477          self.username = configFile.get('SMBTransport', 'username')
   478          self.domain   = configFile.get('SMBTransport', 'domain')
   479          self.serverName = configFile.get('SMBTransport', 'servername')
   480          self.password = configFile.get('SMBTransport', 'password')
   481          self.machine  = configFile.get('SMBTransport', 'machine')
   482          self.hashes   = configFile.get('SMBTransport', 'hashes')
   483  
   484          self.stringBinding = r'ncacn_np:%s[\PIPE\lsass]' % self.machine
   485          self.ts = ('71710533-BEBA-4937-8319-B5DBEF9CCC36', '1.0')
   486  
   487  class TCPTransport(DRSRTests):
   488      def setUp(self):
   489          DRSRTests.setUp(self)
   490          configFile = ConfigParser.ConfigParser()
   491          configFile.read('dcetests.cfg')
   492          self.username = configFile.get('TCPTransport', 'username')
   493          self.domain   = configFile.get('TCPTransport', 'domain')
   494          self.serverName = configFile.get('TCPTransport', 'servername')
   495          self.password = configFile.get('TCPTransport', 'password')
   496          self.machine  = configFile.get('TCPTransport', 'machine')
   497          self.hashes   = configFile.get('TCPTransport', 'hashes')
   498          self.stringBinding = epm.hept_map(self.machine, drsuapi.MSRPC_UUID_DRSUAPI, protocol = 'ncacn_ip_tcp')
   499          self.ts = ('8a885d04-1ceb-11c9-9fe8-08002b104860', '2.0')
   500  
   501  class TCPTransport64(DRSRTests):
   502      def setUp(self):
   503          DRSRTests.setUp(self)
   504          configFile = ConfigParser.ConfigParser()
   505          configFile.read('dcetests.cfg')
   506          self.username = configFile.get('TCPTransport', 'username')
   507          self.domain   = configFile.get('TCPTransport', 'domain')
   508          self.serverName = configFile.get('TCPTransport', 'servername')
   509          self.password = configFile.get('TCPTransport', 'password')
   510          self.machine  = configFile.get('TCPTransport', 'machine')
   511          self.hashes   = configFile.get('TCPTransport', 'hashes')
   512          self.stringBinding = epm.hept_map(self.machine, drsuapi.MSRPC_UUID_DRSUAPI, protocol = 'ncacn_ip_tcp')
   513          self.ts = ('71710533-BEBA-4937-8319-B5DBEF9CCC36', '1.0')
   514  
   515  
   516  # Process command-line arguments.
   517  if __name__ == '__main__':
   518      import sys
   519      if len(sys.argv) > 1:
   520          testcase = sys.argv[1]
   521          suite = unittest.TestLoader().loadTestsFromTestCase(globals()[testcase])
   522      else:
   523          #suite = unittest.TestLoader().loadTestsFromTestCase(SMBTransport)
   524          suite  = unittest.TestLoader().loadTestsFromTestCase(TCPTransport)
   525          #suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TCPTransport64))
   526          #suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SMBTransport64))
   527      unittest.TextTestRunner(verbosity=1).run(suite)