
    hi=                         d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lm Z m!Z!m"Z"m#Z#m$Z$  G d
 de%          Z& G d de&          Z'dS )z!
DCE/RPC server as per [MS-RPCE]
    N)deque)get_if_addr)conf)MTU)	RandShort)DceRpc5DceRpcSessionDceRpc5BindDceRpc5BindAckDceRpc5BindNakDceRpc5Auth3DceRpc5AlterContextDceRpc5AlterContextRespDceRpc5ResultDceRpc5RequestDceRpc5ResponseDceRpc5TransferSyntaxDceRpc5PortAnyCommonAuthVerifierDCE_RPC_INTERFACESDCERPC_TransportRPC_C_AUTHN_LEVEL)ept_map_Requestept_map_Responsetwr_p_tprotocol_tower_tprot_and_addr_tc                       e Zd Zd ZdS )_DCERPC_Server_metaclassc                     |                     dd |                                D                        t                              | |||          S )Ndcerpc_commandsc                 >    i | ]}t          |d           |j        |S dcerpc_command)hasattrr$   ).0xs     a/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/msrpce/rpcserver.py
<dictcomp>z4_DCERPC_Server_metaclass.__new__.<locals>.<dictcomp>5   s-    WWWQ'!EU:V:VWQqWWW    )
setdefaultvaluestype__new__)clsnamebasesdcts       r(   r.   z _DCERPC_Server_metaclass.__new__2   sN    WW#**,,WWW	
 	
 	
 ||Cuc222r*   N)__name__
__module____qualname__r.    r*   r(   r   r   1   s#        3 3 3 3 3r*   r   c                       e Zd Z	 	 	 	 	 ddZd Zed             Zd Zd Ze	dd
            Z
d Zd Ze                    e          d             ZdS )DCERPC_ServerFTNc                     || _         t          di || _        t                      | _        || _        |rd| _        nd| _        || _        || _        |pi | _	        || _
        d S )NNDR64zNDR 2.0r6   )	transportr	   sessionr   queuendr64ndr_namelocal_ipportportmapverb)selfr;   r>   rC   r@   rA   rB   kwargss           r(   __init__zDCERPC_Server.__init__;   sn     #$..v..WW

 	&#DMM%DM 	}"			r*   c                     	 |                     t                    }|sd S |                      |           	 |                                 }|sn#|                    t	          |                     :oN)recvr   get_responsesendbytes)rD   sockpktresps       r(   loopzDCERPC_Server.loopS   su    
	'))C..C IIcNNN'((** 		%++&&&	'
	'r*   c                       fd}|S )z
        A decorator that registers a DCE/RPC responder to a command.
        See the DCE/RPC documentation.

        :param reqcls: the DCE/RPC packet class to respond to
        c                     | _         | S rH   r#   )funcreqclss    r(   decoz"DCERPC_Server.answer.<locals>.decoi   s    "(DKr*   r6   )rT   rU   s   ` r(   answerzDCERPC_Server.answer`   s#    	 	 	 	 	 r*   c                 D    | j                             |j                    dS )z6
        Extend a DCE/RPC server into another
        N)r!   update)rD   
server_clss     r(   extendzDCERPC_Server.extendo   s$     	##J$>?????r*   c                 t    |t                    j        j        }|| j        v r | j        |         | |          S d S rH   )r   payload	__class__r!   )rD   reqr/   s      r(   
make_replyzDCERPC_Server.make_replyu   s?    .!)3$&&&,4',T3777tr*      c                 V   	
 |t           j        k    r:t          j        t          j        t          j                  
t          |pt          j                  	 
                    t          j	        t          j
        d           n# t          $ r Y nw xY w
                    f           
                    d           g 	                    dd          r4t          t          j                            d j        z                        	
fd}|r)t'          j        |                                           
S  |             dS |t           j        k    r:dd	lm}                     d
g             |j        d|pt          j        | dS t7          d          )a%  
        Spawn a DCE/RPC server

        :param transport: one of DCERPC_Transport
        :param iface: the interface to spawn it on (default: conf.iface)
        :param port: the port to spawn it on (for IP_TCP or the SMB server)
        :param bg: background mode? (default: False)
              rC   TzServer %s started. Waiting...c                     	 	 	                                 \  } }                    |            t          t          j                            dt          |          z                        t          j        fd}t          j
        |j        | f                                           # t          $ r1 t          d           	                    t          j                   Y nt"          $ r t          d           Y nw xY wD ]F}	 |                    t          j                   |                                 7# t&          $ r Y Cw xY w	                                 d S # D ]F}	 |                    t          j                   |                                 7# t&          $ r Y Cw xY w	                                 w xY w)NTu   ┃ Connection received from %s)r@   rA   )targetargsz
X Exiting.zX Server closed.)acceptappendprintr   color_themegoldreprr   NCACN_IP_TCP	threadingThreadrP   startKeyboardInterruptshutdownsocket	SHUT_RDWROSErrorclose	Exception)
clientsocketaddressserverrM   r/   rE   r@   rA   socketsssocks
       r(   _runz!DCERPC_Server.spawn.<locals>._run   s   ""05-g|444 ,11 DtG}} T   
 "%,9"%-!%" " %	" " "(#);l_  %'''!"" ) 5 5 5,'''NN6#344444 . . .,-----. !( ! !! MM&*:;;; JJLLLL( ! ! ! D!KKMMMMM !( ! !! MM&*:;;; JJLLLL( ! ! ! D!KKMMMMsf   B.B1 18D)E( +DE( DE( 3E
EE(G.3F"!G"
F/	,G.F/	/G)re   r   )
SMB_Servershares)ifacerA   bgDCERPC_SERVER_CLSzUnsupported transport :(Nr6   )r   rm   rs   AF_INETSOCK_STREAMr   r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRru   bindlistengetri   rj   greenr3   rn   ro   rp   NCACN_NPscapy.layers.smbserverr~   r+   spawn
ValueError)r/   r;   r   rA   r   rE   r}   r~   r@   r{   r|   s   `  ` `  @@@r(   r   zDCERPC_Server.spawn|   s    (555M&.&2DEEE"5#6DJ77H  !2F4GKKKK   JJ$'(((LLOOOGzz&$'' $**7#,F    "  "  "  "  "  "  "  "  "  "D   ---33555 *333999999h+++#:# )tz"%     7888s   +B	 	
BBc                     t          |t                    rt          |          }n|}d }t          j        |v r@|t          j                 j        }|t          j                 j                                          j        	                    |          }t          |j
        |j        |j        |j                  }t          |v st          |v s
t           |v r j        rt%          t          j                            d|j        j        j        z   j        j        r<d j        j        j        j         j        j        d j        j        j         nddndz                         j        j        sv j                             j                            |t?                      z                        j        r,t%          t          j                             d                     nd\  }} j        j        r|j!        r|j!        j"        r j        j        #                     j        j$        |j!        j"                  \   j        _$        }}tK          |j!        j                   j        _        |j!        j&         j        _&        t           |v rK|d	k    r,t%          t          j                             d
                     | '                    |           d S |6tQ          |j!        j)        |j!        j        |j!        j&        |          |_!         fdfd|j*        D             } j+        'd j        j        j        ,                                z  }n)t[           j+                  ,                                dz   }t          |v rt\          }	nt^          }	 j                             j                            | |	ta                      tc          |          |          z                        j        rct%          t          j        2                    d|	j         d j        j        j         d|3                                 d j4                              n
tj          |v r  j        rIt%          t          j                            d|tj                   j        j        j        z                        6                    |          }
|
r j                             j                            |to          tq          |
          |j9                  z  |
z                        j        r9t%          t          j        2                    d|
j        j        z                       | '                    |           d S d S )N)endianencodingfloatcall_idz<< %sz (with z -  )z$! DceRpc5BindNak (unknown interface))Nr   r   z! DceRpc5Auth3 failed)	auth_type
auth_levelauth_context_id
auth_valuec           	      l   | j         d                             d          }|j        k    rAt          ddt	          | j         d         j        | j         d         j                            S |dk    r!t          ddt	          dd                    S t          ddt	          dd                    S )	Nr   z	%if_uuid%)if_uuid
if_version)resultreasontransfer_syntaxzBind Time Feature Negotiation   NULL   )transfer_syntaxessprintfr?   r   r   r   r   )ctxr0   rD   s     r(   
get_resultz&DCERPC_Server.recv.<locals>.get_result"  s    03;;KHHDt},,,#$#$,A(+(=a(@(H+.+@+C+N- - -       !@@@,#$#$,A(.+,- - -        -#$#$,A(.+,- - -      r*   c                 &    g | ]} |          S r6   r6   )r&   r'   r   s     r(   
<listcomp>z&DCERPC_Server.recv.<locals>.<listcomp>B  s!    CCCQ::a==CCCr*   s   \\PIPE\\%s     )	port_spec)assoc_group_idsec_addrresultsz>>  z is on port 'z' using z<< REQUEST: %s)
alloc_hintcont_idz>> RESPONSE: %s):
isinstancerL   r   r   padding_layerload
underlayerremove_payloadr<   in_pktr   r   r   r   r
   r   r   rC   ri   rj   openingr\   r]   r3   sspr   r0   rpc_bind_interfacer=   rZ   out_pktr   failauth_verifierr   GSS_Accept_sec_context
sspcontextr   r   rI   r   r   context_elemrA   encodestrr   r   r   r   successdecoder?   r   r_   r   lenr   )rD   datar^   padhdrr   statusr   r   r/   rO   r   s   `          @r(   rI   zDCERPC_Server.recv   s   dE"" 	$--CCC$$d().C"#.==???l!!#&&:\)K	
 
 
 #!4!;!;|s?R?Ry $,,#+"7"@@  $|/
$ 
$ $ 0 : C C (,|'>'J %I$,*A*F$H$H$H)+%, %,	  "$   $ <2 h
!!$,"6"6s^=M=M7M"N"NOOO9 Y$*//0VWWXXX%,"
FL$) )4 (??/1B1M 	/" /@)4/ /DL+ 473D3TDL0#s**!Q;;!$"2"7"78O"P"PQQQ? IIcNNN "-,>&)&7&A'*'8'C,/,=,M'1	- - -)    @ DCCC#2BCCC9$ ,,9>EEGGH I !$DI 5 5 7 7' AI#%%(CC1C
!!L((#+4;;%3*3& & & %,  	 	   9 (00X#, X X1P1U X X,5,<,<,>,>X XHLX X    s""y $,,(n-5?HI    ??3''D 
!!L(()'*4yy$'K  
  	 	 	 9 (00-1HI    ?IIcNNNNN ?r*   c                 X    	 | j                                         S # t          $ r Y d S w xY wrH   )r=   popleft
IndexError)rD   s    r(   rJ   zDCERPC_Server.get_response  s=    	:%%''' 	 	 	44	s    
))c                    | j         t          j        k    rt          d          t	          |t
                                       d                    }|j        d         j        }|j        d         j	        dz  |j        d         j
        z  }d}||ft          v r%t          ||f         }|| j        v r| j        |         }|t          t          t	          |j        d         |j        d         |j        d         t          ddd|	          t          dd
d| j        pd	          g                              }t#          |g| j                  }|j        |j        _        n	 |S )z,
        Answer to ept_map_Request.
        Unimplementedzmap_tower.tower_octet_stringr      Nrb   r   rm   )
lhs_lengthprotocol_identifier
rhs_lengthrhsIP   z0.0.0.0)floors)tower_octet_string)ITowersr>   )r;   r   rm   r   r   r   valueofr   uuidr   versionr   rB   r   rL   r   r@   r   r>   
max_towersr   	max_count)	rD   r^   towerr   r   rA   	interface
resp_towerrO   s	            r(   ept_mapzDCERPC_Server.ept_map  s   
 >-:::_---  (()GHH
 
 |A#l1o)R/5<?3JJ
 *!333*D*+=>IDL((|I. #($!LO!LO!LO++,4B+,$(	   ,+,48+,$(M$>Y	     $ $  J. $ZL
KKKD%(^DL"" r*   )FTNNN)Nr`   F)r3   r4   r5   rF   rP   staticmethodrV   rZ   r_   classmethodr   rI   rJ   __func__r   r   r6   r*   r(   r8   r8   :   s            0' ' '   \@ @ @   S9 S9 S9 [S9jn n n`   ___%%2 2 &%2 2 2r*   r8   )	metaclass)(__doc__rs   rn   collectionsr   
scapy.archr   scapy.configr   
scapy.datar   scapy.volatiler   scapy.layers.dcerpcr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.layers.msrpce.eptr   r   r   r   r   r-   r   r8   r6   r*   r(   <module>r      s               " " " " " "             $ $ $ $ $ $                                     *             3 3 3 3 3t 3 3 3C C C C C6 C C C C C Cr*   