o
    Žõ±jG  ã                   @   s  d dl 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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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' 	 G dd„ dƒZ(ddd„Z)ddd„Z*dS )é    N)Úlogger)Úprint_table)ÚKRB_CRED)Úfiletime_to_dt)Úgeterr)Úget_TGSÚget_TGTÚgenerate_targetsÚbruteÚ
asreproastÚspnroastÚs4uÚprocess_keytabÚlist_ccacheÚ
del_ccacheÚroast_ccacheÚccache_to_kirbiÚkirbi_to_ccache)Úparse_kirbiÚformat_kirbiÚprint_kirbi)ÚLDAPConnectionFactory)ÚKerberosSPN)ÚKerberosCredentialc                   @   s@   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚKerberosCMDHelperc                 C   s   dg| _ dg| _d S )NÚkerberos)Úlive_keywordsÚkeywords)Úself© r   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/kerberos/cmdhelper.pyÚ__init__$   s   zKerberosCMDHelper.__init__c                 C   s    |   d¡du rt| dƒ} t| ƒS )NÚ0xTé   )Ú
startswithÚint)Úluidr   r   r    Úluid_converter(   s   
z KerberosCMDHelper.luid_converterc                  C   sÖ  t jdd�}|jdd�}d|_d|_|jddd�}|jdd	d�}|jd
ddd� |jddd�}|jddd� |jd
ddd� |jddd�}|jddd� |jd
ddd� |jddd�}|jddd� |jddd�}	|jddd�}
|
jddd� |
jd
ddd� |jd d!d�}|jddd� |jd"d#|gd$� t jdd�}|jd%d�}d|_d&|_|jd'd(d�}|jd)d*d� |jd+d,d�}|jd)d*d� |jd-td.d/� |jdd0d�}|jd)d*d� |jd
ddd� |jd1d2d�}|jd)d*d� |jd3d4d� |jd5d6d�}|jd)d*d� |jd7d8d� t jdd�}|jd9d�}d|_d:|_|jd;d<d�}|jd3d=d� |jd"d#d�}| ¡ }d|_d>|_|jdd?d�}|jd@dAd� |jd
ddBd� |jdCdDtd dEdF� |jdGdHd�}|jd@dId� |jdJdd� |jd
ddBd� |jdCdDtd dEdF� |jdKdLd�}|jdMdNdOd� |jd
ddPd� |jdQdRdSdTdU� |jdVdWd� |jdXdYdZd[� |jd\d\d�}|jd]d^d_d� |jdMdNdOd� |jdCdDtd`dEdF� |jd
ddad� |jdVdWd� |jdbdcdYdZd[� |jddded�}|jd]d^d_d� |jdMdNdOd� |jdCdDtd`dEdF� |jd
ddad� |jd@dfd� |jdbdcdYdZd[� |jdgdhd�}|jd@dId� |jdJdd� |jdidjd� |jd
ddBd� |jdkdld�}|jdmdId� |jdndo|gd$�}|jdpdq|gd$�}d S )rNF)Úadd_helpÚlive_kerberos_module)ÚhelpTÚcurrentluidz'Prints out the LUID of the current userÚroastz)Automatically run spnroast and asreproastz-oz
--out-filez1Output file to store hashcat formatted tickets inÚtgtzTRequest a TGT ticket. It may work better specifying the target as cifs/<domain.corp>z--targetz3SPN string of the service to request the ticket forzOutput ccache file nameÚapreqz*Request a APREQ ticket for a given serviceÚtargetÚpurgez4Purge all tickets. For the current user use --luid 0z--luidzQLUID of the user whose tickets to be purged. Use "0x" if you specify a hex value!Úsessionsz.List user sessions. Needs elevated privileges.ÚdumpzjFetches tickets for a given session or all sessions from memory and prints or exports them as .kirbi fileszSLUID of the user whose tickets to be exported. Use "0x" if you specify a hex value!z--outdirzpath to kirbi directoryÚtriagez0List tickets for a given session or all sessionsr   zKerberos related commands)r*   ÚparentsÚccache_commandÚccache_moduleÚlistzList ccache file contentsÚ
ccachefilezpath to CCACHE fileÚdelz]Delete tickets from ccache file based on their order. To get the order user the list command.Úindexzticket index to delete)Útyper*   z2Convert stored tickets to hashcat crackable formatÚ	loadkirbizAdd kirbi file to ccache file.Ú	kirbifilezpath to kirbi file / directoryÚexportkirbiz3Export tickets to kirbi files. One ticket per file.Úkirbidirzpath to kirbi directory Úkirbi_commandÚkirbi_moduleÚparsez$Parse kirbi file and show the ticketzpath to kirbi fileÚkerberos_modulezFetches a TGT for a given userÚurlz`user credentials in URL format. Example: "kerberos+password://TEST\victim:Passw0rd!1@10.10.10.2"z/Output file to store the TGT in. CCACHE format.z-ez--etypezEncryption type to be requested)r;   Údefaultr*   Útgsz&Fetches a TGS for a given service/userzuser credentials in URL formatÚspnr
   zBruteforcing usernamesz-dz--domainzTDomain name (realm). This overrides any other domain spec that the users might have.z)Output file to store the found usernames.z-nz--show-negativesÚ
store_truezPrint failed enumerations)Úactionr*   ÚaddresszKerberos server IP/hostnameÚtargetsÚ*zÏusername or file with usernames(one per line). Must be in username@domain format, unless you specified --domain then only the username is needed.You can specify mutliple usernames or files separated by space)Únargsr*   r   z-lz--ldapz5LDAP URL. Load targets via LDAP connection to the DC.é   z=Output file to store the tickets in hashcat crackable format.z-tz	--targetsr   zkerberoast/spnroastz'user credentials in Kerberos URL formatr   z1Gets an S4U2proxy ticket impersonating given userÚ
targetuserÚ Úkeytabz%Parse keytab file, list secret key(s)Ú
keytabfileÚccachezParse/Edit ccache fileÚkirbizParse/Edit kirbi file)ÚargparseÚArgumentParserÚadd_subparsersÚrequiredÚdestÚ
add_parserÚadd_argumentr%   ) r   ÚparserÚlive_parserÚlive_subcommand_parserÚlive_kerberos_subparsersÚlive_luid_parserÚlive_roast_parserÚlive_tgs_parserÚlive_purge_parserÚlive_sessions_parserÚlive_export_parserÚlive_triage_parserÚccache_subcommand_parserÚkerberos_ccache_subparsersÚccache_listÚ
ccache_delÚccache_roastÚccache_kirbiÚkirbi_subcommand_parserÚkerberos_kirbi_subparsersÚ
kirbi_listÚkerberos_groupÚkerberos_subparsersÚ
tgt_parserÚ
tgs_parserÚbrute_parserÚasreproast_parserÚspnroast_parserÚ
s4u_parserÚkeytab_parserÚccache_parserÚkirbi_parserr   r   r    Úadd_args.   s°   zKerberosCMDHelper.add_argsc                 C   sb   t | jƒdkr|j| jv r|  |¡ t | jƒdkr+|jdkr-|j| jv r/|  |¡ d S d S d S d S )Nr   Úlive)Úlenr   ÚcommandÚrunr   ÚmoduleÚrun_live)r   Úargsr   r   r    Úexecute§   s
   
$ÿzKerberosCMDHelper.executec                 C   s&  t  ¡ dkrtdƒ d S ddlm}m} |ƒ }|jdkrGt ||j	ƒ¡\}}}|d ur5tdt
|ƒ ƒ d S |j	d u rC|D ]}t|ƒ q<d S d S |jdkr{| |j¡}	|j	d u r]t|	ƒ d S t|j	dƒ�}
|
 |	¡ W d   ƒ d S 1 stw   Y  d S |jd	kr¡| |j¡\}}td
ƒ tt| ¡ ƒƒ tdt |¡ ¡  ƒ d S |jdkr°tt| ¡ ƒƒ d S |jdkrÚd }|jd urÏ|j}| d¡du rËt|dƒ}t|ƒ}| |¡ tdƒ d S |jdkrå| ¡  d S |jdk�rQ|jd u rõ| ¡ }nt |j¡}|  |¡}g d¢g}|D ]C}t!|| ƒdk�r�q|| D ]0}	| "t|ƒ|	d |	d t#|	d ƒ $¡ t#|	d ƒ $¡ t#|	d ƒ $¡ t%|	d ƒt%|	d ƒg¡ �q�qt&|ƒ d S |jdk�r|jd u �rb| '¡ }nt |j¡}| (|¡}|j)d u�rè|D ]p}|| D ]h}	z,t* +|	d ¡j,}d -|d d d  d! ¡}tt|ƒƒd d" -||d d d# g¡ }W n   tt|ƒƒd t. /d$¡ ¡  }Y tt.j0 -|j)d%| ¡dƒ�}
|
 |	d ¡ W d   ƒ n	1 �sÝw   Y  �q{�qud S |D ]&}t!|| ƒdk�r÷�qêtd&t|ƒ ƒ || D ]	}	t|	d ƒ �q�qêd S d S )'NÚWindowsz&[-]This command only works on Windows!r   )ÚKerberosLiveÚ
live_roastr,   z@[LIVE][KERBEROS][ROAST] Error while roasting tickets! Reason: %sr-   Úwbr.   zAPREQ b64: zSessionkey b64: %sr+   r0   r"   Tr#   zTickets purged!r1   r3   )ÚLUIDÚ
ServerNameÚ	RealmNameÚ	StartTimeÚEndTimeÚ	RenewTimeÚEncryptionTypeÚTicketFlagsr‰   rŠ   r‹   rŒ   r�   rŽ   r�   r2   ÚTicketÚ_ÚticketsÚsnamezname-stringú@Úrealmé   zticket_%s.kirbizLUID @%s)1ÚplatformÚsystemÚprintÚpypykatz.kerberos.kerberosliver…   r†   r)   Úasyncior   Úout_filer   Úget_tgtr/   r   ÚopenÚwriteÚ	get_apreqr   r2   Úbase64Ú	b64encodeÚdecodeÚhexÚget_current_luidr&   r$   r%   r0   Úlist_sessionsÚget_all_ticketinfor   r'   Úget_ticketinfor}   Úappendr   Ú	isoformatÚstrr   Úexport_all_ticketdataÚexport_ticketdataÚoutdirr   ÚloadÚnativeÚjoinÚosÚurandomÚpath)r   r‚   r…   r†   ÚklÚresÚerrorsÚerrÚrÚticketÚfr.   Ú
sessionkeyr&   ÚticketinfosÚtabler’   ÚptÚnamer   r   r    r�   ¯   s¸   


þ

"ÿ













øÿ

. ÿ€ùÿÿçzKerberosCMDHelper.run_livec           
      C   s>  |j dkrIt t|j|jd�¡\}}|d urtd| ƒ d S |jd urCt|jdƒ�}| 	| 
¡ ¡ W d   ƒ d S 1 s<w   Y  d S t|ƒ d S |j dkr—t t|j|j|jd�¡\}}}}}|d urltd| ƒ d S |jd ur‘t|jdƒ�}| 	| 
¡ ¡ W d   ƒ d S 1 sŠw   Y  d S t|ƒ d S |j dkrÂt|j|jƒ}t t|j||j|jƒ¡\}	}|d urÀtdt|ƒ ƒ d S d S |j d	k�r|jd u r×t|j|jd
d�}nt t|jdd�¡\}}	t t|j||j|jd�¡\}	}|d u�rtdt|ƒ ƒ d S d S |j dk�rW|jd u �r|jd u �rtdƒ‚|jd u �r*t|j|jdd�}nt t|jdd�¡\}	}t t|j||j|jd�¡\}	}|d u�rUtdt|ƒ ƒ d S d S |j dk�rªt t|j|j|jƒ¡\}}}}}|d u�r}tdt|ƒ ƒ d S |jd u�r¤t|jdƒ�}| 	| 
¡ ¡ W d   ƒ d S 1 �s�w   Y  d S t|ƒ d S |j dk�r·t|jƒ d S |j dk�r|jdk�rÊt|j ƒ d S |jdk�rÙt!|j |jƒ d S |jdk�rèt"|j |j#ƒ d S |jdk�r÷t$|j |j%ƒ d S |jdk�rt&|j |j'ƒ d S d S |j dk�r|j(dk�rt)|j*ƒ d S d S d S ) Nr-   )Úoverride_etypez/[KERBEROS][TGT] Failed to fetch TGT! Reason: %sr‡   rF   z/[KERBEROS][TGS] Failed to fetch TGS! Reason: %sr
   z;[KERBEROS][BRUTE] Error while enumerating users! Reason: %sr   F)Úto_spnÚasrep)Útarget_type)rœ   Úetypez([KERBEROS][ASREPROAST] Error! Reason: %sr   z+Either LDAP URL or targets must be providedTrG   z&[KERBEROS][SPNROAST] Error! Reason: %sr   z![KERBEROS][S4U] Error! Reason: %srQ   rS   r7   r,   r9   r>   r<   rT   rB   )+rC   r›   r   r   rD   rÅ   r™   rœ   rž   rŸ   r2   r   r   rG   r	   rK   Údomainr
   rJ   Úshow_negativesr   ÚldapÚget_ldap_kerberos_targetsr   Ú	Exceptionr   r   rO   r   rR   r6   r   r8   r   r   r:   r   r?   r   rT   rA   r   r=   )
r   r‚   rT   r¸   r»   rF   ÚencTGSRepPartÚkeyÚtarget_spnsr‘   r   r   r    r     s˜   

"ÿ
$
"ÿ
þ
 
þ 
þ"
$ÿÿþzKerberosCMDHelper.runN)
Ú__name__Ú
__module__Ú__qualname__r!   Ústaticmethodr'   r{   rƒ   r�   r   r   r   r   r    r   #   s    
yjr   Úntlmc                 C   s>   ddl m} |ƒ }|d }|d ur|}d| |d |d |f S )Nr   )Úget_logon_infoÚlogonserverzldap+sspi-%s://%s\%s@%srÆ   Úusername)Úwinacl.functions.highlevelrÓ   )Ú
authmethodÚhostrÓ   ÚinforÔ   r   r   r    Úget_ldap_urlp  s   rÚ   Úallc                 Ã   s  �| dkrt ||d�} t | ¡}| ¡ }| ¡ I d H \}}|d ur#|‚|jj dd¡ dd¡}g }	g }
|dks;|dkr^| ¡ 2 z3 d H W \}}|d urM|‚t	ƒ }|j
|_||_|
 |¡ q?6 |d	ksf|dkr‰| ¡ 2 z3 d H W \}}|d urx|‚tƒ }|j
|_||_|	 |¡ qj6 |
|	fS )
NÚauto)r×   rØ   zDC=rP   ú,Ú.rÃ   rÛ   rG   )rÚ   r   Úfrom_urlÚ
get_clientÚconnectÚ	_ldapinfoÚdistinguishedNameÚreplaceÚget_all_knoreq_usersr   ÚsAMAccountNamerÕ   rÆ   r©   Úget_all_service_usersr   )Úldap_urlrÄ   r×   rØ   Ú
msldap_urlÚclientr‘   r¸   rÆ   Ú	spn_usersÚasrep_usersÚuserÚcredr   r   r    rÉ   z  s<   €
ù	ù	rÉ   )rÒ   N)rÛ   rÒ   N)+r²   r¡   r—   rU   r›   Úpypykatzr   Ú	tracebackÚminikerberos.common.utilsr   Ú"minikerberos.protocol.asn1_structsr   Úpypykatz.commons.filetimer   Úpypykatz.commons.commonr   Úpypykatz.kerberos.kerberosr   r   r	   r
   r   r   r   r   r   r   r   r   r   Úpypykatz.kerberos.kirbiutilsr   r   r   Úmsldap.commons.factoryr   Úminikerberos.common.spnr   Úminikerberos.common.credsr   r   rÚ   rÉ   r   r   r   r    Ú<module>   s,   <  
O
