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)