o
    àý°jzA  ã                
   @   sž  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d dlmZ d dl	m
Z
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 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!m"Z"m#Z# G dd„ dƒZ$e%dkrMe&ej'ƒ G dd„ dej(ƒZ)ej*de)ddZ+e+j,ddd e+j,dddd e+j,dddd e+j,ddd d e+j,d!d"e-d#d$d% e+j,d&d"e-d#d'd% e+j,d(d"e-d)d*d% e+j,d+d"d,d e+j,d-dd.d e+j,d/dd0d e+ .d1¡Z/e/j,d2d"d3d4d5 e/j,d6d7d8gd9d8d:d;d< e+ .d=¡Z/e/j,d>d"d?d@dA e/j,dBd"d?d@dA e/j,dCd"dDdEd5 e/j,dFd"dDdEd5 e/j,dGddHd e0ej1ƒdIkr@e+ 2¡  e 3dI¡ e+ 4¡ Z5e
 6e5j7e5j8¡ ee5j9e5j:e5j;dJdK\Z<Z=Z>Z?Z?Z?ee5j@e5jAe5j;dLdK\ZBZCZDZ?Z?Z?e5jEr€e5jFr€e GdM¡ e 3dI¡ e5jdur‘e He5j¡gZIde5_JnejKZIz;e$e5jLe5jMe5jJeIe5jEe5jNe5jFe5jOƒZPeP Qe=e>e<e5j:¡ eP ReCeDeBe5jA¡ eP Se5jTe5jU¡ eP V¡  eP W¡  eP X¡  W dS  eYyL ZZ zpdNeZ Z[e \e[¡ ee[v rëe \dO¡ e#e[v sõe"e[v rúe \dP¡ e!e[v re \dQ¡ e e[v see[v r!eP ]¡  ^¡ ekr!eBd?kr!e \dR¡ ee[v s+e"e[v r0e _dS¡ dTe[v rAe \dU¡ W Y dZZ[ZdS W Y dZZ[ZdS dZZ[Zww dS )Vé    )Údivision)Úprint_functionN)Ú
AUTH_BASIC)ÚloggerÚrpcdatabase)Úparse_identity)ÚuuidÚversion)ÚKNOWN_UUIDS)Ú	transportÚrpcrtÚepm)ÚDCERPCException)ÚDCERPCStringBindingÚSMBTransport)Úmgmt)ÚRPC_PROXY_CONN_A1_401_ERRÚRPC_PROXY_INVALID_RPC_PORT_ERRÚRPC_PROXY_HTTP_IN_DATA_401_ERRÚRPC_PROXY_CONN_A1_0X6BA_ERRÚRPC_PROXY_CONN_A1_404_ERRÚRPC_PROXY_RPC_OUT_DATA_404_ERRc                   @   sx   e Zd Z		ddd„Zdd	„ Zd 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
S )"ÚRPCMapÚ é   F© é@   c	           	      C   sŒ   zt |ƒ| _W n   tdƒ‚| j ¡ dkr | j d¡s tdƒ‚|| _|| _|| _|| _|| _	|| _
|| _d| _t |¡| _| j ¡ | _d S )Nz%Provided stringbinding is not correctr   ÚRpcProxyF)r   Ú_RPCMap__stringbindingÚ	ExceptionÚget_network_addressÚis_option_setÚ_RPCMap__authLevelÚ_RPCMap__brute_uuidsÚ_RPCMap__uuidsÚ_RPCMap__brute_opnumsÚ_RPCMap__opnum_maxÚ_RPCMap__brute_versionsÚ_RPCMap__version_maxÚ!_RPCMap__msrpc_lockout_protectionr   ÚDCERPCTransportFactoryÚ_RPCMap__rpctransportÚget_dce_rpcÚ_RPCMap__dce)	ÚselfÚstringbindingÚ	authLevelÚ
bruteUUIDsÚuuidsÚbruteOpnumsÚopnumMaxÚbruteVersionsÚ
versionMaxr   r   ú†/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/rpcmap.pyÚ__init__9   s$   
ÿzRPCMap.__init__c                 C   s   | j S ©N)r+   ©r.   r   r   r7   Úget_rpc_transportR   s   zRPCMap.get_rpc_transportNc                 C   sH   |d ur|  d¡\}}nd}d}t| jdƒr"| j |||||¡ d S d S )Nú:r   Úset_credentials)ÚsplitÚhasattrr+   r=   ©r.   ÚusernameÚpasswordÚdomainÚhashesÚlmhashÚnthashr   r   r7   Úset_transport_credentialsU   s   ÿz RPCMap.set_transport_credentialsc                 C   sf   |d ur|  d¡\}}nd}d}t| jdƒr | j |||||¡ |dks,|dks,|dkr1d| _d S d S )Nr<   r   r=   T)r>   r?   r-   r=   r)   r@   r   r   r7   Úset_rpc_credentials_   s   
ÿzRPCMap.set_rpc_credentialsc                 C   s8   t | jtƒr|r| j |¡ |r| j |¡ d S d S d S r9   )Ú
isinstancer+   r   ÚsetRemoteHostÚ	set_dport)r.   ÚsmbhostÚsmbportr   r   r7   Úset_smb_infol   s   üzRPCMap.set_smb_infoc                 C   s   | j  | j¡ | j  ¡  d S r9   )r-   Úset_auth_levelr"   Úconnectr:   r   r   r7   rP   s   s   zRPCMap.connectc                 C   s   | j  ¡  d S r9   )r-   Ú
disconnectr:   r   r   r7   rQ   w   s   zRPCMap.disconnectc              
      s:  z<| j  tj¡ t | j ¡‰ | jr|  ¡  W d S t‡ fdd„tˆ d d ƒD ƒƒ}| 	d¡ t
|ƒD ]}|  |¡ q2W d S  tyœ } zTt|ƒ d¡dks_t|ƒ d¡dks_t|ƒ d	¡dkrnt d
¡ t d¡ |  ¡  nt|ƒ d¡r‰| jdkr‰t d¡ t d¡ |  ¡  n‚ W Y d }~d S W Y d }~d S d }~ww )Nc                 3   s.    | ]}t  ˆ d  d | d  ¡ ¡V  qdS )Úif_id_vectorÚif_idÚDataN)r   Úbin_to_uuidtupÚgetData)Ú.0Úindex©Úifidsr   r7   Ú	<genexpr>ˆ   s
   € ÿ
ÿzRPCMap.do.<locals>.<genexpr>rR   Úcount)z$AFA8BD80-7D8A-11C9-BEF4-08002B102989z1.0Únca_s_unk_ifr   Úreason_not_specifiedÚabstract_syntax_not_supportedz#Target MGMT interface not availablez3Bruteforcing UUIDs. The result may not be complete.Úrpc_s_access_deniedFzKTarget MGMT interface requires authentication, but no credentials provided.)r-   Úbindr   ÚMSRPC_UUID_MGMTÚhinq_if_idsr#   Úbruteforce_uuidsÚsetÚrangeÚaddÚsortedÚhandle_discovered_tupr   ÚstrÚfindÚloggingÚinfor)   )r.   ÚuuidtupsÚtupÚer   rY   r7   Údoz   s:   þ
ÿ





ú€óz	RPCMap.doc                 C   sP  g }t | jd ƒD ]F}t |d| f¡}| j ¡  z| j |¡ W n( tyI } zt|ƒ 	d¡dkr8| 
d¡ n| 
t|ƒ¡ W Y d }~q	d }~ww | 
d¡ q	t|ƒdkr•|d |d kr•|d }|rv|d |krv| ¡  |rv|d |ksjt|ƒD ]\}}td	||f ƒ qztd
t|ƒ| j|f ƒ d S t|ƒD ]\}}td	||f ƒ q™d S )Né   z%d.0r_   r   z5abstract_syntax_not_supported (version not supported)ÚsuccesséÿÿÿÿéþÿÿÿzVersions %d: %szVersions %d-%d: %s)rf   r(   r   Úuuidtup_to_binr-   rP   ra   r   rj   rk   ÚappendÚlenÚpopÚ	enumerateÚprint)r.   Úinterface_uuidÚresultsÚiÚbinuuidrp   ÚsuffixÚresultr   r   r7   Úbruteforce_versions£   s0   
€üÿÿzRPCMap.bruteforce_versionsc                 C   sV  g }t | jd ƒD ]I}| j ¡  | j |¡ | j |d¡ z| j ¡  W n( tyL } zt|ƒ 	d¡dkr;| 
d¡ n| 
t|ƒ¡ W Y d }~q	d }~ww | 
d¡ q	t|ƒdkr˜|d |d kr˜|d }|ry|d |kry| ¡  |ry|d |ksmt|ƒD ]\}}td	||f ƒ q}td
t|ƒ| j|f ƒ d S t|ƒD ]\}}td	||f ƒ qœd S )Nrr   ó    Únca_s_op_rng_errorr   z$nca_s_op_rng_error (opnum not found)rs   rt   ru   zOpnum %d: %szOpnums %d-%d: %s)rf   r&   r-   rP   ra   ÚcallÚrecvr   rj   rk   rw   rx   ry   rz   r{   )r.   r   r}   r~   rp   r€   r   r   r   r7   Úbruteforce_opnumsÂ   s2   
€üÿÿzRPCMap.bruteforce_opnumsc                 C   sÖ   t | jƒD ]Z}| j ¡  t |¡}z| j |¡ W n@ tjyY } z3t	|ƒ 
d¡dkr1W Y d }~qt	|ƒ 
d¡dkr@W Y d }~qt	|ƒ 
d¡dkrOW Y d }~qW Y d }~nd }~ww |  |¡ qt dt| jƒ¡ d S )Nr_   r   Únca_s_proto_errorr^   zTested %d UUID(s))rh   r$   r-   rP   r   rv   ra   r   r   rj   rk   ri   rl   rm   rx   )r.   ro   r   rp   r   r   r7   rd   â   s"   

ÿ€øzRPCMap.bruteforce_uuidsc              
   C   s   |d t jv rtdt j|d   ƒ ntdƒ t |¡d d… tv r2tdtt |¡d d…   ƒ ntdƒ td|d |d f ƒ | jrL|  |d ¡ | jr{z
|  	t |¡¡ W n! t
yz } zt|ƒ d	¡dkrotd
ƒ n‚ W Y d }~nd }~ww tƒ  d S )Nr   zProtocol: %szProcotol: N/Aé   zProvider: %szProvider: N/AzUUID: %s v%srr   r_   zListening: False)r   ÚKNOWN_PROTOCOLSr{   r   rv   r
   r'   r‚   r%   r‡   r   rj   rk   )r.   ro   rp   r   r   r7   ri   ù   s(    
þ€þ
zRPCMap.handle_discovered_tup)r   r   Fr   Fr   Fr   )r   N)NN)Ú__name__Ú
__module__Ú__qualname__r8   r;   rG   rH   rN   rP   rQ   rq   r‚   r‡   rd   ri   r   r   r   r7   r   8   s    
ÿ



) r   Ú__main__c                   @   s   e Zd Zdd„ ZdS )ÚSmartFormatterc                 C   s*   |  d¡r|dd …  ¡ S tj | ||¡S )NzR|é   )Ú
startswithÚ
splitlinesÚargparseÚHelpFormatterÚ_split_lines)r.   ÚtextÚwidthr   r   r7   r•     s   
zSmartFormatter._split_linesN)r‹   rŒ   r   r•   r   r   r   r7   r     s    r   Tz#Lookups listening MSRPC interfaces.)Úadd_helpÚformatter_classÚdescriptionr/   a  R|String binding to connect to MSRPC interface, for example:
ncacn_ip_tcp:192.168.0.1[135]
ncacn_np:192.168.0.1[\pipe\spoolss]
ncacn_http:192.168.0.1[593]
ncacn_http:[6001,RpcProxy=exchange.contoso.com:443]
ncacn_http:localhost[3388,RpcProxy=rds.contoso:443])Úhelpz-brute-uuidsÚ
store_truez4Bruteforce UUIDs even if MGMT interface is available)Úactionr›   z-brute-opnumsz!Bruteforce opnums for found UUIDsz-brute-versionsz(Bruteforce major versions of found UUIDsz
-opnum-maxÚstorer   z)Bruteforce opnums from 0 to N, default 64)r   ÚtypeÚdefaultr›   z-version-maxz+Bruteforce versions from 0 to N, default 64z-auth-levelr   zJMS-RPCE auth level, from 1 to 6, default 6 (RPC_C_AUTHN_LEVEL_PKT_PRIVACY)z-uuidzTest only this UUIDz-debugzTurn DEBUG output ONz-tsz&Adds timestamp to every logging outputzncacn-np-detailsz
-target-ipz
ip addressz£IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name and you cannot resolve it)r   Úmetavarr›   z-portÚ139Ú445ú?zdestination portz)Destination port to connect to SMB Server)ÚchoicesÚnargsr    r¡   r›   Úauthenticationz	-auth-rpcr   z[domain/]username[:password])r   r    r›   z-auth-transportz-hashes-rpczLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASHz-hashes-transportz-no-passzdon't ask for passwordsrr   z!Password for MSRPC communication:)Úgetpass_msgz)Password for RPC transport (SMB or HTTP):z-Specify only -brute-opnums or -brute-versionszProtocol failed: %sz„This usually means the target is a MS Exchange Server, and connections to this rpc port on this host are not allowed (try port 6001)zrThis usually means the target is a MS Exchange Server, and connections to the specified RPC server are not allowedzSThis usually means the target has no ACL to connect to this endpoint using RpcProxyz]RPC proxy basic authentication might require you to specify the domain. Your domain is empty!zBA proxy in front of the target server detected (may be WAF / SIEM)r`   zBThis usually means the credentials on the MSRPC level are invalid!)`Ú
__future__r   r   ÚreÚsysrl   r“   Úimpacket.httpr   Úimpacket.examplesr   r   Úimpacket.examples.utilsr   Úimpacketr   r	   Úimpacket.dcerpc.v5.epmr
   Úimpacket.dcerpc.v5r   r   r   Úimpacket.dcerpc.v5.rpcrtr   Úimpacket.dcerpc.v5.transportr   r   r   Úimpacket.dcerpc.v5.rpchr   r   r   r   r   r   r   r‹   r{   ÚBANNERr”   r   ÚArgumentParserÚparserÚadd_argumentÚintÚadd_argument_groupÚgrouprx   ÚargvÚ
print_helpÚexitÚ
parse_argsÚoptionsÚinitÚtsÚdebugÚauth_rpcÚ
hashes_rpcÚno_passÚ	rpcdomainÚrpcuserÚrpcpassÚ_Úauth_transportÚhashes_transportÚtransportdomainÚtransportuserÚtransportpassÚbrute_opnumsÚbrute_versionsÚerrorÚstring_to_uuidtupr2   Úbrute_uuidsÚuuid_databaser/   Ú
auth_levelÚ	opnum_maxÚversion_maxÚlookuperrH   rG   rN   Ú	target_ipÚportrP   rq   rQ   r   rp   Ú
error_textÚcriticalr;   Úget_auth_typerm   r   r   r   r7   Ú<module>   s²      
\

ÿ

""

ÿ












ÿ€â¶