a
    kÄ#d[¤  ã                   @   sb  d 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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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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddlm9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl7m?Z? ej@�rjddlAmBZBmCZC nd ZBZCG dd„ de e<e=eDe9f   ƒZEG dd„ de1ƒZFdd„ ZGG dd„ de1ƒZHg d¢ZIdd„ ZJG dd„ de1ƒZKG dd „ d eFƒZLG d!d"„ d"e1ƒZMG d#d$„ d$e1ƒZNG d%d&„ d&eFƒZOG d'd(„ d(e1ƒZPG d)d*„ d*e1ƒZQG d+d,„ d,e1ƒZRG d-d.„ d.e1ƒZSG d/d0„ d0e1ƒZTG d1d2„ d2eFƒZUG d3d4„ d4eUƒZVd5d6„ ZWG d7d8„ d8eƒZXG d9d:„ d:eXƒZYG d;d<„ d<eXƒZZd_d?d@„Z[d`dAdB„Z\G dCdD„ dDeƒZ]G dEdF„ dFeƒZ^dGdH„ Z_dIdJ„ Z`dKdL„ ZadMdN„ ZbdOdP„ ZcG dQdR„ dRe1ƒZddSdT„ ZedUdV„ ZfdWdX„ ZgdYdZ„ Zhd[d\„ Zid]d^„ ZjdS )azh
NTLM

https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-NLMP/%5bMS-NLMP%5d.pdf
é    N)Úget_if_addr)ÚASN1_STRINGÚASN1_Codecs)Úconf)Ú	ASN1F_OIDÚASN1F_PRINTABLE_STRINGÚASN1F_SEQUENCEÚASN1F_SEQUENCE_OF)ÚASN1_Packet)Ú	AutomatonÚ
ObjectPipe)Úbytes_base64)ÚFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚFieldLenFieldÚ
FlagsFieldÚ
LEIntFieldÚ	_StrFieldÚLEShortEnumFieldÚMultipleTypeFieldÚPacketFieldÚPacketListFieldÚLEShortFieldÚStrFieldÚStrFieldUtf16ÚStrFixedLenFieldÚLEIntEnumFieldÚLEThreeBytesFieldÚStrLenFieldUtf16ÚUTCTimeFieldÚ	XStrFieldÚXStrFixedLenFieldÚXStrLenField)ÚPacket)ÚStringBuffer)ÚSSLStreamSocketÚStreamSocket)ÚHash_MD5)ÚAnyÚCallableÚDictÚListÚTupleÚOptional)ÚHash_MD4)ÚhashesÚhmacc                       s^   e Zd ZdZg d¢ZdZd‡ fdd„	Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )Ú_NTLMPayloadFieldzeSpecial field used to dissect NTLM payloads.
    This isn't trivial because the offsets are variable.)ÚfieldsÚ
fields_mapÚoffsetÚlength_fromTNc                    sB   || _ || _dd„ |D ƒ| _|| _tt| ƒ |dd„ |D ƒ¡ d S )Nc                 S   s   i | ]}|j |“qS © )Úname©Ú.0Úfieldr8   r8   úH/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/ntlm.pyÚ
<dictcomp>b   ó    z._NTLMPayloadField.__init__.<locals>.<dictcomp>c                 S   s"   g | ]}|j d ur|j|j f‘qS ©N)Údefaultr9   r:   r8   r8   r=   Ú
<listcomp>f   s   
ÿz._NTLMPayloadField.__init__.<locals>.<listcomp>)r6   r4   r5   r7   Úsuperr3   Ú__init__)Úselfr9   r6   r4   r7   ©Ú	__class__r8   r=   rD   Y   s    
þz_NTLMPayloadField.__init__c                 C   sl   |r|sg S g }|D ]R\}}|| j vr(qt| j | tƒsXt|tƒsXt| j | |ƒ||ƒ}| ||f¡ q|S r@   )r5   Ú
isinstancer   r%   ÚgetattrÚappend)rE   ÚpktÚxÚfuncÚresultsÚ
field_nameÚvaluer8   r8   r=   Ú_on_payloadj   s    
ÿþz_NTLMPayloadField._on_payloadc                 C   s   |   ||d¡S )NÚi2h©rQ   ©rE   rK   rL   r8   r8   r=   rR   {   s    z_NTLMPayloadField.i2hc                 C   s   |   ||d¡S )NÚh2irS   rT   r8   r8   r=   rU      s    z_NTLMPayloadField.h2ic                 C   s   t |  ||d¡ƒS )NÚi2repr)ÚreprrQ   rT   r8   r8   r=   rV   ƒ   s    z_NTLMPayloadField.i2reprc           	      C   sz   t ƒ }|D ]b\}}|| jvrq
| j| }| |d ¡}|d urJ|| j8 }nt|ƒ}| | |d|¡|d ¡ q
|t|ƒ S )NÚBufferOffsetr?   é   )r&   r5   Úgetfieldvalr6   ÚlenrJ   ÚaddfieldÚbytes)	rE   rK   ÚsÚvalÚbufrO   rP   r<   r6   r8   r8   r=   r\   ‡   s    

z_NTLMPayloadField.addfieldc                 C   s2  | j d u rd| }}n$|   |¡}||d … |d |…  }}|rB|sJ|g fS g }d}| jD ] }| |jd ¡| j }	z| |jd ¡}
W n ty¤   t|ƒ|	 }
Y n0 |	dk r°qXt|	|
 |ƒ}||	|	|
 … rX| |	|j| 	|||	|	|
 … ¡d f¡ qX|�r|||d … 7 }|j
dd„ d� |d	d
„ |D ƒfS )Nr?   r   rX   ÚLenrY   c                 S   s   | d S ©Nr   r8   ©rL   r8   r8   r=   Ú<lambda>¯   r?   z,_NTLMPayloadField.getfield.<locals>.<lambda>)Úkeyc                 S   s   g | ]}|d d… ‘qS )rY   Nr8   ©r;   rL   r8   r8   r=   rB   °   r?   z._NTLMPayloadField.getfield.<locals>.<listcomp>)r7   r4   rZ   r9   r6   ÚAttributeErrorr[   ÚmaxrJ   ÚgetfieldÚsort)rE   rK   r^   ÚretZremainZlen_pktrN   Ú
max_offsetr<   r6   Úlengthr8   r8   r=   ri   –   s6    


ÿÿ
z_NTLMPayloadField.getfield)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__ZislistrD   rQ   rR   rU   rV   r\   ri   Ú__classcell__r8   r8   rF   r=   r3   S   s    ür3   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú_NTLMPayloadPacketÚPayloadc                    sp   zt t| ƒ ˆ ¡W S  tyj   z*t‡ fdd„t t| ƒ | j¡D ƒƒW  Y S  tyd   tˆ ƒ‚Y n0 Y n0 d S )Nc                 3   s"   | ]}|d  ˆ kr|d V  qdS )r   rY   Nr8   rf   ©Úattrr8   r=   Ú	<genexpr>¼   s   üz1_NTLMPayloadPacket.__getattr__.<locals>.<genexpr>)rC   rt   Ú__getattr__rg   ÚnextÚ_NTLM_PAYLOAD_FIELD_NAMEÚStopIteration)rE   rw   rF   rv   r=   ry   ¶   s    
ÿþz_NTLMPayloadPacket.__getattr__c                    sÀ   zt t| ƒ ˆ |¡W S  tyº   t t| ƒ | j¡}ˆ |  | j¡jvrNtˆ ƒ‚z2| t	‡ fdd„t
t t| ƒ | j¡ƒD ƒƒ¡ W n ty’   Y n0 | ˆ |g¡ t t| ƒ | j|¡ Y n0 d S )Nc                 3   s"   | ]\}}|d  ˆ kr|V  qdS ©r   Nr8   ©r;   ÚirL   rv   r8   r=   rx   Ñ   s   ûz1_NTLMPayloadPacket.setfieldval.<locals>.<genexpr>)rC   rt   Úsetfieldvalrg   ry   r{   Ú	get_fieldr5   Úpoprz   Ú	enumerater|   rJ   )rE   rw   r_   ru   rF   rv   r=   r€   Æ   s.    
ÿ
ÿÿþ
þz_NTLMPayloadPacket.setfieldval)rn   ro   rp   r{   ry   r€   rs   r8   r8   rF   r=   rt   ³   s   rt   c                 C   sö   | j d D ]æ\}}|  d¡j|  | |¡}|| }|  |d ¡du rl|d|… t d|¡ ||d d…  }|  |d ¡du rª|d|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 lengthsru   ra   Nú<Hé   ZMaxLené   rX   z<Ié   )r4   r�   r5   Zi2lenrZ   ÚstructÚpack)rE   ÚpZ
pay_offsetr4   rO   rP   rm   r6   r8   r8   r=   Ú_NTLM_post_buildâ   s:    ÿÿÿ

ÿÿ
ÿÿ
ÿÿ
r‹   c                   @   s@   e Zd ZdZedddd�edddd	d
dœƒgZeddd„ƒZdS )ÚNTLM_HeaderzNTLM HeaderÚ	Signatures   NTLMSSP r‡   ©rm   ÚMessageTypeé   ZNEGOTIATE_MESSAGEZCHALLENGE_MESSAGEZAUTHENTICATE_MESSAGE)rY   r…   r�   Nc                 O   sP   |rLt |ƒdkrLt d|dd… ¡d }|dkr4tS |dkr@tS |dkrLtS | S )Né
   r„   r‡   r   rY   r…   r�   )r[   rˆ   ÚunpackÚNTLM_NEGOTIATEÚNTLM_CHALLENGEÚNTLM_AUTHENTICATE_V2)ÚclsZ_pktÚargsZkargsr�   r8   r8   r=   Údispatch_hook
  s    zNTLM_Header.dispatch_hook)N)	rn   ro   rp   r9   r   r   Úfields_descÚclassmethodr˜   r8   r8   r8   r=   rŒ     s   þþrŒ   ) ÚNTLMSSP_NEGOTIATE_UNICODEZNTLM_NEGOTIATE_OEMZNTLMSSP_REQUEST_TARGETZr10ZNTLMSSP_NEGOTIATE_SIGNZNTLMSSP_NEGOTIATE_SEALZNTLMSSP_NEGOTIATE_DATAGRAMÚNTLMSSP_NEGOTIATE_LM_KEYZr9ZNTLMSSP_NEGOTIATE_NTLMÚr8ÚJZ%NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIEDZ*NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIEDZr7ZNTLMSSP_NEGOTIATE_ALWAYS_SIGNZNTLMSSP_TARGET_TYPE_DOMAINZNTLMSSP_TARGET_TYPE_SERVERZr6Ú*NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITYZNTLMSSP_NEGOTIATE_IDENTIFYZr5Z"NTLMSSP_REQUEST_NON_NT_SESSION_KEYZNTLMSSP_NEGOTIATE_TARGET_INFOZr4ZNTLMSSP_NEGOTIATE_VERSIONZr3Úr2Úr1ÚNTLMSSP_NEGOTIATE_128ÚNTLMSSP_NEGOTIATE_KEY_EXCHÚNTLMSSP_NEGOTIATE_56c                 C   s    t t| |ƒdd„ fgt| |ƒƒS )Nc                 S   s   | j jS r@   )ÚNegotiateFlagsr›   ©rK   r8   r8   r=   rd   @  r?   z_NTLMStrField.<locals>.<lambda>)r   r   r   )r9   rA   r8   r8   r=   Ú_NTLMStrField<  s    ÿÿûr§   c                	   @   s>   e Zd ZeddƒeddƒeddƒeddƒeddddiƒgZd	S )
Ú_NTLM_VersionÚProductMajorVersionr   ÚProductMinorVersionZProductBuildZres_verZNTLMRevisionCurrenté   Zv15N)rn   ro   rp   r   r   r   r   r™   r8   r8   r8   r=   r¨   H  s   ûr¨   c                   @   s~   e Zd ZdZdZdZeedddeƒe	ddƒe	d	dƒe
d
dƒe	ddƒe	ddƒe
ddƒeedeeddƒeddƒgƒg
Zdd„ ZdS )r“   zNTLM NegotiaterY   é(   r¥   r   éàÿÿÿÚDomainNameLenNÚDomainNameMaxLenÚDomainNameBufferOffsetZWorkstationNameLenZWorkstationNameMaxLenZWorkstationNameBufferOffsetru   Ú
DomainNamer?   ÚWorkstationNamec                 C   s   t | || jdddœƒ| S )Né   é   )r±   r²   ©r‹   ÚOFFSET©rE   rK   Zpayr8   r8   r=   Ú
post_buildm  s    
þýzNTLM_NEGOTIATE.post_build)rn   ro   rp   r9   ÚmessageTyper¶   rŒ   r   Ú_negotiateFlagsr   r   r¨   r3   r§   r™   r¸   r8   r8   r8   r=   r“   T  s(   þÿòr“   c                   @   s@   e Zd Zeddƒeddƒedddd�eddd	d�gZd
d„ ZdS )ÚSingle_Host_DataÚSizer   ZZ4Z
CustomDatar?   r‡   rŽ   Z	MachineIDé    c                 C   s   t jS r@   ©r   Zpadding_layer©rE   Úpayloadr8   r8   r=   Údefault_payload_class  s    z&Single_Host_Data.default_payload_classN)rn   ro   rp   r   r#   r™   rÁ   r8   r8   r8   r=   r»   w  s   ür»   c                   @   sÄ   e Zd ZdZedddddddd	d
dddddœƒeddddd�eeddddddœƒdd„ feddg d¢ddd�d d„ fe	de
ƒ e
ƒd!d„ fedd"d#d„ d$�d%d„ fgedd"d&d„ d$�ƒgZd'd(„ ZdS ))ÚAV_PAIRzNTLM AV PairÚAvIdr   ZMsvAvEOLZMsvAvNbComputerNameZMsvAvNbDomainNameZMsvAvDnsComputerNameZMsvAvDnsDomainNameZMsvAvDnsTreeNameÚ
MsvAvFlagsZMsvAvTimestampZMsvAvSingleHostZMsvAvTargetNameZMsvAvChannelBindings)r   rY   r…   r�   r†   é   é   é   r‡   é	   r‘   ÚAvLenNÚValuer„   )Z	length_ofÚfmtrY   ZconstrainedzMIC integrityzSPN from untrusted source)rY   r…   r†   c                 C   s
   | j dkS )NrÆ   ©rÃ   r¦   r8   r8   r=   rd   ™  r?   zAV_PAIR.<lambda>©iA  rY   rY   r   r   r   ç    ÐcAú<Q)ÚepochÚcustom_scalingrË   c                 C   s
   | j dkS )NrÇ   rÌ   r¦   r8   r8   r=   rd   �  r?   c                 C   s
   | j dkS )Nr‡   rÌ   r¦   r8   r8   r=   rd   Ÿ  r?   r?   c                 C   s   | j S r@   ©rÉ   r¦   r8   r8   r=   rd      r?   )r7   c                 C   s
   | j dkS )Nr‘   rÌ   r¦   r8   r8   r=   rd   ¡  r?   c                 C   s   | j S r@   rÒ   r¦   r8   r8   r=   rd   £  r?   c                 C   s   t jS r@   r¾   r¿   r8   r8   r=   rÁ   §  s    zAV_PAIR.default_payload_class)rn   ro   rp   r9   r   r   r   r   r!   r   r»   r$   r    r™   rÁ   r8   r8   r8   r=   rÂ   ƒ  sP   õýüþýÿÿôññ"rÂ   c                   @   sœ   e Zd ZdZdZdZeeddƒeddƒeddƒe	dd	d
e
ƒedddd�edddd�eddƒeddƒeddƒeedeeddƒedeƒ geƒgƒgZdd„ ZdS )r”   zNTLM Challenger…   é8   ZTargetNameLenNZTargetNameMaxLenZTargetNameBufferOffsetr¥   r   r­   ÚServerChallenger‡   rŽ   ÚReservedZTargetInfoLenZTargetInfoMaxLenZTargetInfoBufferOffsetru   Ú
TargetNamer?   Ú
TargetInfoc                 C   s   t | || jdddœƒ| S )Né   r¬   )rÖ   r×   rµ   r·   r8   r8   r=   r¸   Ç  s    
þýzNTLM_CHALLENGE.post_build)rn   ro   rp   r9   r¹   r¶   rŒ   r   r   r   rº   r#   r¨   r3   r§   r   rÂ   r™   r¸   r8   r8   r8   r=   r”   «  s,   þÿïr”   c                   @   s   e Zd Zedddd�gZdS )ÚLM_RESPONSEÚResponser?   r´   rŽ   N©rn   ro   rp   r   r™   r8   r8   r8   r=   rÙ   Ñ  s   ÿrÙ   c                   @   s(   e Zd Zedddd�edddd�gZdS )ÚLMv2_RESPONSErÚ   r?   r³   rŽ   ÚChallengeFromClientr‡   NrÛ   r8   r8   r8   r=   rÜ   ×  s   þrÜ   c                   @   s   e Zd Zedddd�gZdS )ÚNTLM_RESPONSErÚ   r?   r´   rŽ   NrÛ   r8   r8   r8   r=   rÞ   Þ  s   ÿrÞ   c                   @   sf   e Zd Zeddƒeddƒeddƒeddƒedddg d	¢d
d�edddd�eddƒede	ƒ ge	ƒgZ
dS )ÚNTLMv2_CLIENT_CHALLENGEZRespTyper   Z
HiRespTypeZ	Reserved1Z	Reserved2Ú	TimeStampNrÏ   rÍ   rÎ   )rË   rÐ   rÑ   rÝ   s   12345678r‡   rŽ   Z	Reserved3ÚAvPairs)rn   ro   rp   r   r   r   r!   r   r   rÂ   r™   r8   r8   r8   r=   rß   ä  s   ÿ÷rß   c                   @   s&   e Zd Zedddd�egZdd„ ZdS )ÚNTLMv2_RESPONSEÚ
NTProofStrr?   r³   rŽ   c              
      sX   d}d}‡ fdd„}d  t|ƒ ƒ¡}d  ||dt dˆ j¡ˆ jd|dg¡}t||| ƒS )a2  
        Set temp to ConcatenationOf(Responserversion, HiResponserversion,
            Z(6), Time, ClientChallenge, Z(4), ServerName, Z(4))
        Set NTProofStr to HMAC_MD5(ResponseKeyNT,
            ConcatenationOf(CHALLENGE_MESSAGE.ServerChallenge,temp))

        Remember ServerName = AvPairs
        ó   c                  3   s*   ˆ j D ]} t| ƒV  | jdkr d S qd S rb   )rá   r]   rÃ   rc   ©rE   r8   r=   ÚServerNameGen  s    


z8NTLMv2_RESPONSE.computeNTProofStr.<locals>.ServerNameGenr?   s         rÏ   s       )ÚjoinÚiterrˆ   r‰   rà   rÝ   ÚHMAC_MD5)rE   ÚResponseKeyNTrÔ   ZResponserversionZHiResponserversionræ   Z
ServerNameÚtempr8   rå   r=   ÚcomputeNTProofStrø  s    	ø
z!NTLMv2_RESPONSE.computeNTProofStrN)rn   ro   rp   r#   rß   r™   rì   r8   r8   r8   r=   râ   ò  s   þrâ   c                !   @   sT  e Zd ZdZdZdZdZeeddƒeddƒe	ddƒed	dƒed
dƒe	ddƒeddƒeddƒe	ddƒeddƒeddƒe	ddƒeddƒeddƒe	ddƒeddƒeddƒe	ddƒe
dddeƒeeedddd�dd „ ƒed!eeed"eƒ eƒd#d „ fged"eƒ eƒƒeed$eƒ eƒd%d „ fged$eƒ eƒƒed&dƒed'dƒed(dƒed)dƒgƒgZd*d+„ ZdS ),ÚNTLM_AUTHENTICATEzNTLM Authenticater�   éX   rY   ZLmChallengeResponseLenNZLmChallengeResponseMaxLenZLmChallengeResponseBufferOffsetÚNtChallengeResponseLenÚNtChallengeResponseMaxLenZNtChallengeResponseBufferOffsetr®   r¯   r°   ÚUserNameLenZUserNameMaxLenZUserNameBufferOffsetZWorkstationLenZWorkstationMaxLenZWorkstationBufferOffsetZEncryptedRandomSessionKeyLenZEncryptedRandomSessionKeyMaxLenÚ%EncryptedRandomSessionKeyBufferOffsetr¥   r   r­   ÚMICr?   r³   rŽ   c                 C   s   | j  dd¡d uS )Nró   r?   )r4   Úgetr¦   r8   r8   r=   rd   =  r?   zNTLM_AUTHENTICATE.<lambda>ru   ÚLmChallengeResponsec                 C   s
   | j dkS ©Nr…   ©ÚNTLM_VERSIONr¦   r8   r8   r=   rd   D  r?   ÚNtChallengeResponsec                 C   s
   | j dkS rö   r÷   r¦   r8   r8   r=   rd   J  r?   r±   ÚUserNameÚWorkstationÚEncryptedRandomSessionKeyc                 C   s"   t | || jdddddddœƒ| S )NrØ   é   é   é$   é,   é4   )rõ   rù   r±   rú   rû   rü   rµ   r·   r8   r8   r=   r¸   U  s    
úùzNTLM_AUTHENTICATE.post_build)rn   ro   rp   r9   r¹   r¶   rø   rŒ   r   r   r   rº   r¨   r   r#   r3   r   r   rÜ   rÙ   râ   rÞ   r§   r"   r™   r¸   r8   r8   r8   r=   rí     sv   þÿÿÿýÿÿÿýðÿÜ9rí   c                   @   s   e Zd ZdZdS )r•   r…   N)rn   ro   rp   rø   r8   r8   r8   r=   r•   a  s   r•   c                 C   s:   t | tƒsJ ‚ddlm}m} |ƒ |dtt| ƒƒ d� S )zCCreate an HTTP NTLM negotiate packet from an NTLM_NEGOTIATE messager   )ÚHTTPÚHTTPRequests   NTLM )ÚAuthorization)rH   r“   Zscapy.layers.httpr  r  r   r]   )Zntlm_negotiater  r  r8   r8   r=   ÚHTTP_ntlm_negotiatee  s
    ÿr  c                       s>   e Zd Z‡ fdd„Zdd„ Zdd„ Zddd	„Zd
d„ Z‡  ZS )Ú_NTLM_Automatonc                    sn   t ƒ | _i | _dD ]\}}t| || ||¡ƒ q| jp:| j| _tt	| ƒj
f ‡ fdd„‡ fdd„dœ|¤Ž d S )N))ÚDROP_MIC_v1F)ÚDROP_MIC_v2Fc                     s   ˆ S r@   r8   ©Úkwargs©Úsockr8   r=   rd   y  r?   z*_NTLM_Automaton.__init__.<locals>.<lambda>c                     s   ˆ S r@   r8   r	  r  r8   r=   rd   z  r?   )ZrecvsockÚll)r   Ú
token_pipeÚvaluesÚsetattrr‚   r  r  ZDROP_MICrC   r  rD   )rE   r  r
  re   ZdfltrF   r  r=   rD   q  s    

þýz_NTLM_Automaton.__init__c                 C   s�  |sdS ddl m}m}m} d }d }d}t|tƒr>|d d dfS t|tttt	fƒrZ|}d}n¨t||ƒrj|j
}t||ƒrz|j}t|dƒr’|jr’|jj}t|dƒr¢|j}z
|j}W n tyÄ   |j}Y n0 t||ƒrÖ|j}t|tƒrêt|jƒ}t|tjƒ�rt|jƒ}| j�s| j�r„t|tƒ�r„d|_d |_d |_d |_| j�r„td	d
„ |j D ƒƒ}	tdd
„ t!|	j"ƒD ƒƒ}
|	j" #|
d t$ddd�¡ ||||fS )N©NNNNr   )ÚGSSAPI_BLOBÚSPNEGO_negTokenÚSPNEGO_TokenFTÚmechListMICÚ	negResults                   c                 s   s"   | ]}|d  dkr|d V  qdS )r   rù   rY   Nr8   )r;   Úvr8   r8   r=   rx   ¯  s   ÿz-_NTLM_Automaton._get_token.<locals>.<genexpr>c                 s   s    | ]\}}|j d kr|V  qdS )rÆ   NrÌ   )r;   r   Úkr8   r8   r=   rx   ³  s   
ÿrY   rÄ   ©rÃ   rÊ   )%Zscapy.layers.gssapir  r  r  rH   r]   r“   r”   rí   r•   ZinnerContextTokenÚtokenÚhasattrr  rP   r  Z	mechTokenrg   ZresponseTokenr   rŒ   r_   r   Ú	raw_layerÚloadr  r  ró   rï   rð   rò   rz   ru   rƒ   rá   ÚinsertrÂ   )rE   r  r  r  r  r  ró   ÚrawTokenÚntlmZChallengeResponser   r8   r8   r=   Ú
_get_token~  sf    
ý







ÿÿ
þz_NTLM_Automaton._get_tokenc                 C   s   | j  |¡ d S r@   )r  Úsend)rE   r   r8   r8   r=   Úreceived_ntlm_token½  s    z#_NTLM_Automaton.received_ntlm_tokenNc                 C   s    |d ur| j  ||¡S | j | S r@   )r  rô   )rE   rw   rA   r8   r8   r=   rô   À  s    z_NTLM_Automaton.getc                 C   s   | j  ¡  |  ¡  d S r@   )Zlisten_sockÚcloseÚstoprå   r8   r8   r=   ÚendÅ  s    
z_NTLM_Automaton.end)N)	rn   ro   rp   rD   r!  r#  rô   r&  rs   r8   r8   rF   r=   r  p  s
   ?
r  c                       sZ   e Zd ZdZdZejZdZi Z	‡ fdd„Z
dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z‡  ZS )ÚNTLM_ClientzO
    A class to overload to create a client automaton when using
    NTLM.
    é½  Fc                    s"   t ƒ | _tt| ƒj|i |¤Ž d S r@   )r   Úclient_piperC   r'  rD   ©rE   r—   r
  rF   r8   r=   rD   Ô  s    zNTLM_Client.__init__c                 C   s
   || _ d S r@   )Úsrv_atmt)rE   r+  r8   r8   r=   ÚbindØ  s    zNTLM_Client.bindc                 C   s   || j j|< d S r@   )r+  r  ©rE   rw   rP   r8   r8   r=   Úset_srvÜ  s    zNTLM_Client.set_srvc                 C   s   | j j ¡ S r@   )r+  r  Úrecvrå   r8   r8   r=   Ú	get_tokenß  s    zNTLM_Client.get_tokenc                 C   s   | j  |¡S r@   )r+  r"  ©rE   rK   r8   r8   r=   Úechoâ  s    zNTLM_Client.echoc                 C   s   | j  ¡ }| j  ¡  |S r@   )r)  r/  r$  ©rE   r
  r8   r8   r=   Úwait_serverå  s    

zNTLM_Client.wait_server)rn   ro   rp   rq   Úportr   r  r–   ÚsslÚ
kwargs_clsrD   r,  r.  r0  r2  r4  rs   r8   r8   rF   r=   r'  Ê  s   r'  c                       sh   e Zd ZdZdZejZ‡ fdd„Zdd„ Z	ddd	„Z
d
d„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚNTLM_Serveraÿ  
    A class to overload to create a server automaton when using
    NTLM.

    :param NTLM_VALUES: a dict whose keys are
        - "NetbiosDomainName"
        - "NetbiosComputerName"
        - "DnsDomainName"
        - "DnsComputerName"
        - "DnsTreeName"
        - "Flags"
        - "Timestamp"

    :param IDENTITIES: a dict {"username": NTOWFv2("password", "username", "domain")}
                       (this is the KeyResponseNT). Setting this value enables
                       signature computation and authenticates inbound users.
    :param DOMAIN_AUTH: a tuple ("<DC IP>", "machineName", b"machinePassword") to
                        use for domain authentication, used to establish the netlogon
                        session. (UNIMPLEMENTED)
    r(  c                    sz   d | _ tƒ | _| dd ¡| _d| _| dd ¡| _| dd ¡| _t| jƒpPt| jƒ| _	d | _
d | _tt| ƒj|i |¤Ž d S )NZNTLM_VALUESr   ÚDOMAIN_AUTHÚ
IDENTITIES)Úcli_atmtÚdictÚ
cli_valuesr‚   Úntlm_valuesÚ
ntlm_stater9  r:  ÚboolÚCHECK_LOGINÚSigningSessionKeyÚ	ChallengerC   r8  rD   r*  rF   r8   r=   rD     s    zNTLM_Server.__init__c                 C   s
   || _ d S r@   )r;  )rE   r;  r8   r8   r=   r,    s    zNTLM_Server.bindFc                    sB  |r$ˆj rˆj j ¡ S ˆj ¡  dS ddlm} ˆjdk�rJdˆ_d\}}}tt 	d|ddƒ¡dd	d
dddt
ddd�t
ddd�t
ddd�t
ddd�t
ddd�t
ddd�t
dd�gfgd�}ˆj rÖˆj j ¡ \}}}}nˆj ¡ d }ˆj�r8dD ] }|ˆjv rðt||ˆj| ƒ qðdd„ |jD ƒ‰ ‡ ‡fdd„dD ƒ|_|ˆ_||||fS ˆjdk�r>dˆ_d}ˆj �rtˆj j ¡ S ˆj ¡ \}}	}	}t|v�r˜td ƒ‚ˆj�r2|j�r°|j}
nd }
ˆj�rˆj�rÐd dd |fS |
ˆjv �r|j ˆj|
 ˆjj¡}||jjk�rd dd |fS t 	d|ddƒ¡ˆj_ˆjdd |fS d dd |fS d S )!Nr  r   )ÚrandintrY   )NNFrÏ   l            r…   l   E r‘   )rÖ   Ú r×   ZSRVr  ZDOMAINr�   zSRV.DOMAIN.localr†   zDOMAIN.localrÅ   rÇ   g        rÌ   )rÔ   r�   r¥   r©   rª   ru   )rÔ   r¥   r©   rª   rÖ   c                 S   s   i | ]}|j |j“qS r8   r  rf   r8   r8   r=   r>   H  r?   z)NTLM_Server.get_token.<locals>.<dictcomp>c              	      s<   g | ]4\}}|ˆj v s|ˆ v rt|ˆj  |ˆ | ¡d �‘qS )r  )r>  rÂ   rô   r~   ©ZavpairsrE   r8   r=   rB   I  s   
õz)NTLM_Server.get_token.<locals>.<listcomp>))r…   ZNetbiosDomainName)rY   ZNetbiosComputerName)r†   ZDnsDomainName)r�   ZDnsComputerName)rÅ   ZDnsTreeName)rÆ   ÚFlags)rÇ   Ú	Timestampr}   FzUnexpected state :()r;  r  r/  ÚclearÚrandomrD  r?  r”   rˆ   r‰   rÂ   r>  r  r×   rC  r•   Ú
ValueErrorrA  rñ   rú   rB  r9  r:  rù   rì   rÔ   rã   )rE   ZnegoexrD  r  ró   r  Útokre   Zauth_tokÚ_Úusernamerã   r8   rF  r=   r0    sˆ    







òÿú
þ
þþzNTLM_Server.get_tokenc                 C   s:   |j r|j}nd }| jr6|| jv r6t| j| |jjƒS d S r@   )rñ   rú   r:  ÚNTLMv2_ComputeSessionBaseKeyrù   rã   )rE   r   rN  r8   r8   r=   Úget_SessionBaseKey}  s    þzNTLM_Server.get_SessionBaseKeyc                    s^   |d }t |tƒrJ| jrJ|  |¡}|rJ|}|jjr@t||jƒ}n|}|| _t	t
| ƒ |¡ d S rb   )rH   r•   rA  rP  r¥   r£   ÚRC4Krü   rB  rC   r8  r#  )rE   Z
ntlm_tupler   ZSessionBaseKeyZKeyExchangeKeyÚExportedSessionKeyrF   r8   r=   r#  ˆ  s    
þzNTLM_Server.received_ntlm_tokenc                 C   s"   | j r|| j j|< n
|| j|< d S r@   )r;  r  r=  r-  r8   r8   r=   Úset_cli™  s    zNTLM_Server.set_clic                 C   s   | j r| j  |¡S d S r@   )r;  r"  r1  r8   r8   r=   r2  Ÿ  s    zNTLM_Server.echoc                 K   s    | j sJ dƒ‚| j j |¡ d S )Nz&Cannot start NTLM client: not provided)r;  r)  r"  r3  r8   r8   r=   Ústart_client£  s    zNTLM_Server.start_client)F)rn   ro   rp   rq   r5  r   r  r–   rD   r,  r0  rP  r#  rS  r2  rT  rs   r8   r8   rF   r=   r8  ë  s   
jr8  Fr…   c                 C   s,  t | tƒsJ dƒ‚t |tƒs$J dƒ‚|s0J dƒ‚t tjtj¡}| t|	pNtj	ƒ| j
f¡ | d¡ g }|pni }|pvi }|rŒd |d< |d< |r d |d< |d< |r´d|d	< d|d	< |d
urÌ| |d< |d< |j | i ¡ ¡ D ]\}}||vrÞ|||< qÞ�z²�zt ¡ }| ¡ �s| ¡ \}}t|| jƒ}| |fd|
i|¤Ž}t ¡ }| ||j
f¡ d
}|j�r”t tj¡}d|_tj|_| |¡}t||jƒ}nt||jƒ}tdt|ƒt|  ¡ ƒf ƒ ||fd|
i|¤Ž}||f||ff}| !|¡ | |¡ | |¡ | "¡  | "¡  �qW n t#�y0   tdƒ Y n0 W |D ]j\}}|D ],}z|j$dd� W n t%�yl   Y n0 �qD|D ](}z| &¡  W n t%�yš   Y n0 �qv�q8| &¡  nz|D ]j\}}|D ],}z|j$dd� W n t%�yæ   Y n0 �q¾|D ](}z| &¡  W n t%�y   Y n0 �qð�q²| &¡  0 d
S )aÐ  
    NTLM Relay

    This class aims at implementing a simple pass-the-hash attack across
    various protocols.

    Usage example:
        ntlm_relay(port=445,
                   remoteIP="192.168.122.65",
                   remotePort=445,
                   iface="eth0")

    :param port: the port to open the relay on
    :param remoteIP: the address IP of the server to connect to for auth
    :param remotePort: the proto to connect to the server into
    ú#Specify a correct NTLM server classz#Specify a correct NTLM client classz!Specify a valid remote IP addressrÅ   Tr  r  FZEXTENDED_SECURITYNÚ
ALLOW_SMB2Údebugz%s connected -> %súExiting.©Úwait)'Ú
issubclassr8  r'  ÚsocketÚAF_INETÚSOCK_STREAMr,  r   r   Úifacer5  Úlistenr7  rô   ÚitemsÚ	threadingÚEventÚis_setÚacceptr(   r–   Úconnectr6  Ú
SSLContextÚPROTOCOL_TLS_CLIENTÚcheck_hostnameÚ	CERT_NONEÚverify_modeÚwrap_socketr'   ÚprintrW   ÚgetsocknamerJ   ÚrunbgÚKeyboardInterruptÚ	forcestopÚ	Exceptionr$  )Ú	serverClsZremoteIPZremoteClientClsr  r  ZDROP_EXTENDED_SECURITYrV  Úserver_kwargsZclient_kwargsr_  rW  ÚssockÚsniffersr  r  ÚevtÚclientsocketÚaddressr  r+  Ú_sockZremote_sockÚcontextr;  Zsock_tupZatmtsÚsocksÚatmtr8   r8   r=   Ú
ntlm_relay¨  sª    ÿÿÿÿÿ


ÿ
ÿ




õ
r~  c                 C   s¾  t | tƒsJ dƒ‚t tjtj¡}| t|p0tjƒ| j	f¡ | 
d¡ ttj d| j ¡ƒ g }|pfi }zîzpt ¡ }| ¡ sØ| ¡ \}}t|| jƒ}	| |	fd|i|¤Ž}
| |
|	f¡ ttj dt|ƒ ¡ƒ |
 ¡  qtW n tyô   tdƒ Y n0 W |D ]P\}}	z|jdd� W n t�y(   Y n0 z|	 ¡  W qü t�yJ   Y qü0 qü| ¡  nb|D ]R\}}	z|jdd� W n t�yˆ   Y n0 z|	 ¡  W n t�yª   Y n0 �q\| ¡  0 d	S )
z/
    Starts a standalone NTLM server class
    rU  rÅ   zServer %s started. Waiting...rW  z-> %s connected rX  FrY  N)r[  r8  r\  r]  r^  r,  r   r   r_  r5  r`  rm  Zcolor_themeÚgreenrn   rb  rc  rd  re  r(   r–   rJ   ZgoldrW   ro  rp  rq  rr  r$  )rs  rt  r_  rW  ru  rv  rw  rx  ry  r  r+  r}  r8   r8   r=   Úntlm_server  s\    ÿÿÿ
ÿ
÷
r€  c                   @   s8   e Zd ZejZeeeeddƒeddƒdd�dd�ƒZ	dS )ÚNEGOEX_EXCHANGE_NTLM_ITEMÚoidrE  r  é1   )Zexplicit_tagé€   N)
rn   ro   rp   r   ÚBERÚ
ASN1_codecr   r   r   Ú	ASN1_rootr8   r8   r8   r=   r�  C  s   ýúÿr�  c                   @   s.   e Zd ZdZejZeeedg e	ƒdd�ƒZ
dS )ÚNEGOEX_EXCHANGE_NTLMz[
    GSSAPI NegoEX Exchange metadata blob
    This was reversed and may be meaningless
    ra  é    )Zimplicit_tagN)rn   ro   rp   rq   r   r…  r†  r   r	   r�  r‡  r8   r8   r8   r=   rˆ  Q  s   þûÿrˆ  c                 C   s"   t  | t ¡ ¡}| |¡ | ¡ S r@   )r2   ÚHMACr1   ÚMD5ÚupdateÚfinalize)re   ÚdataÚhr8   r8   r=   ré   e  s    
ré   c                 C   s   t ƒ  | ¡S r@   )r0   Údigestrc   r8   r8   r=   ÚMD4k  s    r‘  c                 C   s2   ddl m}m} | | ¡}||dd�}| ¡ }|S )zAlleged RC4r   ©ÚCipherÚ
algorithmsN©Úmode)Ú&cryptography.hazmat.primitives.ciphersr“  r”  ÚARC4Ú	encryptor)re   r“  r”  Ú	algorithmÚcipherr™  r8   r8   r=   ÚRC4Inito  s
    
rœ  c                 C   s
   |   |¡S )zThe RC4 Encryption Algorithm)rŒ  )ÚhandlerŽ  r8   r8   r=   ÚRC4x  s    rž  c                 C   s@   ddl m}m} | | ¡}||dd�}| ¡ }| |¡| ¡  S )zXIndicates the encryption of data item D with the key K using the
    RC4 algorithm.
    r   r’  Nr•  )r—  r“  r”  r˜  r™  rŒ  r�  )re   rŽ  r“  r”  rš  r›  r™  r8   r8   r=   rQ  }  s
    
rQ  c                   @   s,   e Zd Zeddƒedddd�eddƒgZd	S )
ÚNTLMSSP_MESSAGE_SIGNATUREÚVersionrY   ÚChecksumr?   r‡   rŽ   ÚSeqNumr   N)rn   ro   rp   r   r   r™   r8   r8   r8   r=   rŸ  Š  s   ýrŸ  c                 C   s"   t t|  d¡ƒ| ¡ |  d¡ƒS )zComputes the ResponseKeyNTzutf-16le)ré   r‘  ÚencodeÚupper)ZPasswdZUserZUserDomr8   r8   r=   ÚNTOWFv2”  s    ÿr¥  c                 C   s
   t | |ƒS r@   )ré   )rê   rã   r8   r8   r=   rO  š  s    rO  c                 C   s:   t |t d|¡| ƒd d… }| r,t| |ƒ}td||d�S )Nz<ir‡   rY   )r   r¡  r¢  )ré   rˆ   r‰   rž  rŸ  )ÚHandleÚ
SigningKeyr¢  ÚMessageÚchksumr8   r8   r=   ÚMAC   s    
ýrª  c                 C   s    t | |ƒ}t| |||ƒ}||fS r@   )rž  rª  )r¦  r§  r¢  r¨  Zsealed_messageÚ	signaturer8   r8   r=   ÚSEAL­  s    
r¬  c                 C   s8   | j r0|dkrtƒ  |d ¡S tƒ  |d ¡S nd S d S )NÚClients;   session key to client-to-server signing key magic constant s;   session key to server-to-client signing key magic constant )rŸ   r)   r�  )ÚNegFlgrR  ÚModer8   r8   r=   ÚSIGNKEYµ  s    ÿÿÿÿr°  c                 C   s’   | j r\| jr|}n | jr&|d d… }n|d d… }|dkrJtƒ  |d ¡S tƒ  |d ¡S n2| jrŠ| jrx|d d… d S |d d… d	 S n|S d S )
NrÇ   rÅ   r­  s;   session key to client-to-server sealing key magic constant s;   session key to server-to-client sealing key magic constant rÆ   ó    r†   s   å8°)rŸ   r¢   r¤   r)   r�  rœ   )r®  rR  r¯  ZSealKeyr8   r8   r=   ÚSEALKEYÇ  s,    ÿÿÿÿr²  )FFFNNNNr…   )NNr…   )krq   r6  r\  rˆ   rb  Z
scapy.archr   Zscapy.asn1.asn1r   r   Zscapy.asn1.mibr   Zscapy.asn1fieldsr   r   r   r	   Zscapy.asn1packetr
   Zscapy.automatonr   r   Zscapy.compatr   Zscapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zscapy.packetr%   Zscapy.sessionsr&   Zscapy.supersocketr'   r(   Zscapy.layers.tls.crypto.hashr)   r*   r+   r,   r-   r.   r/   r0   Zcrypto_validZcryptography.hazmat.primitivesr1   r2   Ústrr3   rt   r‹   rŒ   rº   r§   r¨   r“   r»   rÂ   r”   rÙ   rÜ   rÞ   rß   râ   rí   r•   r  r  r'  r8  r~  r€  r�  rˆ  ré   r‘  rœ  rž  rQ  rŸ  r¥  rO  rª  r¬  r°  r²  r8   r8   r8   r=   Ú<module>   sŽ   d  `/$#(&%JZ! B        ô
j   ý
2	
