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ròe %¡  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r‰d}n
tt |  |¡¡ƒ}|
d tj@ r�d}nd}|
d tj@ r©d}nd}| jdu rÙt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 )*z„Dumps 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¡ zÐt |¡}|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rßz
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-ipz£IP 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-kzÁUse 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(Ä