o
    j)                  
   @   s  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ G dd deZG dd dZedkrcejjdu rkedeje_eej ejdddZej dddd ej dddd ej dddd ej dddd e!dZ"e"j d dd!d"d# e"j d$dd!d%d# e"j d&d'd(gd)d(d*d+d, e!d-Z"e"j d.dd/d0d# e"j d1dd2d e"j d3dd4d e"j d5dd6d7d# e#ej$d8kre%  e&d8 e' Z(e	)e(j*e(j+ ee(j,\Z-Z.Z/Z0e-du rd9Z-e(j1du re0e(_1e(j2dur de(_3e/d9krFe.d9krFe(j4du rFe(j5d:u rFe(j2du rFd d;l6m6Z6 e6d<Z/ee.e/e-e(j4e(j2e(j3e(j7e8e(j9e(j:	Z;e;<e0e(j1 dS dS )=    )division)print_functionN)datetime)logger)parse_target)version)STATUS_MORE_ENTRIES)	transportsamr)DCERPCExceptionc                   @   s   e Zd ZdS )ListUsersExceptionN)__name__
__module____qualname__ r   r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/samrdump.pyr   &   s    r   c                   @   s6   e Zd Z		dddZedd Zd	d
 Zdd ZdS )SAMRDump NF  c
           
      C   s^   || _ || _|| _d| _d| _|| _|| _|| _|| _|	| _	|d ur-|
d\| _| _d S d S )Nr   :)_SAMRDump__username_SAMRDump__password_SAMRDump__domain_SAMRDump__lmhash_SAMRDump__nthash_SAMRDump__aesKey_SAMRDump__doKerberos_SAMRDump__kdcHost_SAMRDump__port_SAMRDump__csvOutputsplit)
selfusernamepassworddomainhashesaesKey
doKerberoskdcHostport	csvOutputr   r   r   __init__*   s   zSAMRDump.__init__c                 C   s   | d8 } | d } | S )Nl     }*{Gi r   )tr   r   r   getUnixTime;   s   zSAMRDump.getUnixTimec                 C   s  g }t d|  d| }t d|  t|}|| j || t|dr9|	| j
| j| j| j| j| j || j| j z| |}W n tya } zt t| W Y d}~nd}~ww | jdu rktd |D ]}|\}}	}
|
d d	 d
> |
d d  }|dkrd}n
tt| |}|
d tj@ rd}nd}|
d tj@ rd}nd}| jdu rtd||	|
d |
d |
d |
d ||||
d dd|
d dd|
d f  qmd||	f }t|d |
d  t|d |
d  t|d |
d  t|d |
d  t|d  |
d  t|d! |
d  t|d" | t|d# | t|d$ | t|d% |
d  qm|rPt |}d&|krGt d' dS t d(|  dS t d) dS )*zDumps the list of users and shares registered present at
        remoteName. remoteName is a valid host name or IP address.
        z Retrieving endpoint list from %szncacn_np:%s[\pipe\samr]zStringBinding %sset_credentialsNTz#Name,RID,FullName,PrimaryGroupId,BadPasswordCount,LogonCount,PasswordLastSet,PasswordDoesNotExpire,AccountIsDisabled,AdminComment,UserComment,ScriptPathPasswordLastSetHighPart    LowPartr   z<never>UserAccountControlTrueFalsez#%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%sFullNamePrimaryGroupIdBadPasswordCount
LogonCountUserComment,.AdminComment
ScriptPathz%s (%d)z
/FullName:z/AdminComment:z/UserComment:z/PrimaryGroupId:z/BadPasswordCount:z/LogonCount:z/PasswordLastSet:z/PasswordDoesNotExpire:z/AccountIsDisabled:z/ScriptPath:   zReceived one entry.zReceived %d entries.zNo entries received.)!logginginfodebugr	   DCERPCTransportFactory	set_dportr   setRemoteHosthasattrr.   r   r   r   r   r   r   set_kerberosr   r   _SAMRDump__fetchList	Exceptioncriticalstrr   printr   fromtimestampr-   r
   USER_DONT_EXPIRE_PASSWORDUSER_ACCOUNT_DISABLEDreplacelen)r!   
remoteName
remoteHostentriesstringbindingrpctransporteentryr"   uiduser
pwdLastSet
dontExpireaccountDisabledbasenumr   r   r   dumpA   sn   





 

zSAMRDump.dumpc              
   C   s   |  }g }|  |tj zt|}|d }t||}|d d }td |D ]
}td|d   q,t	d|d d   t
|||d d }tj|||d d	}|d
 }t}	d}
|	tkrz
tj|||
d}W n  ty } zt|ddk r | }W Y d }~nd }~ww |d d D ]>}t||tj|d }td|d |d f  t||d tjj}|d |d |d d f}|| t||d  q|d }
|d }	|	tkscW n ty } ztd|  W Y d }~nd }~ww |  |S )NServerHandleBufferzFound domain(s):z . %sNamezLooking up users in domain %sr   DomainId)serverHandledomainIdDomainHandle)enumerationContextr   
RelativeIdzFound user: %s, uid = %d
UserHandleAllEnumerationContext	ErrorCodezError listing users: %s)get_dce_rpcconnectbindr
   MSRPC_UUID_SAMRhSamrConnect hSamrEnumerateDomainsInSamServerrL   r@   rA   hSamrLookupDomainInSamServerhSamrOpenDomainr   hSamrEnumerateUsersInDomainr   rK   find
get_packethSamrOpenUserMAXIMUM_ALLOWEDhSamrQueryInformationUser2USER_INFORMATION_CLASSUserAllInformationappendhSamrCloseHandler   rJ   
disconnect)r!   rV   dcerT   respre   domainsr$   domainHandlestatusrh   rW   rZ   rrA   rX   r   r   r   __fetchList   sX   

zSAMRDump.__fetchList)	r   r   r   NNFNr   F)r   r   r   r+   staticmethodr-   r`   rH   r   r   r   r   r   )   s    

Mr   __main__utf8Tz>This script downloads the list of users for the target system.)add_helpdescriptiontargetstorez6[[domain/]username[:password]@]<targetName or address>)actionhelpz-csv
store_truezTurn CSV outputz-tsz&Adds timestamp to every logging outputz-debugzTurn DEBUG output ON
connectionz-dc-ipz
ip addresszoIP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameter)r   metavarr   z
-target-ipzIP Address of the target machine. If ommited it will use whatever was specified as target. This is useful when target is the NetBIOS name and you cannot resolve itz-port139445?zdestination portz)Destination port to connect to SMB Server)choicesnargsdefaultr   r   authenticationz-hasheszLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASHz-no-passz&don't ask for password (useful for -k)z-kzUse Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command linez-aesKeyzhex keyz<AES key to use for Kerberos Authentication (128 or 256 bits)r?   r   F)getpassz	Password:)=
__future__r   r   sysr@   argparsecodecsr   impacket.examplesr   impacket.examples.utilsr   impacketr   impacket.nt_errorsr   impacket.dcerpc.v5r	   r
   impacket.dcerpc.v5.rpcrtr   rI   r   r   r   stdoutencoding	getwriterrL   BANNERArgumentParserparseradd_argumentadd_argument_groupgrouprQ   argv
print_helpexit
parse_argsoptionsinittsrB   r   r$   r"   r#   rR   	target_ipr&   kr%   no_passr   dc_ipintr)   csvdumperr`   r   r   r   r   <module>   sl    





8(