
    5i^;                        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	 d dl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 d dlmZmZmZ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+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=m>Z> d dl?m@Z@ d ZA G d d          ZB G d d          ZCdS )    N)hashlib)cms)algos)core)x509)keys)parse_pkcs12)rsa_pkcs1v15_signload_private_key)	NAME_TYPEMESSAGE_TYPE
PaDataType)Enctype_checksum_table_enctype_tableKey)AuthenticatorChecksum)KDC_REQ_BODYPrincipalNameHostAddress
KDCOptionsEncASRepPartAP_REQAuthorizationDataChecksum	krb5_pvnoRealmEncryptionKeyAuthenticatorTicket	APOptionsEncryptedDataAS_REQAP_REP)
PKAuthenticatorAuthPackDunno1Dunno2MetaDataInfo
CertIssuerCertIssuersPA_PK_AS_REPKDCDHKeyInfo)KRB_FINISHED)LSAP_TOKEN_INFO_INTEGRITYKERB_AD_RESTRICTION_ENTRYKERB_AD_RESTRICTION_ENTRYS)GSSAPIFlagsc                     | dk    r|                      ddd          S |                      |                                 dz   dz  d          }dt          |          z                       ddd          }||z   S )	N      bigFsigned         )to_bytes
bit_lengthlen)xlbts      I/home/kali/Ninja/venv/lib/python3.11/site-packages/minikerberos/pkinit.pylength_encoderD   $   su    HH	
Auu	-	--zz1<<>>A%!+U33"c"gg~5599!	
2+    c                   b    e Zd Zd Zed             Zed             Zed             Zd Zd Z	dS )DirtyDHc                     d | _         d | _        d | _        d | _        t	          j        d          | _        t          | j                                        d          | _	        t	          j        d          | _
        d S )N       )pg
shared_keyshared_key_intosurandomprivate_keyinthexprivate_key_intdh_nonceselfs    rC   __init__zDirtyDH.__init__.   sc    $&$&$/$Z^^$T-1133R88$*R..$---rE   c                 >    t                      }| |_        ||_        |S NrG   rK   rL   )rK   rL   dds      rC   from_paramszDirtyDH.from_params7   s    yy"	
"$	
"$	)rE   c                 V    t                      }| d         |_        | d         |_        |S )NrK   rL   r[   )dhpr\   s     rC   	from_dictzDirtyDH.from_dict>   s&    yy"	S"$	S"$	)rE   c                 ~    t           j                            |           j        }t                              |          S rZ   )r   DHParametersloadnativerG   r`   )
asn1_bytesr_   s     rC   	from_asn1zDirtyDH.from_asn1E   s/    
++2#			3		rE   c                 B    t          | j        | j        | j                  S rZ   )powrL   rT   rK   rV   s    rC   get_public_keyzDirtyDH.get_public_keyK   s    	TVT)46	2	22rE   c                     t          || j        | j                  | _        t	          | j                  dd          }t          |          dz  dk    rd|z   }t                              |          | _        | j        S )N   r   0)	rh   rT   rK   rN   rS   r?   bytesfromhexrM   )rW   bob_intr@   s      rC   exchangezDirtyDH.exchangeO   sk    GT%946BB$	$
qrr"!VVaZ1__
Qw1MM!$$$/	rE   N)
__name__
__module____qualname__rX   staticmethodr]   r`   rf   ri   rp    rE   rC   rG   rG   -   s        ! ! !   ,   ,     , 
3 3 3    rE   rG   c                       e Zd Zd ZddZedd            Zedd            ZddZddg dfd	Z	e
j        e
j        z  e
j        z  fd
ZddZddZd ZddZdS )PKINITc                     d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d S rZ   )	privkeyinfocertificateextra_certsuser_sid	user_nameissuercnamediffie_PKINIT__hcertrV   s    rC   rX   zPKINIT.__init__Y   sH    $$$$-$.$+$*$+$,,,rE   MYNc                 D    ddl m}  |||          \  | _        | _        d S )Nr   )find_cert_by_cn)#minikerberos.common.windows.crypt32r   rz   r   )rW   usernamecertstore_namecert_serialr   s        rC   init_windows_certzPKINIT.init_windows_certe   s3    AAAAAA#2?8^#L#L $DLLLrE   c                 ~    t                      }|                    | ||           |                    |           |S )N)r   r   	dh_params)rw   r   setup)r   r   r   r   pkinits        rC   from_windows_certstorezPKINIT.from_windows_certstorej   s@    88&8nT_```,,9,%%%	-rE   c                    t                      }t          |t                    r|                                }t	          | d          5 }t          |                                |          \  |_        |_        |_	        t          |j                  |_        d d d            n# 1 swxY w Y   |                    |           |S )Nrb)passwordr   )rw   
isinstancestrencodeopenr	   readry   rz   r{   r   privkeyr   )pfxfilepfxpassr   r   fs        rC   from_pfxzPKINIT.from_pfxr   s    88& ^^7GT 9a@LQVVXXbi@j@j@j=6v)6+=$V%7886>9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 	,,9,%%%	-s   AB$$B(+B(c                    | j         j        j        d         D ]?}|                    d          r|| _        |                    d          dk    r|| _        @| j         j        j        d         | _        d                    d| j        | j        g          | _	        |Qt          d           t                              t          d          j                  | _        t          d	           d S t          |t                     r!t                              |          | _        d S t          |t"                    r!t                              |          | _        d S t          |t                    r	|| _        d S t'          d
          )Ncommon_namezS-1-12@\AzureADzGenerating DH params...i   zDH params generated.z.DH params must be either a bytearray or a dict)rz   subjectrd   
startswithr|   findr}   r~   joinr   printrG   r`   generate_dh_parametersr   r   dictrm   rf   	Exception)rW   r   r@   s      rC   r   zPKINIT.setup   sb    #*=9  all8 DMM	srDN '.}=$+yy)T[$-@AA$* 	"###""$:4$@$@$GHH4;	      D!! F##I..DKKK9e$$ F##I..DKKK9g&& FDKKK
D
E
EErE   )forwardable	renewable	proxiablecanonicalizec                 $   t          |t                    rt          |          }|t          |t                    r|g}n| j        g}|t          |t                    r|g}ndg}t
          j                            t
          j        j                  }i }t          |          |d<   t          t          j        j        |d          |d<   d|d<   t          t          j        j        |d          |d<   |t          j        d	          z                       d
          |d<   |t          j        d	          z                       d
          |d<   t!          j        d          |d<   ddg|d<   t%          ddd          g|d<   t'          |          }t)          j        |                                                                          }i }|j        |d<   |                    d
          |d<   t!          j        d          |d<   ||d<   i }	| j        j        |	d<   | j        j        |	d<   d
|	d<   i }
d|
d<   t9          j        |	          |
d<   i }t9          j        |
          |d<   | j                                        |d <   i }tA          |          |d!<   t9          j!        |          |d"<   | j        j"        |d#<   tG          |          }| $                    |                                d$%          }tK          tM          |                    |z   }d&|z   }d'tK          tM          |                    z   |z   }i }tN          j(        j        |d(<   ||d)<   i }d*|d+<   d,|d-<   |g|d.<   ||d/<   tS          |                                          S )0N	127.0.0.1zkdc-optionsz	name-typezname-stringr   WELLKNOWN:PKU2Urealmsnamer6   )daysr   microsecondtillrtime   nonce      etype   s	   127.0.0.1)z	addr-typeaddress	addressescusecctime
paChecksumrK   rL   qz1.2.840.10046.2.1	algorithm
parameters
public_keypkAuthenticatorclientPublicValueclientDHNonceF)wrap_signed      0padata-typepadata-value   pvno
   msg-typepadatazreq-body)*r   listsetr   r   datetimenowtimezoneutcr   r   r   MS_PRINCIPALvalue	timedeltareplacesecretsrandbitsr   r   r   sha1dumpdigestr   r   rK   rL   r   DomainParametersPublicKeyAlgorithmri   r%   PublicKeyInforU   r&   sign_authpackrD   r?   r   	PK_AS_REQr#   )rW   targetr   kdcoptsr   kdc_req_body_datakdc_req_bodychecksumauthenticatordppkaspkiauthpacksigned_authpackpayload	pa_data_1asreqs                    rC   build_asreqzPKINIT.build_asreq   s    \\7
 GEJ<5 XFM6h/344#%/%8%8M",9;Q;Whm-n-nooG0G,9;Q;Whn-o-oppG #h&8a&@&@&@ @IIVWIXXF #h&8a&@&@&@ @IIVWIXXG&/33G "2wG$/b\0Z0Z$[$[#\K /00, \,++--..5577(-?-;;1;55-"+B//- (- 
"KM"S'KM"S'"S'
#(#k+B//#l	$-c22${{1133$| ( / > >("&"4T":":("k2(?h(&&x}}e&LL/ #o..///A'g'mCLL999GC/)'17)M-)N
%%-%
K%/"%
					rE   c                    t           |d                  }t          |j        |d                   }t          d         }	i }
d|
d<   |	                    |d|          |
d<   i }t          |
          |d<   t          |                                          }d}|                    d	d
d          t          |                              d	d
d          z   |z   }t                      }||_        d|_        i }d|d<   |                                |z   |d<   t                      }d|_        d|_        t                               d          |_        i }d|d<   |                                |d<   t'          |          }t)          |g                                          }t+          d|dg                                          }t,          j                            t,          j        j                  }i }t4          |d<   t7          |d                   |d<   |d         |d<   |j        |d<   |                    d          |d<   t=          |          |d<   d|d<   t+          d|dg          |d <   t          |          |d!<   |                    |d"tA          |                                          d           }d#g}i }t4          |d$<   tB          j"        j#        |d%<   tI          |d&                   |d&<   tK          tM          |                    |d'<   tO          |j        |d(          |d)<   tQ          |                                          S )*NkeytypekeyvaluerJ   	cksumtype)   r   zgss-micrk      r7   T)	byteorderr9   s                   i  r6   i    @7e303fffe6bff25146addca4fbddf1b94f1634178eb4528fb2731c669ca23cder   zrestriction-typerestriction   )zad-typezad-datazauthenticator-vnocrealmr   r   r   r   subkeyin,(z
seq-numberzauthorization-datacksum   zmutual-requiredr   r   ticketz
ap-options)r   cipherr   ))r   r   enctyper   r   r   r/   r   r=   r?   r   flagschannel_bindingr0   FlagsTokenILrm   rn   	MachineIDr1   r2   r   r   r   r   r   r   r   r   r   r   encryptr   r   
KRB_AP_REQr   r    r!   r   r"   r   )rW   asrepsession_keyr  subkey_datakrb_finished_datar
  subkey_cipher
subkey_keysubkey_checksumkrb_finished_checksum_datakrb_finishedaextensions_dataacchksumtiirestriction_datar@   restrictionsr   authenticator_dataauthenticator_data_encap_optsap_reqs                            rC   build_apreqzPKINIT.build_apreq   sQ    !Y!78-=(+j*ABB*#B'/!,.[)+:+C+CJPRTe+f+fZ(!)*D!E!EI/005577,!JJqE$J??#lBSBSB\B\]^jox|B\B}B}}  AM  M/""(!"&&{{}}6&!####)#+-- bcc#-)*%&$'LLNN=!./?@@ "2!34499;;!"#1$E$E#FGGLLNN, 	h/344#,5()!&uX!7!7X %gW #W # : :W!.{!;!;X%.\"->A[g@h@h?i-j-j)* ( 0 0W ">>+r=I[;\;\;a;a;c;ceijj'&&.#.4&E(O,,&"3w<<00&)K4GSi*j*jkk& 
				rE   Fc                 l    | j         ddlm}  || j         |          S |                     | ||          S )Nr   )
pkcs7_sign)r   r   r'  sign_authpack_native)rW   datar   r'  s       rC   r   zPKINIT.sign_authpack>  sH    	\======
*T\4
(
((		"	"4{	;	;;rE   c                    i }t          j        d          |d<   i }d|d<   t          j        | j        j        | j        j        d          |d<   t          j        |          |d<   t          j        dd	gd
          t          j        dt          j
        |                                          gd
          g|d<   t          j        ddi          |d<   t          | j        t          j        |d                                                   d          |d<   i }d	|d<   ||d<   i }d|d<   t          j        |          g|d<   t          j        |          |d<   | j        g|d<   t          j        t          j        |          g          |d<   |du rDi }d|d<   t          j        |          |d<   t          j        |                                          S t          j        |                                          S )a  
		Creating PKCS7 blob which contains the following things:

		1. 'data' blob which is an ASN1 encoded "AuthPack" structure
		2. the certificate used to sign the data blob
		3. the singed 'signed_attrs' structure (ASN1) which points to the "data" structure (in point 1)
		z1.3.14.3.2.26r   v1version)r~   serial_numbersiddigest_algorithmcontent_typez1.3.6.1.5.2.3.1)typevaluesmessage_digestsigned_attrsz1.2.840.113549.1.1.1signature_algorithmr   	signaturecontentv3digest_algorithmsencap_content_infocertificatessigner_infosTz1.2.840.113549.1.7.2)r   DigestAlgorithmIdr   IssuerAndSerialNumberrz   r~   r-  DigestAlgorithmCMSAttributer   r   r   SignedDigestAlgorithmr
   r   CMSAttributesr   EncapsulatedContentInfoSignerInfos
SignerInfo
SignedDataContentInfo)rW   r)  r   dasiecsdcis           rC   r(  zPKINIT.sign_authpack_nativeE  s    
"+O<<"[/	""Y-'%%3) )  "U) !044"^8I7JKKLL-',t:L:L:S:S:U:U9VWWXX"^ $9;I_:`aa"%dlS5Fr.GY5Z5Z5_5_5a5acijj"[/	"("^"Y-	""Y-"22667" 8<<"()"^r(:(:';<<"^D
2.2n>"%%2i=
/"


"
"
$
$$				 	 	"	""rE   c                    d }|d         D ]/}|d         dk    r!t          j        |d                   j        } n0t          d          t          j                            |d                   j        }|d         }|d	         d
k    rt          d          t          j        |d                   j        }t          d                    dgd |d         D             z             d          }t          	                    t          j        |d                                                   dd          dd          }| j                            |          }	|d         }
|	| j        j        z   |
z   }|d         d         }t           |         }|t"          j        k    r ||d          }n<|t"          j        k    r ||d          }n|t"          j        k    rt+          d          t-          |j        |          }|d         d         }|                    |d|          }t3          j        |          j        }t           t          |d         d                            }t-          |j        |d         d                    }|||fS )!Nc                 ^   d}d}t          |          |k     rt          j        t          |g          | z                                             }t          |          t          |          z   |k    r||d |t          |          z
           z  }n||z  }|dz  }t          |          |k     |S )NrE   r   r6   )r?   r   r   rm   r   )r   keysizeoutput
currentNumcurrentDigests        rC   truncate_keyz*PKINIT.decrypt_asrep.<locals>.truncate_key|  s    6:	Vw		L
|!4!4u!<==DDFFM
6{{S''''11}3gF3344V

mF!OJ 
Vw		 =rE   r   r   r   r   zPA_PK_AS_REP not found!dhSignedDatar:  r0  z1.3.6.1.5.2.3.2z%Keyinfo content type unexpected valuer7   1c                 ,    g | ]}t          |          S ru   )r   ).0r@   s     rC   
<listcomp>z(PKINIT.decrypt_asrep.<locals>.<listcomp>  s    MMM1AMMMrE   subjectPublicKeyrk   r:   r7   Fr8   serverDHNoncezenc-partr   rI   rJ   zBRC4 key truncation documentation missing. it is different from AESr     keyr   r   )r-   rc   rd   r   r   rF  r.   rR   r   
from_bytesr   	BitStringr   r   rp   rU   r   r   AES256AES128RC4NotImplementedErrorr   r	  decryptr   )rW   as_reprS  papkasreprK  keyinfoauthdatapubkeyrM   server_noncefullKeyr   r  t_keyr]  enc_datadec_dataencasrepr  s                       rC   decrypt_asrepzPKINIT.decrypt_asrepx  st      8 . .b2> 233:G	E  
,	-	--
~7>233:"#$'^ 111	:	;	;;wy1229(rwwuMM9K0LMMMMNNPQRR&>>$.2D)EFFKKMMabbQSXch>ii&{##F++*),--<'

W
%%% &
gn<$$55<$$55	a	b	bb 	FNE""#J)(^^CH--(x((/(3xy9::;&FNHUOJ$?@@+	;	&&rE   c                    |t          |t                    r|g}ndg}i }d|d<   | j        |d<   t          |g          }t	          |g          }i }d|d<   t          t          j        j        |d          |d<   i }t          |          |d	<   t          d
|                                i          g|d<   t          |                                          S )Nr   z2.5.4.3r1  r   r   pku2ur   
clientInfor*   r)  rV  )r   r   r~   r'   r(   r   r   r   r   r*   r+   r   r)   )rW   r   rL  r  infomds         rC   get_metadatazPKINIT.get_metadata  s      XFM6 
""V*"W+bTll!qc{{"	$#$w-$93I3O`f%g%ghh$|	"Dzz"V*"'')),--."S'	"				rE   )r   N)r   NNrZ   )F)rq   rr   rs   rX   r   rt   r   r   r   r   r3   GSS_C_MUTUAL_FLAGGSS_C_INTEG_FLAGGSS_C_EXTENDED_ERROR_FLAGr%  r   r(  rq  rw  ru   rE   rC   rw   rw   X   sW       	 	 	M M M M
    , 
 
 
 ,
F F F FB !%d>u>u>u L L L L\ \g[x  |G  |X  \X  \g  \A  \A N N N N`< < < <-# -# -# -#f6' 6' 6'r     rE   rw   )DrO   r   r   platform	unicryptor   
asn1cryptor   r   r   r   r   oscrypto.keysr	   oscrypto.asymmetricr
   r   minikerberos.protocol.constantsr   r   r    minikerberos.protocol.encryptionr   r   r   r    minikerberos.protocol.structuresr   "minikerberos.protocol.asn1_structsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   minikerberos.protocol.rfc4556r%   r&   r'   r(   r)   r*   r+   r,   r-   r.    minikerberos.protocol.rfc_iakerbr/   minikerberos.protocol.mskiler0   r1   r2   minikerberos.gssapi.gssapir3   rD   rG   rw   ru   rE   rC   <module>r     s?   
			                                        & & & & & & C C C C C C C C O O O O O O O O O O Z Z Z Z Z Z Z Z Z Z Z Z B B B B B BP P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y 9 9 9 9 9 9 y y y y y y y y y y 2 2 2 2 2 2  ( ( ( ( ( ( ( (Vs s s s s s s s s srE   