o
    Žõ±j»&  ã                   @   s>  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
 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 d dlmZmZmZmZmZmZmZmZ d dlmZmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& e&ddd„ƒZ'G dd„ dƒZ(dd„ Z)e*dkr�d dl+Z+dZ,e+ -e)e,ƒ¡ dS dS )é    )ÚSMBDCEFactory)Úlsad)Úlsat)ÚEPM)ÚMAXIMUM_ALLOWED)ÚNTStatus)Úlogger)ÚNULL)ÚSMBConnection)ÚDCERPC5Connection)Úbin_to_string)ÚRPC_C_AUTHN_LEVEL_NONEÚRPC_C_AUTHN_LEVEL_CONNECTÚRPC_C_AUTHN_LEVEL_CALLÚRPC_C_AUTHN_LEVEL_PKTÚRPC_C_AUTHN_LEVEL_PKT_INTEGRITYÚRPC_C_AUTHN_LEVEL_PKT_PRIVACYÚDCERPCExceptionÚRPC_C_AUTHN_GSS_NEGOTIATE)Ú
cipherMODEÚDESÚexpand_DES_key)ÚPREFERRED_BACKUP_KEY)ÚPVKFile)ÚasynccontextmanagerNTFc                 C  sR   �t j| |||d�I d H \}}|r|‚z|V  W | ¡ I d H  d S | ¡ I d H  w )N©Ú
auth_levelÚopenÚperform_dummy)ÚLSADRPCÚfrom_smbconnectionÚclose)Ú
connectionr   r   r   ÚinstanceÚerr© r%   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/dcerpc/v5/interfaces/lsatmgr.pyÚlsadrpc_from_smb   s   €"r'   c                   @   sÖ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed*dede	de	fdd„ƒZ
ed*dede	de	fdd„ƒZeejB fdd„Zdd„ Zdd„ Zejjjfdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'efd(d)„Zd	S )+r   c                 C   s*   d| _ tj| _d | _d | _i | _d| _d S )Nz\lsarpcr   )Úservice_pipenamer   ÚMSRPC_UUID_LSATÚservice_uuidÚdceÚhandleÚpolicy_handlesÚph_ctr©Úselfr%   r%   r&   Ú__init__%   s   
zLSADRPC.__init__c                 Ã   s   �| S ©Nr%   r/   r%   r%   r&   Ú
__aenter__.   s   €zLSADRPC.__aenter__c                 Ã   s   �|   ¡ I d H  dS ©N)TN)r!   )r0   Úexc_typeÚexcÚ	tracebackr%   r%   r&   Ú	__aexit__1   s   €zLSADRPC.__aexit__c              
   Ã   s    �z8| j r7| jD ]}zt | j | j| ¡I d H  W q   t ¡  Y qz| j  ¡ I d H  W W dS    Y W dS W d S  tyO } z
d |fW  Y d }~S d }~ww r4   )r+   r-   r   Ú
hLsarCloser   Ú	exceptionÚ
disconnectÚ	Exception)r0   ÚhidÚer%   r%   r&   r!   5   s(   €
þô€ÿzLSADRPC.closeNTFr"   r   r   c              
   Ã   s¬   �z>t ƒ }| |_|j |¡ |d u r|j t¡ |j ¡ I d H \}}|d ur(|‚|j t ƒ j¡I d H \}}|d ur;|‚|d fW S  tyU } z
d|fW  Y d }~S d }~ww )NF)r   r+   Úset_auth_levelr   ÚconnectÚbindr*   r<   )r"   r   r   r   ÚserviceÚ_r$   r>   r%   r%   r&   Úfrom_rpcconnectionG   s$   €
€ÿzLSADRPC.from_rpcconnectionc              
   Ã   s‚   �z)t | tƒ jd�}|du rt}tj| ¡ |||d�I dH \}}|dur&|‚|dfW S  ty@ } z
d|fW  Y d}~S d}~ww )z–
		Creates the connection to the service using an established SMBConnection.
		This connection will use the given SMBConnection as transport layer.
		)ÚfilenameNr   )r   r   r(   r   rD   Úget_dce_rpcr<   )r"   r   r   r   ÚrpctransportrB   r$   r>   r%   r%   r&   r    ^   s   € 
€ÿzLSADRPC.from_smbconnectionc              
   Ã   s†   �z+t  | j|¡I d H \}}|d ur|‚|d }|| j| j< | j}|  jd7  _|d fW S  tyB } z
d |fW  Y d }~S d }~ww )NÚPolicyHandleé   )r   ÚhLsarOpenPolicy2r+   r-   r.   r<   )r0   ÚpermissionsÚrespr$   ÚphÚtr>   r%   r%   r&   Úopen_policy2p   s   €
€ÿzLSADRPC.open_policy2c              
   Ã   ó~   �z't  | j| j| t jj¡I d H \}}|d ur|‚|d d d  ¡ }|d fW S  ty> } z
d |fW  Y d }~S d }~ww )NÚPolicyInformationÚPolicyPrimaryDomainInfoÚSid)r   ÚhLsarQueryInformationPolicy2r+   r-   ÚPOLICY_INFORMATION_CLASSÚPolicyPrimaryDomainInformationÚformatCanonicalr<   )r0   Úpolicy_handlerL   r$   Ú
domain_sidr>   r%   r%   r&   Úget_domain_sid}   ó   €$
€ÿzLSADRPC.get_domain_sidc              
   Ã   rP   )NrQ   ÚPolicyAccountDomainInfoÚ	DomainSid)r   rT   r+   r-   rU   ÚPolicyAccountDomainInformationrW   r<   )r0   rX   rL   r$   Úhost_sidr>   r%   r%   r&   Úget_host_sid‡   r[   zLSADRPC.get_host_sidc           
   
   C  sØ   �zRt  | j| j| ||¡I dH \}}|dur|‚|t jjjkrLg }|d d D ]	}| |d ¡ q(|d d D ]}||d  }||d dfV  q8W dS |dfV  W dS  tyk }	 zd|	fV  W Y d}	~	dS d}	~	ww )z
		sids: list of string sid
		NÚReferencedDomainsÚDomainsÚNameÚTranslatedNamesÚNamesÚDomainIndex)	r   ÚhLsarLookupSidsr+   r-   ÚLSAP_LOOKUP_LEVELÚ	enumItemsÚLsapLookupWkstaÚappendr<   )
r0   rX   ÚsidsÚlookup_levelrL   r$   ÚdomainsÚentryÚdomainr>   r%   r%   r&   Úlookup_sids‘   s&   €"þ
€þzLSADRPC.lookup_sidsc              
   Ã   sv   �z#t  | j| j| |¡I d H \}}|d urd |fW S |  |¡}|d fW S  ty: } z
d |fW  Y d }~S d }~ww r2   )r   ÚhLsarRetrievePrivateDatar+   r-   Údecrypt_secretr<   )r0   rX   Úkey_namerL   r$   Úsecretr>   r%   r%   r&   Úretrieve_private_data§   s   € 


€ÿzLSADRPC.retrieve_private_datac                 Ã   s>   �t  | j| j| |¡I d H \}}|d urd |fS |d |fS )NÚSecretHandle)r   ÚhLsarOpenSecretr+   r-   )r0   rX   Úsecret_namerL   r$   r%   r%   r&   Úopen_secret±   s
   € zLSADRPC.open_secretc                 Ã   sN   �t  | j|¡I d H \}}|d urd |fS d |d d ¡}|  |¡}||fS )Nó    ÚEncryptedCurrentValueÚBuffer)r   ÚhLsarQuerySecretr+   Újoinrs   )r0   Úsecret_handlerL   r$   Ú
enc_secretru   r%   r%   r&   Úquery_secret·   s   €
zLSADRPC.query_secretc              
   Ã   s2  �z�|   tj¡I d H \}}|d ur|‚i }dD ]f}i }|  ||¡I d H \}}|d ur,|‚dt|ƒ }|  ||¡I d H \}}|d urC|‚tj|d d… ddd�}	|	dkr^|dd … }
|
|d< n|	d	kryt |¡}t 	d
|j
¡}|j}||d< ||d< |||< q|d fW S  ty˜ } z
d |fW  Y d }~S d }~ww )N)zG$BCKUPKEY_PREFERREDzG$BCKUPKEY_PzG$BCKUPKEY_%sé   ÚlittleF)Ú	byteorderÚsignedrI   Ú	legacykeyé   ÚRSA2ÚpvkÚcertificate)rO   r   ÚPOLICY_GET_PRIVATE_INFORMATIONrv   r   ÚintÚ
from_bytesr   r   Úconstruct_unencryptedÚkeydataÚcertdatar<   )r0   rM   r$   ÚresultsÚkeynameÚresÚ
guid_bytesÚguidÚ	keystructÚ
keyversionr�   ÚpbkrŠ   r‹   r>   r%   r%   r&   Úget_backupkeys¿   s>   €



€ÿzLSADRPC.get_backupkeysc           
      C   s¤   | j  ¡ }d}|}tdt|ƒdƒD ]7}|d d… }t|d d… ƒ}t|tjƒ}|| |¡7 }|dd … }|dd … }t|ƒdk rH|t|ƒd … }qt	 
|¡}	|	d S )Nr{   r   é   é   ÚSecret)r+   Úget_session_keyÚrangeÚlenr   r   r   ÚECBÚdecryptr   ÚLSA_SECRET_XP)
r0   ÚencdataÚkeyÚdecdataÚkey0rC   ÚchunkÚtkeyÚctxru   r%   r%   r&   rs   ã   s   
€
zLSADRPC.decrypt_secretc              
   Ã   s`   �zt  | j¡I dH \}}|dur|‚|d dfW S  ty/ } z
d|fW  Y d}~S d}~ww )z(Returns the username of the current userNÚUserName)r   ÚhLsarGetUserNamer+   r<   )r0   Úansr$   r>   r%   r%   r&   Úget_usernameõ   s   €€ÿzLSADRPC.get_usernameÚusernamec           
   
   Ã   sÀ   �zDt  | j| j| |g¡I dH \}}|dur|‚|d d d d }|d d d d  ¡ }|d d d d	 }d
||f }|||dfW S  ty_ }	 zt|ƒ d|	fW  Y d}	~	S d}	~	ww )z1Returns the SID of the user specified by usernameNra   rb   r   rc   rS   ÚTranslatedSidsÚSidsÚ
RelativeIdz%s-%s)r   ÚhLsarLookupNamesr+   r-   rW   r<   Úprint)
r0   rX   r¯   r­   r$   Údomain_namerY   Úuser_ridÚusersidr>   r%   r%   r&   Úget_sid_for_userÿ   s   €"€þzLSADRPC.get_sid_for_user©NTF)Ú__name__Ú
__module__Ú__qualname__r1   r3   r8   r!   Ústaticmethodr   ÚboolrD   r
   r    r   r   ÚPOLICY_LOOKUP_NAMESrO   rZ   r`   rh   ri   rj   rq   rv   rz   r‚   rš   rs   r®   Ústrr¸   r%   r%   r%   r&   r   $   s(    	


$
r   c                 Ã   s  �d}d}dd l }dd l}ddlm} ddlm} ddlm} | | ¡} |  	¡ }| 
¡ I d H \}	}
|
d ur;t|
ƒ |
‚tdƒ d }z3t |¡I d H \}}
|
d ur_t|
ƒ t| |
j¡ƒ W d S | ¡ I d H \}}
|
d urn|
‚t|ƒ W d S    | ¡  |d urŠ| ¡ I d H  Y d S Y d S )Nz8
	e80089d6f0b1f19e
	c669ca27496f2fc1
	77304427d10d993c
	z9
	1000000001000000 
	0503fa2ece589243
	a8117ee5881c8c25
	r   )ÚSMBConnectionFactory)Ú
SMBMachine)ÚGUIDzSMB Connected!)r7   ÚhashlibÚ!aiosmb.commons.connection.factoryrÁ   Ú!aiosmb.commons.interfaces.machinerÂ   Ú.aiosmb.wintypes.dtyp.constrcuted_security.guidrÃ   Úfrom_urlÚget_connectionÚloginr´   r   r    Ú	format_tbÚ__traceback__rš   Ú	print_excr!   )ÚurlÚenc_desÚdec_desr7   rÄ   rÁ   rÂ   rÃ   r"   rC   r$   ÚbÚkeysr%   r%   r&   Úamain  s>   €
ÿrÓ   Ú__main__zRsmb2+ntlm-password://TEST\dadmin:Passw0rd!1alma@win2019ad.test.corp/?dc=10.10.10.2r¹   ).Ú0aiosmb.dcerpc.v5.common.connection.smbdcefactoryr   Úaiosmb.dcerpc.v5r   r   Ú'aiosmb.dcerpc.v5.interfaces.endpointmgrr   Úaiosmb.dcerpc.v5.dtypesr   Úaiosmb.wintypes.ntstatusr   Úaiosmbr   r	   Úaiosmb.connectionr
   Úaiosmb.dcerpc.v5.connectionr   Úaiosmb.dcerpc.v5.uuidr   Úaiosmb.dcerpc.v5.rpcrtr   r   r   r   r   r   r   r   Úunicrypto.symmetricr   r   r   Úwinacl.dtyp.wcee.backupkeyr   Úwinacl.dtyp.wcee.pvkfiler   Ú
contextlibr   r'   r   rÓ   rº   ÚasynciorÎ   Úrunr%   r%   r%   r&   Ú<module>   s6    (
 l0û