o
    àý°j}Q  ã                   @   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mZ d dlmZ d dlmZ d d	lm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ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZeƒ ZG dd„ de ƒZ!G dd „ d ƒZ"d!d"„ Z#d#d$„ Z$d%d&„ Z%G d'd(„ d(ej&ƒZ'G d)d*„ d*ej(ej)ƒZ*e+d+kr×d d,l,m-Z- e- .¡  e*ƒ Z/e/ 0¡  dS dS )-é    )Údivision)Úprint_functionN)ÚQueue)ÚunpackÚpack)ÚTimerÚThread)ÚLOG)ÚEnum)Ú	Structureg      >@c                   @   s   e Zd ZdZdZdZdZdS )Ú	enumItemsr   é   é   éÿ   N)Ú__name__Ú
__module__Ú__qualname__ÚNO_AUTHENTICATIONÚGSSAPIÚ	USER_PASSÚUNACCEPTABLE© r   r   ú£/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/servers/socksserver.pyr   ,   s
    r   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )Ú
replyFieldr   r   r   é   é   é   é   é   é   N)r   r   r   Ú	SUCCEEDEDÚSOCKS_FAILUREÚNOT_ALLOWEDÚNETWORK_UNREACHABLEÚHOST_UNREACHABLEÚCONNECTION_REFUSEDÚTTL_EXPIREDÚCOMMAND_NOT_SUPPORTEDÚADDRESS_NOT_SUPPORTEDr   r   r   r   r   2   s    r   c                   @   s   e Zd ZdZdZdZdS )ÚATYPr   r   r   N)r   r   r   ÚIPv4Ú
DOMAINNAMEÚIPv6r   r   r   r   r)   =   s    r)   c                   @   ó   e Zd ZdZdS )ÚSOCKS5_GREETINGS)©ÚVERúB=5)ÚMETHODSzB*BN©r   r   r   Ú	structurer   r   r   r   r.   B   ó    r.   c                   @   r-   )ÚSOCKS5_GREETINGS_BACK)r/   )r2   úB=0Nr3   r   r   r   r   r6   J   r5   r6   c                   @   r-   )ÚSOCKS5_REQUEST)r/   ©ÚCMDr7   ©ÚRSVr7   )r)   r7   ©ÚPAYLOADú:Nr3   r   r   r   r   r8   P   r5   r8   c                   @   r-   )ÚSOCKS5_REPLY)r/   )ÚREPr1   r;   )r)   zB=1)r>   z	:="AAAAA"Nr3   r   r   r   r   r@   Y   r5   r@   c                   @   r-   )ÚSOCKS4_REQUEST))r0   zB=4r9   )ÚPORTz>H=0)ÚADDRz4s="r=   Nr3   r   r   r   r   rB   b   r5   rB   c                   @   r-   )ÚSOCKS4_REPLY))r0   r7   )rA   zB=0x5A)r<   z<H=0)r<   z<L=0Nr3   r   r   r   r   rE   k   r5   rE   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚRepeatedTimerc                 O   s:   d | _ || _|| _|| _|| _d| _t ¡ | _|  ¡  d S ©NF)	Ú_timerÚintervalÚfunctionÚargsÚkwargsÚ
is_runningÚtimeÚ	next_callÚstart)ÚselfrI   rJ   rK   rL   r   r   r   Ú__init__x   s   
zRepeatedTimer.__init__c                 C   s&   d| _ |  ¡  | j| ji | j¤Ž d S rG   )rM   rP   rJ   rK   rL   ©rQ   r   r   r   Ú_run‚   s   zRepeatedTimer._runc                 C   sF   | j s!|  j| j7  _t| jt ¡  | jƒ| _| j ¡  d| _ d S d S )NT)rM   rO   rI   r   rN   rT   rH   rP   rS   r   r   r   rP   ‡   s   

üzRepeatedTimer.startc                 C   s   | j  ¡  d| _d S rG   )rH   ÚcancelrM   rS   r   r   r   ÚstopŽ   s   

zRepeatedTimer.stopN)r   r   r   rR   rT   rP   rV   r   r   r   r   rF   w   s
    
rF   c                   @   s@   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Ze	dd„ ƒZ
dS )Ú
SocksRelayzBase PluginÚ c                 C   s2   || _ || _|| _|d | _d | _d | _|| _d S )NÚdata)Ú
targetHostÚ
targetPortÚsocksSocketÚsessionDataÚusernameÚclientConnectionÚactiveRelays)rQ   rZ   r[   r\   r`   r   r   r   rR   œ   s   

zSocksRelay.__init__c                 C   ó   t dƒ‚©NzVirtual Function©ÚRuntimeErrorrS   r   r   r   ÚinitConnection¥   ó   zSocksRelay.initConnectionc                 C   ra   rb   rc   rS   r   r   r   ÚskipAuthentication©   rf   zSocksRelay.skipAuthenticationc                 C   ra   rb   rc   rS   r   r   r   ÚtunnelConnection­   rf   zSocksRelay.tunnelConnectionc                 C   ra   rb   rc   rS   r   r   r   ÚgetProtocolPort±   s   zSocksRelay.getProtocolPortN)r   r   r   ÚPLUGIN_NAMEÚPLUGIN_SCHEMErR   re   rg   rh   Ústaticmethodri   r   r   r   r   rW   –   s    	rW   c                 C   s¢  t  d¡ t| j ¡ ƒD ]Â}t| j|  ¡ ƒD ]¶}t| j| |  ¡ ƒD ]¨}|dkrÌ|dkrÌ| j| | | d du rÂt  d|||f ¡ z| j| | | d  ¡  W q$ tyÁ } zat jdd	d
� t  dt|ƒ ¡ t|ƒ d¡dks�t|ƒ d¡dks�t|ƒ d¡dks�t|ƒ d¡dkr·| j| | |= t	t| j| |  ¡ ƒƒdkr­| j| |= t  d|||f ¡ W Y d }~q$d }~ww t  d|||f ¡ q$qqd S )Nz-KeepAlive Timer reached. Updating connectionsrY   ÚschemeÚinUseFz Calling keepAlive() for %s@%s:%sÚprotocolClientú
Exception:T©Úexc_infoú	SOCKS: %súBroken piper   úreset by peerúInvalid argumentzServer not connectedr   ú"Removing active relay for %s@%s:%sz5Skipping %s@%s:%s since it's being used at the moment)
r	   ÚdebugÚlistr`   ÚkeysÚ	keepAliveÚ	ExceptionÚstrÚfindÚlen)ÚserverÚtargetÚportÚuserÚer   r   r   ÚkeepAliveTimer·   s2   
$$€÷€îþÿr…   c           	   
   C   s¼  	 t  ¡ \}}}}}}|| jv duri | j|< || j| v dur'i | j| |< || j| | v durÏt d|||||jf ¡ i | j| | |< || j| | | d< d| j| | | d< || j| | | d< || j| | d< || j| | d< d| j| | | d	< zt d
t|ƒ ¡ | ¡ }|| j| | | d	< W n t	y½ } zd| j| | | d	< W Y d }~nd }~ww t d| j| | | d	  ¡ nt d|||f ¡ | 
¡  q)NTzCSOCKS: Adding %s://%s@%s(%s) [%s] to active SOCKS connection. Enjoyro   Frn   rY   rm   zN/AÚisAdminz!Checking admin status for user %szisAdmin returned: %sz<Relay connection for %s at %s(%d) already exists. Discarding)ÚactiveConnectionsÚgetr`   r	   ÚinfoÚ	client_idrx   r}   r†   r|   ÚkillConnection)	r€   r�   r‚   rm   ÚuserNameÚclientrY   r†   r„   r   r   r   ÚactiveConnectionsWatcherÑ   s8   
€ý"ÜrŽ   c                    s   ‡ ‡fdd„}|S )Nc                    sŒ   ddl m}m‰  |tƒ}t d¡}| tj¡ | d¡‡fdd„ƒ}|jddgd	�‡ ‡fd
d„ƒ}|jddgd	�dd„ ƒ}|j	ˆˆd� d S )Nr   )ÚFlaskÚjsonifyÚwerkzeugú/c                      s   t ˆ jƒ dtˆ jƒ S )NzRelays available: %s!)Úprintr`   r   r   )r€   r   r   Úindex  s   
z.webService.<locals>._webService.<locals>.indexz/ntlmrelayx/api/v1.0/relaysÚGET)Úmethodsc                     sª   g } ˆj D ]K}ˆj | D ]C}ˆj | | D ]9}|dkrN|dkrNˆj | | | d j}ˆj | | d }ˆj | | | d }|  ||||t|ƒt|ƒg¡ qqqˆ | ƒS )NrY   rm   ro   r†   )r`   rŠ   Úappendr}   )Úrelaysr�   r‚   rƒ   rŠ   Úprotocolr†   ©r�   r€   r   r   Ú
get_relays  s   
€ûÿz3webService.<locals>._webService.<locals>.get_relaysc                 S   s   d S ©Nr   )Úrelayr   r   r   Úget_info  s   z1webService.<locals>._webService.<locals>.get_info)Úhostr‚   )
Úflaskr�   r�   r   ÚloggingÚ	getLoggerÚsetLevelÚERRORÚrouteÚrun)r€   r�   ÚappÚlogr”   r›   rž   ©Úaddrr‚   rš   r   Ú_webServiceú   s   

zwebService.<locals>._webServicer   )rª   r‚   r«   r   r©   r   Ú
webServiceù   s    r¬   c                   @   s*   e Zd Zdd„ Zejfdd„Zdd„ ZdS )ÚSocksRequestHandlerc                 C   sF   || _ |\| _| _|| _d| _d | _d | _d | _tj	 
| |||¡ d S )Nr   )Ú!_SocksRequestHandler__socksServerÚ_SocksRequestHandler__ipÚ_SocksRequestHandler__portÚ _SocksRequestHandler__connSocketÚ"_SocksRequestHandler__socksVersionrZ   r[   Ú_SocksRequestHandler__NBSessionÚsocketserverÚBaseRequestHandlerrR   )rQ   ÚrequestÚclient_addressr€   r   r   r   rR     s   zSocksRequestHandler.__init__c                 C   sD   | j dkrtƒ }|j|d< ntƒ }|jdkrd|d< | j | ¡ ¡S )Nr   rA   r   é[   )r²   r@   ÚvaluerE   r±   ÚsendallÚgetData)rQ   ÚerrorÚreplyr   r   r   ÚsendReplyError'  s   

z"SocksRequestHandler.sendReplyErrorc              
   C   s¬  t  d| j| jf ¡ | j d¡}t|ƒ}|d | _| jdkr3| j tƒ  	¡ ¡ | j d¡}t
|ƒ}nt|ƒ}| jdkrš|d tjjkr_t |d d d… ¡| _td|d dd … ƒd	 | _n{|d tjjkr”td
|d d d… ƒd	 }|d d|d … jdd�| _td|d |d d … ƒd	 | _nFt  d¡ n@|d | _|d d d… dkrÒ|d d dkrÒ|d  d¡}|dkrÂt  d¡ n|d  dd¡d d d… | _nt |d ¡| _t  d| j| jf ¡ | jdk�r'| j| jjv �r| j| jj| j v du�rt  d| j| jf ¡ |  tj¡ d S nt  d| j| jf ¡ |  tj¡ d S | jdk�rät ¡ }zt  d| j| jf ¡ | | j| jf¡ W n* t�yq } zt jddd� t  dt |ƒ ¡ |  tj¡ W Y d }~d S d }~ww | jdk�r”t!ƒ }tj"j|d< | #¡ \}	}
t $|	¡t%d|
ƒ |d< nt&ƒ }| j | 	¡ ¡ 	 z| j d¡}|dk�r®W n6| |¡ | d¡}| j |¡ W n" t�yá } zt jddd� t  dt |ƒ¡ W Y d }~nd }~ww �q d }| j| jjv �r| j| jj| j v �r| jj| j | j d  }|d u�r¥t  d!| j| jj'| f ¡ | jj'| | j| j| j| jj| j | j ƒ}d"}�zKz~| (¡  | jdk�rZt!ƒ }tj"j|d< | j #¡ \}	}
t $|	¡t%d|
ƒ |d< nt&ƒ }| j | 	¡ ¡ | )¡ du�rš| j *¡  W W |j+d u�r–| jj ,| ji ¡ ,| ji ¡}|j+|v �r˜d"||j+ d#< d S d S d S d| jj| j | j |j+ d#< | -¡  d}W n© t�yY } zœt jddd� t  dt |ƒ ¡ t |ƒ d$¡d	k�sçt |ƒ d%¡d	k�sçt |ƒ d&¡d	k�rO| jj| j | j |j+= t.t/| jj| j | j  0¡ ƒƒdk�r| jj| j | j= t  d'|j+| j| jf ¡ |  tj¡ W Y d }~W |j+d u�rK| jj ,| ji ¡ ,| ji ¡}|j+|v �rMd"||j+ d#< d S d S d S W Y d }~nd }~ww W |j+d u�r|| jj ,| ji ¡ ,| ji ¡}|j+|v �r|d"||j+ d#< n"|j+d u�rž| jj ,| ji ¡ ,| ji ¡}|j+|v �ržd"||j+ d#< w |�r¤d S nt  d(¡ t  d)¡ z	|  tj¡ W d S  t�yÕ } zt  d*t |ƒ ¡ W Y d }~d S d }~ww )+Nz!SOCKS: New Connection from %s(%s)i    r0   r   r)   r>   r   z>Hr   z!Br   zutf-8)ÚencodingzNo support for IPv6 yet!rC   rD   r   z   ú éÿÿÿÿz#Error while reading SOCKS4a header!zSOCKS: Target is %s(%s)é5   Tz$SOCKS: Don't have a relay for %s(%s)zSOCKS: Connecting to %s(%s)rp   rq   rs   rA   ó    rm   zHandler for port %s found %sFrn   rt   ru   rv   rw   z+SOCKS: I don't have a handler for this portzSOCKS: Shutting down connectionzSOCKS END: %s)1r	   rx   r¯   r°   r±   Úrecvr6   r²   rº   r»   r8   rB   r)   r*   r¹   ÚsocketÚ	inet_ntoarZ   r   r[   r+   Údecoder¼   r~   Úsplitr®   r`   r¾   r   r%   Úconnectr|   r}   r@   r    ÚgetsocknameÚ	inet_atonr   rE   ÚsocksPluginsre   rg   Úcloser^   rˆ   rh   r   ry   rz   )rQ   rY   Ú	grettingsr¶   Ú
hostLengthÚnullBytePosÚsr„   r½   rª   r‚   rm   r�   Úsession_completedÚport_relaysr   r   r   Úhandle2  s  



"
$ ý€ü


€þø
ÿ
ýë(&ýû€ô€€ýÿ

 €ÿzSocksRequestHandler.handleN)r   r   r   rR   r   r%   r¾   rÔ   r   r   r   r   r­     s    
r­   c                   @   s$   e Zd Zdedfdd„Zdd„ ZdS )ÚSOCKS)z	127.0.0.1i8  i‚#  c                 C   sì   t  d|d |d ¡ i | _i | _d | _d | _g | _dtj_	tj 
| ||¡ ddlm} |D ]}t  d|j ¡ || j|j< | j |j¡ q.ttt| ƒ| _tt|d |ƒ| fd�| _d| j_| j ¡  tt| fd�| _d| j_| j ¡  d S )Nz'SOCKS proxy started. Listening on %s:%dr   r   T)ÚSOCKS_RELAYSz%s loaded..)r�   rK   )r	   r‰   r`   rÌ   ÚrestAPIrŽ   ÚsupportedSchemesr´   Ú	TCPServerÚallow_reuse_addressrR   Ú1impacket.examples.ntlmrelayx.servers.sockspluginsrÖ   rj   rk   r—   rF   ÚKEEP_ALIVE_TIMERr…   Ú_SOCKS__timerr   r¬   ÚdaemonrP   )rQ   Úserver_addressÚhandler_classÚapi_portrÖ   r�   r   r   r   rR   Ö  s(   
zSOCKS.__init__c                 C   s   | j  ¡  | `| `tj | ¡S rœ   )rÝ   rV   r×   rŽ   r´   rÙ   ÚshutdownrS   r   r   r   râ   ö  s   
zSOCKS.shutdownN)r   r   r   r­   rR   râ   r   r   r   r   rÕ   Õ  s     rÕ   Ú__main__)Úlogger)1Ú
__future__r   r   r´   rÅ   rN   r¡   Úqueuer   Ústructr   r   Ú	threadingr   r   Úimpacketr	   Úimpacket.dcerpc.v5.enumr
   Úimpacket.structurer   rÜ   r   r   r)   r.   r6   r8   r@   rB   rE   r‡   ÚobjectrF   rW   r…   rŽ   r¬   rµ   r­   ÚThreadingMixInrÙ   rÕ   r   Úimpacket.examplesrä   ÚinitrÑ   Úserve_foreverr   r   r   r   Ú<module>   sJ   			!(# :'ü