
    h:                     0   d Z ddlZddl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mZmZ ddlmZ ddlmZmZ dd	lmZ d
Zd ZddddZdddZddddZdddZddddZddd d!d"d#d$Zd%dd&d'd!d(d)d*d+d,d-
Zd.d/d0d1d2d3d4d5d6Zd7d8iZd7d9iZ  G d: d;e          Z! G d< d=e          Z" G d> d?e          Z#d@d%dAdBd&dCddDdEdFd)dGZ$dHdIdJdKdLdMZ% G dN dOe          Z& G dP dQe          Z'dRdSdTdUZ(dVdKdLdWZ) G dX dYe          Z* G dZ d[e          Z+ G d\ d]e          Z, G d^ d_e          Z- G d` dae-          Z. eee.dbc            eee.dbd            ee.e!d7dbe            ee.e"d7dbf           e/dgk    rddhl0m1Z1  e1 e2            dij           dS dS )kz[
TACACS

Based on tacacs+ v6 draft
https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06
    N)Packetbind_layers)ByteEnumField	ByteFieldIntField)FieldListField)FieldLenFieldConditionalFieldStrLenField)TCPchborb)conftestc                 x    dd}t                    t                     k     rt          j                    }|                    t	          j        d|                     |                    |                                           |                    t	          j        d||                     |                    |           |                                }|z  t                    t                     k     d                     fdt          t                               D                       S )z|

    Obfuscation methodology from section 3.7
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-3.7

        !Iz!BBc              3      K   | ]<}t          t          |                   t          |                   z            V  =d S Nr   ).0ipadpays     X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/tacacs.py	<genexpr>zobfuscate.<locals>.<genexpr>8   sD      LLqCCFc#a&kk122LLLLLLr   )
lenhashlibmd5updatestructpackencodedigestjoinrange)r   secret
session_idversionseqcurr_padmsgr   s   `      @r   	obfuscater-      s    CH
 c((SXX

kmm

6;tZ00111

6==??###

6;ugs33444

8::<<x c((SXX

 88LLLLLE#c((OOLLLLLLr   RootUserMinimum)      r   TacacszTacacs+)r2      AuthenticationAuthorization
Accounting)r2         UnencryptedzSingle Connection)r2      LoginzChange PasszSend Authentication)r2   r8   r;   ASCIIPAPCHAPARAPMSCHAPMSCHAPv2)r2   r8   r9   r;         NoneEnablePPPPTRCMDX25NASIFwProxy)
r   r2   r8   r9   r;   rC   rD         	   PASSFAILGETDATAGETUSERGETPASSRESTARTERRORFOLLOW)r2   r8   r9   r;   rC   rD   rM      r2   NOECHOABORTc                   p   e Zd ZdZdZ edde           edde           edde           edde	           e
dd	d
d           e
dd	d
d           e
dd	d
d           e
dd	d
d           e eddd           d            eddd            eddd            eddd           gZd	S )TacacsAuthenticationStartz

    Tacacs authentication start body from section 4.1
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-4.1

    z Tacacs Authentication Start Bodyactionr2   priv_lvlauthen_typeauthen_serviceuser_lenN!Buserfmt	length_ofport_lenportrem_addr_lenrem_addrdata_lendata c                     | j         S r   ra   xs    r   <lambda>z"TacacsAuthenticationStart.<lambda>   s
    RSR\ r   length_fromc                     | dk    S )Nrm    rp   s    r   rr   z"TacacsAuthenticationStart.<lambda>   s
    a2g r   c                     | j         S r   rg   rp   s    r   rr   z"TacacsAuthenticationStart.<lambda>        r   c                     | j         S r   ri   rp   s    r   rr   z"TacacsAuthenticationStart.<lambda>       Q^ r   c                     | j         S r   rk   rp   s    r   rr   z"TacacsAuthenticationStart.<lambda>   ry   r   )__name__
__module____qualname____doc__namer   TACACSAUTHENACTIONTACACSPRIVLEVELTACACSAUTHENTYPETACACSAUTHENSERVICEr	   r
   r   fields_descrv   r   r   r\   r\   q   s<         .D =1.@AA =Q@@ =3CDD =!116IJJ =TtvNNN =TtvNNN =4:VVV =TtvNNN##KKH\H\$]$]$]$5$57 7;vr7K7KLLL;z2;S;STTT;vr7K7KLLLNKKKr   r\   c            
           e Zd 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            e	ddd           gZ
dS )TacacsAuthenticationReplyz

    Tacacs authentication reply body from section 4.2
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-4.2

    z Tacacs Authentication Reply Bodystatusr2   flagsr   server_msg_lenN!H
server_msgrd   rk   rl   rm   c                     | j         S r   r   rp   s    r   rr   z"TacacsAuthenticationReply.<lambda>   	    qGW r   rs   c                     | j         S r   r~   rp   s    r   rr   z"TacacsAuthenticationReply.<lambda>   ry   r   )r   r   r   r   r   r   TACACSREPLYPASSTACACSREPLYFLAGSr	   r   r   rv   r   r   r   r      s          .D =1o>> =!-=>> =!14T\ZZZ =TtvNNN;|R=W=WXXX;vr7K7KLLLNKKKr   r   c            	           e Zd ZdZdZ edddd           edddd	           ed
de           eddd            ed	dd           gZ	dS )TacacsAuthenticationContinuez

    Tacacs authentication continue body from section 4.3
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-4.3

    z#Tacacs Authentication Continue Bodyuser_msg_lenNr   user_msgrd   rk   rl   r   r2   rm   c                     | j         S r   )r   rp   s    r   rr   z%TacacsAuthenticationContinue.<lambda>   r|   r   rs   c                     | j         S r   r~   rp   s    r   rr   z%TacacsAuthenticationContinue.<lambda>   ry   r   )
r   r   r   r   r   r	   r   TACACSCONTINUEFLAGSr   r   rv   r   r   r   r      s          1D =4:VVV =TtvNNN =!-@AA;z2;S;STTT;vr7K7KLLL	NKKKr   r   zNot Setz
Kerberos 5LineLocalGuestRadiusz
Kerberos 4)r   r2   r8   r9   r;   rC   rD   rN             zPass Addz	Pass replFailErrorFollow)r2   r8   r   r   !   c                   v   e Zd ZdZdZ edde           edde           edde           edde	           e
d	d
dd           e
dd
dd           e
dd
dd           e
dd
dd           edg  edd          d            eddd            eddd            eddd           gZd Zd
S )TacacsAuthorizationRequestz

    Tacacs authorization request body from section 5.1
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-5.1

    z!Tacacs Authorization Request Bodyauthen_methodr   r^   r2   r_   r`   ra   Nrb   rc   rd   rg   rh   ri   rj   arg_cntarg_len_listre   count_ofrm   c                     | j         S r   r   pkts    r   rr   z#TacacsAuthorizationRequest.<lambda>       #+ r   rs   c                     | j         S r   ro   rp   s    r   rr   z#TacacsAuthorizationRequest.<lambda>   ry   r   c                     | j         S r   rx   rp   s    r   rr   z#TacacsAuthorizationRequest.<lambda>   ry   r   c                     | j         S r   r{   rp   s    r   rr   z#TacacsAuthorizationRequest.<lambda>   r|   r   c                 >    | j         dk    rt          S t          j        S Nr   r   TacacsPacketArgumentsr   padding_layerselfr   s     r   guess_payload_classz.TacacsAuthorizationRequest.guess_payload_class       <!((!!r   )r   r   r   r   r   r   TACACSAUTHORTYPEr   r   r   r	   r   r   r   r   r   rv   r   r   r   r      sS         /D =!5EFF =Q@@ =3CDD =!116IJJ =TtvNNN =TtvNNN =4:VVV =Dd^TTT!>."iiA6F6F.E.EG G G;vr7K7KLLL;vr7K7KLLL;z2;S;STTTVK" " " " "r   r   c                       e Zd ZdZdZ edde           edddd	           ed
ddd           edddd           edg  e	dd          d            e
ddd            e
ddd           gZd ZdS )TacacsAuthorizationReplyz

    Tacacs authorization reply body from section 5.2
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-5.2

    zTacacs Authorization Reply Bodyr   r   r   Nrb   r   r   r   r   r   rd   rk   rl   rm   c                     | j         S r   r   r   s    r   rr   z!TacacsAuthorizationReply.<lambda>   r   r   rs   c                     | j         S r   r   rp   s    r   rr   z!TacacsAuthorizationReply.<lambda>   r   r   c                     | j         S r   r~   rp   s    r   rr   z!TacacsAuthorizationReply.<lambda>   ry   r   c                 >    | j         dk    rt          S t          j        S r   r   r   s     r   r   z,TacacsAuthorizationReply.guess_payload_class   r   r   )r   r   r   r   r   r   TACACSAUTHORSTATUSr	   r   r   r   r   r   rv   r   r   r   r      s          -D =1.@AA =Dd^TTT =!14T\ZZZ =TtvNNN!>."iiA6F6F.E.EG G G;|R=W=WXXX;vr7K7KLLLNK" " " " "r   r   StartStopWatchdog)r8   r;   rN   Success)r2   r8   r   c                      e Zd ZdZdZ edde           edde           edde           edde	           ed	de
           ed
ddd           edddd           edddd           edddd           edg  edd          d            eddd            eddd            eddd           gZd ZdS )TacacsAccountingRequestz

    Tacacs accounting request body from section 6.1
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-6.1

    zTacacs Accounting Request Bodyr   r   r   r^   r2   r_   r`   ra   Nrb   rc   rd   rg   rh   ri   rj   r   r   r   rm   c                     | j         S r   r   r   s    r   rr   z TacacsAccountingRequest.<lambda>  r   r   rs   c                     | j         S r   ro   rp   s    r   rr   z TacacsAccountingRequest.<lambda>  ry   r   c                     | j         S r   rx   rp   s    r   rr   z TacacsAccountingRequest.<lambda>  ry   r   c                     | j         S r   r{   rp   s    r   rr   z TacacsAccountingRequest.<lambda>  r|   r   c                 >    | j         dk    rt          S t          j        S r   r   r   s     r   r   z+TacacsAccountingRequest.guess_payload_class!  r   r   )r   r   r   r   r   r   TACACSACNTFLAGSr   r   r   r   r	   r   r   r   r   r   rv   r   r   r   r     sd         ,D =!_== =!5EFF =Q@@ =3CDD =!116IJJ =TtvNNN =TtvNNN =4:VVV =Dd^TTT!>."iiA6F6F.E.EG G G;vr7K7KLLL;vr7K7KLLL;z2;S;STTTVK" " " " "r   r   c            	           e Zd ZdZdZ edddd           edddd	           ed
de           eddd            ed	dd           gZ	dS )TacacsAccountingReplyz

    Tacacs accounting reply body from section 6.2
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-6.2

    zTacacs Accounting Reply Bodyr   Nr   r   rd   rk   rl   r   rm   c                     | j         S r   r   rp   s    r   rr   zTacacsAccountingReply.<lambda>4  r   r   rs   c                     | j         S r   r~   rp   s    r   rr   zTacacsAccountingReply.<lambda>5  ry   r   )
r   r   r   r   r   r	   r   TACACSACNTSTATUSr   r   rv   r   r   r   r   '  s          *D =!14T\ZZZ =TtvNNN =41ABB;|R=W=WXXX;vr7K7KLLL	NKKKr   r   c                   H    e Zd ZdZdgZdZ eddd           gZd Zd	 Z	d
S )r   zx

    Class defined to handle the arguments listed at the end of tacacs+
    Authorization and Accounting packets.

    _lenzArguments in Tacacs+ packetrl   rm   c                     | j         S r   )r   r   s    r   rr   zTacacsPacketArguments.<lambda>C  s    38 r   rs   c                     | j         }d}t          |t                    r!|j         }|dz  }t          |t                    !|j        |         | _        |S Nr   r2   )
underlayer
isinstancer   r   r   )r   scurr   s       r   pre_dissectz!TacacsPacketArguments.pre_dissectE  s^    o 344 	.CFA 344 	 $Q'	r   c                     | j         }d}t          |t                    r!|j         }|dz  }t          |t                    !|dz   |j        k     rt          S t          j        S r   )r   r   r   r   r   r   )r   r   r   r   s       r   r   z)TacacsPacketArguments.guess_payload_classQ  sj    o 344 	.CFA 344 	 q53;((!!r   N)
r   r   r   r   	__slots__r   r   r   r   r   rv   r   r   r   r   8  sg          I(D;vr7K7KLLLMK
 
 
" " " " "r   r   c                       e Zd ZdZd ZdS )TacacsClientPacketz

    Super class for tacacs packet in order to get them unencrypted
    Obfuscation methodology from section 3.7
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-3.7

    c                 j    | j         dk    r't          |t          | j        | j        | j                  }|S r   )r   r-   SECRETr(   r)   r*   r   s     r   post_dissectzTacacsClientPacket.post_dissecti  s-    :??C$,QQC
r   N)r   r   r   r   r   rv   r   r   r   r   _  s-             r   r   c            	           e Zd ZdZdZ edde           edde           edd           edd	e	           e
d
d	           e
dd          gZd Zd Zd Zd ZdS )TacacsHeaderzy

    Tacacs Header packet from section 3.8
    https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06#section-3.8

    zTacacs Headerr)   r4   typer2   r*   r   r   r(   lengthNc                    | j         dk    r| j        dz  dk    rt          S t          t	          j        d|dd                             t          |dd                    k    rt          S t          t	          j        d|d d                             t          |dd                    k    rt          S | j         dk    r| j        dz  dk    rt          S t          S | j         d	k    r| j        dz  dk    rt          S t          S t          j        S )
Nr2   r8   r   bbbbr;   rN   z!hhrC   r9   )r   r*   r   sumr!   unpackr   r\   r   r   r   r   r   r   	raw_layer)r   payloads     r   r   z TacacsHeader.guess_payload_class  s     9>>x!|q  006=166773wqrr{;K;KKK00V]5'"1"+66773wqrr{;K;KKK33 9>>x!|q  //-- 9>>x!|q  ,,**~r   c                     | j         /|r-|d d         t          j        dt          |                    z   }| j        dk    r't          |t          | j        | j        | j	                  }||z   S )Nr   r   )
r   r!   r"   r   r   r-   r   r(   r)   r*   )r   pr   s      r   
post_buildzTacacsHeader.post_build  sd     ;3#2#T3s88444A:??C$,QQC3wr   c                 6    t          j        d| j                  S )NI)r!   r"   r(   )r   s    r   hashretzTacacsHeader.hashret  s    {3000r   c                     t          |t                    o2| j        |j        dz   k    o| j        |j        k    o| j        |j        k    S )Nr2   )r   r   r*   r   r(   )r   others     r   answerszTacacsHeader.answers  sN    5,// 4EIM)4	UZ'4 5#33	5r   )r   r   r   r   r   r   TACACSVERSION
TACACSTYPEr   TACACSFLAGSr   r   r   r   r   r   rv   r   r   r   r   q  s          D =C?? =J779UA&& =![998L!,,8Hd++-K  <
 
 
1 1 15 5 5 5 5r   r   1   )dport)sport)r   r  )r   r  __main__)interactztacacs+)mydictmybanner)3r   r!   r   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   scapy.layers.inetr   scapy.compatr   r   scapy.configr   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   
scapy.mainr  globalsrv   r   r   <module>r     s      , , , , , , , , ; ; ; ; ; ; ; ; ; ; ' ' ' ' ' ' E E E E E E E E E E ! ! ! ! ! ! ! ! ! ! ! ! ! !      	M M M: ! ! ! ! "  
  %' ' !&.0 0  !# #  !!"   #	% 	%  ! ! x= 'l N N N N N N N N2N N N N N N N N$N N N N N6 N N N* !#  $
  
   $$ !"	$ $ " " " " " " " "<" " " " "v " " ":  " " ! " " 
" " " " "f " " ">N N N N NF N N N"$" $" $" $" $"F $" $" $"N       $B5 B5 B5 B5 B5% B5 B5 B5J CR ( ( ( ( CR ( ( ( ( L3!2 F F F F L3!2 F F F Fz######HGGII	222222 r   