o
    jy                     @   sH  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
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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"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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI d dlJmKZKmLZLmMZMmNZNmOZO d dlPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb d dlcmdZdmeZe d dlfmgZg d dlhmiZi G dd dZjdd Zkeldkr"e
mek  dS dS )    )division)print_functionN)timegm)strptime)	unhexlify)ListOptionalDictAny)logger)CCACHE)KerberosSPN)KerberosCredential)KerberosTarget)AS_REPTGS_REPETYPE_INFO2AuthorizationDataEncTicketPartEncASRepPartEncTGSRepPartAD_IF_RELEVANTKDC_REQ_BODYAS_REQTGS_REQPrincipalNameRealmTicketAP_REQAuthenticatorEncryptedDataPA_FOR_USER_ENC	krb5_pvno
KDCOptions	APOptionsMETHOD_DATA
ETYPE_INFOPADATA_TYPEPA_PAC_REQUESTPA_ENC_TS_ENCChecksum	CKSUMTYPE)ApplicationTagNumbersPreAuthenticationDataTypesEncryptionTypePrincipalNameTypeProtocolVersionNumberTicketFlagsChecksumTypesAuthorizationDataTypeKERB_NON_KERB_CKSUM_SALT	NAME_TYPEMESSAGE_TYPE
PaDataType)Key_enctype_table_checksum_tableEnctype_HMACMD5)KERB_SID_AND_ATTRIBUTESPAC_SIGNATURE_DATAPAC_INFO_BUFFERPAC_LOGON_INFOPAC_CLIENT_INFO_TYPEPAC_SERVER_CHECKSUMPAC_PRIVSVR_CHECKSUMPACTYPEPKERB_SID_AND_ATTRIBUTES_ARRAYVALIDATION_INFOPAC_CLIENT_INFOKERB_VALIDATION_INFOUPN_DNS_INFO_FULLPAC_REQUESTOR_INFOPAC_UPN_DNS_INFOPAC_ATTRIBUTES_INFOPAC_REQUESTORPAC_ATTRIBUTE_INFO)KerberosTime	Principal)AIOKerberosClientSocket)AIOKerberosClientc                   @   s   e Zd ZdededefddZedd Zedd	 Zed
d Zdd Z	dd Z
dd Zdd Ze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$S )%TICKETERtargetpassworddomainc                 C   s   || _ || _|| _|| _d | _d | _|jr>|jd}|d | _t	|dkr*|d n|d | _
|jd ur<| |j d S d S d| _| j| _
d S )N/r      krbtgt)_TICKETER__password_TICKETER__target_TICKETER__domain_TICKETER__options_TICKETER__tgt_TICKETER__tgt_session_keyspnsplit_TICKETER__servicelen_TICKETER__serverkeytabloadKeysFromKeytab)selfrT   rU   rV   options	spn_parts rj   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/minikerberos/tickettest.py__init__`   s   

zTICKETER.__init__c                 C   s   | d9 } | d7 } | S )Ni l     }*{Grj   )trj   rj   rk   getFileTimes   s   zTICKETER.getFileTimec                 C   s   | d d d |  S N      rj   data_lengthrj   rj   rk   getPadLengthy   s   zTICKETER.getPadLengthc                 C   s   | d d d S ro   rj   rr   rj   rj   rk   getBlockLength}   s   zTICKETER.getBlockLengthc                 C   s   t d d S )Nz3Keytab loading not yet implemented for minikerberos)loggingwarning)rg   filenamerj   rj   rk   rf      s   
zTICKETER.loadKeysFromKeytabc                 C   s  t  }ttjtjj }| |}|d@ |d d< |d? |d d< d|d d< d|d d< d|d d< d|d d< |d@ |d	 d< |d? |d	 d< d
|d d< d
|d d< d|d d< d|d d< | j|d< d|d< d|d< d|d< d|d< d|d< d|d< d
|d< t	| j
j|d< | j
jd}t|d
krd|d< nt	|d
 |d< t||d< |D ]}qd
|d< d|d< d|d< | j |d < d!|d"< d
|d#< d
|d$ d< d
|d$ d< d
|d% d< d
|d% d< d
|d&< d
|d'< d
|d(< t }||d)< |S )*Nl    	LogonTimedwLowDateTime    dwHighDateTime
LogoffTimeiKickOffTimePasswordLastSetr   PasswordCanChangePasswordMustChangeEffectiveName FullNameLogonScriptProfilePathHomeDirectoryHomeDirectoryDrivei  
LogonCountBadPasswordCountUserId,i  PrimaryGroupId
GroupCount	UserFlags                   UserSessionKeyLogonServerLogonDomainNames           LMKeySubAuthStatusLastSuccessfulILogonLastFailedILogonFailedILogonCount	Reserved3ResourceGroupCountData)rH   r   datetimenowtimezoneutc	timetuplern   r[   intr]   user_idgroupsra   rc   r\   upperrF   )rg   kerbdataaTimeunixTimer   groupvalidationInforj   rj   rk   createBasicValidationInfo   s^   


z"TICKETER.createBasicValidationInfoc                 C   s@  |   }i }| |  |t< t }t }|d d d tjjkr7tj	j|d< tj	j|d< d|d< d|d< n)d|d< d|d< t
| jjdkrTtjj|d< tjj|d< ntjj|d< tjj|d< | |t< | |t< t }| jd	|d
< t
|d
 |d< | |t< | jjr| | | jjdu r| | | | |S )Nticketenc-partetypeSignatureTyper   	Signatures               @   zutf-16leName
NameLengthF)r   getDatagetDataReferentsr@   r>   r.   RC4_HMACvaluer2   HMAC_MD5rc   r]   aesKeyHMAC_SHA1_96_AES256HMAC_SHA1_96_AES128rB   rC   rG   r[   encoderA   	extra_paccreateUpnDnsPacold_paccreateAttributesInfoPaccreateRequestorInfoPac)rg   kdcRepr   pacInfossrvCheckSumprivCheckSum
clientInforj   rj   rk   createBasicPac   s:   



zTICKETER.createBasicPacc                 C   s  t  }d| t| }| j  d| j  d}t||d< t|t| |d< |d |d  }| |}|d| 7 }| j d}t||d< || |d< |d |d  }| |}|d| 7 }d|d	< | jd}t||d
< || |d< |d |d
  }| |}|d| 7 }d}	t|	|d< || |d< |d |d  }| |}|	d|  }
|| | |
 }| | | |t	< d S )N    @z	utf-16-le	UpnLength	UpnOffsetDnsDomainNameLengthDnsDomainNameOffset   FlagsSamNameLengthSamNameOffsets                                    	SidLength	SidOffset)
rI   rt   rc   r[   lowerr\   r   r   r   rK   )rg   r   
upnDnsInfoPAC_padupn_data	total_lenpaddns_namesamNameuser_sid_data	user_datapost_pac_datarj   rj   rk   r   	  s:    



zTICKETER.createUpnDnsPacc                 C   s&   t  }d|d< d|d< | | t< d S )Nr   FlagsLengthrX   r   )rN   r   rL   )r   pacAttributesrj   rj   rk   r   2  s   z TICKETER.createAttributesInfoPacc                 C   s   t  }| |t< d S N)rM   r   rJ   )rg   r   pacRequestorrj   rj   rk   r   :  s   zTICKETER.createRequestorInfoPacc                 C   s   | j jdu r| j| jkrtd ntd td dS td | j| jkr3t }tjj	|d< n	t
 }tj
j	|d< d|d	< | j jd u rG	 | j |d
< ttjj	| jgd|d< t |d< tjj	|d d< | j |d d< t| j| jkr|tjj	ntjj	| j| j| jkr| j n| jgd|d d< t |d d< d|d d d< t |d< | j jd u rt| j jdkrtjj	|d d d< tjj	|d d< n%tjj	|d d d< tjj	|d d< ntjj	|d d d< tjj	|d d< d|d d< | |}||fS )NTz/Requesting TGT to target domain to use as basisz3Requesting TGT/TGS to target domain to use as basisz:Request functionality not yet implemented for minikerberos)NNz,Creating basic skeleton ticket and PAC Infoszmsg-type   pvnocrealmz	name-typezname-stringcnamer   ztkt-vnorealmsnamer   r   kvnor   r   )r]   requestr\   rd   rv   infoerrorr   r,   r   r   nthashr   r   r5   	PRINCIPALr[   r   r0   r   SRV_INSTrb   r    rc   r   r.   AES256_CTS_HMAC_SHA1_96AES128_CTS_HMAC_SHA1_96r   r   )rg   r   r   rj   rj   rk   createBasicTicketB  sR   



 

zTICKETER.createBasicTicketc                    s   t d dS )Nz?S4U2Self+U2U functionality not yet implemented for minikerberos)NNNN)rv   r   )rg   rj   rj   rk   getKerberosS4U2SelfU2U}  s   
zTICKETER.getKerberosS4U2SelfU2Uc                 C   s  t d| j| jf  tjtjjtjt	| j
jd }| j
jr(t d dS t }g }|d d d dd	|d
< |d
 d tjjkrUddd tdD |d
 d< n+|d
 d tjjkrpddd tdD |d
 d< nddd tdD |d
 d< | j |d< ttjj| jgd|d< ddd|d< tjtjj}|jdd|d< |jdd|d< ||d< ||d< g |d< t d  t d! t d" | j| jkrt }nt }|d
 |d
< g |d#< d$|d%< ||d&< t|d |d< t|d |d< t|d |d< t|d |d< | j |d'< t| j| jkr tjjntjj| j| j| jkr1| j n| jgd|d(< | j| jkrGt d) nt d* |||fS )+NzCustomizing ticket for %s/%s)hourszRSapphire ticket (impersonation) functionality not yet implemented for minikerberos)NNNr   r   r       )keytypekeyvaluekeyr   r   c                 S      g | ]}t tjqS rj   randomchoicestringascii_letters.0_rj   rj   rk   
<listcomp>      z,TICKETER.customizeTicket.<locals>.<listcomp>   r   c                 S   r   rj   r   r   rj   rj   rk   r    r  r{   c                 S   r   rj   r   r   rj   rj   rk   r    r  r   r   r   r   )ztr-typecontents	transited)microsecondauthtime	starttimeendtimez
renew-tillzauthorization-dataz	PAC_LOGON_INFOz	PAC_CLIENT_INFO_TYPEz	EncTicketPartzlast-reqi[noncezkey-expirationsrealmr   z	EncAsRepPartz	EncTGSRepPart) rv   r   r\   r[   r   r   r   r   	timedeltar   r]   durationimpersonater   r   r.   r   r   joinranger   r   r   r5   r   replacerd   r   r   strr   rb   )rg   r   r   ticketDurationencTicketPartflagsr   
encRepPartrj   rj   rk   customizeTicket  sh   $


"" 



"

zTICKETER.customizeTicketc                 C   s   t d t d dS )NzSigning/Encrypting final ticketzLPAC signing and ticket encryption not yet fully implemented for minikerberos)r   NN)rv   r   r   )rg   r   encASorTGSRepPartr  r   rj   rj   rk   signEncryptTicket  s   

	zTICKETER.signEncryptTicketc                 C   s0   t d| jddd   t }t d d S )NzSaving ticket in %srW   .z.ccachez8CCACHE saving not yet fully implemented for minikerberos)rv   r   r[   r  r   )rg   r   
sessionKeyccacherj   rj   rk   
saveTicket  s   zTICKETER.saveTicketc                    sf   |   \}}|d ur-| ||\}}}|d ur/| ||||\}}}|r1| || d S d S d S d S r   )r   r  r  r  )rg   r   adIfRelevantr  r  r   cipherr  rj   rj   rk   run  s   zTICKETER.runN)__name__
__module____qualname__r  rl   staticmethodrn   rt   ru   rf   r   r   r   r   r   r   r   r  r  r  r!  rj   rj   rj   rk   rS   _   s*    


Z()
;VrS   c               
      s  t d tjddd} | jdddd | jd	dd
d | jddddd | jddddd | jddddd | jddddd | jdddd | jdddd | jddddd | jd dd!d"d | jd#dd$d | jd%dd&d | jd'dd(d | jd)dd*d+d | jd,dd-d | jd.dd/d | d0}|jd1dd2d |jd3dd4d |jd5dd6d7d |jd8dd9d:d | jd;dd<d ttjd=kr|   t d> t d? t d@ t dA t dB t dC t dD t dE t dF t dG t dH t	d= | 
 }|jrtjtjdI ntjtjdI |jd u r%tdJ t	d= |jd u rA|jd u rA|jd u rAtdK t	d= |jd ur]|jd ur]|jdu r]tdL t	d= |jdu rs|jd u rstdM t	d= |jdu r|jd u r|jd u rdNdOlm} |dP}n|j}|jr8g }|jdf|jp|jdQf|jdf|jd1f|d3f|jdf|jd fg}|D ]\}}|s|| q|rtdRdS|  t	d= |j s|jstdT t	d= g }	|j!r|	d% |j"d ur|	d# |j#d ur|	d |j$d ur|	d) |	r)tdUdS|	  |j r8|jd ur8tdV zt%|j&||j|}
|
' I d H  W d S  t(yv } zt) j*tjkredNd l+}|,  t t-| W Y d }~d S d }~ww )WNzMinikerberos Ticket GeneratorTz>Creates a Kerberos golden/silver tickets based on user options)add_helpdescriptionrT   storez%username for the newly created ticket)actionhelpz-spnz}SPN (service/server) of the target service the silver ticket will be generated for. if omitted, golden ticket will be createdz-request
store_trueFzlRequests ticket to domain and clones it changing only the supplied information. It requires specifying -user)r)  defaultr*  z-domainz2the fully qualified domain name (e.g. contoso.com))r)  requiredr*  z-domain-sidz@Domain SID of the target domain the ticker will be generated forz-aesKeyzhex keyz5AES key used for signing the ticket (128 or 256 bits))r)  metavarr*  z-nthashz#NT hash used for signing the ticketz-keytabz7Read keys for SPN from keytab file (silver ticket only)z-groupsz513, 512, 520, 518, 519zVcomma separated list of groups user will belong to (default = 513, 512, 520, 518, 519)z-user-id500zCuser id for the user the ticket will be created for (default = 500)z
-extra-sidzHComma separated list of ExtraSids to be included inside the ticket's PACz
-extra-pacz-Populate your ticket with extra PAC (UPN_DNS)z-old-pacz^Use the old PAC structure to create your ticket (exclude PAC_ATTRIBUTES_INFO and PAC_REQUESTORz	-duration87600z=Amount of hours till the ticket expires (default = 24*365*10)z-tsz&Adds timestamp to every logging outputz-debugzTurn DEBUG output ONauthenticationz-userzZdomain/username to be used if -request is chosen (it can be different from domain/usernamez	-passwordzpassword for domain/usernamez-hasheszLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASHz-dc-ipz
ip addresszoIP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameterz-impersonatezSapphire ticket. target username that will be impersonated (through S4U2Self+U2U) for querying the ST and extracting the PAC, which will be included in the new ticketrX   z
Examples: zp	./ticketer.py -nthash <krbtgt/service nthash> -domain-sid <your domain SID> -domain <your domain FQDN> baduser
zd	will create and save a golden ticket for user 'baduser' that will be all encrypted/signed used RC4.z^	If you specify -aesKey instead of -ntHash everything will be encrypted using AES128 or AES256zc	(depending on the key specified). No traffic is generated against the KDC. Ticket will be saved asz	baduser.ccache.
z	./ticketer.py -nthash <krbtgt/service nthash> -aesKey <krbtgt/service AES> -domain-sid <your domain SID> -domain <your domain FQDN> -request -user <a valid domain user> -password <valid domain user's password> baduser
z`	will first authenticate against the KDC (using -user/-password) and get a TGT that will be usedzc	as template for customization. Whatever encryption algorithms used on that ticket will be honored,zf	hence you might need to specify both -nthash and -aesKey data. Ticket will be generated for 'baduser'z	and saved as baduser.ccache)levelzDomain should be specified!z7You have to specify either aesKey, or nthash, or keytabzMYou cannot specify both -aesKey and -nthash w/o using -request. Pick only onez.-request parameter needs -user to be specifiedr   )getpassz	Password:z-aesKey or -nthashz+missing parameters to do sapphire ticket : z, z=missing parameter -user-id. Must be set if not doing -old-pacz7doing sapphire ticket, ignoring following parameters : zWparameter -user-id will be ignored when specifying -old-pac in a sapphire ticket attack).printargparseArgumentParseradd_argumentadd_argument_grouprc   sysargv
print_helpexit
parse_argsdebugrv   basicConfigDEBUGINFOrV   criticalr   r   re   r   r   userhashesrU   r3  r  
domain_sidr   appendr  r   r   	extra_sidr   r  rS   rT   r!  	Exception	getLoggerr2  	traceback	print_excr  )parserr   rh   r3  rU   missing_paramsrequired_paramsparam
param_nameignored_paramsexecutererJ  rj   rj   rk   main  s   



$

$



$










rT  __main__)n
__future__r   r   r5  r   rv   r   r   structr9  asynciocalendarr   timer   binasciir   typingr   r   r	   r
   minikerberosr   minikerberos.common.ccacher   minikerberos.common.spnr   minikerberos.common.credsr   minikerberos.common.targetr   "minikerberos.protocol.asn1_structsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   minikerberos.protocol.constantsr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7    minikerberos.protocol.encryptionr8   r9   r:   r;   r<   minikerberos.protocol.pacr=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN    minikerberos.protocol.structuresrO   rP   $minikerberos.network.aioclientsocketrQ   minikerberos.aioclientrR   rS   rT  r"  r!  rj   rj   rj   rk   <module>   sF   0x8P   # 
