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rd 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 rt d|||f  z| j| | | d   W q$ ty } zat jdd	d
 t dt|  t|ddkst|ddkst|ddkst|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rt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rt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rt 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rt }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rt! }tj"j|d< |# \}	}
t$|	t%d|
 |d< nt& }| j|	  	 z| jd}|dkrW n6|| |d}| j| W n" ty } zt jddd t dt | W Y d }~nd }~ww qd }| j| jjv r| j| jj| j v r| jj| j | j d  }|d urt 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 rd"||j+ d#< d S d S d S d| jj| j | j |j+ d#< |-  d}W n tyY } zt jddd t dt |  t |d$d	kst |d%d	kst |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 rd"||j+ d#< w |rd 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   			!(# :'