
    h{(                       d 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mZmZ ddlmZmZmZ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( dd	l)m*Z* dd
l+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZM ddlNmOZOmPZP ddlQmRZR e(ZSe(ZTeSZUeSZVeSZWe(ZXeSZY G d de*          ZZ G d de*          Z[ eddi dddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<i d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdc           eUddde           eSdfde           e" e$d.g e[dgh                    fZ\ G di dje          Z] G dk dle          Z^ G dm dne          Z_ G do dpe          Z` G dq dre(          Za G ds dte          Zb G du dve          Zc G dw dxe(          Zd G dy dze          Ze G d{ d|e          Zf G d} d~e(          Zg G d de          Zh G d de          Zi G d de(          Zj G d de          Zk G d de          Zl G d de(          Zm G d de          Zn G d de          Zo G d de(          ZpeJeJdZq G d de'          Zr G d de*          Zs G d de*          Zt G d de*          Zu G d de*          Zv G d de*          Zw G d de*          Zx G d de*          Zy G d de*          Zz G d de*          Z{d Z| G d de*          Z} G d de*          Z~ G d de*          Z G d de*          Z G d de*          Z G d de*          Z G d de*          Z G d de*          Z G d de*          Z G d de          Z G d de*          Z G d de*          Z G d de*          Z G d de*          Z G dÄ de*          Z G dń de*          Z G dǄ de*          Z G dɄ de*          Z G d˄ de*          Z G d̈́ de*          Z G dτ de*          Z G dф de*          Z G dӄ de*          Z G dՄ de*          Z G dׄ de*          Z G dل de*          Z G dۄ de*          Z G d݄ de*          Zi Z G d߄ de'          Z G d de*          Z G d de*          Zeed<    G d de*          Zeed<    G d de*          Z e6ee            e5eAed            e5eAed            e5eAed            e5eAed            e6eAedd            G d de*          Z e6ee            e5eBed            e5eBed            e6eBedd            ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d           d ej        d          d ej        d          d ej        d          d ej        d          d	 ej        d
          d ej        d          d ej        d          diZi  ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d           d! ej        d"          d# ej        d$          d% ej        d&          d' ej        d(          d) ej        d*          d+ ej        d,          d- ej        d.          d/ ej        d0          d1i  ej        d2          d3 ej        d4          d5 ej        d6          d7 ej        d8          d9 ej        d:          d; ej        d<          d= ej        d>          d? ej        d@          dA ej        dB          dC ej        dD          dE ej        dF          dG ej        dH          dI ej        dJ          dK ej        dL          dM ej        dN          dO ej        dP          dQ ej        dR          dSi  ej        dT          dU ej        dV          dW ej        dX          dY ej        dZ          d[ ej        d\          d] ej        d^          d_ ej        d`          da ej        db          dc ej        dd          de ej        df          dg ej        dh          di ej        dj          dk ej        dl          dm ej        dn          do ej        dp          dq ej        dr          ds ej        dt          du ej        dv          dw ej        dx          dy ej        dz          d{ ej        d|          d} ej        d~          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          d ej        d          diZi ddddd#dd+dd3dd?ddWddddddddddddddddddddddddZ G d de          Z ej        dddg          Ze,j                            dd          Ze,j        j        	 dd            Z G d de	          Z G d de4          Z G d de4          Z G d de          Z G d de          ZdS (  a'  
LDAP

RFC 1777 - LDAP v2
RFC 4511 - LDAP v3

Note: to mimic Microsoft Windows LDAP packets, you must set::

    conf.ASN1_default_long_size = 4

.. note::
    You will find more complete documentation for this layer over at
    `LDAP <https://scapy.readthedocs.io/en/latest/layers/ldap.html>`_
    N)Enum)get_if_addr)AnsweringMachine)ASN1_BOOLEAN
ASN1_ClassASN1_CodecsASN1_ENUMERATEDASN1_INTEGERASN1_STRING)BER_Decoding_Error
BER_id_decBER_len_decBERcodec_STRING)ASN1F_badsequenceASN1F_BOOLEANASN1F_CHOICEASN1F_ENUMERATEDASN1F_FLAGSASN1F_INTEGER
ASN1F_NULLASN1F_optionalASN1F_PACKETASN1F_SEQUENCE_OFASN1F_SEQUENCEASN1F_SET_OFASN1F_STRING_PacketFieldASN1F_STRING)ASN1_Packet)conf)log_runtime)FieldLenField
FlagsFieldThreeBytesField)Packetbind_bottom_upbind_layers)send)SimpleSocketStreamSocketSSLStreamSocket)dns_resolve)IPTCPUDP)IPv6)_GSSAPI_FieldGSS_C_FLAGSGSS_S_COMPLETEGSSAPI_BLOB_SIGNATUREGSSAPI_BLOBSSP)NBTDatagram)NETLOGONNETLOGON_SAM_LOGON_RESPONSE_EX)Listc                   \    e Zd Zej        Z e edd           edd                    Z	dS )AttributeValueAssertionattributeTypeorganizationNameattributeValue N)
__name__
__module____qualname__r   BER
ASN1_codecr   AttributeTypeAttributeValue	ASN1_root     U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/ldap.pyr;   r;   u   sF        Jo'9::',, IIIrI   r;   c                   4    e Zd Zej        Z edd          ZdS )LDAPReferralurir?   Nr@   rA   rB   r   rC   rD   
LDAPStringrG   rH   rI   rJ   rL   rL   }   &        J
5"%%IIIrI   rL   
resultCodesuccess   operationsError   protocolError   timeLimitExceeded   sizeLimitExceeded   compareFalse   compareTrue   authMethodNotSupported   strongAuthRequired
   referral   adminLimitExceeded   saslBindInProgress   noSuchAttribute   undefinedAttributeType   inappropriateMatching   constraintViolation   attributeOrValueExists   invalidAttributeSyntax    noSuchObject!   aliasProblem"   invalidDNSyntax#   isLeaf$   aliasDereferencingProblem0   inappropriateAuthentication1   invalidCredentials2   insufficientAccessRights3   busy4   unavailable5   unwillingToPerform6   
loopDetect@   namingViolationA   objectClassViolationB   notAllowedOnNonLeafC   notAllowedOnRDNentryAlreadyExistsobjectClassModsProhibitedresultsTooLargeother)D   E   F   P   	matchedDNr?   diagnosticMessage   implicit_tagc                   b    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdS )ASN1_Class_LDAPLDAP`   a   r   c   d   e   f   g   h   i   J   k   l   m   n      r   s   w   x   N)r@   rA   rB   nameBindRequestBindResponseUnbindRequestSearchRequestSearchResultEntrySearchResultDoneModifyRequestModifyResponse
AddRequestAddResponse
DelRequestDelResponseModifyDNRequestModifyDNResponseCompareRequestCompareResponseAbandonRequestSearchResultReferenceExtendedRequestExtendedResponserH   rI   rJ   r   r      s~        DKLMMMNJKJKONON OrI   r   c                   .    e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ASN1_Class_LDAP_AuthenticationzLDAP Authentication         r            N)r@   rA   rB   r   simple
krbv42LDAP	krbv42DSAsaslsicilyPackageDiscoverysicilyNegotiatesicilyResponserH   rI   rJ   r   r      s7         DFJID!ONNNrI   r   c                       e Zd Zej        ZdS )LDAP_Authentication_simpleNr@   rA   rB   r   r   tagrH   rI   rJ   r   r              
(
/CCCrI   r   c                       e Zd Zej        ZdS )#BERcodec_LDAP_Authentication_simpleNr   rH   rI   rJ   r   r      r   rI   r   c                       e Zd Zej        ZdS ) ASN1F_LDAP_Authentication_simpleN)r@   rA   rB   r   r   ASN1_tagrH   rI   rJ   r   r      s        -4HHHrI   r   c                       e Zd Zej        ZdS )LDAP_Authentication_krbv42LDAPNr@   rA   rB   r   r   r   rH   rI   rJ   r   r              
(
3CCCrI   r   c                       e Zd Zej        ZdS )'BERcodec_LDAP_Authentication_krbv42LDAPNr   rH   rI   rJ   r   r      r   rI   r   c                       e Zd Zej        ZdS )$ASN1F_LDAP_Authentication_krbv42LDAPN)r@   rA   rB   r   r   r   rH   rI   rJ   r   r      s        -8HHHrI   r   c                       e Zd Zej        ZdS )LDAP_Authentication_krbv42DSANr@   rA   rB   r   r   r   rH   rI   rJ   r   r              
(
2CCCrI   r   c                       e Zd Zej        ZdS )&BERcodec_LDAP_Authentication_krbv42DSANr   rH   rI   rJ   r   r     r   rI   r   c                       e Zd Zej        ZdS )#ASN1F_LDAP_Authentication_krbv42DSAN)r@   rA   rB   r   r   r   rH   rI   rJ   r   r     s        -7HHHrI   r   c                       e Zd Zej        ZdS )*LDAP_Authentication_sicilyPackageDiscoveryNr@   rA   rB   r   r   r   rH   rI   rJ   r   r             
(
?CCCrI   r   c                       e Zd Zej        ZdS )3BERcodec_LDAP_Authentication_sicilyPackageDiscoveryNr   rH   rI   rJ   r   r     r   rI   r   c                       e Zd Zej        ZdS )0ASN1F_LDAP_Authentication_sicilyPackageDiscoveryN)r@   rA   rB   r   r   r   rH   rI   rJ   r   r     s        -DHHHrI   r   c                       e Zd Zej        ZdS )#LDAP_Authentication_sicilyNegotiateNr@   rA   rB   r   r   r   rH   rI   rJ   r   r             
(
8CCCrI   r   c                       e Zd Zej        ZdS ),BERcodec_LDAP_Authentication_sicilyNegotiateNr   rH   rI   rJ   r  r    r   rI   r  c                       e Zd Zej        ZdS ))ASN1F_LDAP_Authentication_sicilyNegotiateN)r@   rA   rB   r   r   r   rH   rI   rJ   r  r     s        -=HHHrI   r  c                       e Zd Zej        ZdS )"LDAP_Authentication_sicilyResponseNr@   rA   rB   r   r   r   rH   rI   rJ   r  r  %          
(
7CCCrI   r  c                       e Zd Zej        ZdS )+BERcodec_LDAP_Authentication_sicilyResponseNr  rH   rI   rJ   r
  r
  )  r  rI   r
  c                       e Zd Zej        ZdS )(ASN1F_LDAP_Authentication_sicilyResponseN)r@   rA   rB   r   r   r   rH   rI   rJ   r  r  -  s        -<HHHrI   r  )s
   GSS-SPNEGOs   GSSAPIc                        e Zd Z fdZ xZS )_SaslCredentialsFieldc                    t          t          |                               ||          }|d         j        s|S |j        j        t
          v r4t          |j        j                 |d         j        |          |d         fS |S Nr   )_underlayerrS   )superr  m2ival	mechanism_SASL_MECHANISMS)selfpktsr  	__class__s       rJ   r  z_SaslCredentialsField.m2i5  s    )40044S!<<1vz 	J= 000 !23CFJCPPPA  
rI   r@   rA   rB   r  __classcell__r  s   @rJ   r  r  4  s8        	 	 	 	 	 	 	 	 	rI   r  c            	       |    e Zd Zej        Z e edd           e e	dd                    e
j                  ZdS )#LDAP_Authentication_SaslCredentialsr  r?   credentialsr   N)r@   rA   rB   r   rC   rD   r   rO   r   r  r   r   rG   rH   rI   rJ   r  r  A  sa        J
;##!!-44	
 	
 48  IIIrI   r  c                       e Zd Zej        Z e edd           edd           e	dde
eee          ej                  ZdS )LDAP_BindRequestversionrW   	bind_namer?   authenticationNr   )r@   rA   rB   r   rC   rD   r   r   LDAPDNr   r   r   r   r  r   r   rG   rH   rI   rJ   r"  r"  L  sr        Ji##{B,0//	
 	
 %0  IIIrI   r"  c                       e Zd Zej        Z ee e e	ddd                     e e	ddd                    fz   de
j        iZed             Zej        d	             Zed
             ZdS )LDAP_BindResponseserverSaslCredsWrapr?      r   serverSaslCreds   r   c                     | j         j        S )9
        serverCreds field in SicilyBindResponse
        )r   r  r  s    rJ   serverCredszLDAP_BindResponse.serverCredsp  s    
 ~!!rI   c                 .    t          |          | _        dS )r.  N)r   r   )r  r  s     rJ   r0  zLDAP_BindResponse.serverCredsw  s    
 %S))rI   c                     | j         rW| j         j        rKt          | j         j                  }|j        }t	          |t
                    r|j        S t          |          S | j        r| j        j        r| j        j        S dS )zZ
        Get serverSaslCreds or serverSaslCredsWrap depending on what's available
        N)r)  r  r  r   
isinstancer   bytesr+  )r  wrapr  s      rJ   serverSaslCredsDataz%LDAP_BindResponse.serverSaslCredsData~  s    
 # 		(@(D 		6t7O7STTD"C#{++ w::! 	d&:&> 	'++4rI   N)r@   rA   rB   r   rC   rD   r   
LDAPResultr   r   r   r   rG   propertyr0  setterr6  rH   rI   rJ   r(  r(  ]  s        J !L!6NNN 
  L!2BTJJJ 	
 %1 I" " " X" * * *   X  rI   r(  c                   T    e Zd Zej        Z e edd          ej	                  Z
dS )LDAP_UnbindRequestinfor   r   N)r@   rA   rB   r   rC   rD   r   r   r   r   rG   rH   rI   rJ   r;  r;    s@        J
61$2  IIIrI   r;  c                   4    e Zd Zej        Z edd          ZdS )LDAP_SubstringFilterInitialr  r?   NrN   rH   rI   rJ   r>  r>    rP   rI   r>  c                   4    e Zd Zej        Z edd          ZdS )LDAP_SubstringFilterAnyr  r?   NrN   rH   rI   rJ   r@  r@    rP   rI   r@  c                   4    e Zd Zej        Z edd          ZdS )LDAP_SubstringFilterFinalr  r?   NrN   rH   rI   rJ   rB  rB    rP   rI   rB  c                       e Zd Zej        Z ed ed           ed e	            e	d           ed e
            e
d           ed e            ed	                    Zd
S )LDAP_SubstringFilterStrstrr?   initialr   r   anyr   finalr   N)r@   rA   rB   r   rC   rD   r   r   r   r>  r@  rB  rG   rH   rI   rJ   rD  rD    s        JB''))'		
 	
 	
 	**,,.ETX	
 	
 	
 	%%''%		
 	
 	
 IIIrI   rD  c                   ^    e Zd Zej        Z e edd           edg e	                    Z
dS )LDAP_SubstringFiltertyper?   filtersN)r@   rA   rB   r   rC   rD   r   rE   r   rD  rG   rH   rI   rJ   rJ  rJ    sH        Jfb!!)R)@AA IIIrI   rJ  c                      t          | i |S NLDAP_Filterargskwargss     rJ   <lambda>rT    s    {D'CF'C'C rI   c                   6    e Zd Zej        Z edg e          ZdS )LDAP_FilterAndvalsN	r@   rA   rB   r   rC   rD   r   _LDAP_FilterrG   rH   rI   rJ   rV  rV    (        JVR66IIIrI   rV  c                   6    e Zd Zej        Z edg e          ZdS )LDAP_FilterOrrW  NrX  rH   rI   rJ   r\  r\    rZ  rI   r\  c                   N    e Zd Zej        Z e edddd                     ZdS )LDAP_FilterNotr  Nc                      t           S rN  rO  rQ  s     rJ   rT  zLDAP_FilterNot.<lambda>  s    K rI   )next_cls_cb)	r@   rA   rB   r   rC   rD   r   r   rG   rH   rI   rJ   r^  r^    s@        JUD$4W4WXXX IIIrI   r^  c                   4    e Zd Zej        Z edd          ZdS )LDAP_FilterPresentpresentobjectClassNr@   rA   rB   r   rC   rD   rE   rG   rH   rI   rJ   rb  rb    s&        Ji77IIIrI   rb  c                   *    e Zd Zej        Zej        ZdS )LDAP_FilterEqualNr@   rA   rB   r   rC   rD   r;   rG   rH   rI   rJ   rg  rg            J'1IIIrI   rg  c                   *    e Zd Zej        Zej        ZdS )LDAP_FilterGreaterOrEqualNrh  rH   rI   rJ   rk  rk    ri  rI   rk  c                   *    e Zd Zej        Zej        ZdS )LDAP_FilterLessOrEqualNrh  rH   rI   rJ   rm  rm    ri  rI   rm  c                   *    e Zd Zej        Zej        ZdS )LDAP_FilterApproxMatchNrh  rH   rI   rJ   ro  ro    ri  rI   ro  c            
           e Zd Zej        Z e e eddd                     e eddd                     e	ddd           e
dd	d
                    ZdS )LDAP_FilterExtensibleMatchmatchingRuler?   r   r   rK  
matchValuer   dnAttributesF   N)r@   rA   rB   r   rC   rD   r   r   rO   rF   r   rG   rH   rI   rJ   rq  rq    s        JJ~r===	
 	
 	Jvr555	
 	
 	|Rd;;;ne$???	 	IIIrI   rq  c                   :    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )ASN1_Class_LDAP_FilterzLDAP Filter         r            r,        N)r@   rA   rB   r   AndOrNotEqualityMatch
SubstringsGreaterOrEqualLessOrEqualPresentApproxMatchExtensibleMatchrH   rI   rJ   rw  rw    sE        D
C	B
CMJNKGKOOOrI   rw  c                      e Zd Zej        Z ed e             edde	e
j                   eddee
j                   eddee
j                   eddee
j                   eddee
j                   ed	dee
j                   ed
dee
j                   eddee
j                   eddee
j                   eddee
j                            Zedefd            Z dS )rP  filterand_Nr   or_not_equalityMatch
substringsgreaterOrEquallessOrEqualrc  approxMatchextensibleMatchc                    	
 d
|                                  d         dk    rd| z  } g }|}g }t          |           }d}||k     r| |         }|dz  }|dv r|dk    r4|                    g            |                    |           |d         }n,|dk    r*|st          
d	z             |                    d          }n|d
v r|                    |           n|dv r1|d         dv r|dxx         |z  cc<   |                    |           n|dv r|                    |           n|dk    r|                    |           nw|dk    r|                    |           n[d}| |dz
  d         D ]}|dv r n||z  }|st          
dz             |t          |          dz
  z  }|                    |           ||k     |rt          
d	z             |d         }	
fd	t           	|                    S )z:
        Convert a RFC-2254 filter to LDAP_Filter
        zInvalid LDAP filter string: r   (z(%s)rS   ) 	
)zparenthesis unmatched.z&|!=z~><:z~><:*r?   Nz():!|&~<>=*zcritical failure (impossible).c           	      d     st          dz             t                     dk    r,t           d         t                    r  d                   S  d         dv r]t                     dk     rt          dz               d         dk    rt          nt
          fd dd          D             	          S  d         d
k    rRt                     dk    rt          dz             t          t            d                                       S d v rd v rt                     dk     s d         dk    rt          dz             t          t           d         
                                           fdt           dd                    D                       S d v rt          d          t          d  D                       rt                     dk    s
d d         vrt          dz              d         dk    r#t          t           d                             S  d v rt          nd v rt           nd v rt"          nt$          t           d         
                                          t           d                             S t          dz             )Nzempty enclosure.rS   r   z&|rW   zbad use of multinary operator.&c                 B    g | ]}t           |                     S )r  rO  ).0y_getflds     rJ   
<listcomp>zDLDAP_Filter.from_rfc2254_string.<locals>._getfld.<locals>.<listcomp>  s,    HHHQ+WWQZZ888HHHrI   rW  !rU   zbad use of unary operator.r  r  r  r  zbad use of substring.c           	          g | ]a\  }}|d k    t           |t                    dz
  k    rt          n|dk    rt          nt          t          |                              bS )r  rW   r   r  )rE  )rD  lenrB  r>  r@  r   )r  ir  xs      rJ   r  zDLDAP_Filter.from_rfc2254_string.<locals>._getfld.<locals>.<listcomp>  s        !Aq88 0!=#$Q!#4#4 !: 9 $%66 &A%@%<"-a..!2 !2 !2   $88rI   )rK  rL  z:=zExtensible not implemented.c              3      K   | ]}|d v V  	dS ))<=>=~=r  NrH   )r  r  s     rJ   	<genexpr>zCLDAP_Filter.from_rfc2254_string.<locals>._getfld.<locals>.<genexpr>  s(      ==aQ11======rI   zbad use of comparison.rc  r  r  r  r<   r>   zinvalid filter.)
ValueErrorr  r3  listrV  r\  r^  rP  rJ  r   strip	enumerateNotImplementedErrorrG  rb  rm  rk  ro  rg  )r  r  _lerrs   `rJ   r  z0LDAP_Filter.from_rfc2254_string.<locals>._getfld  s    =< );!;<<<Q1AaD$!7!7wqt}}$1q66A::$U-M%MNNNH!A$#++=HHHH!ABB%HHH    1q66Q;;$U-I%IJJJ%#771Q4==999    cQhhq66A::1$U-D%DEEE+$QqTZZ\\22    %.ae$4$4       )*GHHH==1===== <q66Q;;#QqT//$U-E%EFFFQ43;;-k!A$6G6GHHHH*qyy +* qyy 32 qyy 0/)"-adjjll";";#.qt#4#4    !):!:;;;rI   r  )lstripr  appendr  poprP  )r  tokenscur	backtrack	filterlenr  cvr  r  r  s            @@rJ   from_rfc2254_stringzLDAP_Filter.from_rfc2254_stringQ  s|    /==??1$$f_F 	KK	)mmq	AFA%%%c

2  %%%"gc  G$U-E%EFFFmmB''e

1cr7f$$GGGqLGGG

1e

1c

1c

1 A  AM))FAA O$U-M%MNNNSVVaZ

1Y )mm^  	?U%==>>> >	< >	< >	< >	< >	< >	<@ ''&//2222rI   )!r@   rA   rB   r   rC   rD   r   rb  r   rV  rw  r  r\  r  r^  r  rg  r  rJ  r  rk  r  rm  r  r  ro  r  rq  r  rG   staticmethodrE  r  rH   rI   rJ   rP  rP    s       JD.7M7Q	
 	
 	
 	45K5N	
 	
 	
 	D.7M7Q	
 	
 	
 	/=		
 	
 	
 	 /:		
 	
 	
 	%/>		
 	
 	
 	"/;		
 	
 	
 	/7		
 	
 	
 	"/;		
 	
 	
 	&/?		
 	
 	
a6 6Ip F3C F3 F3 F3 \F3 F3 F3rI   rP  c                   4    e Zd Zej        Z edd          ZdS )LDAP_SearchRequestAttributerK  r?   Nre  rH   rI   rJ   r  r    s&        Jfb))IIIrI   r  c                      e Zd Zej        Z e edd           edddddd           eddd	d
ddd           e	dd           e	dd           e
dd           ed e            e           edg e          ej        	  	        ZdS )LDAP_SearchRequest
baseObjectr?   scoper   singleLevelwholeSubtreer   rS   rU   derefAliasesneverDerefAliasesderefInSearchingderefFindingBaseObjderefAlways)r   rS   rU   rW   	sizeLimit	timeLimit	attrsOnlyFr  
attributesr   N)r@   rA   rB   r   rC   rD   r   r&  r   r   r   r   rP  r   r  r   r   rG   rH   rI   rJ   r  r    s        J|R  QL]~NN	
 	
 	&%( 	 		
 		
 	k1%%k1%%k5))X{{}}k::,,GHH$2)  IIIrI   r  c                   4    e Zd Zej        Z edd          ZdS )LDAP_AttributeValuevaluer?   N)r@   rA   rB   r   rC   rD   rF   rG   rH   rI   rJ   r  r    s&        Jw++IIIrI   r  c                   ^    e Zd Zej        Z e edd           edg e	                    Z
dS )LDAP_PartialAttributerK  r?   valuesN)r@   rA   rB   r   rC   rD   r   rE   r   r  rG   rH   rI   rJ   r  r    sG        Jfb!!Xr#677 IIIrI   r  c                   |    e Zd Zej        Z e edd           ed e	            e	          e
j                  ZdS )LDAP_SearchResponseEntry
objectNamer?   r  r   N)r@   rA   rB   r   rC   rD   r   r&  r   r  r   r   rG   rH   rI   rJ   r  r    sd        J|R  !!##!	
 	

 %6  IIIrI   r  c                   6    e Zd Zej        Z eedej	        iZ
dS )LDAP_SearchResponseResultDoner   N)r@   rA   rB   r   rC   rD   r   r7  r   r   rG   rH   rI   rJ   r  r    s4        J	$5 IIIrI   r  c                   D    e Zd Zej        Z edg eej	                  Z
dS )LDAP_SearchResponseReferenceurisr   N)r@   rA   rB   r   rC   rD   r   URIr   r   rG   rH   rI   rJ   r  r    s;        J!!
$:	  IIIrI   r  c            
       x    e Zd Zej        Z e edddddd           ed e	            e	                    Z
dS )	LDAP_ModifyRequestChange	operationr   adddeletereplacer  modificationN)r@   rA   rB   r   rC   rD   r   r   r   r  rG   rH   rI   rJ   r  r  *  sm        J 	
 	
 	^%:%:%<%<>STT IIIrI   r  c                   l    e Zd Zej        Z e edd           edg e	          e
j                  ZdS )LDAP_ModifyRequestobjectr?   changesr   N)r@   rA   rB   r   rC   rD   r   r&  r   r  r   r   rG   rH   rI   rJ   r  r  :  sS        Jx)R)ABB$2  IIIrI   r  c                   6    e Zd Zej        Z eedej	        iZ
dS )LDAP_ModifyResponser   N)r@   rA   rB   r   rC   rD   r   r7  r   r   rG   rH   rI   rJ   r  r  C  s4        J	$3 IIIrI   r  c                   *    e Zd Zej        Zej        ZdS )LDAP_AttributeN)r@   rA   rB   r   rC   rD   r  rG   rH   rI   rJ   r  r  O  s        J%/IIIrI   r  c                   |    e Zd Zej        Z e edd           ed e	            e	          e
j                  ZdS )LDAP_AddRequestentryr?   r  r   N)r@   rA   rB   r   rC   rD   r   r&  r   r  r   r   rG   rH   rI   rJ   r  r  T  sc        JwN	
 	

 %/  IIIrI   r  c                   6    e Zd Zej        Z eedej	        iZ
dS )LDAP_AddResponser   N)r@   rA   rB   r   rC   rD   r   r7  r   r   rG   rH   rI   rJ   r  r  a  4        J	$0 IIIrI   r  c                   B    e Zd Zej        Z eddej                  Z	dS )LDAP_DelRequestr  r?   r   N)
r@   rA   rB   r   rC   rD   r&  r   r   rG   rH   rI   rJ   r  r  m  s7        J
$/  IIIrI   r  c                   6    e Zd Zej        Z eedej	        iZ
dS )LDAP_DelResponser   N)r@   rA   rB   r   rC   rD   r   r7  r   r   rG   rH   rI   rJ   r  r  v  r  rI   r  c                   T    e Zd Zej        Z e edd          ej	                  Z
dS )LDAP_AbandonRequest	messageIDr   r   N)r@   rA   rB   r   rC   rD   r   r   r   r   rG   rH   rI   rJ   r  r    s@        Jk1%%$3  IIIrI   r  c                        e Zd Zej        Z ee e e	ddd                     e e
ddd                    fz   dej        iZ fdZ xZS )	LDAP_ExtendedResponseresponseNameNr   r   responseValuer   r   c                     t          t          |                               |          }|s|S | j        j        dd          D ]*}	 |                    | |          }# t          $ r Y  nw xY w|S )N)r  r  
do_dissectrG   seqdissectr   )r  r  r  objr  s       rJ   r	  z LDAP_ExtendedResponse.do_dissect  s     '..99!<< 	H>%bcc* 	 	CKKa(($   s   A
A*)A*)r@   rA   rB   r   rC   rD   r   r7  r   LDAPOIDr   r   r   rG   r	  r  r  s   @rJ   r  r    s        Jww~t$OOOPP||OTPTUUUVV	 %5	 	I        rI   r  c                        e Zd Z fdZ xZS )_ControlValue_Fieldc                    t          t          |                               ||          }|d         j        s|S |j        j                                        }|t          v r*t          |         |d         j        |          |d         fS |S r  )r  r  r  r  controlTypedecode_LDAP_CONTROLS)r  r  r  r  r  r  s        rJ   r  z_ControlValue_Field.m2i  s    '..223::1vz 	Jo)0022.(({+CFJCHHHA  
rI   r  r  s   @rJ   r  r    s8        
 
 
 
 
 
 
 
 
rI   r  c            
           e Zd Zej        Z e edd           e e	dd                     e e
dd                              ZdS )LDAP_Controlr  r?   criticalityFcontrolValueN)r@   rA   rB   r   rC   rD   r   r  r   r   r  rG   rH   rI   rJ   r  r    sp        Jr""M-//	
 	
 	**>2>>?? IIIrI   r  c                   \    e Zd Zej        Z e edd           edd                    Z	dS )LDAP_realSearchControlValuesizer   cookier?   N)
r@   rA   rB   r   rC   rD   r   r   r   rG   rH   rI   rJ   r  r    sD        Jfa  Xr"" IIIrI   r  1.2.840.113556.1.4.319c                   L    e Zd Zej        Z e eddg d                    ZdS )LDAP_serverSDFlagsControlflagsN)OWNERGROUPDACLSACL)	r@   rA   rB   r   rC   rD   r   r   rG   rH   rI   rJ   r  r    sJ        J  		
 		
 IIIrI   r  z1.2.840.113556.1.4.801c                      e Zd Zej        Z e edd           ed e	            e
ee	eeeeeeeeeeee           e edded                              ZdZedd            Zed	             Zd
 Z e!d             Z"d Z#d Z$dS )r   r  r   
protocolOpControlsNrx  r   c                     |rit          |          dk    rV|d         dk    rJt          j        d|d d                   d         dz   t          |          k    rt          S t          j        S | S )NrY   r   r   !I)r  structunpackLDAP_SASL_Bufferr   	raw_layer)cls_pktrR  kargss       rJ   dispatch_hookzLDAP.dispatch_hook  sg     	&CIINNAw$=tBQBx003a73t99DD++~%
rI   c                 D   t          |          dk     rd S |}|r	 t          t          |          d                   \  }}n# t          t          f$ r Y d S w xY w|rAt          |          |k    r.||d          }|s! | |          }t
          |v rt          |vrd S |S nd S |d S )NrY   rS   )r  r   r   r   
IndexErrorr  r  )r-  datarR  rS  	remaininglengthr  r  s           rJ   tcp_reassemblezLDAP.tcp_reassemble  s    t99q==4 	 	'
9(=(=a(@AA	&
3   tt #a&&F**fggJ	  #d))C 1C779DD#tJ t#  	$ ts   %A AAc                     dS Ns   ldaprH   r/  s    rJ   hashretzLDAP.hashret4      wrI   c                 L    | j         dk    ot          | j        t                    S )Nr   )r  r3  r%  r  r/  s    rJ   unsolicitedzLDAP.unsolicited7  s,     ~" 
zO2(
 (
 	
rI   c                 ^    | j         rdS t          |t                    o|j        | j        k    S )NT)r<  r3  r   r  r  r   s     rJ   answerszLDAP.answers>  s0     	4%&&L5?dn+LLrI   c                     | j         r| j        sdS | j         j        j                            dd          d| j        j        dt          gfS )Nr?   _r  r  r  )r%  r  r  r@   r  r  r   r/  s    rJ   	mysummaryzLDAP.mysummaryC  sa     	dn 	2 )2::3DDDD"""
 F
 	
rI   rN  )%r@   rA   rB   r   rC   rD   r   r   r   r  r"  r(  r  r  r  r  r  r  r  r  r  r  r;  r  r   r   r  rG   show_indentclassmethodr0  r6  r9  r8  r<  r?  rB  rH   rI   rJ   r   r     s9       Jk1%%  $)(!#	
 	
( 	j$4PPP	
 	
- I6 K   [   [6   
 
 X
M M M


 

 

 

 

rI   r     )dport)sporti  rG  rF  c            	           e Zd Zej        Z eej        j	        d          e
 edd                    ej        j	        d                   Zd ZdS )CLDAPr   userr?   rS   c                 L    t          |t                    o|j        | j        k    S rN  )r3  rJ  r  r>  s     rJ   r?  zCLDAP.answerse  s     %''MEOt~,MMrI   N)r@   rA   rB   r   rC   rD   r   r   rG   r
  r   r&  r?  rH   rI   rJ   rJ  rJ  [  sz        J1F62	
 	
 	1 IN N N N NrI   rJ  z$C7407360-20BF-11D0-A768-00AA006E0529z"Domain Password & Lockout Policiesz$59BA2F42-79A2-11D0-9020-00C04FC2D3CFzGeneral Informationz$4C164200-20C0-11D0-A768-00AA006E0529zAccount Restrictionsz$5F202010-79A5-11D0-9020-00C04FC2D4CFzLogon Informationz$BC0AC240-79A9-11D0-9020-00C04FC2D4CFzGroup Membershipz$E45795B2-9455-11D1-AEBD-0000F80367C1zPhone and Mail Optionsz$77B5B886-944A-11D1-AEBD-0000F80367C1zPersonal Informationz$E45795B3-9455-11D1-AEBD-0000F80367C1zWeb Informationz$E48D0154-BCF8-11D1-8702-00C04FB96050zPublic Informationz$037088F8-0AE1-11D2-B422-00A0C968F939zRemote Access Informationz$B8119FD0-04F6-4762-AB7A-4986C76B3F9AzOther Domain Parametersz$72E39547-7B18-11D1-ADEF-00C04FD8D5CDzDNS Host Name Attributesz$FFA6F046-CA4B-4FEB-B40D-04DFEE722543zMS-TS-GatewayAccessz$91E647DE-D96F-4B70-9557-D63FF4F3CCD8zPrivate Informationz$5805BC62-BDC9-4428-A5E2-856A0F4C185EzTerminal Server License Serverz$ee914b82-0a98-11d1-adbb-00c04fd8d5cdzAbandon-Replicationz$440820ad-65b4-11d1-a3da-0000f875ae0dzAdd-GUIDz$1abd7cf8-0a99-11d1-adbb-00c04fd8d5cdzAllocate-Ridsz$68b1d179-0d15-4d4f-ab71-46152e79a7bczAllowed-To-Authenticatez$edacfd8f-ffb3-11d1-b41d-00a0c968f939zApply-Group-Policyz$0e10c968-78fb-11d2-90d4-00c04f79dc55zCertificate-Enrollmentz$a05b8cc2-17bc-4802-a710-e7c15ab866a2zCertificate-AutoEnrollmentz$014bf69c-7b3b-11d1-85f6-08002be74fabzChange-Domain-Masterz$cc17b1fb-33d9-11d2-97d4-00c04fd8d5cdzChange-Infrastructure-Masterz$bae50096-4752-11d1-9052-00c04fc2d4cfz
Change-PDCz$d58d5f36-0a98-11d1-adbb-00c04fd8d5cdzChange-Rid-Masterz$e12b56b6-0a95-11d1-adbb-00c04fd8d5cdzChange-Schema-Masterz$e2a36dc9-ae17-47c3-b58b-be34c55ba633zCreate-Inbound-Forest-Trustz$fec364e0-0a98-11d1-adbb-00c04fd8d5cdzDo-Garbage-Collectionz$ab721a52-1e2f-11d0-9819-00aa0040529bzDomain-Administer-Serverz$69ae6200-7f46-11d2-b9ad-00c04f79f805zDS-Check-Stale-Phantomsz$2f16c4a5-b98e-432c-952a-cb388ba33f2ezDS-Execute-Intentions-Scriptz$9923a32a-3607-11d2-b9be-0000f87a36b2zDS-Install-Replicaz$4ecc03fe-ffc0-4947-b630-eb672a8a9dbczDS-Query-Self-Quotaz$1131f6aa-9c07-11d1-f79f-00c04fc2dcd2zDS-Replication-Get-Changesz$1131f6ad-9c07-11d1-f79f-00c04fc2dcd2zDS-Replication-Get-Changes-Allz$89e95b76-444d-4c62-991a-0facbeda640cz*DS-Replication-Get-Changes-In-Filtered-Setz$1131f6ac-9c07-11d1-f79f-00c04fc2dcd2zDS-Replication-Manage-Topologyz$f98340fb-7c5b-4cdb-a00b-2ebdfa115a96zDS-Replication-Monitor-Topologyz$1131f6ab-9c07-11d1-f79f-00c04fc2dcd2zDS-Replication-Synchronizez$05c74c5e-4deb-43b4-bd9f-86664c2a7fd5z-Enable-Per-User-Reversibly-Encrypted-Passwordz$b7b1b3de-ab09-4242-9e30-9980e5d322f7zGenerate-RSoP-Loggingz$b7b1b3dd-ab09-4242-9e30-9980e5d322f7zGenerate-RSoP-Planningz$7c0e2a7c-a419-48e4-a995-10180aad54ddzManage-Optional-Featuresz$ba33815a-4f93-4c76-87f3-57574bff8109zMigrate-SID-Historyz$b4e60130-df3f-11d1-9c86-006008764d0ezmsmq-Open-Connectorz$06bd3201-df3e-11d1-9c86-006008764d0ez	msmq-Peekz$4b6e08c3-df3c-11d1-9c86-006008764d0ezmsmq-Peek-computer-Journalz$4b6e08c1-df3c-11d1-9c86-006008764d0ezmsmq-Peek-Dead-Letterz$06bd3200-df3e-11d1-9c86-006008764d0ezmsmq-Receivez$4b6e08c2-df3c-11d1-9c86-006008764d0ezmsmq-Receive-computer-Journalz$4b6e08c0-df3c-11d1-9c86-006008764d0ezmsmq-Receive-Dead-Letterz$06bd3203-df3e-11d1-9c86-006008764d0ezmsmq-Receive-journalz$06bd3202-df3e-11d1-9c86-006008764d0ez	msmq-Sendz$a1990816-4298-11d1-ade2-00c04fd8d5cdzOpen-Address-Bookz$1131f6ae-9c07-11d1-f79f-00c04fc2dcd2z,Read-Only-Replication-Secret-Synchronizationz$45ec5156-db7e-47bb-b53f-dbeb2d03c40fzReanimate-Tombstonesz$0bc1554e-0a99-11d1-adbb-00c04fd8d5cdzRecalculate-Hierarchyz$62dd28a8-7f46-11d2-b9ad-00c04f79f805z Recalculate-Security-Inheritancez$ab721a56-1e2f-11d0-9819-00aa0040529bz
Receive-Asz$9432c620-033c-4db7-8b58-14ef6d0bf477zRefresh-Group-Cachez$1a60ea8d-58a6-4b20-bcdc-fb71eb8a9ff8zReload-SSL-Certificatez$7726b9d5-a4b4-4288-a6b2-dce952e80a7fzRun-Protect_Admin_Groups-Taskz$91d67418-0135-4acc-8d79-c08e857cfbeczSAM-Enumerate-Entire-Domainz$ab721a54-1e2f-11d0-9819-00aa0040529bzSend-Asz$ab721a55-1e2f-11d0-9819-00aa0040529bzSend-Toz$ccc2dc7d-a6ad-4a7a-8846-c04e3cc53501zUnexpire-Passwordz$280f369c-67c7-438e-ae98-1d46f3c6f541z Update-Password-Not-Required-Bitz$be2bb760-7f46-11d2-b9ad-00c04f79f805zUpdate-Schema-Cachez$ab721a53-1e2f-11d0-9819-00aa0040529bzUser-Change-Passwordz$00299570-246d-11d0-a768-00aa006e0529zUser-Force-Change-Passwordz$3e0f7e18-2c7a-4c10-ba82-4d926db99a3ezDS-Clone-Domain-Controllerz$084c93a2-620d-4879-a836-f0ae47de0e89zDS-Read-Partition-Secretsz$94825a8d-b171-4116-8146-1e34d8f54401zDS-Write-Partition-Secretsz$4125c71f-7fac-4ff0-bcb7-f09a41325286zDS-Set-Ownerz$88a9933e-e5c8-4f2a-9dd7-2527416b8092zDS-Bypass-Quotaz$9b026da6-0d3c-465c-8bee-5199d7165cbazDS-Validated-Write-ComputerCREATE_CHILDDELETE_CHILDLIST_CONTENTSWRITE_PROPERTY_EXTENDED	READ_PROP
WRITE_PROPDELETE_TREEr   LIST_OBJECT   CONTROL_ACCESSi   DELETEi   READ_CONTROLi   	WRITE_DACi   WRITE_OWNERi   SYNCHRONIZEi   ACCESS_SYSTEM_SECURITYl        GENERIC_READi   @GENERIC_WRITEGENERIC_EXECUTEGENERIC_ALL)i    i   c                   r    e Zd ZdZdZ ee          Zd ej	        d          ddddddfdZ
d	 Zd
 Zd ZdS )LdapPing_am	ldappingdzudp port 389 or 138DOMAINz$192bc4b3-0085-4521-83fe-062913ef59f2zDefault-First-Site-NameSRV1Nc	                     || _         |p|dz   | _        || _        || _        || _        |p|dz   | j        z   | _        || _        || _        d S )Nz.LOCAL.)NetbiosDomainNameDnsForestName
DomainGuid
DcSiteNameNetbiosComputerNameDnsHostNamesrc_ipsrc_ip6)	r  rh  rj  rk  rl  ri  rm  rn  ro  s	            rJ   parse_optionszLdapPing_am.parse_options  si     "3*L/@8/K$$#6 & 
#%(:: 	 rI   c                    t           |v r'ddlm}m} 	 ||v o||j        v S # t
          $ r Y dS w xY wt          |vst          |j        t                    sdS |j        }|j
        oz|j
        d         j        j                                        dk    oM|j        oFt          |j        j        t                    o't!          d |j        j        j        D                       S )Nr   )SMBMailslot_WriteNETLOGON_SAM_LOGON_REQUESTFs   netlogonc              3   @   K   | ]}|j         j        j        d k    V  dS )   NtVerN)r  r<   r  r  r  s     rJ   r  z)LdapPing_am.is_request.<locals>.<genexpr>#  s@        ;<&*h6     rI   )r6   scapy.layers.smbrr  rs  DataAttributeErrorrJ  r3  r%  r  r  rK  r  lowerr  rV  rG  rW  )r  reqrr  rs  s       rJ   
is_requestzLdapPing_am.is_request  s   
 #VVVVVVVV%,W1Ksx1W "   uu:cn>P#Q#Q5nN q!&*0022kA
 3:,n==   @C
@Q@V    	
s     
..c                    t           |v r|                     |          S t          |v r9t          |t                   j        | j        p|t                   j                  }n8t          |t                   j        | j        p|t                   j                  }|t          |j	        |j
                  z  }	 t          d |j        j        j        j        D                       }n# t          $ r Y d S w xY w|t!          t#          t%          t'          t)          t+          t-          |dddd| j        | j        | j        | j        | j        d| j        | j                            	          
          gt)          d                    g          |j        d           z  t!          t=          d d          |j        d           z  S )N)dstsrcrH  c              3   b   K   | ]*}|j         j        j        d k    |j         j        j        V  +dS )	   DnsDomainN)r  r<   r  r>   rv  s     rJ   r  z)LdapPing_am.make_reply.<locals>.<genexpr>3  sI       ! !8)-== '+====! !rI   zV1+V5      .)DnsDomainName	NtVersion	LmNtToken	Lm20TokenFlagsrj  ri  rm  rh  rl  UserNamerk  ClientSiteNamer  )r     Netlogon)r  rK  )r  )r%  r  rK  r   )rd   rQ   )r6   make_mailslot_ping_replyr/   r  ro  r~  r,   rn  r.   rF  rG  nextr%  r  rW  StopIterationrJ  r  r  r  r   r4  r8   rj  ri  rm  rh  rl  rk  r  r  )r  r{  respr  s       rJ   
make_replyzLdapPing_am.make_reply(  s   #005553;;CIMt|/Ls4y}MMMDD#b'+4;+E#b'+FFFD#)395555	  ! !.5:! ! !  MM
  	 	 	FF	 3- 3*5,1,J>K:A:?:?6=;??>B>P<@<LBFBXDHD\9=;???C-. -. -.-* -*+& +& +&!" !" !"$2 "-[!9!95     @ -E# # #$J 8!    -  K,.	
s   8-C& &
C43C4c                 h   ddl m}m}m}m} t          |t
                   j                  t          |j        |j	                  z  }| j
        p1t          | j                            dt          j                            }|t!          |j        |j        |j        |j        |           |            z   ||j        j                  z  z  }|j                                        } || ||          d	d
d
d| j        | j        | j        | j        | j        | j        | j                  |_        |S )Nr   )rr  
SMB_Header
DcSockAddrr8   )r~  rH  iface)
SourceNameSUFFIX1DestinationNameSUFFIX2SourceIP)Name)sin_addrzV1+V5EX+V5EX_WITH_IPr  r  )rh  r  r  r  r  r  rj  ri  r  rm  rl  rk  r  )rw  rr  r  r  r8   r,   r  r.   rF  rG  rn  r   optsniffgetr   r  r6   r  r  r  r  rx  MailslotNamer  rj  ri  rm  rl  rk  )	r  r{  rr  r  r  r8   r  addressrh  s	            rJ   r  z$LdapPing_am.make_mailslot_ping_replyj  s   	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 c"gk"""S))&
 &
 &
 
 +TT]->->w
-S-S!T!T. #    jll  X*  
	
  /557722/!z    -,,( $ 8?#
 
 
	& rI   )r@   rA   rB   function_namer  r  r'   send_functionuuidUUIDrp  r|  r  r  rH   rI   rJ   rb  rb    s        M"F L&&M #49CDD,"   ,
 
 
8@
 @
 @
D/ / / / /rI   rb  	LocatedDCipsamlogon	dclocatoriX  Aldapc                 V
   |d}d                     | ||t          |          g                                          }|t          v rt          |         S d|                                 z  }|rt	          j        d|z             	 d t          |d|          D             }	n # t          $ r t          d	|z            w xY w|	st          d
|z            |rt	          j        d|	d|d           g }
|	D ]5}t          |||          }|r|
	                    d |D                        6|
st          d|d|	          |rt	          j        d|
d|           |dk    rt          |
d         d          S |dk    r |
J d            |
D ]}|rt	          j        d|d|d           	 t          j        t          j        t          j                  }|                    |           |                    ||f           t          |d          }|t          |<   ||                                 c S # t"          $ r0 |rt	          j        d|z             Y |                                 w xY w# |                                 w xY wt          d|d|
          |dk    r|
D ]j}|rt	          j        d|z             	 t          j        t          j        t          j                  }|                    |           |                    |df           t'          |t(                    }|                    t)          t-          t/          t1          t/          t3          t5          d          t5          |                      !          t/          t3          t5          d"          t5          t7          j        d#|                               !          g$          !          t;          t5          d%          &          g'          d(          |d)          }|rd}t=          |j        t@                    r5	 tC          d* |j        j"        D                       }n# tF          $ r Y nw xY wt          ||          }|t          |<   ||                                 c S n># t"          $ r1 |rt	          j        d|z             Y |                                 8w xY w	 |                                 S# |                                 w xY wt          d+|
z            dS ),aV  
    Perform a DC Locator as per [MS-ADTS] sect 6.3.6 or RFC4120.

    :param realm: the kerberos realm to locate
    :param mode: Detect if a server is up and joinable thanks to one of:

    - 'nocheck': Do not check that servers are online.
    - 'ldap': Use the LDAP ping (CLDAP) per [MS-ADTS]. Default.
              This will however not work with MIT Kerberos servers.
    - 'connect': connect to specified port to test the connection.

    :param mode: in connect mode, the port to connect to. (e.g. 88)
    :param debug: print debug logs

    This is cached in conf.netcache.dclocator.
    Ni  !;z_kerberos._tcp.dc._msdcs.%sz'DC Locator: requesting SRV for '%s' ...c                     g | ]	}|j         
S rH   )targetrv  s     rJ   r  zdclocator.<locals>.<listcomp>  s*     
 
 
 H
 
 
rI   SRV)qnameqtypetimeoutzResolution of %s timed outzNo DNS record found for %szDC Locator: got z. Resolving z records ...c              3   $   K   | ]}|j         V  d S rN  )rdatarv  s     rJ   r  zdclocator.<locals>.<genexpr>  s$      --1qw------rI   zCould not get any z records for z	 . Mode: nocheckr   connectz%Must provide a port in connect mode !zDC Locator: connecting to z on z ...zDC Locator: %s timed out.zNo host was reachable on port z among r  zDC Locator: LDAP Ping %s on ...rE  r  r  r  ru  z<Ir  r  rK  )r  r  )r%  rK  )r  verbosec              3   ~   K   | ]8}|j         j        d k    t          |j        d         j        j                  V  9dS )r  r   N)rK  r  r7   r  r  rv  s     rJ   r  zdclocator.<locals>.<genexpr>1  sQ       , ,$%#$6:#<#< !)!):)> ? ?#<#<#<#<, ,rI   z6No LDAP ping succeeded on any of %s. Try another mode?)$joinrE  rz  _dclocatorcacher    r<  r+   TimeoutErrorr  extend_located_dcsocketAF_INETSOCK_STREAM
settimeoutr  closeOSError
SOCK_DGRAMr(   rJ  sr1r  rP  rV  rg  r   r)  packr  r3  r%  r  r  r  r  )realmr  modeportr  r  debugcache_identr  hostsipshostarecr  sockresultr  responses                     rJ   r  r    sX   (  	 ((E5$I?@@FFHHKo%%{++ *EKKMM9E LBUJKKK
A
 
   
 
 
  A A A7%?@@@A 
5=>>>	 
>CeeUUUK	
 	
 	
 C . .
 
 

  	.JJ-------- Hj%%%OPPP	 HCCCFGGGy3q64(((			!H 	 	B X  RRRQUQUQU!VWWW}V^V5GHH(((b$Z((($R../5, 

     G$%@2%EFFF

 

jccRSSS	 @	 @	B I !BR!GHHH=}V^V5FGG(((b#Y'''#D%00hh#5#.'5(33C>I,>W>W?J5?Q?Q4. 4. 4.)* )* )* )43C>I(>S>S?J4:Ki4P4P@2 @24. 4. 4.)* )* )**&(" (" ("$ $ $* !<)4[)A)A!" !" !"(+$ $ $6 "9  < $A  ! !D  "#H!#.2JKK !!'+ , ,),)B, , , ( (HH
  - ! ! ! D!(X66F39OK0! 

-"      G$%@2%EFFF

!", 



QTWWXXXG 
s   B! !B>0A0H77#I1I40I11I44J
E9R)#Q&%R)&
Q30R)2Q33R)(S>)#S$S>#S$$S>>Tc                   *    e Zd ZdZdZdZdZdZdZdZ	dS )	LDAP_BIND_MECHSUNAUTHENTICATEDSIMPLEGSSAPIz
GSS-SPNEGOEXTERNALz
DIGEST-MD5SICILYN)
r@   rA   rB   NONEr  SASL_GSSAPISASL_GSS_SPNEGOSASL_EXTERNALSASL_DIGEST_MD5r  rH   rI   rJ   r  r  K  s1        DFK"OM"OFFFrI   r  c            	       N    e Zd ZdZ eddddddd           ed	d          gZd
S )LDAP_SASL_GSSAPI_SsfCapz6
    RFC2222 sect 7.2.1 and 7.2.2 negotiate token
    supported_security_layersr   ir  	INTEGRITYCONFIDENTIALITY)rS   rU   rY   max_output_token_sizeN)r@   rA   rB   __doc__r"   r#   fields_descrH   rI   rJ   r  r  V  s`         
 	
' !'	 	
	
 
	
 	/33KKKrI   r  c                   j    e Zd ZdZ edddd           ede          gZd Zd Z	e
d	             ZdS )
r+  z
    RFC 4422 sect 3.7
    BufferLengthNr(  Buffer)fmt	length_ofc                     dS r8  rH   r/  s    rJ   r9  zLDAP_SASL_Buffer.hashretz  r:  rI   c                 ,    t          |t                    S rN  )r3  r+  r>  s     rJ   r?  zLDAP_SASL_Buffer.answers}  s    %!1222rI   c                 b   t          |          dk     rd S |d         dk    rIt          t          |          d                   \  }}|r"|t          |          k    rt          |          S t	          j        d|d d                   d         dz   }t          |          |k    r | |          S d S )NrY   r   r   rS   r(  )r  r   r   r   r)  r*  )r-  r3  rR  rS  xlenr  r5  s          rJ   r6  zLDAP_SASL_Buffer.tcp_reassemble  s    t99q==47d??!*T"2"21"566GD! "ADzz!tT"1"X..q1A5t993t99 rI   )r@   rA   rB   r  r!   r0   r   r  r9  r?  rD  r6  rH   rI   rJ   r+  r+  k  s          	ndIIIh%%K
  3 3 3   [  rI   r+  c                   &     e Zd ZddgZ fdZ xZS )LDAP_ExceptionrQ   r   c                    |                     dd           }|rO|j        j        | _        |j        j        j                            d                              d          | _        n6|                     dd           | _        |                     dd           | _         t          t          |           j	        |i | d S )Nr      backslashreplaceerrorsrQ   r   )
r  r%  rQ   r   r  rstripr  r  r  __init__)r  rR  rS  r  r  s       rJ   r  zLDAP_Exception.__init__  s    zz&$'' 	K"o8DO%)_%F%J%Q%Q& &f.f// "" %jjt<<DO%+ZZ0CT%J%JD",nd##,d=f=====rI   )r@   rA   rB   	__slots__r  r  r  s   @rJ   r  r    sC        23I
> 
> 
> 
> 
> 
> 
> 
> 
>rI   r  c            
       >   e Zd ZdZ	 ddZddZddee         fd	Z	 	 	 	 	 dd
Z	 e
j        d e
j        ej                                                  z            Zdddddddg g f	dededee         dee         fdZg fdedee         dee         ddfdZd ZdS )LDAP_Clienta  
    A basic LDAP client

    The complete documentation is available at
    https://scapy.readthedocs.io/en/latest/layers/ldap.html

    Example 1 - SICILY - NTLM (with encryption)::

        client = LDAP_Client()
        client.connect("192.168.0.100")
        ssp = NTLMSSP(UPN="Administrator", PASSWORD="Password1!")
        client.bind(
            LDAP_BIND_MECHS.SICILY,
            ssp=ssp,
            encrypt=True,
        )

    Example 2 - SASL_GSSAPI - Kerberos (with signing)::

        client = LDAP_Client()
        client.connect("192.168.0.100")
        ssp = KerberosSSP(UPN="Administrator@domain.local", PASSWORD="Password1!",
                          SPN="ldap/dc1.domain.local")
        client.bind(
            LDAP_BIND_MECHS.SASL_GSSAPI,
            ssp=ssp,
            sign=True,
        )

    Example 3 - SASL_GSS_SPNEGO - NTLM / Kerberos::

        client = LDAP_Client()
        client.connect("192.168.0.100")
        ssp = SPNEGOSSP([
            NTLMSSP(UPN="Administrator", PASSWORD="Password1!"),
            KerberosSSP(UPN="Administrator@domain.local", PASSWORD="Password1!",
                        SPN="ldap/dc1.domain.local"),
        ])
        client.bind(
            LDAP_BIND_MECHS.SASL_GSS_SPNEGO,
            ssp=ssp,
        )

    Example 4 - Simple bind over TLS::

        client = LDAP_Client()
        client.connect("192.168.0.100", use_ssl=True)
        client.bind(
            LDAP_BIND_MECHS.SIMPLE,
            simple_username="Administrator",
            simple_password="Password1!",
        )
    Tc                     d | _         || _        d| _        d | _        d | _        d | _        d| _        d| _        d| _        d| _	        d| _
        d S )NFr   )r  verbssl
sslcontextssp
sspcontextencryptsign	sasl_wrapboundr  )r  r  s     rJ   r  zLDAP_Client.__init__  sU     			
rI   NFr[   c           	         || _         || _        || j         rd}nd}t          j                    }|                    |           | j        r!t          d|d|| j         rdndd           |                    ||f           | j        rNt          t          j        	                    d	t          |                                          z                       | j         rZ| j        7t          j        t           j                  }d
|_        t           j        |_        n| j        }|                    |          }| j         rt%          |t&                    | _        dS t+          |t&                    | _        dS )a  
        Initiate a connection

        :param ip: the IP to connect to.
        :param port: the port to connect to. (Default: 389 or 636)

        :param use_ssl: whether to use LDAPS or not. (Default: False)
        :param sslcontext: an optional SSLContext to use.
        Ni|  rE  u   ┃ Connecting to z	 on port z	 with SSLr?   z...u   └ Connected from %sF)r  r   r  r  r  printr  r   color_themegreenreprgetsockname
SSLContextPROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_modewrap_socketr*   r   r  r)   )r  r  r  use_sslr   r  r  contexts           rJ   r  zLDAP_Client.connect  s~    $<x }   9 	E BBD#'83KK33	   	b$Z   9 	 &&.d6F6F6H6H1I1II   
 8 	-&.)@AA).&&)m##/&&t,,D8 	1'd33DIII$T400DIIIrI   controlsc                    | xj         dz  c_         | j        r9t          t          j                            d|j        j        z                       t          | j         ||          }| j	        rBt          | j                            | j        t          |          | j                            } | j        j        |fddi|}|rdt          |v r[|t                   j        rI| j        r@|                                 t          t          j                            d                     |S | j	        r<|j        r3t          | j                            | j        |j                            }nd }| j        r|s.t          t          j                            d	                     d S t          t          j                            d
t          |v r|j        j        j        n|j        j        z                       |S )NrS   z>> %s)r  r%  r&  conf_req_flag)r  r  r   z! Got unsolicited notification.z! Bad response.z<< %s)r  r  r  r   r	  openingr  r@   r   r  r+  r  GSS_Wrapr  r4  r  r  r  r<  showfailr  
GSS_UnwraprR   r%  )r  r%  r  rS  r  r  s         rJ   r  zLDAP_Client.sr1  s   !9 	U$"**7Z5I5R+RSSTTTn!
 
 
 > 	"x((O#JJ"&, )    C ty}
 

 
 
  	DDLLT$Z%;Ly P		d&++,MNNOOOK> 		{ H''   9 	 d&++,=>>???$,,  $t|| !O5>>!%!8	 	 	 	 rI   c                 z   || _         || _        || _        || _        d| _        |t          |t                    st          d          |t          j        k    r+ddl	m
} t          | j        |          st          d          n|t          j        k    r+ddlm} t          | j        |          st          d          n|t          j        k    rHddlm}	 t          | j        |	          st          d	          | j        r| j        st          d
          n7|t          j        t          j        fv r| j        s| j        rt          d          | j        1|t          j        t          j        fv rt          d|j        z            | j         t          j        k    r|                     t+          t-          |pd          t/          |pd                              }
t0          |
vs*t          |
j        t4                    r|
j        j        dk    r*| j        r|
                                 t=          d          t>          }n| j         t          j        k    r|                     t+          t-          d          tA          d                              }
|
j        j        dk    r#|
                                 t=          d          | j        !                    | j        tD          j#        tD          j$        z  tD          j%        z  | j        rtD          j&        ndz  | j        rtD          j'        ndz            \  | _        }}|                     t+          t-          d          tQ          tS          |                                        }
|
j        j*        }|s#|
                                 t=          d          | j        !                    | j        tW          |                    \  | _        }}|                     t+          t-          d          tY          tS          |                                        }
|
j        j        dk    rt[          d|
          n| j         t          j        t          j        fv r| j        !                    | j        tD          j#        tD          j$        z  tD          j%        z  | j        rtD          j&        ndz  | j        rtD          j'        ndz            \  | _        }}|r|                     t+          t-          d          t]          t-          | j         j                  t-          tS          |                                                  }
t          |
j        t4                    s9| j        r0t_          d| j         j0        z             |
                                 dS |
j        j1        }|s|
j        j        }n9| j        !                    | j        tW          |                    \  | _        }}|nt>          }|t>          k    r0|
                                 t=          d| j         j0        z            | j         t          j        k    r|                     t+          t-          d          t]          t-          | j         j                  d                              }
te          | j        3                    | j        ti          |
j        j1                                      }| j        r|j5        j6        st=          d          | j        r|j5        j7        st=          d          te          | j        s| j        r,d8                    | j        rdgng | j        rdgng z             nd|j9                  }|                     t+          t-          d          t]          t-          | j         j                  | j        :                    | j        tS          |          d !                                        }
|
j        j        dk    rt[          d"|
          | j        p| j        | _;        | j;        r0d#| j<        _=        t}          | j<        j?        t                    | _<        | j        rt_          d$| j         j0        z             d#| _A        dS )%aO  
        Send Bind request.

        :param mech: one of LDAP_BIND_MECHS
        :param ssp: the SSP object to use for binding

        :param sign: request signing when binding
        :param encrypt: request encryption when binding

        :
        This acts differently based on the :mech: provided during initialization.
        Nz@'mech' attribute is required and must be one of LDAP_BIND_MECHS.r   )KerberosSSPz4Only raw KerberosSSP is supported with SASL_GSSAPI !)	SPNEGOSSPz2Only SPNEGOSSP is supported with SASL_GSS_SPNEGO !)NTLMSSPz+Only raw NTLMSSP is supported with SICILY !z:NTLM on LDAP does not support signing without encryption !z4Cannot use 'sign' or 'encrypt' with NONE or SIMPLE !z%s cannot be used with a ssp !r?   )r$  r%  zLDAP simple bind failed !rI   z!Sicily package discovery failed !)	req_flagss   NTLMzSicily negotiate failed !zSicily response failed !r  )r  r   z%s bind failed !z+GSSAPI SASL failed to negotiate INTEGRITY !z1GSSAPI SASL failed to negotiate CONFIDENTIALITY !+r  r  r  )r  r  Fr  z7GSSAPI SASL failed to negotiate client security flags !Tz%s bind succeeded !)Bmechr  r  r  r  r3  r  r  r  scapy.layers.kerberosr  r  scapy.layers.spnegor   r  scapy.layers.ntlmr!  r  r  r  r  r"  r   r   r   r%  r(  rQ   r  r  RuntimeErrorr2   r   GSS_Init_sec_contextr1   GSS_C_REPLAY_FLAGGSS_C_SEQUENCE_FLAGGSS_C_MUTUAL_FLAGGSS_C_INTEG_FLAGGSS_C_CONF_FLAGr   r4  r0  r4   r  r  r  r  r   r6  r  r  r3   r  r  r  r  r  r  r  r  closedr)   insr+  r  )r  r%  r  r  r  simple_usernamesimple_passwordr  r   r!  r  statustokenr  saslOptionss                  rJ   bindzLDAP_Client.bindT  s	   , 		<z$@@<R   ?...999999dh44 Y !WXXXY_444555555dh	22 W !UVVVW_+++111111dh00 P !NOOOy   P   o*O,BCCCy YDL Y !WXXX8D "-
 %
 %
 =
JKKK 9...88 )/*?R@@#='-2$ $   D D  !$/3DEE !?-229  IIKKK"#>???#FFY/000 88 )#..#Mc#R#R   D )Q..		"#FGGG-1X-J-J1!56!34 8<yG{33aI 7;lI{22	K .K 	. 	.*DOUF 88 )'22#Fe$ $   D /-C @		"#>???-1X-J-JS!1!1. .*DOUF 88 )'22#Ee$ $   D )Q..$.    /
 Y+'
 
 

 .2X-J-J  1!56!34 8<yG{33aI 7;lI{22	K	 .K 
. 
.*DOUF  xx$"-c"2"2'J&1$)/&B&B(3E%LL(A(A( ( (    "$/3DEE y $049>ABBB		Fo9 !_7F151N1NO[%5%52 2.'  . $F^##IIKKK1DINBCCCY/555 88 )#..#F"-dio">">$($ $ $   D 2##O)$/*MNN  K y R!F!P R"#PQQQX#=MX ##VWWW1
 I	+ "&	+#((&*i7k]]R.2lB)**D+ + +
 &1&G	 	 	K 88 )#..#F"-dio">">$(H$5$5 O!+..*/	 %6 % %$ $ $   D )Q..$M   
 2> 	F#DI$TY]4DEEDI9 	:'$).8999


rI   s   ^[%s]*$r?   r   i  r  r  r  c
                     |dk    rd}|rt                               |          }n+t          t          t          d                              }d}
i }	                      t          |d |D             t          |          t          |          t          |          t          |          t          |          t          |          	          |	 j	        r"t          d
dt          d|
                    gng z   d          }t          |vr#|                                 t          d          d  fd|rt          |vr#t!          j        dt%          |                     nt&          |j        v r7fd|j        j        D             }|| |j        j        j                  <   nt          |j        v r|j        j        }|dk    r=t!          j        |j                            d                     t5          d|          |j        r.t9          d |j        D             d          }||j        j        }
nn
|j        }||
sn|S )z
        Perform a LDAP search.

        :param baseObject: the dn of the base object to search in.
        :param filter: the filter to apply to the search (currently unsupported)
        :param scope: 0=baseObject, 1=singleLevel, 2=wholeSubtree
        rootDSEr?   s   objectClassr  r  rI   Tc                 H    g | ]}t          t          |                      S )r  )r  r   )r  attrs     rJ   r  z&LDAP_Client.search.<locals>.<listcomp>m  s;            4T9J9JKKK     rI   )r  r  r  r  r  r  r  r  r  i  )r  r  )r  r  r  rW   r  r  zSearch timed out.c                 .    |                      d          S )Nr  r  )r  )r  s    rJ   rT  z$LDAP_Client.search.<locals>.<lambda>  s    188+=8>> rI   c                 d    j                             |           r|                                 S | S rN  )	_TEXT_REGmatchr  )r  r  s    rJ   _ssafez"LDAP_Client.search.<locals>._ssafe  s.    >''** 88::%HrI   zInvalid response: %sc                 ^    i | ])} |j         j                  fd |j        D             *S )c                 :    g | ]} |j         j                  S rH   )r  r  )r  r  rA  s     rJ   r  z1LDAP_Client.search.<locals>.<dictcomp>.<listcomp>  s'    +U+U+UAFF17;,?,?+U+U+UrI   )rK  r  r  )r  r;  _srA  s     rJ   
<dictcomp>z&LDAP_Client.search.<locals>.<dictcomp>  sP         49=))+U+U+U+U+U+U+U  rI   r   zGot response: %resultCode%zLDAP search failed !r#  c              3   X   K   | ]%}t          |j        t                    |j        V  &d S rN  )r3  r  r  )r  r  s     rJ   r  z%LDAP_Client.search.<locals>.<genexpr>  sP       !" !"()'1()8S(& (&!"$%N!" !" !" !" !" !"rI   N)rP  r  rb  r   r  r  r	   r
   r   r  r  r  r  r  r  r   r    warningr  r  r%  r  r  r  rQ   sprintfr  r&  r  r  payload)r  r  r  r  r  r  r  r  r  r  r  entriesr  attrsrQ   realSearchControlValuerD  rA  s   `               @@rJ   searchzLDAP_Client.searchH  s1   & ""J 	 44V<<FF !)'77    F [	88"!   $.       +:66)%00!0!>!>*955*955*955     : (,D,0-H),+1." ." ."  
 
  " A  ! !DD -D88		"#6777>>B      ($t##'(>T

KKK+t>>    $(O$>  E CHGBBt9=>>??2doEE!%!;J!S((#+ O334PQQ   -2!%     = &59!" !"-1]!" !" !" !%	6 	62  6A)?)F)J %|Q  ($T  w[	x rI   r  r  returnc                     |                      t          ||          |d          }t          |j        vs|j        j        dk    rt          d|          dS )zC
        Perform a LDAP modify request.

        :returns:
        )r  r  rW   r<  r   zLDAP modify failed !r#  N)r  r  r  r%  rQ   r  )r  r  r  r  r  s        rJ   modifyzLDAP_Client.modify  s     xx     
 
  t66)Q.. &    /.rI   c                 r    | j         rt          d           | j                                         d| _        d S )NzX Connection closed
F)r  r  r  r  r  r/  s    rJ   r  zLDAP_Client.close  s8    9 	+)***	


rI   )T)NFNr[   rN  )NFFNN)r@   rA   rB   r  r  r  r9   r  r  r7  recompileescapestring	printableencoder?  rE  rM  r  rP  r  rH   rI   rJ   r  r    s       4 4p    "01 01 01 01d9 9\(: 9 9 9 9| p p p pd 
:		&2B2I2I2K2K(L(LLMMI  "')} }} } I} |$} } } }F (*	  ./ |$	
 
   8    rI   r  )r  r  NrS   Nr   )r  collectionsrR  r  r  rU  r)  r  enumr   
scapy.archr   scapy.ansmachiner   scapy.asn1.asn1r   r   r   r	   r
   r   scapy.asn1.berr   r   r   r   scapy.asn1fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.asn1packetr   scapy.configr   scapy.errorr    scapy.fieldsr!   r"   r#   scapy.packetr$   r%   r&   scapy.sendrecvr'   scapy.supersocketr(   r)   r*   scapy.layers.dnsr+   scapy.layers.inetr,   r-   r.   scapy.layers.inet6r/   scapy.layers.gssapir0   r1   r2   r3   r4   r5   scapy.layers.netbiosr6   rw  r7   r8   typingr9   rO   r  r&  RelativeLDAPDNrE   rF   r  r;   rL   r7  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>  r@  rB  rD  rJ  rY  rV  r\  r^  rb  rg  rk  rm  ro  rq  rw  rP  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rJ  r  LDAP_PROPERTY_SETLDAP_CONTROL_ACCESS_RIGHTSLDAP_DS_ACCESS_RIGHTSrb  
namedtupler  netcache	new_cacher  commandsregisterr  r  r  r+  r)  r  r  r  rH   rI   rJ   <module>ru     sO        				  



          " " " " " " - - - - - -                                                           ) ( ( ( ( (       # # # # # #         
         
                 ) ( ( ( ( ( * * * * * * * * * * # # # # # #                - , , , , ,             

	    k   & & & & &; & & & 	'	
y'	
 '	
 '	
 "	'	

 "'	
 ~'	
 }'	
 ''	
 #'	
 
'	
 $'	
 $'	
 !'	
 ('	
 ''	
  %!'	
" (#'	
 '	
$ (%'	
& ''	
( )'	
* !+'	
, -'	
. +/'	
0 -1'	
2 $3'	
4 *5'	
6 7'	
8 9'	
: $;'	
< ='	
> !?'	
@ &A'	
B %C'	
D !E'	
 '	
F %+!M'	
 '	
 '	
+ +X F;J"B''N$$Z\PTUUUVVa1
n    j   :
 
 
 
 
Z 
 
 
0 0 0 0 0 0 0 00 0 0 0 0/ 0 0 05 5 5 5 5| 5 5 5
4 4 4 4 4[ 4 4 44 4 4 4 4o 4 4 49 9 9 9 9< 9 9 9
3 3 3 3 3K 3 3 33 3 3 3 3_ 3 3 38 8 8 8 8, 8 8 8
@ @ @ @ @ @ @ @@ @ @ @ @/ @ @ @E E E E E| E E E
9 9 9 9 9+ 9 9 99 9 9 9 9? 9 9 9> > > > > > > >
8 8 8 8 8 8 8 88 8 8 8 8/ 8 8 8= = = = =| = = = $/;GG 
 
 
 
 
4 
 
 
    +       {   "/ / / / / / / /l       & & & & &+ & & &
& & & & &k & & &
& & & & & & & &
    k   .    ;    DC7 7 7 7 7[ 7 7 7
7 7 7 7 7K 7 7 7
    [   8 8 8 8 8 8 8 8
2 2 2 2 2{ 2 2 2
2 2 2 2 2 2 2 2
2 2 2 2 2[ 2 2 2
2 2 2 2 2[ 2 2 2
           Z   A3 A3 A3 A3 A3+ A3 A3 A3H* * * * *+ * * *
       4, , , , ,+ , , ,
    K   
 
 
 
 
{ 
 
 
    K       ;       {               +   0 0 0 0 0[ 0 0 0

 
 
 
 
k 
 
 
    {       k       {       +       K   :     2       ;       +    ,G' (         ,E' (^
 ^
 ^
 ^
 ^
; ^
 ^
 ^
B D$    sD $ $ $ $ sD $ $ $ $ sD % % % % sD % % % % CS , , , ,
N N N N NK N N N E5    sE % % % % sE % % % % Cc - - - -
 DI. +DI4557LDI4557MDI4557JDI4557IDI4557ODI4557MDI4557HDI4557KDI4557RDI4557PDI4557QDI4557LDI4557LDI4557W# ,KDI4557LKDI455zK DI455K DI4557P	K
 DI4557KK DI4557OK DI4557SK DI4557MK DI4557UK DI455|K DI4557JK DI4557MK DI4557TK DI4557NK DI4557QK  DI4557P!K" DI4557U#K K$ DI4557K%K& DI4557L'K( DI4557S)K* DI4557W+K, DI. 31K2 DI4557W3K4 DI. (9K: DI4557S;K< DI. 6AKB DI4557NCKD DI4557OEKF DI4557QGKH DI4557LIKJ DI4557LKKL DI455{MKN DI4557SOKP DI4557NQK K KR DI455~SKT DI4557VUKV DI4557QWKX DI4557MYKZ DI455{[K\ DI4557J]K^ DI. 5cKd DI4557MeKf DI4557NgKh DI. )mKn DI455|oKp DI4557LqKr DI4557OsKt DI4557VuKv DI4557TwKx DI455yyKz DI455y{K K| DI4557JDI. )DI4557LDI4557MDI4557SDI4557SDI4557RDI4557SDI455~DI4557HDI4557TUK K `  )	
            (  !" #$ "'   4h h h h h" h h hV %k$[42DEE-))+s;; OPbY bY bY bYT    d       f   *! ! ! ! !v ! ! !H> > > > >\ > > > H	 H	 H	 H	 H	& H	 H	 H	 H	 H	rI   