o
    j8R                     @   sB  d dl mZ d dl mZ d dlZd dlZd dlZd dlZz
d dlmZm	Z	 W n e
y7   d dlmZm	Z	 Y nw d dlmZ d dlmZmZmZ d dlmZmZmZmZ d dlmZ G d	d
 d
Zddddi fddZdd ZG dd dZG dd deZG dd deZG dd deeZG dd deZG dd deZ dS )    )division)print_functionN)urlparse
urlunparse)ntlm)DCERPCException	DCERPC_v5	DCERPC_v4)RPCProxyClientRPCProxyClientExceptionRPC_OVER_HTTP_v1RPC_OVER_HTTP_v2)SMBConnectionc                   @   sn   e Zd Ze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 ZdS )DCERPCStringBindingzf(?:([a-fA-F0-9-]{8}(?:-[a-fA-F0-9-]{4}){3}-[a-fA-F0-9-]{12})@)?([_a-zA-Z0-9]*):([^\[]*)(?:\[([^]]*)])?c                 C   s   t j|}|d| _|d| _|d| _|d}|re|d}|d | _z| j	d | jt
dd  | _W n   Y i | _|dd  D ]}|dd}t
|dkr[|d nd	| j|d < qId S d	| _i | _d S )
N            ,r   z	endpoint== )r   parsermatchgroup_DCERPCStringBinding__uuid_DCERPCStringBinding__ps_DCERPCStringBinding__nasplit_DCERPCStringBinding__endpointindexlen_DCERPCStringBinding__options)selfstringbindingr   optionsoptionvv r'   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dcerpc/v5/transport.py__init__*   s(   


$
zDCERPCStringBinding.__init__c                 C      | j S N)r   r"   r'   r'   r(   get_uuidB      zDCERPCStringBinding.get_uuidc                 C   r*   r+   )r   r,   r'   r'   r(   get_protocol_sequenceE   r.   z)DCERPCStringBinding.get_protocol_sequencec                 C   r*   r+   r   r,   r'   r'   r(   get_network_addressH   r.   z'DCERPCStringBinding.get_network_addressc                 C   
   || _ d S r+   r0   r"   addrr'   r'   r(   set_network_addressK      
z'DCERPCStringBinding.set_network_addressc                 C   r*   r+   )r   r,   r'   r'   r(   get_endpointN   r.   z DCERPCStringBinding.get_endpointc                 C   r*   r+   r!   r,   r'   r'   r(   get_optionsQ   r.   zDCERPCStringBinding.get_optionsc                 C   s
   | j | S r+   r8   r"   option_namer'   r'   r(   
get_optionT   r6   zDCERPCStringBinding.get_optionc                 C   s
   || j v S r+   r8   r:   r'   r'   r(   is_option_setW   r6   z!DCERPCStringBinding.is_option_setc                 C   s   | j |= d S r+   r8   r:   r'   r'   r(   unset_optionZ      z DCERPCStringBinding.unset_optionc                 C   s   t | j| j| j| j| jS r+   )DCERPCStringBindingComposer   r   r   r   r!   r,   r'   r'   r(   __str__]   s   zDCERPCStringBinding.__str__N)__name__
__module____qualname__recompiler   r)   r-   r/   r1   r5   r7   r9   r<   r=   r>   rA   r'   r'   r'   r(   r   $   s    
r   r   c                 C   sp   d}| r
|| d 7 }||d 7 }|r||7 }|s|r6|d| 7 }|r2|dd dd | D  7 }|d7 }|S )	Nr   @:[r   c                 S   s2   g | ]\}}t |d kr|nd|t |gqS )r   r   )strjoin).0keyvalr'   r'   r(   
<listcomp>k   s   2 z.DCERPCStringBindingCompose.<locals>.<listcomp>])rK   items)uuidprotocol_sequencenetwork_addressendpointr$   sr'   r'   r(   r@   a   s    r@   c                 C   s  t | }| }| }d|kr#| }|rt|t|}nct|}n^d|kr:| }|r5t|t|}nLt|}nGd|krQ| }|rLt|t|}n5t|}n0d|kro| }|rj|tdd  }t	||d}nt	|}nd|kr}| }t
|d}ntd|| |S )	Nncadg_ip_udpncacn_ip_tcp
ncacn_httpncacn_npz\pipe)filenamencalocalzUnknown protocol sequence.)r   r1   r/   r7   UDPTransportintTCPTransportHTTPTransportr    SMBTransportLOCALTransportr   set_stringbinding)r#   sbnapsportrpctransport
named_piper'   r'   r(   DCERPCTransportFactoryq   s<   




rj   c                   @   s   e Zd ZeZ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 Zd d! Zd"d# Zd$d% Zd>d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd?d6d7Zd8d9 Zd:d; Z d&S )@DCERPCTransportc                 C   s   || _ || _|| _d | _d | _d | _d| _d| _d| _d | _	d| _
d| _d| _d| _d | _d | _d | _d | _| dd d| _d| _d| _d S )Nr   FT)_DCERPCTransport__remoteName_DCERPCTransport__remoteHost_DCERPCTransport__dstport_stringbinding_max_send_frag_max_recv_frag_domain_lmhash_nthash!_DCERPCTransport__connect_timeout_doKerberos	_username	_password_aesKey_TGT_TGS_kdcHostset_credentials_strict_hostname_validation_validation_allow_absent_accepted_hostnamer"   
remoteNamedstportr'   r'   r(   r)      s,   
zDCERPCTransport.__init__c                 C      t dNzvirtual functionRuntimeErrorr,   r'   r'   r(   connect      zDCERPCTransport.connectr   c                 C   r   r   r   r"   dataforceWriteAndx	forceRecvr'   r'   r(   send   r   zDCERPCTransport.sendc                 C   r   r   r   r"   r   countr'   r'   r(   recv   r   zDCERPCTransport.recvc                 C   r   r   r   r,   r'   r'   r(   
disconnect   r   zDCERPCTransport.disconnectc                 C   r   r   r   r,   r'   r'   r(   
get_socket   r   zDCERPCTransport.get_socketc                 C   r*   r+   ru   r,   r'   r'   r(   get_connect_timeout   r.   z#DCERPCTransport.get_connect_timeoutc                 C   r2   r+   r   )r"   timeoutr'   r'   r(   set_connect_timeout   r6   z#DCERPCTransport.set_connect_timeoutc                 C   r*   r+   rl   r,   r'   r'   r(   getRemoteName   r.   zDCERPCTransport.getRemoteNamec                 C   
   || _ dS BThis method only makes sense before connection for most protocols.Nr   )r"   r   r'   r'   r(   setRemoteName      
zDCERPCTransport.setRemoteNamec                 C   r*   r+   rm   r,   r'   r'   r(   getRemoteHost   r.   zDCERPCTransport.getRemoteHostc                 C   r   r   r   )r"   
remoteHostr'   r'   r(   setRemoteHost   r   zDCERPCTransport.setRemoteHostc                 C   r*   r+   rn   r,   r'   r'   r(   	get_dport   r.   zDCERPCTransport.get_dportc                 C   r   r   r   )r"   dportr'   r'   r(   	set_dport   r   zDCERPCTransport.set_dportc                 C   r*   r+   ro   r,   r'   r'   r(   get_stringbinding   r.   z!DCERPCTransport.get_stringbindingc                 C   r2   r+   r   )r"   r#   r'   r'   r(   rc      r6   z!DCERPCTransport.set_stringbindingc                 C   s   |   |  fS r+   )r   r   r,   r'   r'   r(   get_addr      zDCERPCTransport.get_addrc                 C   s    |  |d  | |d  dS )r   r   r   N)r   r   r3   r'   r'   r(   set_addr   s   zDCERPCTransport.set_addrNc                 C   s   || _ || _d S r+   )rv   r|   )r"   flagkdcHostr'   r'   r(   set_kerberos      
zDCERPCTransport.set_kerberosc                 C   r*   r+   )rv   r,   r'   r'   r(   get_kerberos   r.   zDCERPCTransport.get_kerberosc                 C   r*   r+   )r|   r,   r'   r'   r(   get_kdcHost   r.   zDCERPCTransport.get_kdcHostc                 C   s   |dkr
|    d S || _d S )N)set_default_max_fragment_sizerp   )r"   send_fragment_sizer'   r'   r(   set_max_fragment_size   s   
z%DCERPCTransport.set_max_fragment_sizec                 C   s   || _ || _|| _d S r+   )r~   r   r   )r"   validateaccept_emptyhostnamer'   r'   r(   set_hostname_validation   s   
z'DCERPCTransport.set_hostname_validationc                 C   s
   d| _ d S Nr   )rp   r,   r'   r'   r(   r      s   
z-DCERPCTransport.set_default_max_fragment_sizec                 C   s$   | j | j| j| j| j| j| j| jfS r+   )rw   rx   rr   rs   rt   ry   rz   r{   r,   r'   r'   r(   get_credentials  s   zDCERPCTransport.get_credentialsr   c	           	      C   s   || _ || _|| _|| _|| _|| _|dks|dkrJt|d r$d| }t|d r.d| }zt|| _	t|| _
W d S    || _	|| _
Y d S d S )Nr   r   z0%s)rw   rx   rr   ry   rz   r{   r    binascii	unhexlifyrs   rt   	r"   usernamepassworddomainlmhashnthashaesKeyTGTTGSr'   r'   r(   r}     s&   zDCERPCTransport.set_credentialsc                 C   s   t jS r+   )r   
USE_NTLMv2r,   r'   r'   r(   doesSupportNTLMv2#  s   z!DCERPCTransport.doesSupportNTLMv2c                 C   s   t | S r+   )r   r,   r'   r'   r(   get_dce_rpc'  r   zDCERPCTransport.get_dce_rpc)r   r   r   r   r   r+   r   r   r   r   NN)!rB   rC   rD   r   DCERPC_classr)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   r   r}   r   r   r'   r'   r'   r(   rk      s<    


	
rk   c                   @   sR   e Zd ZdZeZdddZdd Zdd Zdd
dZ	dddZ
dd Zdd ZdS )r]   z0Implementation of ncadg_ip_udp protocol sequence   c                 C   s(   t | || d| _| d d| _d S )Nr      r   )rk   r)   _UDPTransport__socketr   _UDPTransport__recv_addrr   r'   r'   r(   r)   /  s   

zUDPTransport.__init__c              
   C   s|   z't |  |  dt jd \}}}}}t  |||| _| j|   W dS  t jy= } z	d | _t	d| d }~ww Nr   zCould not connect: %sr   )
socketgetaddrinfor   r   
SOCK_DGRAMr   
settimeoutr   errorr   r"   afsocktypeproto	canonnamesamsgr'   r'   r(   r   5  s   (zUDPTransport.connectc                 C   .   z| j   W dS  tjy   d | _ Y dS w Nr   r   )r   closer   r   r,   r'   r'   r(   r   @     zUDPTransport.disconnectr   c                 C   s   | j ||  |  f d S r+   )r   sendtor   r   r   r'   r'   r(   r   H  s   zUDPTransport.sendc                 C   s   | j d\}| _|S )N    )r   recvfromr   )r"   r   r   bufferr'   r'   r(   r   K  s   zUDPTransport.recvc                 C   r*   r+   )r   r,   r'   r'   r(   get_recv_addrO  r.   zUDPTransport.get_recv_addrc                 C   r*   r+   )r   r,   r'   r'   r(   r   R  r.   zUDPTransport.get_socketNr   r   )rB   rC   rD   __doc__r	   r   r)   r   r   r   r   r   r   r'   r'   r'   r(   r]   *  s    


r]   c                   @   sF   e Zd ZdZdddZdd Zdd Zdd
dZdddZdd Z	dS )r_   z0Implementation of ncacn_ip_tcp protocol sequencer   c                 C   s"   t | || d| _| d d S )Nr   r   )rk   r)   _TCPTransport__socketr   r   r'   r'   r(   r)   X  s   zTCPTransport.__init__c              
   C   s   t |  |  dt jd \}}}}}t  |||| _z| j|   | j| W dS  t j	yE } z| j
  td| d }~ww r   )r   r   r   r   SOCK_STREAMr   r   r   r   r   r   r   r   r'   r'   r(   r   ]  s   (
zTCPTransport.connectc                 C   r   r   )r   r   r   r   r,   r'   r'   r(   r   h  r   zTCPTransport.disconnectr   c                 C   sP   | j r d}	 |||| j   }|sd S | j| |t|7 }q| j| d S r   )rp   r   r   r    r"   r   r   r   offsettoSendr'   r'   r(   r   p  s   zTCPTransport.sendc                 C   sf   |r+d}d}t ||k r)| j|t | }|dkr||7 }ntdt ||k s|S | jd}|S )N    z Connection closed by remote hostr   )r    r   r   r   )r"   r   r   r   chunkr'   r'   r(   r   |  s   
zTCPTransport.recvc                 C   r*   r+   )r   r,   r'   r'   r(   r     r.   zTCPTransport.get_socketNr   r   )
rB   rC   rD   r   r)   r   r   r   r   r   r'   r'   r'   r(   r_   U  s    


r_   c                   @   sp   e Zd Z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dZdddZdd Zdd ZdS )r`   z.Implementation of ncacn_http protocol sequenceNQ  c                 C   sB   d| _ d | _t| _t| _t| || t| || | 	d d S )NFr   )
_useRpcProxy_rpcProxyUrlr_   
_transportr   _versionrk   r)   r
   r   r   r'   r'   r(   r)     s   zHTTPTransport.__init__r   c	           	      C   s   | j | ||||||||	S r+   )r   r}   r   r'   r'   r(   r}     s   zHTTPTransport.set_credentialsc                 C   s   d| _ t| _d S NT)r   r
   r   r,   r'   r'   r(   rpc_proxy_init  r   zHTTPTransport.rpc_proxy_initc                 C   s   |    t|| _d S r+   )r   r   r   )r"   urlr'   r'   r(   set_rpc_proxy_url  s   zHTTPTransport.set_rpc_proxy_urlc                 C   s
   t | jS r+   )r   r   r,   r'   r'   r(   get_rpc_proxy_url  r6   zHTTPTransport.get_rpc_proxy_urlc                 C   s   t | | | jdr?|   | jdd}|d dkr*| d|d   d S |d dkr;| d|d   d S td	d S )
NRpcProxyrH   r   443zhttps://%s/rpc/rpcproxy.dllr   80zhttp://%s/rpc/rpcproxy.dllz RPC Proxy port must be 80 or 443)	rk   rc   ro   r=   r   r<   r   r   r   )r"   rc   rpcproxyr'   r'   r(   rc     s   zHTTPTransport.set_stringbindingc                 C   sV   | j dkr$t| _t|  |  d}|dkr"td| j| j	f d S t
|  d S )NFr   s   ncacn_http/1.0z%s:%s service is not ncacn_http)r   r   r   r_   r   r   r   r   _HTTPTransport__remoteName_HTTPTransport__dstportr
   )r"   r   r'   r'   r(   r     s   

zHTTPTransport.connectr   c                 C   s   | j | |||S r+   )r   r   r   r'   r'   r(   r        zHTTPTransport.sendc                 C   s   | j | ||S r+   )r   r   r   r'   r'   r(   r     r   zHTTPTransport.recvc                 C   s   | j dkr
t| S td)NFz6This method is not supported for RPC Proxy connections)r   r_   r   r   r,   r'   r'   r(   r     s   

zHTTPTransport.get_socketc                 C   s   | j | S r+   )r   r   r,   r'   r'   r(   r     r?   zHTTPTransport.disconnect)Nr   r   r   )rB   rC   rD   r   r)   r}   r   r   r   rc   r   r   r   r   r   r'   r'   r'   r(   r`     s    




r`   c                   @   sz   e Zd ZdZ		d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 Zdd Zdd Zdd Zdd ZdS )!ra   z,Implementation of ncacn_np protocol sequence  r   Nr   Fc              
   C   s   t | || d | _d| _|| _d| _d| _| ||||||	|
| || _|| _	|dkr1| 
| |dkr9d| _n
d| _| j|   d | _|| _| d d S )Nr   r   FTr   )rk   r)   _SMBTransport__socket_SMBTransport__tid_SMBTransport__filename_SMBTransport__handle_SMBTransport__pending_recvr}   rv   r|   r   _SMBTransport__existing_smbgetCredentials_SMBTransport__prefDialect_SMBTransport__smb_connectionr   )r"   r   r   r[   r   r   r   r   r   r   r   r   remote_hostsmb_connection
doKerberosr   r'   r'   r(   r)     s$   
zSMBTransport.__init__c                 C   r2   r+   )r	  )r"   dialectr'   r'   r(   preferred_dialect  r6   zSMBTransport.preferred_dialectc                 C   sT   | j s&t|  |  |  | j|  d| _ | jr(| j | j| j	| j
 d S d S d S )N)	sess_portpreferredDialectr   )r
  r   r   r   r   r	  r   r~   setHostnameValidationr   r   r,   r'   r'   r(   setup_smb_connection  s   
z!SMBTransport.setup_smb_connectionc                 C   s   | j dkr6|   | jdu r| j | j| j| j| j| j n| j j	| j| j| j| j| j| j
| j| j| jd	 | j d| _| j | j| j| _| j   | _dS )Nr   F)r   r   r   zIPC$r   )r
  r  rv   loginrw   rx   rr   rs   rt   kerberosLoginry   r|   rz   r{   connectTreer  openFiler  r  getSMBServerr   r  r,   r'   r'   r(   r     s   

 zSMBTransport.connectc                 C   s:   | j | j | jdu r| j   | j   d| _ d S d S )NFr   )r
  disconnectTreer  r  logoffr   r,   r'   r'   r(   r     s   



zSMBTransport.disconnectc                 C   sz   | j r&d}	 |||| j   }|sn| jj| j| j||d |t|7 }qn
| j| j| j| |r;|  jd7  _d S d S )Nr   r   )r   )rp   r
  	writeFiler  r  r    r  r   r'   r'   r(   r     s   zSMBTransport.sendc                 C   sJ   | j s| jr| jr|  jd8  _| jj| j| j| jdS | j| j| jS )Nr   )bytesToRead)rp   r  r
  readFiler  r  rq   r   r'   r'   r(   r   (  s
   zSMBTransport.recvc                 C   r*   r+   )r
  r,   r'   r'   r(   get_smb_connection2  r.   zSMBTransport.get_smb_connectionc                 C   s   || _ | j|   d| _d S r   )r
  r}   r  r  )r"   r  r'   r'   r(   set_smb_connection5  s   
zSMBTransport.set_smb_connectionc                 C   
   | j  S r+   )r
  r  r,   r'   r'   r(   get_smb_server:  r   zSMBTransport.get_smb_serverc                 C   r*   r+   )r  r,   r'   r'   r(   r   >  r.   zSMBTransport.get_socketc                 C   r   r+   )r
  r   r,   r'   r'   r(   r   A  r6   zSMBTransport.doesSupportNTLMv2)r  r   r   r   r   r   r   r   NNr   r   FNr   )rB   rC   rD   r   r)   r  r  r   r   r   r   r  r  r!  r   r   r'   r'   r'   r(   ra     s     

	

ra   c                   @   s>   e Zd ZdZdddZdd Zdd Zdd
dZdddZdS )rb   z
    Implementation of ncalocal protocol sequence, not the same
    as ncalrpc (I'm not doing LPC just opening the local pipe)
    r   c                 C   s   t | dd || _d| _d S )Nr   r   )rk   r)   _LOCALTransport__filename_LOCALTransport__handle)r"   r[   r'   r'   r(   r)   J  s   
zLOCALTransport.__init__c                 C   s@   | j  ddk rd| j  | _ td| j  tjtjB | _dS )NPIPEr   z\PIPE\%sz\\.\%sr   )r"  upperfindosopenO_RDWRO_BINARYr#  r,   r'   r'   r(   r   O  s   zLOCALTransport.connectc                 C   s   t | j d S r+   )r'  r   r#  r,   r'   r'   r(   r   U  r   zLOCALTransport.disconnectr   c                 C   s   t | j| d S r+   )r'  writer#  r   r'   r'   r(   r   X  r   zLOCALTransport.sendc                 C   s   t | jd}|S )Ni  )r'  readr#  )r"   r   r   r   r'   r'   r(   r   [  s   zLOCALTransport.recvN)r   r   )	rB   rC   rD   r   r)   r   r   r   r   r'   r'   r'   r(   rb   D  s    

rb   )!
__future__r   r   r   r'  rE   r   urllib.parser   r   ImportErrorimpacketr   impacket.dcerpc.v5.rpcrtr   r   r	   impacket.dcerpc.v5.rpchr
   r   r   r   impacket.smbconnectionr   r   r@   rj   rk   r]   r_   r`   ra   rb   r'   r'   r'   r(   <module>   s2   =' +8Oh