o
    jy                     @   s  d dl mZ d dl mZ d dlmZmZ d dlZd dlmZmZm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ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#m$Z$ d dl%m&Z& d dl'm(Z( ze) W n e*y   e+Z)Y nw dZ,G dd deZ-G dd deZ.G dd deZ/G dd deZ0G dd deZ1G dd deZ2G dd deZ3G dd deZ4G d d! d!Z5G d"d# d#Z6G d$d% d%Z7e8d&kre79e:d'Z;e;<  dS dS )(    )division)print_function)datetimetimezoneN)packunpackcalcsize)bPY2)decoderencoder)noValuehexlify)	Structure)crypto	constantstypes)
AS_REPseq_setTGS_REPEncTGSRepPartEncASRepPartTicketKRB_CREDEncKrbCredPartKrbCredInfoseq_set_iter)KerberosTime)LOG   c                   @      e Zd ZdZdS )Header))tag!H=0)taglenr$   )_tagdataz	_-tagdatazself["taglen"])tagdata:N__name__
__module____qualname__	structure r.   r.   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/ccache.pyr"   .       r"   c                   @   r!   )	DeltaTime))time_offset!L=0)usec_offsetr3   Nr)   r.   r.   r.   r/   r1   6   r0   r1   c                   @      e Zd ZdZdddZdS )CountedOctetString))lengthr3   )_dataz_-datazself["length"])datar(    c                 C   s   d|t | d f S )N%s%sr9   r   selfindentr.   r.   r/   prettyPrintC   s   zCountedOctetString.prettyPrintNr:   r*   r+   r,   r-   r?   r.   r.   r.   r/   r6   <       r6   c                   @      e Zd ZdZdd ZdS )
KeyBlockV3)keytyper$   etyper$   )etype2r$   keylenr$   	_keyvaluez
_-keyvaluezself["keylen"]keyvaluer(   c                 C      d| d t | d f S NzKey: (0x%x)%srF   rO   r   r=   r.   r.   r/   r?   Q      zKeyBlockV3.prettyPrintNrA   r.   r.   r.   r/   rD   G   s    	rD   c                   @   rC   )
KeyBlockV4)rE   rG   rJ   rL   rN   c                 C   rP   rQ   r   rR   r.   r.   r/   r?   ^   rS   zKeyBlockV4.prettyPrintNrA   r.   r.   r.   r/   rT   U   s    rT   c                   @   r5   )Times))authtimer3   )	starttimer3   )endtimer3   )
renew_tillr3   r:   c                 C   s|   t d|t| d  f  t d|t| d  f  t d|t| d  f  t d|t| d  f  d S )	Nz%sAuth : %srV   z%sStart: %srW   z%sEnd  : %srX   z%sRenew: %srY   )printr   fromtimestamp	isoformatr<   r.   r.   r/   r?   h   s   "zTimes.prettyPrintNr@   rA   r.   r.   r.   r/   rU   a   rB   rU   c                   @      e Zd ZdddeffZdS )Address)addrtyper$   addrdatar(   Nr*   r+   r,   r6   r-   r.   r.   r.   r/   r^   n       r^   c                   @   r]   )AuthData)authtyper$   authdatar(   Nra   r.   r.   r.   r/   rc   t   rb   rc   c                   @   sV   e Zd ZG dd deZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )	Principalc                   @   r!   )zPrincipal.PrincipalHeader))	name_typer3   )num_componentsr3   Nr)   r.   r.   r.   r/   PrincipalHeader{   r0   ri   Nc                 C   s   g | _ d | _|d urH| || _|t| jd  }t|| _|t| jd  }g | _ t| jd D ]}t|}|t|d  }| j | q1d S |  | _d S )Nrh   )
componentsrealmri   headerlenr6   rangeappend)r=   r9   	componentcompr.   r.   r/   __init__   s   
zPrincipal.__init__c                 C   s0   t | jt | j }| jD ]}|t |7 }q|S N)rm   rl   rk   rj   r=   totalLenir.   r.   r/   __len__      
zPrincipal.__len__c                 C   s0   | j  | j  }| jD ]}|| 7 }q|S rs   )rl   getDatark   rj   )r=   r9   rp   r.   r.   r/   ry      rx   zPrincipal.getDatac                 C      |   S rs   ry   rR   r.   r.   r/   __str__      zPrincipal.__str__c                 C   s   d}| j D ]}t|d tdurt|d }n|d }||d 7 }q|d d }t| jd tr6| jd }nt| jd }|d| 7 }|S )N    r9   T   /   @)rj   
isinstancebytesr	   rk   )r=   	principalrp   rk   r.   r.   r/   r?      s   
zPrincipal.prettyPrintc                 C   s|   |j | jd< t|j| jd< t }t|j|d< |j|d< || _g | _|jD ]}t }t||d< ||d< | j| q&d S )Nrg   rh   r7   r9   )typerl   rm   rj   r6   rk   ro   )r=   r   octetStringcr.   r.   r/   fromPrincipal   s   

zPrincipal.fromPrincipalc                 C   s   t j|  | jd dS )Nrg   r   )r   rf   r?   rl   rR   r.   r.   r/   toPrincipal   rS   zPrincipal.toPrincipalrs   )r*   r+   r,   r   ri   rr   rw   ry   r|   r?   r   r   r.   r.   r.   r/   rf   z   s    
rf   c                   @   s   e Zd ZG dd deZG dd deZdddZdd	 Zd
d Zdd 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S ) 
Credentialc                   @   6   e Zd ZddefddefddefddefdddfZd	S )
zCredential.CredentialHeaderV3clientr(   serverkeytimeis_skeyzB=0tktflagsr3   num_addressr3   N)r*   r+   r,   rf   rD   rU   r-   r.   r.   r.   r/   CredentialHeaderV3       r   c                   @   r   )
zCredential.CredentialHeaderV4r   r(   r   r   r   r   r   r   N)r*   r+   r,   rf   rT   rU   r-   r.   r.   r.   r/   CredentialHeaderV4   r   r   Nc                 C   s:  d| _ d| _d | _d | _d | _|d ur|dkr| || _n| || _|t| jd  }g | _ t| jd D ]}t	|}|t|d  }| j 
| q7td|d d d }|tdd  }t|D ]}t|}|t|d  }| j
| qct|| _|t| jd  }t|| _|t| jd  }d S |  | _d S )Nr.      r   !L   r   )	addressesauthDatarl   ticketsecondTicketr   r   rm   rn   r^   ro   r   r   rc   r6   )r=   r9   ccache_versionaddressadnum_authdatare   r.   r.   r/   rr      s4   

zCredential.__init__c                 C   s
   | j | S rs   rl   )r=   r   r.   r.   r/   __getitem__   s   
zCredential.__getitem__c                 C   s   || j |< d S rs   r   )r=   itemvaluer.   r.   r/   __setitem__      zCredential.__setitem__c                 C   s   | j d  S )Nr   )rl   r?   rR   r.   r.   r/   getServerPrincipal   r   zCredential.getServerPrincipalc                 C   sf   t | j}| jD ]}|t |7 }q|td7 }| jD ]}|t |7 }q|t | j7 }|t | j7 }|S Nr   )rm   rl   r   r   r   r   r   rt   r.   r.   r/   rw     s   


zCredential.__len__c                 C   s   | j   d S rs   )rl   dumprR   r.   r.   r/   r     r   zCredential.dumpc                 C   sn   | j  }| jD ]}|| 7 }q|tdt| j7 }| jD ]}|| 7 }q|| j 7 }|| j 7 }|S r   )rl   ry   r   r   rm   r   r   r   )r=   r9   rv   r.   r.   r/   ry     s   


zCredential.getDatac                 C   rz   rs   r{   rR   r.   r.   r/   r|     r}   zCredential.__str__r:   c                 C   s  t d|| jd  f  t d|| jd  f  t d|| jd  f  t d|  | jd d	 t d
|| jd f  t d|| jd f  t d|| jd f  | jD ]}|d	 qYt d|t| jf  | jD ]}|d	 qot d|| j f  t d|| j f  d S )Nz%sClient: %sr   z%sServer: %sr   r;   r   z	%sTimes: r   z		z%sSubKey: %sr   z%sFlags: 0x%xr   z%sAddresses: %dr   z%sAuth Data: %dz%sTicket: %sz%sSecond Ticket: %s)rZ   rl   r?   r   rm   r   r   r   )r=   r>   r   r   r.   r.   r/   r?     s   

zCredential.prettyPrintc                 C   s   t  }d|d< ttjj j|d< | d jd |d< t|d< d|d d	< d
|d d< t|d| d  j	 t
 }|| jd  t|d|j tj| d d   }t }t||d< ||d< t|j| d d |d< |S )N   pvnomsg-typer   r9   crealmenc-partr    rH   r:   ciphercnamer   r   r   rF   KDC_REPrO   
sessionKey)r   intr   ApplicationTagNumbersr   rk   r   r   r   components_to_asn1r   r   	from_asn1r   to_asn1r   _enctype_tabledictr   encodeKeyenctype)r=   tgt_repr   r   tgtr.   r.   r/   toTGT/  s"   zCredential.toTGTc                 C   s&  t  }d|d< ttjj j|d< | d jd |d< t|d< d|d d	< d
|d d< t|d| d  j	 t
 }|| jd  |d ure| t|j kretd|j|f  t
j|t|jjd|_t|d|j tj| d d   }t }t||d< ||d< t|j| d d |d< |S )Nr   r   r   r   r9   r   r   r    rH   r:   r   r   r   z4Changing sname from %s to %s and hoping for the bestr   r   r   rF   r   rO   r   )r   r   r   r   r   rk   r   r   r   r   r   r   r   r   upperstrservice_principalr   debugrf   r   r   r   r   r   r   r   r   r   )r=   newSPNtgs_repr   r   tgsr.   r.   r/   toTGSF  s*   zCredential.toTGS)NNr@   rs   )r*   r+   r,   r   r   r   rr   r   r   r   rw   r   ry   r|   r?   r   r   r.   r.   r.   r/   r      s    
 
r   c                   @   s   e Zd ZG dd deZd(ddZdd Zd)d	d
ZedddfddZ	dd Z
dd Zdd Zedd Zdd Zed*ddZdd Zedd Zd d! Zd"d# Zd$d% Zd&d' ZdS )+CCachec                   @   r!   )zCCache.MiniHeader))file_format_versionz	!H=0x0504)	headerlenz!H=12Nr)   r.   r.   r.   r/   
MiniHeadere  r0   r   Nc                 C   s`  d | _ d | _g | _d | _|d urtrtd|d d }n|d }|dks(|dkr,td|dkrg| |}|t|	 d  }|d }g | _ |dkrft
|}| j | |t|8 }|t|d  }|dksJn|dd  }t|| _|t| jd  }g | _t|dkrt||}|d  d	dk r| j| |t|	 d  }t|dksd S d S d S )
Nz>Br    r      zNot Implemented!r   r   r   s   krb5_ccache_conf_data)headersr   credentials
miniHeaderr
   r   NotImplementedErrorr   rm   ry   r"   ro   rf   r   r?   find)r=   r9   r   r   	headerLenrl   credr.   r.   r/   rr   k  sD   


"zCCache.__init__c                 C   sN   |    }| jD ]}|| 7 }q	|| j 7 }| jD ]}|| 7 }q|S rs   )r   ry   r   r   r   )r=   r9   rl   
credentialr.   r.   r/   ry     s   

zCCache.getDataTc                 C   s  | j D ]O}|d   t| ks>|d   dd t| ks>|d   dd t| dd krRtd|d   d  |  S qtd|   |du rEtd	 | j D ]}|d  d
dkr|d   d
d dd dd d |d   d
d dd  }d| dd dd dd | dd dd f }|t|krtd|d   d  |  S qi|d   dd dd d |d   dd  }| dd dd dd dd  d| dd dd  }|t|krDtd|d   d  |  S qid S )Nr   r   r   @z"Returning cached credential for %sutf-8zSPN %s not found in cacheTz0AnySPN is True, looking for another suitable SPNr   r       :%s@%s/r(   .z$@)	r   r?   r   r	   splitr   r   decoder   )r=   r   anySPNr   	cachedSPN	searchSPNr.   r.   r/   getCredential  s4   
B0 


V& BR zCCache.getCredentiali  r    c                 C   s.   || }t |j|j|jd d  d  d S )N   i  i@B g    .A)r   microsecondssecondsdays)r=   dtepochtdr.   r.   r/   toTimeStamp  s   &zCCache.toTimeStampc                 C   sR   t |tr|dddd}n
ddd |D }|ddd d }t|dS )	N'r:   Bc                 s   s    | ]}t |V  qd S rs   )r   ).0bitr.   r.   r/   	<genexpr>  s    z&CCache.reverseFlags.<locals>.<genexpr>    0r   )r   r   replacejoinljustr   )r=   flagsbit_strr.   r.   r/   reverseFlags  s
   

zCCache.reverseFlagsc                 C   sZ  g | _ t }d|d< d|d< d|d< | j | tj|t dd }t }||d	d
 t | _	| j	
| |d d }tj|d d  }||d|}	tj|	t dd }
t }t }||
dd t }|
| | j	|d< ||d< d|d< t |d< t|
d d |d d< |
d d  |d d< t|d d |d d< t |d< | tj|
d |d d< | tj|
d |d d< | tj|
d |d d< |
d  r| tj|
d |d d< | |
d }||d< d|d < t |_t|d! jtjd"d#|jd$< t|jd$ |jd%< t |_ d&|j d$< d|j d%< | j!| d S )'Nr    r#      r%          r'   asn1Specr   r   r   r   r   rH   r   srealmsnamer   r   r   r   rF   rO   rK   r   rV   rW   rX   
renew-tillrY   r   r   r   r   TtagSetcloneValueFlagr9   r7   r~   )"r   r"   ro   r   r   r   r   rf   r   r   r   r   r   decryptr   r   rT   r   asOctetsrm   rU   r   r   hasValuer   r6   r   r   r   cloner   r  r   r   )r=   r   oldSessionKeyr   rl   
decodedTGTtmpPrincipal
cipherTextr   	plainTextencASRepPartr   r   	tmpServerr   r.   r.   r/   fromTGT  sV   



 

zCCache.fromTGTc                 C   sZ  g | _ t }d|d< d|d< d|d< | j | tj|t dd }t }||d	d
 t | _	| j	
| |d d }tj|d d  }||d|}	tj|	t dd }
t }t }||
dd t }|
| | j	|d< ||d< d|d< t |d< t|
d d |d d< |
d d  |d d< t|d d |d d< t |d< | tj|
d |d d< | tj|
d |d d< | tj|
d |d d< |
d  r| tj|
d |d d< | |
d }||d< d|d< t |_t|d  jtjd!d"|jd#< t|jd# |jd$< t |_ d%|j d#< d|j d$< | j!| d S )&Nr    r#   r   r%   r   r'   r   r   r   r   r   r   rH   r   r   r   r   r   r   rF   rO   rK   r   rV   rW   rX   r   rY   r   r   r   r   Tr  r9   r7   r~   )"r   r"   ro   r   r   r   r   rf   r   r   r   r   r   r  r   r   rT   r   r  rm   rU   r   r   r  r   r6   r   r   r   r  r   r  r   r   )r=   r   r  r   rl   
decodedTGSr
  r  r   r  encTGSRepPartr   r   r  r   r.   r.   r/   fromTGS  sV   



 

zCCache.fromTGSc              
   C   sb   |d u rt d t d d S zt|d}| }|  | |W S  ty0 } z|d }~ww )Nz%CCache file is not found. Skipping...zWThe specified path is not correct or the KRB5CCNAME environment variable is not definedrb)r   criticalr   openreadcloseFileNotFoundError)clsfileNamefr9   er.   r.   r/   loadFileP  s   



zCCache.loadFilec                 C   $   t |d}||   |  d S Nzwb+)r  writery   r  r=   r  r  r.   r.   r/   saveFile_     
zCCache.saveFiler:   c           	      C   sx  |  td}|du r||ddfS tdtd  |dkr0|jjd d}td|  d}|dkrEd| | f }|	|}d}d}|du rpd	| | f }|	|}|durjtd
 |
 }ntd n
td ||}|dkr|dur|d  dd d}td|  n|dkrt|jjdkr|jjd d d}td|  ||||fS )a2  
        parses the CCache file specified in the KRB5CCNAME environment variable

        :param domain: an optional domain name of a user
        :param username: an optional username of a user
        :param target: an optional SPN of a target system

        :return: domain, username, TGT, TGS
        
KRB5CCNAMENzUsing Kerberos Cache: %sr:   r9   r   z Domain retrieved from CCache: %sr   zkrbtgt/%s@%szUsing TGT from cachez#No valid credentials found in cachezUsing TGS from cacher   r   r   z"Username retrieved from CCache: %s)r  osgetenvr   r   r   rk   r   r   r   r   r   r?   r   rm   rj   )	r  domainusernametargetccachecredsr   TGTTGSr.   r.   r/   	parseFiled  s:   





zCCache.parseFilec                 C   sH   t d| j   t d t| jD ]\}}t d|  |d qd S )NzPrimary Principal: %szCredentials: z[%d]	)rZ   r   r?   	enumerater   )r=   rv   r   r.   r.   r/   r?     s   zCCache.prettyPrintc                 C   s.   t |d}| }|  |  }|| |S )Nr  )r  r  r  fromKRBCRED)r  r  r  r9   r*  r.   r.   r/   loadKirbiFile  s   

zCCache.loadKirbiFilec                 C   r  r  )r  r   	toKRBCREDr  r!  r.   r.   r/   saveKirbiFile  r#  zCCache.saveKirbiFilec                 C   s0  t j|t dd }t j|d d t dd }|   t|d D ]\}}t }||dd t }|	| |dkr@|| _
t }t }	|	|dd	 t }
|
	|	 ||d
< |
|d< d|d< t |d< t|d d |d d< |d d  |d d< t|d d |d d< t |d< | tj|d |d d< | tj|d |d d< | tj|d |d d< |d  r| tj|d |d d< | |d }||d< d|d< t |_t|d | jtjdd|jd< t|jd |jd< t |_d|jd< d|jd< | j| q"d S ) Nr   r   r   r   ticket-infoprealmpnamer   r   r   r   r   r   rF   rO   rK   r   rW   rV   rX   r   rY   r   r   r   ticketsTr  r9   r7   r~   )r   r   r   r   setDefaultHeaderr0  r   rf   r   r   r   r   rT   r   r  rm   rU   r   r   r  r   r6   r   r   r   r  r   r  r   r   ro   )r=   encodedKrbCredkrbCredencKrbCredPartrv   krbCredInfor
  r   r   r   r  r   r.   r.   r/   r1    sj   






zCCache.fromKRBCREDc           
      C   s  | j }g }g }| jD ]}t }t|d< |d d |d d< |d d |d d< |d jjd |d< t|d< |d jd |d d	< t|d d
tdd |d j	D  t
|d d|d< ttj|d d tjd|d< ttj|d d tjd|d< |d d dkrttj|d d tjd|d< |d jjd |d< t|d< |d jd |d d	< t|d d
tdd |d j	D  || tj|jd t dd }|| q
t }t|d| t }d|d< d|d < t|d!< d|d! d"< t||d! d#< t|d$| t|}	|	S )%Nr   rF   rO   r   r9   r6  r7  rg   z	name-typezname-stringc                 s       | ]}|j d  V  qdS r9   Nfieldsr   r   r.   r.   r/   r          z#CCache.toKRBCRED.<locals>.<genexpr>r   032br   r   rW   )tzrX   rY   r   r   r   r   r   c                 s   r>  r?  r@  rB  r.   r.   r/   r     rC  r   r5  r   r      r   r   rH   r   r8  )r   r   r   r   rk   rA  rl   r   tuplerj   r   r   r   r   r[   r   utcro   r   r   r   r   r   r   r   r   )
r=   r   krbCredInfosr8  r   r=  r   r<  r;  r:  r.   r.   r/   r3    sf   


zCCache.toKRBCREDc                 C   s4   g | _ t }d|d< d|d< d|d< | j | d S )Nr    r#   r   r%   r   r'   )r   r"   ro   )r=   rl   r.   r.   r/   r9  3  s   zCCache.setDefaultHeaderrs   )T)r:   r:   r:   )r*   r+   r,   r   r   rr   ry   r   r   r   r   r  r  classmethodr  r"  r.  r?   r2  r4  r1  r3  r9  r.   r.   r.   r/   r   b  s*    
.
	=?
1
AGr   __main__r$  )=
__future__r   r   r   r   r%  structr   r   r   sixr	   r
   pyasn1.codec.derr   r   pyasn1.type.univr   binasciir   impacket.structurer   impacket.krb5r   r   r   impacket.krb5.asn1r   r   r   r   r   r   r   r   r   r   impacket.krb5.typesr   impacketr   r  	NameErrorIOError
DELTA_TIMEr"   r1   r6   rD   rT   rU   r^   rc   rf   r   r   r*   r  r&  r*  r?   r.   r.   r.   r/   <module>   sN   0H !   ]