o
    àý°j ~  ã                   @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dl
mZmZmZmZ G d	d
„ d
eƒZdZdZdZdZdZdZdZdZdZ d Z!dZ"dZ#dZ$d Z%dZ&dZ'dZ(dZ)dZ*dZ+dZ,d Z-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d!Z:d"Z;G d#d$„ d$eƒZ<G d%d&„ d&eƒZ=G d'd(„ d(eƒZ>G d)d*„ d*eƒZ?G d+d,„ d,eƒZ@G d-d.„ d.eƒZAG d/d0„ d0eƒZBG d1d2„ d2eƒZCG d3d4„ d4eƒZDG d5d6„ d6eƒZEG d7d8„ d8eƒZFG d9d:„ d:eƒZGG d;d<„ d<eƒZHG d=d>„ d>eƒZIG d?d@„ d@eƒZJG dAdB„ dBeƒZKG dCdD„ dDeƒZLG dEdF„ dFeƒZMe?e@eAeBeCeDeEeFeGeHeIeJeKeLeMdGœZNG dHdI„ dIeƒZOG dJdK„ dKeƒZPG dLdM„ dMeƒZQG dNdO„ dOeƒZRG dPdQ„ dQeƒZSG dRdS„ dSeƒZTeedTfdUdV„ZUeeefdWdX„ZVdYdZ„ ZWd[d\„ ZXG d]d^„ d^eƒZYdS )_é    N)Úunpack)ÚuuidÚntlmÚsystem_errorsÚ	nt_errorsÚLOG)ÚDCERPCException)Ú
EMPTY_UUID)ÚHTTPClientSecurityProviderÚ
AUTH_BASIC)Ú	Structure)ÚMSRPCHeaderÚ	MSRPC_RTSÚPFC_FIRST_FRAGÚPFC_LAST_FRAGc                   @   s(   e Zd Ze d¡Zddd„Zdd„ ZdS )ÚRPCProxyClientExceptionzRPC Error: ([a-fA-F0-9]{1,8})Nc                 C   sT   d }|d ur!z| j  |¡}t| d¡dƒ}W n
   |d| 7 }Y t | ||¡ d S )Né   é   z: )ÚparserÚsearchÚintÚgroupr   Ú__init__)ÚselfÚerror_stringÚproxy_errorÚrpc_error_coder   © r   úŠ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dcerpc/v5/rpch.pyr   "   s   z RPCProxyClientException.__init__c                 C   sz   | j d ur:| j }|tjv rtj| d }d| j| j |f S |tjv r2tj| d }d| j| j |f S d| j| j f S | jS )Nr   z%s, code: 0x%x - %sz%s: unknown code: 0x%x)Ú
error_coder   ÚERROR_MESSAGESr   r   )r   ÚkeyÚerror_msg_shortr   r   r   Ú__str__.   s   


zRPCProxyClientException.__str__)NN)Ú__name__Ú
__module__Ú__qualname__ÚreÚcompiler   r   r#   r   r   r   r   r      s    

r   r   é   zkBasic authentication in RPC proxy is used, so coudn't obtain a target NetBIOS name from NTLMSSP to connect.zInvalid RPC Portz-RPC Proxy CONN/A1 request failed, code: 0x6baz.CONN/A1 request failed: HTTP/1.1 404 Not Foundz,RPC_OUT_DATA channel: HTTP/1.1 404 Not Foundz1CONN/A1 request failed: HTTP/1.1 401 Unauthorizedz.RPC_IN_DATA channel: HTTP/1.1 401 Unauthorizedé   é   é   r   é    é@   é   é   é   é	   é
   é   é   é   é   c                   @   ó   e Zd ZdZdS )Ú	RTSCookie))ÚCookiez16s=b"\x00"*16N©r$   r%   r&   Ú	structurer   r   r   r   r9   w   ó    r9   c                   @   r8   )ÚEncodedClientAddress))ÚAddressTypez(<L=(0 if len(ClientAddress) == 4 else 1))Ú_ClientAddressz_-ClientAddressz4 if AddressType == 0 else 16)ÚClientAddressú:)ÚPaddingz12s=b"\x00"*12Nr;   r   r   r   r   r>   }   r=   r>   c                   @   s   e Zd ZddddeffZdS )ÚAck)ÚBytesReceivedú<L=0)ÚAvailableWindowrF   ÚChannelCookierB   N©r$   r%   r&   r9   r<   r   r   r   r   rD   †   s
    ýrD   c                   @   r8   )ÚReceiveWindowSize))ÚCommandTyperF   )rJ   z	<L=262144Nr;   r   r   r   r   rJ   Ž   r=   rJ   c                   @   s   e Zd ZdddeffZdS )ÚFlowControlAck)rK   ú<L=1rD   rB   N)r$   r%   r&   rD   r<   r   r   r   r   rL   •   ó    þrL   c                   @   r8   )ÚConnectionTimeout))rK   z<L=2)rO   z	<L=120000Nr;   r   r   r   r   rO   œ   r=   rO   c                   @   ó   e Zd Zdd deffZdS )r:   )rK   z<L=3rB   NrI   r   r   r   r   r:   £   rN   r:   c                   @   r8   )ÚChannelLifetime))rK   z<L=4)rQ   z<L=1073741824Nr;   r   r   r   r   rQ   ª   r=   rQ   c                   @   r8   )ÚClientKeepalive))rK   z<L=5)rR   z	<L=300000Nr;   r   r   r   r   rR   ·   r=   rR   c                   @   r8   )ÚVersion))rK   z<L=6)rS   rM   Nr;   r   r   r   r   rS   ¾   r=   rS   c                   @   r8   )ÚEmpty))rK   z<L=7Nr;   r   r   r   r   rT   Å   r=   rT   c                   @   r8   )rC   ))rK   z<L=8)ÚConformanceCountz<L=len(Padding))rC   z*ConformanceCountNr;   r   r   r   r   rC   Ë   r=   rC   c                   @   r8   )ÚNegativeANCE))rK   z<L=9Nr;   r   r   r   r   rV   Ó   r=   rV   c                   @   r8   )ÚANCE))rK   z<L=0xANr;   r   r   r   r   rW   Ù   r=   rW   c                   @   rP   )rA   )rK   z<L=0xBrB   N)r$   r%   r&   r>   r<   r   r   r   r   rA   ß   rN   rA   c                   @   rP   )ÚAssociationGroupId)rK   z<L=0xCrB   NrI   r   r   r   r   rX   æ   rN   rX   c                   @   r8   )ÚDestination))rK   z<L=0xD)rY   ú<LNr;   r   r   r   r   rY   í   r=   rY   c                   @   r8   )ÚPingTrafficSentNotify))rK   z<L=0xE)ÚPingTrafficSentrZ   Nr;   r   r   r   r   r[   ô   r=   r[   )r   r   r)   r*   r+   r/   r0   r1   r,   r2   r3   r4   r5   r6   r7   c                   @   s$   e Zd ZdZejd Zddd„ZdS )Ú	RTSHeaderé   ))ÚFlagsú<H=0)ÚNumberOfCommandsr`   Nr   c                 C   s6   t  | ||¡ t| d< ttB | d< d| d< d| d< d S )NÚtypeÚflagsr   Úauth_lengthÚcall_id)r   r   r   r   r   )r   ÚdataÚ	alignmentr   r   r   r     s
   zRTSHeader.__init__)Nr   )r$   r%   r&   Ú_SIZEr   Ú	commonHdrr   r   r   r   r   r]     s    
r]   c                   @   s0   e Zd ZddefddefddefddeffZdS )ÚCONN_A1_RTS_PDUrS   rB   ÚVirtualConnectionCookieÚOutChannelCookierJ   N)r$   r%   r&   rS   r:   rJ   r<   r   r   r   r   rj   "  s    ürj   c                   @   s@   e Zd ZddefddefddefddefddefddeffZdS )	ÚCONN_B1_RTS_PDUrS   rB   rk   ÚINChannelCookierQ   rR   rX   N)	r$   r%   r&   rS   r:   rQ   rR   rX   r<   r   r   r   r   rm   .  s    úrm   c                   @   s   e Zd ZddeffZdS )ÚCONN_A3_RTS_PDUrO   rB   N)r$   r%   r&   rO   r<   r   r   r   r   ro   <  s    ÿro   c                   @   s(   e Zd ZddefddefddeffZdS )ÚCONN_C2_RTS_PDUrS   rB   rJ   rO   N)r$   r%   r&   rS   rJ   rO   r<   r   r   r   r   rp   E  s
    ýrp   c                   @   s    e Zd ZddefddeffZdS )Ú%FlowControlAckWithDestination_RTS_PDUrY   rB   rL   N)r$   r%   r&   rY   rL   r<   r   r   r   r   rq   M  s    þrq   é   c                 C   s‚   t ƒ }tƒ |d< tƒ |d< | |d d< tƒ |d< ||d d< tƒ |d< ||d d< tƒ }t|d< t|jƒ|d< | ¡ |d< | ¡ S )	NrS   rk   r:   rl   rJ   r_   ra   ÚpduData)	rj   rS   r:   rJ   r]   ÚRTS_FLAG_NONEÚlenr<   ÚgetData)ÚvirtualConnectionCookieÚoutChannelCookieÚreceiveWindowSizeÚconn_a1Úpacketr   r   r   ÚhCONN_A1V  s   



r|   c                 C   s¨   t ƒ }tƒ |d< tƒ |d< | |d d< tƒ |d< ||d d< tƒ |d< tƒ |d< tƒ |d< tƒ |d d< ||d d d< tƒ }t|d< t	|j
ƒ|d	< | ¡ |d
< | ¡ S )NrS   rk   r:   rn   rQ   rR   rX   r_   ra   rs   )rm   rS   r:   rQ   rR   rX   r9   r]   rt   ru   r<   rv   )rw   ÚinChannelCookieÚassociationGroupIdÚconn_b1r{   r   r   r   ÚhCONN_B1g  s    





r€   c                 C   sª   t ƒ }tƒ |d< | |d d< tƒ |d< tƒ |d d< ||d d d< ||d d d< tƒ |d d d< ||d d d d< tƒ }t|d< t|jƒ|d	< | 	¡ |d
< | 	¡ S )NrY   rL   rD   rE   rG   rH   r:   r_   ra   rs   )
rq   rY   rL   rD   r9   r]   ÚRTS_FLAG_OTHER_CMDru   r<   rv   )ÚdestinationÚbytesReceivedÚavailableWindowÚchannelCookieÚrts_pdur{   r   r   r   ÚhFlowControlAckWithDestination{  s   

r‡   c                  C   s   t ƒ } t| d< |  ¡ S )Nr_   )r]   ÚRTS_FLAG_PINGrv   )r{   r   r   r   ÚhPing�  s   r‰   c                   @   sà   e Zd ZdZdddddddœZd:dd„Zdd„ Zd;dd„Zd<dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd=d(d)„Zd>d+d,„Zd?d.d/„Zd>d0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd	S )@ÚRPCProxyClienti    ÚMSRPCzno-cachez
Keep-Alivez100-continuezapplication/rpczNo-cache)z
User-AgentzCache-ControlÚ
ConnectionÚExpectÚAcceptÚPragmaNéQ  c                 C   s(   t  | ¡ || _|| _d | _|  ¡  d S ©N)r
   r   Ú_RPCProxyClient__remoteNameÚ_RPCProxyClient__dstportÚ_RPCProxyClient__auth_typeÚ
init_state)r   Ú
remoteNameÚdstportr   r   r   r   ¢  s
   
zRPCProxyClient.__init__c                 C   sj   i | _ t ¡ | _t ¡ | _t ¡ | _t ¡ | _d | _d | _d| _	| j	| _
d| _d| _d| _d| _d| _d S )Nrr   r   Fó    )Ú_RPCProxyClient__channelsr   ÚgenerateÚ _RPCProxyClient__inChannelCookieÚ!_RPCProxyClient__outChannelCookieÚ#_RPCProxyClient__associationGroupIdÚ(_RPCProxyClient__virtualConnectionCookieÚ(_RPCProxyClient__serverConnectionTimeoutÚ(_RPCProxyClient__serverReceiveWindowSizeÚ*_RPCProxyClient__availableWindowAdvertisedÚ(_RPCProxyClient__receiverAvailableWindowÚ_RPCProxyClient__bytesReceivedÚ_RPCProxyClient__serverChunkedÚ_RPCProxyClient__readBufferÚ_RPCProxyClient__chunkLeftÚrts_ping_received©r   r   r   r   r•   ¬  s   




zRPCProxyClient.init_stateÚ c                 C   s    t  d¡ |  |||||¡ d S )NzZDeprecationWarning: Call to deprecated method set_proxy_credentials (use set_credentials).)r   ÚerrorÚset_credentials)r   ÚusernameÚpasswordÚdomainÚlmhashÚnthashr   r   r   Úset_proxy_credentialsÀ  s   
z$RPCProxyClient.set_proxy_credentialsc	           	      C   s   t  | ||||||||¡	 d S r‘   )r
   r«   )	r   r¬   r­   r®   r¯   r°   ÚaesKeyÚTGTÚTGSr   r   r   r«   Ä  s   
ÿzRPCProxyClient.set_credentialsc                 C   ó"   | j  ¡ }d|d< |  d|¡ d S )NÚ
1073741824úContent-LengthÚRPC_IN_DATA©Údefault_headersÚcopyÚcreate_channel©r   Úheadersr   r   r   Úcreate_rpc_in_channelÈ  ó   
z$RPCProxyClient.create_rpc_in_channelc                 C   rµ   )NÚ76r·   ÚRPC_OUT_DATAr¹   r½   r   r   r   Úcreate_rpc_out_channelÎ  rÀ   z%RPCProxyClient.create_rpc_out_channelc                 C   s  t  | | jj| jj¡| j|< t  | | j| || jj|¡d }i }| |¡ | |¡ t  	| ¡| _
| js<| j
tkr<ttƒ‚| js]|  ¡ }|tj d  d¡| _| j | j¡ t d| j ¡ | jjss| jd t| jƒ }| jj|d�| _| jjd | jj }| j| j|||d� |  |¡ d S )	Nr   r   zutf-16lez$StringBinding has been changed to %srB   )Úqueryú?)r¾   )r
   ÚconnectÚ_rpcProxyUrlÚschemeÚnetlocr™   Úget_auth_headersÚpathÚupdateÚget_auth_typer”   r’   r   r   Ú RPC_PROXY_REMOTE_NAME_NEEDED_ERRÚget_ntlmssp_infor   ÚNTLMSSP_AV_HOSTNAMEÚdecodeÚ_stringbindingÚset_network_addressr   ÚdebugrÄ   Ústrr“   Ú_replaceÚrequestÚ_read_100_continue)r   Úmethodr¾   Úauth_headersÚheaders_finalÚntlmssprÄ   rË   r   r   r   r¼   Ô  s2   
ÿ
ÿÿ

HzRPCProxyClient.create_channelc              
   C   s²   | j | j | j¡}| d¡dkr$|| j | j | j¡7 }| d¡dks|dd… dkrWz| d¡d jdd	d
�}td| j|f |d�‚ t	t
tfyV   td| j|f ƒ‚w d S )Nó   

éÿÿÿÿr2   é   s   100 Continue
ó   
r   úUTF-8Úreplace©Úerrorsz8RPC Proxy Client: %s authentication failed in %s channel©r   )r™   ÚsockÚrecvÚ	RECV_SIZEÚfindÚsplitrÑ   r   r”   Ú
IndexErrorÚKeyErrorÚAttributeError)r   rÙ   Úrespr   r   r   rØ   9  s$   ÿ	ÿÿÿÿøz!RPCProxyClient._read_100_continuec           
   
   C   sb  t | j| j| jƒ}|  ¡  |¡ t| j| j| jƒ}|  	¡  |¡ |  ¡  
| j¡}| d¡dkr@||  ¡  
| j¡7 }| d¡dks/|dd… dkriz| d¡d jdd	d
�}td|d�‚ tttfyh   tdƒ‚w |jdd	d
�}d| ¡ v ryd| _|| d¡d d … | _|  ¡ }t|ƒd }t|ƒ}|d d | _|  ¡ }t|ƒd }t|ƒ}	|	d d | _d S )NrÝ   rÞ   r2   r5   s   200rà   r   rá   râ   rã   z RPC Proxy CONN/A1 request failedrå   ÚASCIIztransfer-encoding: chunkedTr+   rs   rO   rJ   )r|   rž   rœ   r¡   Úget_socket_outÚsendr€   r›   r�   Úget_socket_inrç   rè   ré   rê   rÑ   r   rë   rì   rí   Úlowerr¤   r¥   Úrpc_out_read_pktr]   ro   rŸ   rp   r    )
r   r{   rî   Ú
resp_asciiÚconn_a3_rpcÚconn_a3_pduÚconn_a3Úconn_c2_rpcÚconn_c2_pduÚconn_c2r   r   r   Úcreate_tunnelQ  s6   ÿÿzRPCProxyClient.create_tunnelc                 C   ó   | j d jS ©Nr¸   ©r™   ræ   r¨   r   r   r   rò   {  ó   zRPCProxyClient.get_socket_inc                 C   rý   ©NrÂ   rÿ   r¨   r   r   r   rð   ~  r   zRPCProxyClient.get_socket_outc                 C   ó   | j d  ¡ S rþ   ©r™   Úcloser¨   r   r   r   Úclose_rpc_in_channel�  ó   z#RPCProxyClient.close_rpc_in_channelc                 C   r  r  r  r¨   r   r   r   Úclose_rpc_out_channel„  r  z$RPCProxyClient.close_rpc_out_channelc                 C   s    |d d… dkrt d|d�‚d S )Né   s   HTTP/1.0 503 RPC ErrorzRPC Proxy request failedrå   )r   )r   Úbufferr   r   r   Úcheck_http_error‡  s   ÿzRPCProxyClient.check_http_errorc                 C   s  |   ¡ }| jdu r7t| jƒdkr| j}d| _n| | j¡}|  |¡ t|ƒ|kr*|S ||d … | _|d |… S | jdkrq|| jkrY| jd | j… }| j| jd d … | _d| _|S | jd |… }| j|d … | _|  j|8  _|S | j}d| _|  |¡ | d¡dkr—|| | j¡7 }|  |¡ | d¡dksƒt	|d | d¡… dƒ}|| d¡d d … }t|ƒd |k rË|| |t|ƒ d ¡7 }t|ƒd |k s¶t|ƒd |krä||d d … | _|d |d … }t|ƒd |k�r|| | _||d … | j | _|d |… S |d d… S )	NFr   r˜   r)   rà   rÞ   r   éþÿÿÿ)
rð   r¤   ru   r¥   rç   rè   r
  r¦   ré   r   )r   Úamtræ   r	  Ú	chunksizer   r   r   Úrpc_out_recv1‹  sR   





þÿ
zRPCProxyClient.rpc_out_recv1r   c                 C   s   |   ¡  |¡ d S r‘   )rò   rñ   )r   rf   ÚforceWriteAndxÚ	forceRecvr   r   r   rñ   Þ  s   zRPCProxyClient.sendFc                 C   s´   	 d}t |ƒtjk r||  tjt |ƒ ¡7 }t |ƒtjk s
t|ƒ}|d }t |ƒ|k r<||  |t |ƒ ¡7 }t |ƒ|k s+|d tkrG|  |¡ |du rW|d tkrW|  |¡ n|S q)NTr˜   Úfrag_lenrb   )ru   r   rh   r  r   Úflow_controlÚhandle_out_of_sequence_rts)r   Ú
handle_rtsÚresponse_dataÚresponse_headerr  r   r   r   rô   ä  s    ÿÿ
ÛzRPCProxyClient.rpc_out_read_pktc                 C   s   | j dd�S )NT)r  )rô   )r   r  Úcountr   r   r   rç     r   zRPCProxyClient.recvc                 C   s\   t |ƒ}|d tkr!d| _t d¡ tƒ }|  |¡ |  |¡ d S |d tkr+tdƒ‚	 d S )Nr_   Tz6Ping RTS PDU packet received. Is the RPC Server alive?z\The server requested recycling of a virtual OUT channel, but this function is not supported!)	r]   rˆ   r§   r   rª   r‰   rñ   ÚRTS_FLAG_RECYCLE_CHANNELr   )r   r  r{   r   r   r   r    s   


z)RPCProxyClient.handle_out_of_sequence_rtsc                 C   sZ   |  j |7  _ |  j|8  _| j| jd k r+| j| _tt| j | j| jƒ}|  |¡ d S d S )Nr)   )r£   r¢   r¡   r‡   Ú
FDOutProxyrœ   rñ   )r   r  r{   r   r   r   r  A  s   ÿüzRPCProxyClient.flow_controlc                 C   ó   |   ¡  |  ¡  |  ¡  d S r‘   )r¿   rÃ   rü   r¨   r   r   r   rÆ   K  ó   zRPCProxyClient.connectc                 C   r  r‘   )r  r  r•   r¨   r   r   r   Ú
disconnectP  r  zRPCProxyClient.disconnect)Nr�   )r©   r©   r©   )r©   r©   r©   r©   NNr‘   )r   r   )F)r$   r%   r&   rè   rº   r   r•   r±   r«   r¿   rÃ   r¼   rØ   rü   rò   rð   r  r  r
  r  rñ   rô   rç   r  r  rÆ   r  r   r   r   r   rŠ   ˜  s>    û



e*

S

(2
rŠ   )Zr'   ÚbinasciiÚstructr   Úimpacketr   r   r   r   r   Úimpacket.dcerpc.v5.rpcrtr   Úimpacket.uuidr	   Úimpacket.httpr
   r   Úimpacket.structurer   r   r   r   r   r   ÚRPC_OVER_HTTP_v1ÚRPC_OVER_HTTP_v2rÎ   ÚRPC_PROXY_INVALID_RPC_PORT_ERRÚRPC_PROXY_CONN_A1_0X6BA_ERRÚRPC_PROXY_CONN_A1_404_ERRÚRPC_PROXY_RPC_OUT_DATA_404_ERRÚRPC_PROXY_CONN_A1_401_ERRÚRPC_PROXY_HTTP_IN_DATA_401_ERRÚFDClientÚ	FDInProxyÚFDServerr  rt   rˆ   r�   r  ÚRTS_FLAG_IN_CHANNELÚRTS_FLAG_OUT_CHANNELÚRTS_FLAG_EOFÚRTS_FLAG_ECHOÚRTS_CMD_RECEIVE_WINDOW_SIZEÚRTS_CMD_FLOW_CONTROL_ACKÚRTS_CMD_CONNECTION_TIMEOUTÚRTS_CMD_COOKIEÚRTS_CMD_CHANNEL_LIFETIMEÚRTS_CMD_CLIENT_KEEPALIVEÚRTS_CMD_VERSIONÚRTS_CMD_EMPTYÚRTS_CMD_PADDINGÚRTS_CMD_NEGATIVE_ANCEÚRTS_CMD_ANCEÚRTS_CMD_CLIENT_ADDRESSÚRTS_CMD_ASSOCIATION_GROUP_IDÚRTS_CMD_DESTINATIONÚ RTS_CMD_PING_TRAFFIC_SENT_NOTIFYr9   r>   rD   rJ   rL   rO   r:   rQ   rR   rS   rT   rC   rV   rW   rA   rX   rY   r[   ÚCOMMANDSr]   rj   rm   ro   rp   rq   r|   r€   r‡   r‰   rŠ   r   r   r   r   Ú<module>   s¶   !	ñ			