o
    àý°jHw  ã                
   @   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
mZ d dlmZ d dl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 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" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ G dd„ dƒZAeBdk�rŠeCe"jDƒ ejEddd�ZFeFjGdddd� eFjGd dd!d� eFjHd"d#d$�ZIeIjJd%d&d'�ZKeKjGd(d)d*dd+d,� eKjGd-d*d.d/d0� eKjGd1dd2d� eKjGd3dd4d5d,� eKjGd6d*d7d8d0� eKjGd9d*d:d;d0� eKjGd<dd4d=d,� eIjJd>d?d'�ZLeLjGd@d*ddAd,� eLjGdBd*dCd� eLjGdDd*dEd� eLjGdFd*dGd� eLjGdHd*dId� eLjGdJd*dKd� eLjGdLd*dMd� eLjGd(d)d*dNd� eLjGd-d*d.d/d0� eLjGd1dd2d� eLjGd3dd5d� eLjGd6d*d7d8d0� eLjGd9d*d:d;d0� eIjJdOdPd'�ZMeMjGd@d*ddQd,� eMjGdFd*d4dRd,� eIjJdSdTd'�ZNeNjGdUd*d4dVd,� eNjGdWd*d4dXd,� eNjGdFd*d4dYd,� eIjJdZd[d'�ZOeOjGd@d*dd\d,� eOjGdFd*d4dRd,� eOjGd]d*dd4d^d_� eOjGd`d*dd4dad_� eIjJdbdcd'�ZPePjGd@d*dddd,� ePjGdFd*dGd� ePjGdHd*ded� ePjGdfd*eQdgdh� eF R¡ ZSe$ TeSjUeSjV¡ eWejXƒdik�rQeF Y¡  e Zdi¡ zeAeSƒZ[e[ \¡  W dS  e]�y‰ Z^ z e _¡ j`ejak�rvd dlbZbeb c¡  eCdjede^ƒ ƒ W Y dZ^[^dS dZ^[^ww dS )ké    )Údivision)Úprint_functionN)Úb)Ú	unhexlifyÚhexlify)Úpbkdf2_hmac)ÚAESÚ
PKCS1_v1_5)ÚHMACÚSHA1ÚMD4)Úbin_to_string)Úcrypto)ÚSMBConnection)Ú	transport)Úlsad)Úbkrp)ÚRPC_C_AUTHN_LEVEL_PKT_PRIVACYÚRPC_C_AUTHN_GSS_NEGOTIATE)Úversion)Úlogger)Úparse_target)ÚLocalOperationsÚ
LSASecrets)Úhexdump)ÚMasterKeyFileÚ	MasterKeyÚCredHistÚ	DomainKeyÚCredentialFileÚ
DPAPI_BLOBÚCREDENTIAL_BLOBÚ
VAULT_VCRDÚ
VAULT_VPOLÚVAULT_KNOWN_SCHEMASÚVAULT_VPOL_KEYSÚP_BACKUP_KEYÚPREFERRED_BACKUP_KEYÚPVK_FILE_HDRÚPRIVATE_KEY_BLOBÚprivatekeyblob_to_pkcs1ÚDPAPI_DOMAIN_RSA_MASTER_KEYÚderiveKeysFromUserÚderiveKeysFromUserkeyÚCREDHIST_FILEc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚDPAPIc                 C   s   || _ i | _d S )N)ÚoptionsÚdpapiSystem)Úselfr0   © r3   ú…/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/dpapi.pyÚ__init__D   s   zDPAPI.__init__c                 C   sh   |  d¡r2| d¡\}}| d¡d }| d¡d }t|dd … ƒ| jd< t|dd … ƒ| jd< d S d S )Nzdpapi_machinekey:Ú
ú:é   é   Ú
MachineKeyÚUserKey)Ú
startswithÚsplitr   r1   )r2   Ú
secretTypeÚsecretÚ
machineKeyÚuserKeyr3   r3   r4   ÚgetDPAPI_SYSTEMI   s   
ûzDPAPI.getDPAPI_SYSTEMc                 C   sf   t | jjƒ}| ¡ }t| jj|d dd| jd�}| ¡  d| jvs%d| jvr1t	 
d¡ t d¡ d S d S )NF)ÚisRemoteÚhistoryÚperSecretCallbackr:   r;   z4Cannot grab MachineKey/UserKey from LSA, aborting...r8   )r   r0   ÚsystemÚ
getBootKeyr   ÚsecurityrB   ÚdumpSecretsr1   ÚloggingÚerrorÚsysÚexit)r2   ÚlocalOperationsÚbootKeyÚ
lsaSecretsr3   r3   r4   ÚgetLSAQ   s   
þzDPAPI.getLSAc           =   
   C   sú  | j j ¡ dk�r8tt jdƒ}| ¡ }t|ƒ}| ¡  |t|ƒd … }|d dkr;t	|d |d … ƒ}|t|ƒd … }|d dkrSt	|d |d … ƒ}|t|ƒd … }|d dkrkt
|d |d … ƒ}|t|ƒd … }|d dkrƒt|d |d … ƒ}|t|ƒd … }| j j�r| j j�r| j jd u �r|  ¡  | | jd ¡}|r³td	ƒ td
t|ƒ d¡ ƒ d S | | jd ¡}|rÎtdƒ td
t|ƒ d¡ ƒ d S | | jd ¡}|rétdƒ td
t|ƒ d¡ ƒ d S | | jd ¡}|�rtdƒ td
t|ƒ d¡ ƒ d S �np| j j�r‡| j j�r‡|  ¡  t| j j| jd ƒ\}	}
| |	¡}|�r:tdƒ td
t|ƒ d¡ ƒ d S | |	¡}|�rStdƒ td
t|ƒ d¡ ƒ d S | |
¡}|�rltdƒ td
t|ƒ d¡ ƒ d S | |
¡}|�r…tdƒ td
t|ƒ d¡ ƒ d S �nð| j j�rØ| j j�rØt| j jdd … ƒ}t| j j|ƒ\}	}
| |	¡}|�r½tdƒ td
t|ƒ d¡ ƒ d S | |
¡}|�rÖtdƒ td
t|ƒ d¡ ƒ d S �nŸ| j j�rt| j jdd … ƒ}| |¡}|�r tdƒ td
t|ƒ d¡ ƒ d S �nu| j j�rV|�rVt| j jdƒ ¡ }t|ttƒ ƒd … ƒ}t|ƒ}t |¡}| |d d d d… d ¡}|�rTt|ƒ}|d d |d … }tdƒ td
t|ƒ d¡ ƒ d S | j j�r| j jd u �r| j jd u �rtddl m } |dƒ}nt j}t!| j j|ƒ\}	}
}| |¡}|�rštdƒ td
t|ƒ d¡ ƒ d S | |
¡}|�r³tdƒ td
t|ƒ d¡ ƒ d S | |	¡}|�rÌtdƒ td
t|ƒ d¡ ƒ d S | |¡}|�råtdƒ td
t|ƒ d¡ ƒ d S | |
¡}|�rþtd ƒ td
t|ƒ d¡ ƒ d S | |	¡}|�rtd!ƒ td
t|ƒ d¡ ƒ d S �n^| j j"d u�r
t#| j j"ƒ\}}}}|d u �r1d"}|d"k�rZ|d"k�rZ| j j$d u �rZ| j j%d#u �rZ| j j&d u �rZddl m } |dƒ}| j j$d u�rk| j j$ 'd$¡\}}nd%\}}t( )d&| ¡}t*|d'ƒ�rˆ| +|||||| j j&¡ | ,| j j-| j j.¡ | /¡ }| 0t1¡ | j j-d(u �r§| 2t3¡ | 4¡  |j5t6j7d)d*� t6 8¡ }t6j9|d+< | :¡ |d,< t| :¡ ƒ|d-< d|d.< | ;|¡}d}t<t|d/ ƒƒD ]}|d/ | d0k�rî|d17 }�qÝ d2 =|d/ |d … ¡}td3ƒ td
t|ƒ ¡  ƒ d S |d dk�r| ¡  |d dk�r | ¡  |d dk�r+| ¡  |d dk�r6| ¡  �n?| j j ¡ d4k�rít#| j j"ƒ\}}}}|d"k�rt|d"k�rt| j j$d u �rt| j j%d#u �rt| j j&d u �rtddl m } |dƒ}| j j$d u�r…| j j$ 'd$¡\}}nd%\}}t>||ƒ} | j j-�r |  ?|||||| j j&¡ n
| j@|||||d5� t( )d6¡}| A| ¡ | /¡ }| j j-�rÂ| 2t3¡ z| 4¡  | 5tBjC¡ W n t(jD�yÞ }! z|!‚d }!~!ww tB E|tBjF¡}d7D �]}"tG H|  I¡ tB J||d8 |"¡¡}#tK|#ƒ}$d9 L|$¡}%tG H|  I¡ tB J||d8 |%¡¡}&tM Nd:|&d d;… ¡d }'|'d1k�r[tO|&ƒ}(|(d< })| j jP�rFtQ Rd= L|%d> ¡¡ t|%d> d?ƒ S|)¡ �qètd@ƒ tdAt|)ƒ d¡ ƒ tdBƒ �qè|'dk�rétT|&ƒ}(|(d< d |(dC … }*|(d< |(dC |(dC |(dD  … }+tƒ },dE|,dF< d|,dG< d1|,dH< d|,dI< d|,dJ< |(dC |,dK< |, :¡ |* }-|-})| j jP�rÒtQ RdL L|%dM ¡¡ t|%dM d?ƒ S|+¡ tQ RdN L|%dO ¡¡ t|%dO d?ƒ S|)¡ �qètdPƒ |, ¡  tdQt|)ƒ d¡ ƒ tdBƒ �qèd S | j j ¡ dRk�r7tt jdƒ}| ¡ }tU|ƒ}.tV|.d< ƒ}/| j jd u�r1t| j jdd … ƒ}|/ |¡}0|0d u�r/tW|0ƒ}1|1 ¡  d S �nF|/ ¡  �n@| j j ¡ dSk�r0t jXd u �rRt jYd u �rRtdTƒ d S t jXd u�rítt jXdƒ}| ¡ }tZ|ƒ}/| j jd u�rçt| j jdd … ƒ}d }2t[|/j\ƒD ]8\}}3|3dUk�rµ|/j]| }4dV|4j^v �r§t|4dV ƒdWk�r§t_j|t_j`|4dV dX�}nt_ |t_j`¡}| |4d< ¡}2�q~|2d u�rå|/dY  dZ¡d d… tav �rßta|/dY  dZ¡d d…  |2ƒ}5|5 ¡  d S tb|2ƒ d S �n�|/ ¡  �nŠt jYd u�r.tt jYdƒ}| ¡ }tc|ƒ}6|6 ¡  | j jd u�r.t| j jdd … ƒ}|6d[ }/|/ |¡}|d u�r.td|ƒ}7|7 ¡  d S �nG| j j ¡ d\k�rštt jdƒ}| ¡ }tV|ƒ}/| j jd u�r•t| j jdd … ƒ}| j jed u�rot| j jedƒ}8|8 ¡ }9|8 f¡  n| j jgd u�r}th| j jgƒ}9nd }9|/ ||9¡}0|0d u�r”td]ƒ tb|0ƒ d S nâ|/ ¡  nÝ| j j ¡ d^k�rwt| j jdƒ}| ¡ }ti|ƒ}:t|:jjƒdk�rÀtd_ƒ d S | j j�rÙt| j jdd … ƒ}t|:jjd j|ƒ}7n| j jd u �rëddl m } |dƒ}nt j}t!|:jjd j|ƒ}7| j jkd u �r@d };|7D ]}<|: ld|<¡ |:jjd jmd u�r|<}; n�q|;d u �r+|: ¡  tƒ  td`ƒ d S |: |;¡ |: ¡  |:jjd jmd u�r?d S n7|7D ]"}<|: l| j jk|<¡ |:jj| j jk jmd u�rc|:jj| j jk  ¡   d S �qB|:jj| j jk  ¡  tƒ  td`ƒ d S tdaƒ d S )bNÚ	MASTERKEYÚrbÚMasterKeyLenr   ÚBackupKeyLenÚCredHistLenÚDomainKeyLenr;   zDecrypted key with UserKeyzDecrypted key: 0x%szlatin-1r:   zDecrypted key with MachineKeyz!Decrypted Backup key with UserKeyz$Decrypted Backup key with MachineKeyz Decrypted key with UserKey + SIDz'Decrypted Backup key with UserKey + SIDr9   z%Decrypted key with key provided + SIDzDecrypted key with key providedÚ
SecretDataéÿÿÿÿÚbufferÚcbMasterKeyz-Decrypted key with domain backup key provided)Úgetpassz	Password:z+Decrypted key with User Key (MD4 protected)z!Decrypted key with User Key (MD4)z"Decrypted key with User Key (SHA1)z2Decrypted Backup key with User Key (MD4 protected)z(Decrypted Backup key with User Key (MD4)z)Decrypted Backup key with User Key (SHA1)Ú Fr7   )r]   r]   z$ncacn_np:%s[\PIPE\protected_storage]Úset_credentialsT)z$8a885d04-1ceb-11c9-9fe8-08002b104860z2.0)Útransfer_syntaxÚpguidActionAgentÚpDataInÚcbDataInÚdwParamÚ	ppDataOutó    r8   ó    zDecrypted key using rpc callÚ
BACKUPKEYS)ÚlmhashÚnthashzncacn_np:445[\pipe\lsarpc])zG$BCKUPKEY_PREFERREDzG$BCKUPKEY_PÚPolicyHandlezG$BCKUPKEY_{}z<Lé   ÚDatazExporting key to file {}z.keyÚwbzLegacy key:z0x%sr6   Ú	KeyLengthÚCertificateLengthl   qka ÚdwMagicÚ	dwVersionÚ	dwKeySpecÚdwEncryptTypeÚcbEncryptDataÚcbPvkz Exporting certificate to file {}z.derz Exporting private key to file {}z.pvkzPreferred key:zPRIVATEKEYBLOB:{%s}Ú
CREDENTIALÚVAULTzKYou must specify either -vcrd or -vpol parameter. Type --help for more infoé   ÚIVé   )ÚivÚFriendlyNamezutf-16leÚBlobÚ	UNPROTECTzSuccessfully decrypted dataÚCREDHISTzThe CREDHIST file is emptyz&Cannot decrypt (wrong key or password)z:Cannot decrypt (specify -key or -sid whenever applicable) )nr0   ÚactionÚupperÚopenÚfileÚreadr   ÚdumpÚlenr   r   r   rF   rH   ÚsidrQ   Údecryptr1   Úprintr   Údecoder-   Úkeyr   Úpvkr)   r(   r*   r	   Únewr+   Úpasswordr\   r,   Útargetr   ÚhashesÚno_passÚaesKeyr=   r   ÚDCERPCTransportFactoryÚhasattrr^   Úset_kerberosÚkÚdc_ipÚget_dce_rpcÚset_auth_levelr   Úset_auth_typer   ÚconnectÚbindr   ÚMSRPC_UUID_BKRPÚ
BackuprKeyÚBACKUPKEY_RESTORE_GUIDÚgetDataÚrequestÚrangeÚjoinr   ÚkerberosLoginÚloginÚset_smb_connectionr   ÚMSRPC_UUID_LSADÚDCERPCExceptionÚhLsarOpenPolicy2ÚPOLICY_GET_PRIVATE_INFORMATIONr   ÚdecryptSecretÚgetSessionKeyÚhLsarRetrievePrivateDatar   ÚformatÚstructÚunpackr&   ÚexportrJ   ÚdebugÚwriter'   r   r    r!   ÚvcrdÚvpolr"   Ú	enumerateÚattributesLenÚ
attributesÚfieldsr   ÚMODE_CBCr$   r   r#   r%   Úentropy_fileÚcloseÚentropyr   r.   Úcredhist_entries_listÚentryÚdecrypt_entry_by_indexÚpwdhash)=r2   ÚfpÚdataÚmkfÚmkÚbkmkÚchÚdkÚdecryptedKeyÚkey1Úkey2r‹   ÚpvkfileÚprivateÚcipherÚdomain_master_keyr\   rŽ   Úkey3ÚdomainÚusernameÚ
remoteNamerh   ri   ÚrpctransportÚdcer¡   ÚrespÚ	beginningÚiÚ	masterkeyÚaddressÚ
connectionÚeÚkeynamerZ   ÚguidÚnamer?   Ú
keyVersionÚ
backup_keyÚ	backupkeyrŒ   ÚcertÚheaderÚbackupkey_pvkÚcredÚblobÚ	decryptedÚcredsÚ	cleartextr¿   Ú	attributeÚvaultrµ   ÚkeysÚfp2r½   ÚchfÚreal_keyr–   r3   r3   r4   Úrun^   sà  "ý



ý

ý

ý







ý
>



€>





€ÿ
ÿ
ÿ


 
€

ý

€
ÿ÷

€

ý


þ

ÿþz	DPAPI.runN)Ú__name__Ú
__module__Ú__qualname__r5   rB   rQ   rñ   r3   r3   r3   r4   r/   C   s
    r/   Ú__main__TzGExample for using the DPAPI/Vault structures to unlock Windows Secrets.)Úadd_helpÚdescriptionz-debugÚ
store_truezTurn DEBUG output ON)r€   Úhelpz-tsz&Adds timestamp to every logging outputÚactionsr€   )rù   ÚdestÚ
backupkeysz#domain backup key related functions)rù   z-tz--targetÚstorez6[[domain/]username[:password]@]<targetName or address>)r€   Úrequiredrù   z-hasheszLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASH)r€   Úmetavarrù   z-no-passz&don't ask for password (useful for -k)z-kFzÁ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)z-dc-ipz
ip addressztIP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameterz--exportzexport keys to filerÙ   zmasterkey related functionsz-filezMaster Key File to parsez-sidzSID of the userz-pvkz.Domain backup privatekey to use for decryptionz-keyz"Specific key to use for decryptionz	-passwordzRUser's password. If you specified the SID and not the password it will be promptedz-systemzSYSTEM hive to parsez	-securityzSECURITY hive to parsez|The masterkey owner's credentails to ask the DC for decryptionFormat: [[domain/]username[:password]@]<targetName or address>Ú
credentialzcredential related functionszCredential filezKey used for decryptionrì   z"vault credential related functionsz-vcrdzVault Credential filez-vpolzVault Policy filezMaster key used for decryptionÚ	unprotectz)Provides CryptUnprotectData functionalityzFile with DATA_BLOB to decryptz-entropyz/String with extra entropy needed for decryption)r€   Údefaultrþ   rù   z-entropy-filez7File with binary entropy contents (overwrites -entropy)ÚcredhistzCREDHIST related functionszCREDHIST filezUser's passwordz-entryzEntry index in CREDHIST)r€   Útyperù   r8   z	ERROR: %s)eÚ
__future__r   r   r¯   ÚargparserJ   rL   Úsixr   Úbinasciir   r   Úhashlibr   ÚCryptodome.Cipherr   r	   ÚCryptodome.Hashr
   r   r   Úimpacket.uuidr   Úimpacketr   Úimpacket.smbconnectionr   Úimpacket.dcerpc.v5r   r   r   Úimpacket.dcerpc.v5.rpcrtr   r   r   Úimpacket.examplesr   Úimpacket.examples.utilsr   Úimpacket.examples.secretsdumpr   r   Úimpacket.structurer   Úimpacket.dpapir   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   rò   r‰   ÚBANNERÚArgumentParserÚparserÚadd_argumentÚadd_subparsersÚ
subparsersÚ
add_parserrü   rÙ   r   rì   r  r  ÚintÚ
parse_argsr0   ÚinitÚtsr²   r†   ÚargvÚ
print_helprM   Úexecuterrñ   Ú	ExceptionrÜ   Ú	getLoggerÚlevelÚDEBUGÚ	tracebackÚ	print_excÚstrr3   r3   r3   r4   Ú<module>   s²   $X   
a

€ü±