| 13 | #from impacket.examples.ldap_shell import LdapShell |
| 14 | |
| 15 | class ldap_Shell: |
| 16 | def __init__(self, domain, baseDN, username, password, address, options): |
| 17 | self.domain = domain |
| 18 | self.baseDN = baseDN |
| 19 | self.username = username |
| 20 | self.password = password |
| 21 | self.lmhash = '' |
| 22 | self.nthash = '' |
| 23 | self.address = address |
| 24 | self.ldaps_flag = '' |
| 25 | |
| 26 | if options.ldaps == True: |
| 27 | self.ldaps_flag = True |
| 28 | |
| 29 | if options.hashes is not None: |
| 30 | self.lmhash, self.nthash = options.hashes.split(':') |
| 31 | if self.lmhash == "": |
| 32 | self.lmhash = "aad3b435b51404eeaad3b435b51404ee" |
| 33 | |
| 34 | def ldap_connection(self, tls_version): |
| 35 | user_withDomain = '%s\\%s' % (self.domain, self.username) |
| 36 | if tls_version is not None: |
| 37 | use_ssl = True |
| 38 | port = 636 |
| 39 | tls = ldap3.Tls(validate=ssl.CERT_NONE, version=tls_version) |
| 40 | else: |
| 41 | use_ssl = False |
| 42 | port = 389 |
| 43 | tls = None |
| 44 | ldap_server = ldap3.Server(self.address, get_info=ldap3.ALL, port=port, use_ssl=use_ssl, tls=tls) |
| 45 | if self.nthash != "": |
| 46 | ldap_session = ldap3.Connection(ldap_server, user=user_withDomain, password=self.lmhash + ":" + self.nthash, authentication=ldap3.NTLM, auto_bind=True) |
| 47 | else: |
| 48 | ldap_session = ldap3.Connection(ldap_server, user=user_withDomain, password=self.password, authentication=ldap3.NTLM, auto_bind=True) |
| 49 | return ldap_server, ldap_session |
| 50 | |
| 51 | # For ldap3 with tls mode(only for ldap3). |
| 52 | # Picked function from rbcd.py |
| 53 | def ldap_sessions(self): |
| 54 | if self.ldaps_flag == True: |
| 55 | try: |
| 56 | return self.ldap_connection(tls_version=ssl.PROTOCOL_TLSv1_2) |
| 57 | except ldap3.core.exceptions.LDAPSocketOpenError: |
| 58 | return self.ldap_connection(tls_version=ssl.PROTOCOL_TLSv1) |
| 59 | else: |
| 60 | return self.ldap_connection(tls_version=None) |
| 61 | |
| 62 | def start_LDAPShell(self, ldap_server, ldap_session): |
| 63 | domainDumpConfig = ldapdomaindump.domainDumpConfig() |
| 64 | domainDumper = ldapdomaindump.domainDumper(ldap_server, ldap_session, domainDumpConfig) |
| 65 | ldap_shell = LdapShell(self.baseDN, domainDumper, ldap_session) |
| 66 | ldap_shell.cmdloop() |
| 67 | |
| 68 | if __name__ == '__main__': |
| 69 | logger.init() |