o
    Žõ±jî!  ã                   @   s,  d dl mZ d dlZd dlZd dl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 d dlmZmZ d dlmZ d,dd„Zd,dd„Zdd„ Zdd„ Zd-dd„Z dd„ Z!dd„ Z"dd„ Z#d.dd„Z$d-d d!„Z%d/d#d$„Z&d0d&d'„Zd0d(d)„Z'd*d+„ Z(dS )1é    )ÚloggerN)Úkrb5userenumÚ
asreproastÚ
kerberoast)ÚKerberosClientFactory)ÚKerberosSPN)ÚKerberosCredential)ÚKerberosTarget)ÚKeytab)ÚAIOKerberosClient)Úprint_table)ÚCCACHEÚ
Credential)ÚKirbiTc                 C   s„   t ƒ }|du r
tƒ }|  ¡ }|dkrd S | d¡}|dkr/|d ur)||_||_|S td| ƒ‚| dd¡\|_|_|d ur@||_|S )NFÚ ú@éÿÿÿÿzFUser %s is missing realm specification and no global realm is defined!é   )r   r   ÚstripÚfindÚusernameÚdomainÚ	ExceptionÚsplit)ÚtargetÚrealmÚto_spnÚspnÚlineÚm© r    ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/kerberos/kerberos.pyÚprocess_target_line   s"   
	ùr"   c              	   C   s    g }| D ]I}|  ¡ }zt|dƒ W n   t|||d�}|r#| |¡ Y qt|dƒ�}|D ]}t|||d�}|r=| |¡ q-W d  ƒ n1 sHw   Y  q|S )za
	Takes a list of files or strings and generates a list of targets in <username>@<realm> format
	Úr)r   r   N)r   Úopenr"   Úappend)Útargetsr   r   Úresultsr   ÚxÚfr   r    r    r!   Úgenerate_targets)   s(   
€
€ýÿ€r*   c                 C   sJ   t | dƒ�}t | ¡ ¡}tt|ƒƒ W d   ƒ d S 1 sw   Y  d S )NÚrb)r$   r
   Ú
from_bytesÚreadÚprintÚstr)Úkeytablfiler)   Úktr    r    r!   Úprocess_keytab>   s   "þr2   c                 C   sd   t  | ¡}g }| dgt ¡  ¡ d}|jD ]}| t|ƒg| ¡  ¡ |d7 }qtƒ  t	|ƒ d S )NÚidr   r   )
r   Ú	from_filer%   r   Úsummary_headerÚcredentialsr/   Úsummaryr.   r   )Ú
ccachefileÚccÚtableÚiÚcredr    r    r!   Úlist_ccacheC   s   


r=   c                 C   sx   t  | ¡}|r/t|dƒ�}| ¡ D ]}| | ¡ d ¡ qW d   ƒ d S 1 s(w   Y  d S | ¡ D ]}t|ƒ q3d S )NÚwbs   
)r   r4   r$   Ú
get_hashesÚwriteÚencoder.   )r8   Úoutfiler9   r)   Úhr    r    r!   Úroast_ccacheN   s   
ÿ"ÿ
ÿrD   c                 C   sž   t j t j t j | ¡¡dt | ¡ ¡}t | ¡}tƒ }|j	|_	|j
|_
|j|_|j|_t|jƒD ]\}}||kr:q1|j |¡ q1t d| ¡ | |¡ d S )Nz%s.edited.ccachezWriting edited file to %s)ÚosÚpathÚjoinÚdirnameÚabspathÚntpathÚbasenamer   r4   Úfile_format_versionÚ	headerlenÚheadersÚprimary_principalÚ	enumerater6   r%   r   ÚinfoÚto_file)r8   ÚindexÚoutput_filenamer9   Útemp_ccr;   r<   r    r    r!   Ú
del_ccacheX   s   (
rV   c                 C   s,   t  | ¡}t d¡ | |¡ t d¡ d S )NzExtracting kirbi file(s)zDone!)r   r4   r   rQ   Úto_kirbidir)r8   Úkirbidirr9   r    r    r!   Úccache_to_kirbij   s   


rY   c                 C   s†   zt  | ¡}W n ty   t ƒ }Y nw tj |¡}tj |¡r7t d| ¡ t	 	|d ¡D ]}| 
|¡ q.n| 
|¡ | | ¡ d S )Nz#Parsing kirbi files in directory %sz*.kirbi)r   r4   ÚFileNotFoundErrorrE   rF   rI   Úisdirr   rQ   ÚglobÚ	add_kirbirR   )r8   Úkirbir9   Úabs_pathÚ	kirbifiler    r    r!   Úkirbi_to_ccachep   s   
ÿÿ
ra   c              
   Ã   sò   �z^t  d¡ t|tƒr|g}t | ¡}t |¡}t  d| ¡  ¡ t  d¡ | 	¡ }| 
¡ I d H  t  d¡ |j||d�I d H \}}}t ||¡}	|d urS|	 |¡ t  d¡ ||||	d fW S  tyx }
 zd d d d |
fW  Y d }
~
S d }
~
ww )Nz[KERBEROS][TGS] startedz[KERBEROS][TGS] target user: %sz[KERBEROS][TGS] fetching TGTz[KERBEROS][TGS] fetching TGS©Úoverride_etypez[KERBEROS][TGS] done!)r   ÚdebugÚ
isinstanceÚintr   Úfrom_urlr   Úfrom_user_emailÚget_formatted_pnameÚ
get_clientÚget_TGTÚget_TGSr   Úfrom_ticketdatarR   r   )Úurlr   Úout_filerc   ÚkuÚkcommÚtgsÚencTGSRepPartÚkeyr^   Úer    r    r!   rl   €   s,   €







€ÿrl   c              
   Ã   sÀ   �zHt  d¡ t|tƒr|g}t | ¡}| ¡ }| ¡ }t  d| ¡ t  d| ¡ t||ƒ}t  d¡ |j	|d�I d H  t
 |j|j¡}|d fW S  ty_ } z
d |fW  Y d }~S d }~ww )Nz[KERBEROS][TGT] startedz[KERBEROS][TGT] cred: %sz[KERBEROS][TGT] target: %sz[KERBEROS][TGT] fetching TGTrb   )r   rd   re   rf   r   rg   Ú	get_credsÚ
get_targetr   rk   r   rm   Úkerberos_TGTÚkerberos_TGT_encpartr   )rn   rc   rp   r<   r   rq   r^   ru   r    r    r!   rk   ™   s&   €





€ÿrk   Fc              
   Ã   sî   �z_t  d¡ t| ƒ}dd„ |D ƒ}|d j}t|||ƒ2 z:3 dH W \}}}	}
|
dur,q|du rW|rOt|dƒ�}| |d ¡ W d  ƒ n1 sIw   Y  qtd	t|ƒ ƒ q6 t  	d
¡ W dS  t
yv } z
d|fW  Y d}~S d}~ww )ú
	targets List<KerberosSPN>

	z+[KERBEROS][BRUTE] User enumeration startingc                 S   ó   g | ]}|j ‘qS r    ©r   ©Ú.0r(   r    r    r!   Ú
<listcomp>·   ó    zbrute.<locals>.<listcomp>r   NTÚaú
z[+] Enumerated user: %sz+[KERBEROS][BRUTE] User enumeration finished©NN)r   rd   r	   r   r   r$   r@   r.   r/   rQ   r   )Úhostr&   ro   Úshow_negativesr   Ú	enumusersr   r   ÚresultÚ_Úerrr)   ru   r    r    r!   Úbrute®   s0   €

 ÿ€€ø

€ÿrŠ   é   c              
   Ã   s  �zqt  d¡ t  dt|ƒ ¡ dd„ |D ƒ}|d j}t| ƒ}g }t||||ƒ2 z3 dH W \}}	}
|	dur=| t|	ƒ¡ q)6 |ret|ddd	��}|D ]	}| |d
 ¡ qKW d  ƒ n1 s_w   Y  nt	|	ƒ t  
d¡ |dfW S  tyˆ } z
d|fW  Y d}~S d}~ww )rz   z"[KERBEROS][ASREPROAST] Roasting...zC[KERBEROS][ASREPROAST] Supporting the following encryption type: %sc                 S   r{   r    r|   r}   r    r    r!   r   Ó   r€   zasreproast.<locals>.<listcomp>r   Nr�   r   ©Únewliner‚   z[KERBEROS][ASREPROAST] Done!)r   rd   r/   r   r	   r   r%   r$   r@   r.   rQ   r   )r„   r&   ro   ÚetypeÚ	usernamesr   ÚksÚhashesrˆ   rC   r‰   r)   Úthashru   r    r    r!   r   Ê   s6   €

 €þÿÿ€

€ÿr   c              
   Ã   sD  �zŠt  d¡ |r|dkrg d¢}n|g}ng d¢}t  dd dd„ |D ƒ¡ ¡ dd	„ |D ƒ}|d
 j}t | ¡}g }t||||ƒ2 z3 dH W \}	}
}| |
¡ qC6 |ryt|ddd��}|D ]	}| 	|d ¡ q_W d  ƒ n1 ssw   Y  n	|D ]}t
|ƒ q{t  d¡ |dfW S  ty¡ } z
d|fW  Y d}~S d}~ww )rz   z [KERBEROS][SPNROAST] Roasting...r   )r‹   é   é   z?[KERBEROS][SPNROAST] Using the following encryption type(s): %sú,c                 s   s   � | ]}t |ƒV  qd S ©N)r/   r}   r    r    r!   Ú	<genexpr>ø   s   € zspnroast.<locals>.<genexpr>c                 S   r{   r    r|   r}   r    r    r!   r   ú   r€   zspnroast.<locals>.<listcomp>r   NÚwr   rŒ   r‚   z[KERBEROS][SPNROAST] Done!)r   rd   rG   r   r   rg   r   r%   r$   r@   r.   rQ   r   )rn   r&   ro   rŽ   ÚetypesÚktargetsÚkdomainrp   r‘   r   rC   r‰   r)   r’   ru   r    r    r!   Úspnroasté   s>   €



 ÿÿÿ€


€ÿrœ   c                 Ã   sŠ  �zªt  d¡ t | ¡}| ¡ }| ¡ }t |¡}t |¡}|j	sFt  d¡ t
||ƒ}| ¡ I d H  t  d¡ | ||¡I d H }	|	\}
}}nSt  d¡ |j	 ¡ D ]H\}}z*t  dd |d d ¡ ¡ t
 |||¡}| ||¡I d H }	|	\}
}}t  d	¡ W n ty— } zt  d
| ¡ W Y d }~qPd }~ww  t  d¡ t |
|¡}|
|||d fW S  tyÄ } zd d d d |fW  Y d }~S d }~ww )Nz[KERBEROS][S4U] Startedz[KERBEROS][S4U] Getting TGTz[KERBEROS][S4U] Getting STz/[KERBEROS][S4U] Getting TGS via TGT from CCACHEz)[KERBEROS][S4U] Trying to get SPN with %sú!Úcnamezname-stringz[KERBEROS][S4U] Sucsess!z=[KERBEROS][S4U] This ticket is not usable it seems Reason: %sz[KERBEROS][S4U] Done!)r   rd   r   rg   rv   rw   r   Úfrom_target_stringrh   Úccacher   rk   ÚgetSTÚget_all_tgtrG   Úfrom_tgtr   r   rm   )rn   r   Ú
targetuserÚcuÚccredr   Úservice_spnÚtarget_userÚclientÚresrr   rs   rt   Útgtru   r^   r    r    r!   Ús4u  sH   €








€þ
€ÿr¬   )NTr–   rƒ   )NF)Nr‹   ))Úpypykatzr   rE   rJ   r\   Úminikerberos.securityr   r   r   Úminikerberos.common.factoryr   Úminikerberos.common.spnr   Úminikerberos.common.credsr   Úminikerberos.common.targetr	   Úminikerberos.common.keytabr
   Úminikerberos.aioclientr   Úminikerberos.common.utilsr   Úminikerberos.common.ccacher   r   Úminikerberos.common.kirbir   r"   r*   r2   r=   rD   rV   rY   ra   rl   rk   rŠ   rœ   r¬   r    r    r    r!   Ú<module>   s8   








'