a
    kÄ#dd�  ã                   @   s:  d Z ddlmZ ddlm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mZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZI ddlJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZRmSZS ddlTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddlm^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZf ddlCmgZg ejhdu �rddliZe_eIeIgebej f ZkG dd„ dƒZlelƒ e_mejn odd¡ZpejqjrdŽdd„ƒZsG dd„ de6ƒZtG dd„ de6ƒZud d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d/d2d/d3œZvd4e"d5< d6e"e$< G d7d8„ d8eIƒZwG d9d:„ d:eIƒZxG d;d<„ d<eIƒZyd=d>„ Zzejm {eweyez¡ ejm {exeyez¡ d?d@dAdBdCdDœZ|G dEdF„ dFeIƒZ}G dGdH„ dHe}ƒZ~G dIdJ„ dJeIƒZG dKdL„ dLeIƒZ€ejm {exe€ez¡ G dMdN„ dNeIƒZ�ejm {ewe�ez¡ G dOdP„ dPeIƒZ‚G dQdR„ dReIƒZƒdSdT„ Z„ejm {eweƒe„¡ G dUdV„ dVeIƒZ…G dWdX„ dXeIƒZ†G dYdZ„ dZe†ƒZ‡G d[d\„ d\e3ƒZˆd]d^d_d`dadadadbœZ‰G dcdd„ ddeIƒZŠG dedf„ dfe�ƒZ‹eHexeyƒ eHeweydgdh� eHeweydidh� eHewe�djdh� eHewe‹d5dh� eHe‹e‹d5dh� eHe‹e�djdh� eHe�e‹d5dh� eHewewdkdh� eHeweƒdldh� eHe}eydgdm� eHe}e�djdm� eHe}e‹d5dh� eHe}ewdkdm� eHe}eƒdldm� eHeewƒ eHe†eydgdm� eHe†e�djdm� eHe†e‹d5dh� eHe†ewdndm� eHe†eƒdldm� eHe†e…dodkiƒ eHe…ejŒdddpœƒ eHe…e…ƒ eHeye‚dqdqdrds� eHeye€dtdtdrds� eHe€e�djdu� eHe€e‹d5dh� eHe€ewdkdu� eHe€eƒdldu� eHe€e‚dvdu� ej� reew¡ ej� Žeew¡ ej� Žeew¡ ej� �eex¡ ej� ree}¡ ej� ree~¡ ej� ree¡ ej� Žee}¡ ej� reeŠ¡ ej� ŽeeŠ¡ ej� re#eƒ¡ ejqjrd�dxdy„ƒZ‘ejqjrd�dzd{„ƒZ’G d|d}„ d}eMƒZ“ejqjrd‘dd€„ƒZ”ejqjrd’d‚dƒ„ƒZ•ejqjrd“d…d†„ƒZ–G d‡dˆ„ dˆeeI ƒZ—ejqjrd‰dŠ„ ƒZ˜ejqjrd”dŒd�„ƒZ™dS )•z.
Classes and functions for layer 2 protocols.
é    )Úabsolute_import)Úprint_functionN)ÚAnsweringMachine)Úget_if_addrÚget_if_hwaddr)ÚGenÚNet)ÚchbÚorb)Úconf)Úconsts)ÚARPHDR_ETHERÚARPHDR_LOOPBACKÚARPHDR_METRICOMÚDLT_ETHERNET_MPACKETÚDLT_LINUX_IRDAÚDLT_LINUX_SLLÚDLT_LINUX_SLL2ÚDLT_LOOPÚDLT_NULLÚ	ETHER_ANYÚETHER_BROADCASTÚETHER_TYPESÚ	ETH_P_ARPÚETH_P_MACSEC)ÚwarningÚScapyNoDstMacExceptionÚlog_runtime)ÚBCDFloatFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚFCSFieldÚFieldLenFieldÚIP6FieldÚIPFieldÚIntEnumFieldÚIntFieldÚLenFieldÚMACFieldÚMultipleTypeFieldÚOUIFieldÚShortEnumFieldÚ
ShortFieldÚSourceIP6FieldÚSourceIPFieldÚStrFixedLenFieldÚStrLenFieldÚ
XByteFieldÚ	XIntFieldÚXShortEnumFieldÚXShortField)Ú_GlobInterfaceType)Ú	viewitems)Úbind_layersÚPacket)Ú
PacketListÚQueryAnswerÚ
SndRcvListÚ_PacketList)ÚsendpÚsrpÚsrp1Úsrploop)	ÚchecksumÚhexdumpÚhexstrÚ	inet_ntoaÚ	inet_atonÚmac2strÚ	valid_macÚ	valid_netÚ
valid_net6)	ÚAnyÚCallableÚDictÚListÚOptionalÚTupleÚTypeÚUnionÚcast)ÚNetworkInterfacec                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚNeighborc                 C   s
   i | _ d S ©N©Ú	resolvers©Úself© r\   úF/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/l2.pyÚ__init__\   s    zNeighbor.__init__c                 C   s   || j ||f< d S rW   rX   )r[   Úl2Úl3Zresolve_methodr\   r\   r]   Úregister_l3`   s    zNeighbor.register_l3c                 C   s*   |j |j f}|| jv r&| j| ||ƒS d S rW   )Ú	__class__rY   )r[   Zl2instZl3instÚkr\   r\   r]   Úresolved   s    
zNeighbor.resolvec                 C   s   d  dd„ | jD ƒ¡S )NÚ
c                 s   s"   | ]\}}d |j |j f V  qdS )z%-15s -> %-15sN)Ú__name__)Ú.0r_   r`   r\   r\   r]   Ú	<genexpr>m   ó    z$Neighbor.__repr__.<locals>.<genexpr>)ÚjoinrY   rZ   r\   r\   r]   Ú__repr__k   s    zNeighbor.__repr__N)rf   Ú
__module__Ú__qualname__r^   ra   rd   rk   r\   r\   r\   r]   rV   [   s   rV   Z	arp_cacheéx   c           	   
   C   s6  t | tƒrtt| ƒƒ} tt| p dƒƒ} dd„ t| ƒD ƒ}|d d@ dkrfd|d d	@ |d
 |d f S tj | ¡\}}}|tjks’| tj 	|¡v r–dS |dkr¢|} t
 | ¡}|r´|S z,tttd�td| d� t|d
d|dd�}W n2 t�y } ztd|ƒ W Y d}~dS d}~0 0 |du�r2|jj}|t
| < |S dS )z6Return MAC address corresponding to a given IP addressú0.0.0.0c                 S   s   g | ]}t |ƒ‘qS r\   )r
   )rg   Úer\   r\   r]   Ú
<listcomp>}   ri   zgetmacbyip.<locals>.<listcomp>r   éð   éà   z01:00:5e:%.2x:%.2x:%.2xé   é   é   é   úff:ff:ff:ff:ff:ff©Údstúwho-has©ÚopÚpdst)ÚtypeÚifaceÚtimeoutÚverboseÚchainCCZnofilterzgetmacbyip failed on %sN)Ú
isinstancer   ÚnextÚiterrF   rG   r   ÚrouteZloopback_nameZget_if_bcastÚ
_arp_cacheÚgetrA   ÚEtherr   ÚARPr   Ú	Exceptionr   ÚpayloadÚhwsrc)	Úiprƒ   ÚtmpÚiffÚ_ÚgwÚmacÚresÚexr\   r\   r]   Ú
getmacbyipv   s>    

ú


r—   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚDestMACFieldc                 C   s   t  | |d ¡ d S rW   )r*   r^   )r[   Únamer\   r\   r]   r^   Ÿ   s    zDestMACField.__init__c                    sn   |d u r\|d ur\zt j ||j¡}W n tjy8   Y n0 |d u r\t jrPtƒ ‚nd}tdƒ t	t
| ƒ ||¡S )Nrx   z<Mac address to reach destination not found. Using broadcast.)r   Úneighborrd   r�   ÚsocketÚerrorZraise_no_dst_macr   r   Úsuperr˜   Úi2h©r[   ÚpktÚx©rb   r\   r]   rž   £   s    zDestMACField.i2hc                 C   s   t  | ||  ||¡¡S rW   ©r*   Úi2mrž   rŸ   r\   r\   r]   r¤   ²   s    zDestMACField.i2m)rf   rl   rm   r^   rž   r¤   Ú__classcell__r\   r\   r¢   r]   r˜   ž   s   r˜   c                       s4   e Zd ZdgZd	dd„Z‡ fdd„Zdd„ Z‡  ZS )
ÚSourceMACFieldÚgetifNc                 C   s(   t  | |d ¡ |d u rdd„ n|| _d S )Nc                 S   s   |   ¡ d S ©Nr   )r‡   ©r    r\   r\   r]   Ú<lambda>½   ri   z)SourceMACField.__init__.<locals>.<lambda>)r*   r^   r§   )r[   r™   r§   r\   r\   r]   r^   º   s    zSourceMACField.__init__c              
      s€   |d u rn|   |¡}|d u r tj}|rbzt|ƒ}W n0 ty` } ztd| ƒ W Y d }~n
d }~0 0 |d u rnd}tt| ƒ ||¡S )Nz Could not get the source MAC: %sú00:00:00:00:00:00)	r§   r   r€   r   rŒ   r   r�   r¦   rž   )r[   r    r¡   r‘   rp   r¢   r\   r]   rž   ¿   s    
"zSourceMACField.i2hc                 C   s   t  | ||  ||¡¡S rW   r£   rŸ   r\   r\   r]   r¤   Î   s    zSourceMACField.i2m)N)rf   rl   rm   Ú	__slots__r^   rž   r¤   r¥   r\   r\   r¢   r]   r¦   ·   s   
r¦   zEthernet (10Mb)zEthernet (3Mb)zAX.25zProteon ProNET Token RingZChaoszIEEE 802 NetworksZARCNETZHyperchannelZLanstarzAutonet Short AddressZ	LocalTalkZLocalNetz
Ultra linkZSMDSzFrame relayZATMZHDLCzFibre ChannelzSerial Line)rt   rv   rw   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   Z802_ADi¨ˆ  Z802_1AEc                   @   sV   e Zd ZdZedƒedƒeddeƒgZdgZ	dd„ Z
d	d
„ Zdd„ Zeddd„ƒZdS )rŠ   ZEthernetrz   Úsrcr   i �  Ú_defrag_posc                 C   s   t  d| j¡| j ¡  S )NÚH)ÚstructÚpackr   r�   ÚhashretrZ   r\   r\   r]   rÄ   ø   s    zEther.hashretc                 C   s(   t |tƒr$| j|jkr$| j |j¡S dS r¨   )r„   rŠ   r   r�   Úanswers©r[   Úotherr\   r\   r]   rÅ   ü   s    
zEther.answersc                 C   s
   |   d¡S )Nz%src% > %dst% (%type%))ÚsprintfrZ   r\   r\   r]   Ú	mysummary  s    zEther.mysummaryNc                 O   s4   |r0t |ƒdkr0t d|dd… ¡d dkr0tS | S ©Nr·   ú!Hrµ   r   éÜ  )ÚlenrÂ   ÚunpackÚDot3©ÚclsZ_pktÚargsÚkargsr\   r\   r]   Údispatch_hook  s    zEther.dispatch_hook)N)rf   rl   rm   r™   r˜   r¦   r5   r   Úfields_descr¬   rÄ   rÅ   rÉ   ÚclassmethodrÔ   r\   r\   r\   r]   rŠ   ñ   s   
þrŠ   c                   @   sP   e Zd ZdZedƒedƒedddƒgZdd„ Zd	d
„ Z	dd„ Z
eddd„ƒZdS )rÏ   z802.3rz   r¿   rÍ   NrÁ   c                 C   s   | j }|d |… ||d … fS rW   )rÍ   )r[   ÚsZtmp_lenr\   r\   r]   Úextract_padding  s    zDot3.extract_paddingc                 C   s   t |tƒr| j |j¡S dS r¨   )r„   rÏ   r�   rÅ   rÆ   r\   r\   r]   rÅ     s    
zDot3.answersc                 C   s   d| j | jf S )Nz802.3 %s > %s©r¿   rz   rZ   r\   r\   r]   rÉ   !  s    zDot3.mysummaryc                 O   s4   |r0t |ƒdkr0t d|dd… ¡d dkr0tS | S rÊ   )rÍ   rÂ   rÎ   rŠ   rÐ   r\   r\   r]   rÔ   %  s    zDot3.dispatch_hook)N)rf   rl   rm   r™   r˜   r¦   r)   rÕ   rØ   rÅ   rÉ   rÖ   rÔ   r\   r\   r\   r]   rÏ     s   
þrÏ   c                   @   s,   e Zd Zd ZeddƒeddƒeddƒgZdS )ÚLLCÚdsapr   ÚssapÚctrlN)rf   rl   rm   r™   r3   r!   rÕ   r\   r\   r\   r]   rÚ   .  s
   þrÚ   c                 C   s   t j}| | |j¡S rW   )r   rš   rd   r�   )r_   r`   rš   r\   r\   r]   Úl2_register_l35  s    rÞ   ZunicastÚ	broadcastZ	multicastzunicast-to-another-hostz
sent-by-us)r   rt   rv   rw   r­   c                   @   sB   e Zd ZdZeddeƒeddƒeddƒeddd	ƒe	d
de
ƒgZdS )ÚCookedLinuxzcooked linuxÚpkttyper   Ú
lladdrtypeé   Ú	lladdrlenr¿   ri   r±   Úprotoé   N)rf   rl   rm   r™   r-   ÚCOOKED_LINUX_PACKET_TYPESr6   r.   r1   r5   r   rÕ   r\   r\   r\   r]   rà   H  s   


ürà   c                
   @   sR   e Zd ZdZeddeƒeddƒeddƒeddƒe	d	de
ƒed
dƒedddƒgZdS )ÚCookedLinuxV2zcooked linux v2rå   ræ   Úreservedr   Zifindexrâ   rã   rá   rä   r¿   ri   r±   N)rf   rl   rm   r™   r5   r   r.   r(   r6   r    rç   r!   r1   rÕ   r\   r\   r\   r]   rè   S  s   


úrè   c                   @   s,   e Zd ZdZedddd�edddd	�gZd
S )ÚMPacketPreamblezMPacket PreambleÚpreambleri   r±   )ÚlengthZfcsr   z!I)ÚfmtN)rf   rl   rm   r™   r1   r#   rÕ   r\   r\   r\   r]   rê   _  s   ÿrê   c                   @   s&   e Zd Zd ZeddƒeddeƒgZdS )ÚSNAPZOUIr   ÚcodeN)rf   rl   rm   r™   r,   r5   r   rÕ   r\   r\   r\   r]   rî   f  s   
ÿrî   c                   @   sb   e Zd ZdZegZedddƒedddƒedddƒed	deƒgZ	d
d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚDot1Qz802.1QÚprior   rw   Úidrt   Úvlanrµ   r   c                 C   sB   t |tƒr2| j|jkr>| j|jkr>| j |j¡S n| j |¡S dS r¨   )r„   rð   r   ró   r�   rÅ   rÆ   r\   r\   r]   rÅ   w  s    

ÿzDot1Q.answersc                 C   s   | j dkrtS tjS ©NrÌ   )r   rÚ   r   Ú	raw_layer)r[   Úpayr\   r\   r]   Údefault_payload_class�  s    
zDot1Q.default_payload_classc                 C   s.   | j dkr&|d | j … || j d … fS |d fS rô   ©r   ©r[   r×   r\   r\   r]   rØ   ‡  s    
zDot1Q.extract_paddingc                 C   s&   t | jtƒr| j d¡S |  d¡S d S )NzA802.1q %Ether.src% > %Ether.dst% (%Dot1Q.type%) vlan %Dot1Q.vlan%z'802.1q (%Dot1Q.type%) vlan %Dot1Q.vlan%)r„   Z
underlayerrŠ   rÈ   rZ   r\   r\   r]   rÉ   �  s    zDot1Q.mysummaryN)rf   rl   rm   r™   rŠ   Z
aliastypesr   r5   r   rÕ   rÅ   r÷   rØ   rÉ   r\   r\   r\   r]   rð   o  s   



ý
rð   c                   @   s„   e Zd ZdZeddƒeddƒeddƒeddƒeddƒedeƒed	dƒed
dƒedeƒeddƒe	ddƒe	ddƒe	ddƒe	ddƒgZ
dS )ÚSTPzSpanning Tree Protocolrå   r   ÚversionZbpdutypeZ	bpduflagsZrootidZrootmacZpathcostZbridgeidZ	bridgemacZportidZagert   Zmaxager½   Z	hellotimerv   Zfwddelayr¸   N)rf   rl   rm   r™   r.   r!   r*   r   r(   r   rÕ   r\   r\   r\   r]   rú   ˜  s    órú   c                   @   sp  e Zd Zd Zeddeƒeddeƒeddddd	�ed
dddd	�eddddddddddddœ	ƒe	e
dƒdd„ dd„ ffgedddd„ d�ƒe	eddƒdd„ dd„ ffeddƒdd„ dd„ ffgeddd d„ d�ƒe	ed!eƒd"d„ d#d„ ffged!dd$d„ d�ƒe	edd%ƒd&d„ d'd„ ffedd(ƒd)d„ d*d„ ffgeddd+d„ d�ƒg	Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdS )6r‹   Úhwtypert   Úptyperæ   ÚhwlenNÚBrŽ   )rí   Z	length_ofÚplenÚpsrcr}   rv   rw   r­   r®   r¯   r°   r±   r²   )	r{   úis-atzRARP-reqzRARP-repzDyn-RARP-reqzDyn-RAR-repzDyn-RARP-errz	InARP-reqz	InARP-repc                 C   s   | j dko| jdkS ©Nrt   r¯   ©rü   rþ   r©   r\   r\   r]   rª   ¿  ri   zARP.<lambda>c                 C   s:   | j dko8| jdkp8| jd u o8|d u p8t|ƒdkp8t|ƒS r  ©rü   rþ   rÍ   rI   ©r    Úvalr\   r\   r]   rª   À  s   
c                 C   s   | j S rW   ©rþ   r©   r\   r\   r]   rª   Æ  ri   ©Zlength_fromr~   c                 C   s   | j dko| jdkS ©Nræ   r­   ©rý   r   r©   r\   r\   r]   rª   Ë  ri   c                 C   s.   | j dko,| jdkp,| jd u o,|d u p,t|ƒS r
  ©rý   r   rJ   r  r\   r\   r]   rª   Ì  s   
c                 C   s   | j dko| jdkS ©NiÝ†  r¹   r  r©   r\   r\   r]   rª   Ñ  ri   c                 C   s.   | j dko,| jdkp,| jd u o,|d u p,t|ƒS r  ©rý   r   rK   r  r\   r\   r]   rª   Ò  s   
c                 C   s   | j S rW   ©r   r©   r\   r\   r]   rª   ×  ri   Úhwdstc                 C   s   | j dko| jdkS r  r  r©   r\   r\   r]   rª   Ü  ri   c                 C   s:   | j dko8| jdkp8| jd u o8|d u p8t|ƒdkp8t|ƒS r  r  r  r\   r\   r]   rª   Ý  s   
c                 C   s   | j S rW   r  r©   r\   r\   r]   rª   ã  ri   ro   c                 C   s   | j dko| jdkS r
  r  r©   r\   r\   r]   rª   è  ri   c                 C   s.   | j dko,| jdkp,| jd u o,|d u p,t|ƒS r
  r  r  r\   r\   r]   rª   é  s   
z::c                 C   s   | j dko| jdkS r  r  r©   r\   r\   r]   rª   î  ri   c                 C   s.   | j dko,| jdkp,| jd u o,|d u p,t|ƒS r  r  r  r\   r\   r]   rª   ï  s   
c                 C   s   | j S rW   r  r©   r\   r\   r]   rª   ô  ri   c                 C   s(   t  d| j| j| jd d ¡| j ¡  S )Nz>HHHrt   rv   )rÂ   rÃ   rü   rý   r}   r�   rÄ   rZ   r\   r\   r]   rÄ   ø  s
    ÿÿzARP.hashretc                 C   sj   t |tƒsdS | j|jd kr"dS |  d¡ | | j¡}| d¡ ||j¡}|d t|ƒ… |d t|ƒ… kS )NFrt   r  r~   )r„   r‹   r}   Ú	get_fieldr¤   r  r~   rÍ   )r[   rÇ   Z	self_psrcZ
other_pdstr\   r\   r]   rÅ   ý  s    
zARP.answersc                 C   sv   t tttf |  d¡ƒ\}}| | |¡\}}t|tƒrBtt	|ƒƒ}t|t
ƒrXtj |¡S t|tƒrntj |¡S dS d S )Nr~   )NNN)rT   rQ   r+   ÚstrZgetfield_and_valZ_find_fld_pkt_valr„   r   r…   r†   r%   r   Zroute6r‡   r&   )r[   Zfldrz   Z	fld_innerr\   r\   r]   r‡   
  s    ÿ


z	ARP.routec                 C   s   d|fS )Nri   r\   rù   r\   r\   r]   rØ     s    zARP.extract_paddingc                 C   s2   | j dkr|  d¡S | j dkr(|  d¡S |  d¡S )Nrt   zARP who has %pdst% says %psrc%rv   zARP is at %hwsrc% says %psrc%zARP %op% %psrc% > %pdst%)r}   rÈ   rZ   r\   r\   r]   rÉ     s
    



zARP.mysummary)rf   rl   rm   r™   r5   ÚHARDWARE_TYPESr   r$   r-   r+   r¦   r1   r0   r/   r*   r   r&   r%   rÕ   rÄ   rÅ   r‡   rØ   rÉ   r\   r\   r\   r]   r‹   ª  sˆ   

÷ÿÿÿ	öÿÿÿÿùñÿÿÿ	öÿÿÿÿùñÇLr‹   c                 C   sD   |j d ur|j n| d¡ ||j¡}|dkr6t|jƒS t d¡ d S )Nr~   r­   z]Unable to guess L2 MAC address from an ARP packet with a non-IPv4 pdst. Provide it manually !)r   r  Zi2lenr~   r—   r   r   )r_   r`   r   r\   r\   r]   Úl2_register_l3_arp%  s    $
ÿr  c                   @   s@   e Zd ZdZeddƒeddƒeddddƒedd	d
d„ d�gZdS )Ú
GREroutingzGRE routing informationÚaddress_familyr   Z
SRE_offsetÚSRE_lenNZrouting_inforÿ   ri   c                 C   s   | j S rW   )r  r©   r\   r\   r]   rª   ;  ri   zGRErouting.<lambda>r	  )	rf   rl   rm   r™   r.   r!   r$   r2   rÕ   r\   r\   r\   r]   r  5  s   ÿýr  c                   @   sÔ   e Zd Zd ZddiZedddƒedddƒedddƒedddƒed	ddƒed
ddƒedddƒedddƒeddeƒee	ddƒdd„ ƒee	ddƒdd„ ƒee
ddƒdd„ ƒee
ddƒdd„ ƒgZeddd„ƒZdd„ ZdS )ÚGREÚseqence_number©Úsequence_numberz2.4.4Úchksum_presentr   rt   Úrouting_presentÚkey_presentÚseqnum_presentÚstrict_route_sourceÚrecursion_controlrw   Úflagsr®   rû   rå   ÚchksumNc                 C   s   | j dkp| jdkS ©Nrt   ©r  r  r©   r\   r\   r]   rª   M  ri   zGRE.<lambda>Úoffsetc                 C   s   | j dkp| jdkS r$  r%  r©   r\   r\   r]   rª   N  ri   Úkeyc                 C   s
   | j dkS r$  )r  r©   r\   r\   r]   rª   O  ri   r  c                 C   s
   | j dkS r$  ©r  r©   r\   r\   r]   rª   P  ri   c                 O   s(   |r$t  d|dd… ¡d dkr$tS | S )NrË   rv   r­   r   éˆ  )rÂ   rÎ   ÚGRE_PPTPrÐ   r\   r\   r]   rÔ   S  s     zGRE.dispatch_hookc                 C   sX   ||7 }| j rT| jd u rTt|ƒ}|d d… t|d? d@ ƒ t|d@ ƒ |dd …  }|S ©Nr­   r±   éÿ   r¯   )r  r#  rC   r	   )r[   Úprö   Úcr\   r\   r]   Ú
post_buildZ  s
    4zGRE.post_build)N)rf   rl   rm   r™   Údeprecated_fieldsr   r5   r   r"   r6   r4   rÕ   rÖ   rÔ   r/  r\   r\   r\   r]   r  ?  s(   ÿ








ôr  c                   @   sÀ   e Zd ZdZdZddiZedddƒedddƒed	ddƒed
ddƒedddƒedddƒedddƒedddƒedddƒeddeƒe	ddƒe	ddƒe
eddƒdd„ ƒe
eddƒdd„ ƒgZdd„ ZdS )r*  z9
    Enhanced GRE header used with PPTP
    RFC 2637
    zGRE PPTPr  r  r  r   rt   r  r  r  r   r!  rw   Úacknum_presentr"  r­   rû   rå   r)  Úpayload_lenNZcall_idr  c                 C   s
   | j dkS r$  r(  r©   r\   r\   r]   rª   z  ri   zGRE_PPTP.<lambda>Z
ack_numberc                 C   s
   | j dkS r$  )r1  r©   r\   r\   r]   rª   {  ri   c                 C   sR   ||7 }| j d u rNt|ƒ}|d d… t|d? d@ ƒ t|d@ ƒ |dd …  }|S r+  )r2  rÍ   r	   )r[   r-  rö   Zpay_lenr\   r\   r]   r/  }  s
    
4zGRE_PPTP.post_build)rf   rl   rm   Ú__doc__r™   r0  r   r5   r   r.   r"   r4   rÕ   r/  r\   r\   r\   r]   r*  c  s(   ÿ









ór*  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚLoIntEnumFieldc                 C   s   |d? S ©Né   r\   rŸ   r\   r\   r]   Úm2iŠ  s    zLoIntEnumField.m2ic                 C   s   t t|ƒd> S r5  )rT   ÚintrŸ   r\   r\   r]   r¤   Ž  s    zLoIntEnumField.i2mN)rf   rl   rm   r7  r¤   r\   r\   r\   r]   r4  ˆ  s   r4  ZIPv4ZOSIZ	AppletalkzNetware IPX/SPXZIPv6)rv   r°   r¹   é   r6  é   é   c                   @   s>   e Zd ZdZd Zejr&eddeƒgZ	ne
ddeƒgZ	dgZdS )ÚLoopbackz\*BSD loopback layerr   rv   rÀ   N)rf   rl   rm   r3  r™   r   ZOPENBSDr'   ÚLOOPBACK_TYPESrÕ   r4  r¬   r\   r\   r\   r]   r<  œ  s   r<  c                   @   s   e Zd ZdZdS )ÚDot1ADZ802_1ADN)rf   rl   rm   r™   r\   r\   r\   r]   r>  §  s   r>  éz   rø   ipˆ  i �  rt   i  )rå   iXe  r  )r  r  éB   rw   )rÛ   rÜ   rÝ   éª   )rï   i  r¸   c                    s¦   t | tƒrt| ƒ‰ | }n| ‰ | d }t |tƒrJ|ttj |¡d ƒfg}nt |tƒr\|g}n|}‡ fdd„|D ƒ}zt||d� t 	|¡ qtW n t
y    Y n0 dS )a¾  Poison targets' ARP cache

    :param target: Can be an IP, subnet (string) or a list of IPs. This lists the IPs
                   or subnets that will be poisoned.
    :param addresses: Can be either a string, a tuple of a list of tuples.
                      If it's a string, it's the IP to usurpate in the victim,
                      with the local interface's MAC. If it's a tuple,
                      it's ("IP", "MAC"). It it's a list, it's [("IP", "MAC")]

    Examples for target "192.168.0.2"::

        >>> arpcachepoison("192.168.0.2", "192.168.0.1")
        >>> arpcachepoison("192.168.0.1/24", "192.168.0.1")
        >>> arpcachepoison(["192.168.0.2", "192.168.0.3"], "192.168.0.1")
        >>> arpcachepoison("192.168.0.2", ("192.168.0.1", get_if_hwaddr("virbr0")))
        >>> arpcachepoison("192.168.0.2", [("192.168.0.1", get_if_hwaddr("virbr0"),
        ...                                ("192.168.0.2", "aa:aa:aa:aa:aa:aa")])

    r   c              
      s,   g | ]$\}}t |d �td|ˆ |dd� ‘qS ))r¿   r{   rx   ©r}   r  r~   rŽ   r  )rŠ   r‹   )rg   r¡   Úy©Útargetsr\   r]   rq     s   þÿz"arpcachepoison.<locals>.<listcomp>)Ú
iface_hintN)r„   r  r   r   r   r‡   Útupler?   ÚtimeÚsleepÚKeyboardInterrupt)ÚtargetÚ	addressesÚintervalZ
str_targetZcouple_listr-  r\   rD  r]   ÚarpcachepoisonÜ  s$    



ýrN  c              
   C   s  |st j | ¡d }|s t|ƒ}|du rDt| ƒ}|sDtd|  ƒ dS |du rht|ƒ}|shtd| ƒ dS td||||f ƒ tt||d�td|| |dd� t||d�td| ||dd� gd	||d
ddd� tdƒ tt||d�td|| |dd� t||d�td| ||dd� g|d� dS )aÁ  ARP MitM: poison 2 target's ARP cache

    :param ip1: IPv4 of the first machine
    :param ip2: IPv4 of the second machine
    :param mac1: MAC of the first machine (optional: will ARP otherwise)
    :param mac2: MAC of the second machine (optional: will ARP otherwise)
    :param target_mac: MAC of the attacker (optional: default to the interface's one)
    :param iface: the network interface. (optional: default, route for ip1)

    Example usage::

        $ sysctl net.ipv4.conf.virbr0.send_redirects=0  # virbr0 = interface
        $ sysctl net.ipv4.ip_forward=1
        $ sudo scapy
        >>> arp_mitm("192.168.122.156", "192.168.122.17")

    Remember to change the sysctl settings back..
    r   NzCan't resolve mac for %szMITM on %s: %s <--> %s <--> %s©rz   r¿   r{   rx   rB  úarp and arp[7] = 2g      à?rt   )ÚfilterÚinterr€   r�   r‚   ÚstorezRestoring...)r€   )	r   r‡   r   r—   ÚprintrB   rŠ   r‹   r?   )Zip1Zip2Zmac1Zmac2Z
target_macr€   rR  r\   r\   r]   Úarp_mitm  sb    
ÿÿ
ÿÿüò
ÿÿ
ÿÿüùrU  c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚARPingResultNÚARPingc                 C   s   t  | |||¡ d S rW   )r=   r^   )r[   r•   r™   Ústatsr\   r\   r]   r^   X  s    zARPingResult.__init__c           
      O   sŒ   t ƒ }d}| jD ]R\}}tj |j¡}||jkr4dn|}t|t|ƒƒ}| |t	 j||t
 jf¡ q|D ]\}}}	td||||	f ƒ qhdS )z=
        Print the list of discovered MAC addresses.
        r   Úunknownz  %-17s %-*s %sN)Úlistr•   r   ZmanufdbZ_get_short_manufr¿   ÚmaxrÍ   ÚappendrŠ   r‹   r  rT  )
r[   rÒ   ÚkwargsÚdataÚpaddingr×   ÚrZmanufr¿   r  r\   r\   r]   Úshow_  s    zARPingResult.show)NrW  N)rf   rl   rm   r^   ra  r\   r\   r\   r]   rV  W  s
      ý
rV  rv   c                 K   sŒ   |du rt j}ttdd�t| d� f|d|| dœ|¤Ž\}}t|jƒ}|rp|durp|D ]}|d jt|d j	< qV|dur„|r„| 
¡  ||fS )zÀSend ARP who-has requests to determine which hosts are up
arping(net, [cache=0,] [iface=conf.iface,] [verbose=conf.verb]) -> None
Set cache=True if you want arping to modify internal ARP-CacheNrx   ry   ©r~   rP  )r‚   rQ  r�   rF  rt   )r   Úverbr@   rŠ   r‹   rV  r•   rŽ   rˆ   r  ra  )Únetr�   Úcacher‚   rÓ   ÚansÚunansÚpairr\   r\   r]   Úarpingr  s&    ÿûú

ri  úff:ff:00:00:00:00c                 K   s4   t t|d�td| d� ft| dddœ|¤Ž}|duS )zLTry to guess if target is in Promisc mode. The target is provided by its ip.ry   r{   r|   rt   r   )r   rF  r�   r‚   N)rA   rŠ   r‹   r   )r�   Ú
fake_bcastrÓ   Ú	responsesr\   r\   r]   Ú
is_promiscŒ  s    ,rm  úff:ff:ff:ff:ff:fec                 K   sJ   t t|d�t| d� fd|| dœ|¤Ž\}}t|jdd�}| ¡  ||fS )zqSend ARP who-has requests to determine which hosts are in promiscuous mode
    promiscping(net, iface=conf.iface)ry   rb  rP  )rQ  r�   rF  ZPROMISCPing©r™   )r@   rŠ   r‹   rV  r•   Údisplay)rd  r�   rk  rÓ   rf  rg  r\   r\   r]   Úpromiscping–  s    ÿÿ
rq  c                   @   sL   e Zd ZdZdZdZeeƒZddd„Z	dd„ Z
d	d
„ Zddd„Zdd„ ZdS )ÚARP_ama­  Fake ARP Relay Daemon (farpd)

    example:
    To respond to an ARP request for 192.168.100 replying on the
    ingress interface::

      farpd(IP_addr='192.168.1.100',ARP_addr='00:01:02:03:04:05')

    To respond on a different interface add the interface parameter::

      farpd(IP_addr='192.168.1.100',ARP_addr='00:01:02:03:04:05',iface='eth0')

    To respond on ANY arp request on an interface with mac address ARP_addr::

      farpd(ARP_addr='00:01:02:03:04:05',iface='eth1')

    To respond on ANY arp request with my mac addr on the given interface::

      farpd(iface='eth1')

    Optional Args::

     inter=<n>   Interval in seconds between ARP replies being sent

    ZfarpdÚarpNc                 C   sB   t |tƒrt|ƒ| _n|| _t |tƒr2t|ƒ| _n|| _|| _d S rW   )r„   r  r   ÚIP_addrÚfrom_ipÚARP_addr)r[   rt  rv  ru  r\   r\   r]   Úparse_optionsÂ  s    

zARP_am.parse_optionsc                 C   sL   |  t¡sdS |t }|jdkoJ| jd u s6|j| jv oJ| jd u pJ|j| jv S )NFrt   )Zhaslayerr‹   r}   rt  r~   ru  r  )r[   Úreqrs  r\   r\   r]   Ú
is_requestÎ  s    

ÿýzARP_am.is_requestc           	      C   s°   |t  }|t }d| jv r6ttttf | j d¡ƒ}ntj	 	|j
¡\}}}|| _| jd u r€zt|ƒ}W q† ty|   d}Y q†0 n| j}t |j|d�td||j|j|j
d� }|S )Nr€   r«   rO  r  )r}   rŽ   r  r  r~   )rŠ   r‹   ÚoptsendrT   rS   rU   r  r‰   r   r‡   r  r‘   rv  r   rŒ   r¿   r~   rŽ   )	r[   rx  Zetherrs  r‘   Úar“   rv  Úrespr\   r\   r]   Ú
make_replyÙ  s.    

ÿüÿzARP_am.make_replyc                 C   s>   d| j v r | j|fi | j ¤Ž n| j|fd| ji| j ¤Ž d S )Nr€   )rz  Úsend_functionr‘   )r[   Úreplyr~  r\   r\   r]   Ú
send_replyò  s    
zARP_am.send_replyc                 C   s    t d| ¡ | ¡ | jf ƒ d S )Nz%s ==> %s on %s)rT  Úsummaryr‘   )r[   rx  r  r\   r\   r]   Úprint_replyù  s    zARP_am.print_reply)NNN)N)rf   rl   rm   r3  Zfunction_namerQ  Ústaticmethodr?   r~  rw  ry  r}  r€  r‚  r\   r\   r\   r]   rr  £  s   

rr  c                 K   s&   t tƒ t| d� fdd„ ddœ|¤ŽS )zExploit Etherleak flawrb  c                 S   s"   t j| d v o t| d t j jƒS r$  )r   Zpadding_layerrE   Úload)Zs_rr\   r\   r]   rª     ri   zetherleak.<locals>.<lambda>rs  )ZprnrQ  )r@   rŠ   r‹   )rK  rÓ   r\   r\   r]   Ú	etherleakþ  s    þþr…  r,  c                 K   sÔ  i }t | d�D ]¨}tj |j¡d }t|ƒ}t|ƒ}||_||_|dkrP||_n&t	|ƒd|… |_t	|jƒd|… |_|dkr†||_
nt|ƒd|… |_
| |g ¡ t|td�| ¡ qtƒ tdd� }	}
t|ƒD ]>\}}t|f|d	d
œ|¤Ž\}}|	|7 }	|
|7 }
d|	_d|
_qÒ|	D ]´\}}t |v�r,�q|t  }| d¡ ||j¡}|dk�r~t|ƒdk�r~tdƒ t|dd… ƒ tƒ  | d¡ ||j
¡}|dk�rt|ƒdk�rtdƒ t|dd… ƒ tƒ  �q|	|
fS )z†Exploit ARP leak flaws, like NetBSD-SA2017-002.

https://ftp.netbsd.org/pub/NetBSD/security/advisories/NetBSD-SA2017-002.txt.asc

    rb  r   r­   Nr¯   rÙ   Z
Unansweredro  rs  )r€   rQ  ZResultsr  rŽ   )r‹   r   r‡   r~   r   r   r   rþ   r  rG   rŽ   rH   Ú
setdefaultr\  rŠ   r   r=   r;   r8   r@   Zlistnamer  r¤   rÍ   rT  rD   )rK  r   rþ   rÓ   Z
pkts_ifacer    r€   r  rŽ   rf  rg  ZpktsZans_newZ	unans_newr’   Zrcvr\   r\   r]   Úarpleak  sN    	ÿ

r‡  )r   )r¸   )NNNNrw   )rv   r   N)rj  )rv   rn  )r,  r,  )šr3  Ú
__future__r   r   rÂ   rH  r›   Zscapy.ansmachiner   Z
scapy.archr   r   Zscapy.base_classesr   r   Zscapy.compatr	   r
   Zscapy.configr   Zscapyr   Z
scapy.datar   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.errorr   r   r   Zscapy.fieldsr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   Zscapy.interfacesr7   Zscapy.libs.sixr8   Zscapy.packetr9   r:   Zscapy.plistr;   r<   r=   r>   Zscapy.sendrecvr?   r@   rA   rB   Zscapy.utilsrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r‡   Zscapy.router  Z_ResolverCallablerV   rš   ZnetcacheZ	new_cacherˆ   ÚcommandsÚregisterr—   r˜   r¦   r  rŠ   rÏ   rÚ   rÞ   ra   rç   rà   rè   rê   rî   rð   rú   r‹   r  r  r  r*  r4  r=  r<  r>  rõ   Zl2typesZregister_num2layerZregister_layer2numZl3typesrN  rU  rV  ri  rm  rq  rr  r…  r‡  r\   r\   r\   r]   Ú<module>   s6  @l,,'ëû	&{
$%ü


 ý2     ùG	[
