a
    kÄ#d�6  ã                   @   s¸  d Z ddlZddl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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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)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 G dd„ deƒZ5G dd„ deƒZ6G dd„ de	ƒZ7G dd„ deƒZ8G dd„ deƒZ9G dd„ deƒZ:G dd„ deƒZ;e0e,e,dœZ<G dd„ deƒZ=G dd „ d eƒZ>g d!¢Z?G d"d#„ d#eƒZ@G d$d%„ d%eƒZAG d&d'„ d'eƒZBed(ƒd)iZCG d*d+„ d+e)ƒZDd,d-„ ZEG d.d/„ d/e)ƒZFG d0d1„ d1e)ƒZGG d2d3„ d3e)ƒZHd4d5d6d7d8d9d:d;d<d=d>d?d=d@dAdBœZIdCdD„ ZJG dEdF„ dFe)ƒZKG dGdH„ dHe)ƒZLG dIdJ„ dJe)ƒZMe*eHeHƒ eHe<dK< eBe-dLœZNG dMdN„ dNeƒZOdS )Oz“
Generic Security Services (GSS) API

Implements parts of
- GSSAPI: RFC2743
- GSSAPI SPNEGO: RFC4178 > RFC2478
- GSSAPI SPNEGO NEGOEX: [MS-NEGOEX]
é    N)ÚUUID)ÚASN1_SEQUENCEÚASN1_Class_UNIVERSALÚASN1_Codecs)ÚBERcodec_SEQUENCE)Úconf)	ÚASN1F_CHOICEÚASN1F_ENUMERATEDÚASN1F_FLAGSÚ	ASN1F_OIDÚASN1F_PACKETÚASN1F_SEQUENCEÚASN1F_SEQUENCE_OFÚASN1F_STRINGÚASN1F_optional)ÚASN1_Packet)ÚFieldListFieldÚLEIntEnumFieldÚ
LEIntFieldÚLELongEnumFieldÚLELongFieldÚLEShortFieldÚMultipleTypeFieldÚPacketFieldÚPacketListFieldÚStrFixedLenFieldÚUUIDEnumFieldÚ	UUIDFieldÚStrFieldÚXStrFixedLenFieldÚXStrLenField)ÚPacketÚbind_layers)ÚKerberosÚKRB5_GSS)ÚNEGOEX_EXCHANGE_NTLMÚNTLM_HeaderÚ_NTLMPayloadField)ÚDictÚTuplec                   @   s   e Zd ZdZdZdS )ÚASN1_Class_GSSAPIZGSSAPIé`   N)Ú__name__Ú
__module__Ú__qualname__ÚnameÚAPPLICATION© r1   r1   úJ/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/gssapi.pyr*   H   s   r*   c                   @   s   e Zd ZejZdS )ÚASN1_GSSAPI_APPLICATIONN©r,   r-   r.   r*   r0   Útagr1   r1   r1   r2   r3   M   s   r3   c                   @   s   e Zd ZejZdS )ÚBERcodec_GSSAPI_APPLICATIONNr4   r1   r1   r1   r2   r6   Q   s   r6   c                   @   s   e Zd ZejZdS )ÚASN1F_SNMP_GSSAPI_APPLICATIONN)r,   r-   r.   r*   r0   ZASN1_tagr1   r1   r1   r2   r7   U   s   r7   c                   @   s   e Zd ZejZeddƒZdS )ÚSPNEGO_MechTypeÚoidN)r,   r-   r.   r   ÚBERÚ
ASN1_codecr   Ú	ASN1_rootr1   r1   r1   r2   r8   \   s   r8   c                   @   s   e Zd ZejZeddeƒZdS )ÚSPNEGO_MechTypesÚ	mechTypesN)	r,   r-   r.   r   r:   r;   r   r8   r<   r1   r1   r1   r2   r=   a   s   r=   c                   @   s    e Zd ZejZeeddƒƒZdS )ÚSPNEGO_MechListMICÚvalueÚ N)	r,   r-   r.   r   r:   r;   r   r   r<   r1   r1   r1   r2   r?   f   s   r?   )z1.3.6.1.4.1.311.2.2.10z1.2.840.48018.1.2.2ú1.2.840.113554.1.2.2c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )Ú_SPNEGO_Token_Fieldc                    s"   |d u rd}t t| ƒ |t|ƒ¡S )Nó    )ÚsuperrC   Úi2mÚbytes)ÚselfÚpktÚx©Ú	__class__r1   r2   rF   s   s    z_SPNEGO_Token_Field.i2mc                    s€   t t| ƒ ||¡\}}t|jtƒr,|jj}nt|jtƒrB|jjg}|rx|d rx|d j	j
tv rxt|d j	j
 |j
ƒ|fS ||fS )Nr   )rE   rC   Úm2iÚ
isinstanceZ
underlayerÚSPNEGO_negTokenInitr>   ÚSPNEGO_negTokenRespÚsupportedMechr9   ÚvalÚ_mechDissector)rH   rI   ÚsZdatÚrÚtypesrK   r1   r2   rM   x   s    

z_SPNEGO_Token_Field.m2i)r,   r-   r.   rF   rM   Ú__classcell__r1   r1   rK   r2   rC   r   s   rC   c                   @   s   e Zd ZejZeddƒZdS )ÚSPNEGO_Tokenr@   N)r,   r-   r.   r   r:   r;   rC   r<   r1   r1   r1   r2   rX   ƒ   s   rX   )Z	delegFlagZ
mutualFlagZ
replayFlagZsequenceFlagZ
supersededZanonFlagZconfFlagZ	integFlagc                   @   sd   e Zd ZejZeeeedde	dd�ƒee
ddedd�ƒeedded	d�ƒeed
dedd�ƒƒƒZdS )rO   r>   Né    ©Zexplicit_tagZreqFlagsé�   ©Zimplicit_tagZ	mechTokené¢   ÚmechListMICé£   )r,   r-   r.   r   r:   r;   r   r   r   r8   r
   Ú_ContextFlagsr   rX   r?   r<   r1   r1   r1   r2   rO   ’   s4   ÿÿÿÿÿÿþÿôÿrO   c                   @   sp   e Zd ZejZeeeedddddddœdd	�ƒee	d
e
ƒ e
dd	�ƒee	ddedd	�ƒee	ddedd�ƒƒƒZdS )rP   Z	negResultr   zaccept-completedzaccept-incompleteZrejectzrequest-mic)r   é   é   é   rY   rZ   rQ   é¡   ZresponseTokenNr]   r^   r_   r\   )r,   r-   r.   r   r:   r;   r   r   r	   r   r8   rX   r?   r<   r1   r1   r1   r2   rP   ­   sB   ýûÿþÿþÿþÿíÿrP   c                
   @   s>   e Zd ZejZedeƒ edeƒ edd�ede	ƒ e	dd�ƒZ
dS )ÚSPNEGO_negTokenÚtokenZnegTokenInitrY   r\   ZnegTokenResprd   N)r,   r-   r.   r   r:   r;   r   rO   r   rP   r<   r1   r1   r1   r2   re   Ì   s   ýýûre   ú$5c33530d-eaf9-0d4d-b2ec-4ae3786ec308zUUID('[NTLM-UUID]')c                   @   s`   e Zd Zedddd�eddddd	d
dddddœƒeddƒeddƒeddƒeddƒgZdd„ ZdS )ÚNEGOEX_MESSAGE_HEADERÚ	SignatureZNEGOEXTSé   ©ÚlengthÚMessageTyper   ZINITIATOR_NEGOZACCEPTOR_NEGOZINITIATOR_META_DATAZACCEPTOR_META_DATAZCHALENGEZ
AP_REQUESTZVERIFYÚALERT)r   ra   rb   rc   é   é   é   é   ZSequenceNumÚcbHeaderLengthNÚcbMessageLengthZConversationIdc                 C   st   | j d u r2|dd … t dt|ƒ¡ |dd …  }| jd u rl|dd … t dt|ƒt|ƒ ¡ |dd …  }|| S )Né   ú<Ié   é   )rs   ÚstructÚpackÚlenrt   ©rH   rI   Zpayr1   r1   r2   Ú
post_buildõ   s
    
(
0z NEGOEX_MESSAGE_HEADER.post_build)	r,   r-   r.   r   r   r   r   Úfields_descr}   r1   r1   r1   r2   rh   ä   s    ùórh   c           	      C   sÐ   | j d D ]À\}}|  d¡j|  | |¡}|  d¡j|  | |¡}|| }|  |d ¡du r„|d|… t d|¡ ||d d…  }|  |d ¡du rÂ|d|d … t d|¡ ||d d…  }||7 }q
|S )	z:Util function to build the offset and populate the lengthsÚPayloadZBufferOffsetNrv   ro   ZCountz<Hrq   )ÚfieldsÚ	get_fieldZ
fields_mapZi2lenZi2countZgetfieldvalry   rz   )	rH   ÚpZ
pay_offsetr€   Ú
field_namer@   rl   ÚcountÚoffsetr1   r1   r2   Ú_NEGOEX_post_buildý   s<    ÿÿÿÿÿÿ

ÿÿ
ÿÿ
r†   c                   @   s(   e Zd ZeddƒeddƒgZdd„ ZdS )ÚNEGOEX_BYTE_VECTORZByteArrayBufferOffsetr   ZByteArrayLengthc                 C   s   t jS ©N)r   Zpadding_layer)rH   Úpayloadr1   r1   r2   Úguess_payload_class  s    z&NEGOEX_BYTE_VECTOR.guess_payload_classN)r,   r-   r.   r   r~   rŠ   r1   r1   r1   r2   r‡     s   þr‡   c                   @   s    e Zd ZeddƒeddƒgZdS )ÚNEGOEX_EXTENSION_VECTORZExtensionArrayOffsetr   ÚExtensionCountN)r,   r-   r.   r   r   r~   r1   r1   r1   r2   r‹     s   þr‹   c                   @   s¢   e Zd ZdZdZeedddd�eddƒedd	ƒe	d
d	ƒedd	ƒe	dd	ƒe
deedg edd	eƒdd„ d�edg edd„ d�gdd„ d�gZdd„ Zeddd„ƒZd	S )ÚNEGOEX_NEGO_MESSAGEé\   r   ÚRandomrD   é    rk   ZProtocolVersionZAuthSchemeBufferOffsetNÚAuthSchemeCountZExtensionBufferOffsetrŒ   r   Ú
AuthSchemerA   c                 C   s   | j S rˆ   )r‘   ©rI   r1   r1   r2   Ú<lambda>3  rD   zNEGOEX_NEGO_MESSAGE.<lambda>)Z
count_fromÚ	Extensionc                 C   s   | j S rˆ   )rŒ   r“   r1   r1   r2   r”   5  rD   c                 C   s
   | j d S )NrŽ   )rt   r“   r1   r1   r2   r”   8  rD   ©Zlength_fromc                 C   s   t | || jdddœƒ| S )Nr+   éf   )r’   r•   )r†   ÚOFFSETr|   r1   r1   r2   r}   <  s    
þýzNEGOEX_NEGO_MESSAGE.post_buildc                 O   sD   |r@t |ƒdkr@t d|dd… ¡d }|dv r4tS |dv r@tS | S )Né   rv   rj   r   )r   ra   )rb   rc   )r{   ry   Úunpackr�   ÚNEGOEX_EXCHANGE_MESSAGE)ÚclsÚ_pktÚargsÚkargsrm   r1   r1   r2   Údispatch_hookC  s    z!NEGOEX_NEGO_MESSAGE.dispatch_hook)N)r,   r-   r.   r˜   Úshow_indentrh   r   r   r   r   r'   r   r   Ú_NEGOEX_AUTH_SCHEMESr   r‹   r~   r}   Úclassmethodr    r1   r1   r1   r2   r�   #  s2   
þÿü÷÷r�   ZCRC32zRSA-MD4zRSA-MD4-DESzDES-MACz	DES-MAC-KzRSA-MDA-DES-KzRSA-MD5zRSA-MD5-DESzRSA-MD5-DES3ÚSHA1zHMAC-SHA1-DES3-KDzHMAC-SHA1-DES3zHMAC-SHA1-96-AES128zHMAC-SHA1-96-AES256)ra   rb   rc   ro   rp   rq   rr   rj   é	   é
   r™   é   é   é   ru   c                 C   sJ   | j dkrdS | j dv rdS | j dv r*dS | j dkr8dS | j d	v rFd
S dS )Nra   ro   )rb   ro   rq   rr   ru   )rc   rj   r¥   rx   rp   rj   )r¦   r™   r§   r¨   r©   ru   rw   r   )ÚChecksumTyper“   r1   r1   r2   Ú_checksum_sizeb  s    




r«   c                   @   s<   e Zd Zeddƒeddddiƒeddeƒedd	ed
�gZdS )ÚNEGOEX_CHECKSUMrs   rw   ZChecksumSchemera   ZCHECKSUM_SCHEME_RFC3961rª   NZChecksumValuerD   r–   )	r,   r-   r.   r   r   Ú_checksum_typesr    r«   r~   r1   r1   r1   r2   r¬   p  s
   
ür¬   c                   @   sf   e Zd ZdZdZeeddeƒeddƒeddƒe	dee
eddeƒd	d
„ fgeddƒƒgdd
„ d�gZdS )r›   é@   r   r’   NZExchangeBufferOffsetZExchangeLenr   ZExchangec                 C   s   | j tdƒkS )Nrg   )r’   r   r“   r1   r1   r2   r”   Š  s   ÿz NEGOEX_EXCHANGE_MESSAGE.<lambda>rD   c                 C   s   | j | j S rˆ   )rt   rs   r“   r1   r1   r2   r”   �  rD   r–   )r,   r-   r.   r˜   r¡   rh   r   r¢   r   r'   r   r   r%   r   r~   r1   r1   r1   r2   r›   y  s&   

ÿÿúûñûr›   c                   @   s,   e Zd ZdZeeddeƒedeƒ eƒgZ	dS )ÚNEGOEX_VERIFY_MESSAGEr   r’   NZChecksum)
r,   r-   r.   r¡   rh   r   r¢   r   r¬   r~   r1   r1   r1   r2   r¯   ”  s   
ÿýr¯   z1.3.6.1.4.1.311.2.2.30)ú1.3.6.1.5.5.2rB   c                   @   sB   e Zd ZejZeeddƒede	ƒ e	dd„ d�ƒZ
ed
dd	„ƒZdS )ÚGSSAPI_BLOBÚMechTyper°   ZinnerContextTokenc                 C   s   t  | jjtj¡S rˆ   )Ú_GSSAPI_OIDSÚgetr²   rR   r   Z	raw_layerr“   r1   r1   r2   r”   ´  s   
ÿzGSSAPI_BLOB.<lambda>)Znext_cls_cbNc                 O   sT   |rPt |ƒdkrPt|d d… ƒd@ dkr,tS |d d… dkrPtj|d|i|¤ŽS | S )Nra   rY   rr   s   NTLMSSPr�   )r{   Úordre   r&   r    )rœ   r�   rž   rŸ   r1   r1   r2   r    ¸  s    zGSSAPI_BLOB.dispatch_hook)N)r,   r-   r.   r   r:   r;   r7   r   r   re   r<   r£   r    r1   r1   r1   r2   r±   ¯  s   
ÿþr±   )PÚ__doc__ry   Úuuidr   Zscapy.asn1.asn1r   r   r   Zscapy.asn1.berr   Zscapy.asn1.mibr   Zscapy.asn1fieldsr   r	   r
   r   r   r   r   r   r   Zscapy.asn1packetr   Zscapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    Zscapy.packetr!   r"   Zscapy.layers.kerberosr#   r$   Zscapy.layers.ntlmr%   r&   r'   Zscapy.compatr(   r)   r*   r3   r6   r7   r8   r=   r?   rS   rC   rX   r`   rO   rP   re   r¢   rh   r†   r‡   r‹   r�   r­   r«   r¬   r›   r¯   r³   r±   r1   r1   r1   r2   Ú<module>   s|   	,D	ý
ý
-ñ	

þ