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reCe"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 eFR ZSe$TeSjUeSjV eWejXdikrQeFY  eZdi zeAeSZ[e[\  W dS  e]y Z^ z e_ j`ejakrvd dlbZbebc  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rt|d |d  }|t|d  }| j jr| j jr| j jd u r|   || jd }|rtd	 td
t|d  d S || jd }|rtd td
t|d  d S || jd }|rt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 ||
}|rtd td
t|d  d S n| j jr| j jrt| j jdd  }t| j j|\}	}
||	}|rtd td
t|d  d S ||
}|rt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|\}	}
}||}|rtd td
t|d  d S ||
}|rtd td
t|d  d S ||	}|rtd td
t|d  d S ||}|rtd td
t|d  d S ||
}|rt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* t68 }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rt#| 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 tBE|tBjF}d7D ]}"tGH| I tBJ||d8 |"}#tK|#}$d9L|$}%tGH| I tBJ||d8 |%}&tMNd:|&d d; d }'|'d1kr[tO|&}(|(d< })| j jPrFtQRd=L|%d>  t|%d> d?S|) qtd@ tdAt|)d  tdB q|'dkrtT|&}(|(d< d |(dC  }*|(d< |(dC |(dC |(dD   }+t },dE|,dF< d|,dG< d1|,dH< d|,dI< d|,dJ< |(dC |,dK< |,: |* }-|-})| j jPrtQRdLL|%dM  t|%dM d?S|+ tQRdNL|%dO  t|%dO d?S|) qtdP |,  tdQt|)d  tdB qd 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rtt jXd}| }tZ|}/| j jd urt| j jdd  }d }2t[|/j\D ]8\}}3|3dUkr|/j]| }4dV|4j^v rt|4dV dWkrt_j|t_j`|4dV dX}nt_|t_j`}||4d< }2q~|2d ur|/dY dZd d tav rta|/dY dZd d  |2}5|5  d S tb|2 d S n|/  nt 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rtt jd}| }tV|}/| j jd urt| j jdd  }| j jed urot| j jed}8|8 }9|8f  n| j jgd ur}th| j jg}9nd }9|/||9}0|0d urtd] tb|0 d S n|/  n| j j d^krwt| j jd}| }ti|}:t|:jjdkrtd_ d S | j jrt| j jdd  }t|:jjd j|}7n| j jd u rd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-kFzUse 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

