o
    àý°jl-  ã                   @   sÔ   d dl Z d dl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	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ zd dlmZ W n	   e d¡ ‚ d	ZG d
d	„ d	e	ƒZdS )é    N)ÚLOG)Ú
SocksRelay)ÚgenerateImpacketCert)Ú	TDSPacketÚTDS_STATUS_NORMALÚTDS_STATUS_EOMÚTDS_PRE_LOGINÚTDS_ENCRYPT_NOT_SUPÚTDS_TABULARÚ	TDS_LOGINÚ
TDS_LOGIN7ÚTDS_PRELOGINÚTDS_INTEGRATED_SECURITY_ONÚTDS_SQL_BATCHÚTDS_ENCRYPT_STRICT)ÚNTLMAuthChallengeResponse)ÚSSLz*pyOpenSSL is not installed, can't continueÚMSSQLSocksRelayc                   @   s¤   e Zd ZdZdZdd„ Ze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„ Zd'dd„Zdd„ Zdd„ Zd(dd „Zd!d"„ Zd#d$„ Zd%d&„ ZdS ))r   zMSSQL Socks PluginÚMSSQLc                 C   s:   t  | ||||¡ d| _d | _d| _d | _d| _d| _d S )NFiû  ó    )r   Ú__init__ÚisSSLÚ	tlsSocketÚ
packetSizeÚsessionÚclient_tds8Ú_recv_buffer)ÚselfÚ
targetHostÚ
targetPortÚsocksSocketÚactiveRelays© r"   úª/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/servers/socksplugins/mssql.pyr   /   s   
zMSSQLSocksRelay.__init__c                   C   s   dS )Ni™  r"   r"   r"   r"   r#   ÚgetProtocolPort8   s   zMSSQLSocksRelay.getProtocolPortc                 C   s   d S ©Nr"   ©r   r"   r"   r#   ÚinitConnection<   s   zMSSQLSocksRelay.initConnectionc                 C   sF   | j  ¡ D ]\}}|dv rqt| d¡dd ƒ}t|ddƒr  dS qdS )N)ÚdataÚschemeÚprotocolClientr   Útds8FT)r!   ÚitemsÚgetattrÚget)r   ÚuserÚrelayr   r"   r"   r#   Ú_backend_requires_tds8?   s   ÿz&MSSQLSocksRelay._backend_requires_tds8c                 C   s   | j s|  ¡ r	tS tS r%   )r   r1   r   r	   r&   r"   r"   r#   Ú_get_prelogin_encryptionH   s   z(MSSQLSocksRelay._get_prelogin_encryptionc                 C   sx   t j t ¡ d¡}t j |¡st|ƒ t tj	¡}tj
j|_| d¡ | dg¡ | |¡ |j| jdd�| _d| _d S )Nzimpacket-mssql-socks.pemzALL:@SECLEVEL=0ztds/8.0T)Úserver_side)ÚosÚpathÚjoinÚtempfileÚ
gettempdirÚexistsr   ÚsslÚ
SSLContextÚPROTOCOL_TLS_SERVERÚ
TLSVersionÚMINIMUM_SUPPORTEDÚminimum_versionÚset_ciphersÚset_alpn_protocolsÚload_cert_chainÚwrap_socketr    r   )r   Ú	cert_pathÚcontextr"   r"   r#   Ú _wrap_client_connection_for_tds8M   s   



z0MSSQLSocksRelay._wrap_client_connection_for_tds8c                 C   sD   |   ¡ sd S | j dtj¡}|r|d d… dkr |  ¡  d S d S d S )Né   ó   )r1   r    ÚrecvÚsocketÚMSG_PEEKrF   )r   Ú
first_byter"   r"   r#   Ú_maybe_switch_client_to_tds8Z   s   ÿz,MSSQLSocksRelay._maybe_switch_client_to_tds8c                 C   s   t | jddƒo
| j S )Nr+   F)r-   r   r   r&   r"   r"   r#   Ú"_should_wrap_sql_batch_for_backendb   s   z2MSSQLSocksRelay._should_wrap_sql_batch_for_backendc                 C   s
  |   ¡  |  ¡ }|d tkrt d|d  ¡ dS tƒ }d|d< |  ¡ |d< t dt	 
dd	¡¡|d
< d|d< |  t| ¡ d¡ |d tkrJ| jsJdS |  ¡ }|d tkr_t d|d  ¡ dS tƒ }| |d ¡ |d t@ r¾| jd }|  |d |d d¡ |  ¡ }tƒ }| |d ¡ |d | _zd|d  d¡|d  d¡f  ¡ | _W n^ ty½   d|d |d f  ¡ | _Y nIw |d  d¡dkräz|d  ¡  d¡| _W n2 tyã   |d  ¡ | _Y n#w zd|d  d¡  ¡ | _W n t�y   d|d   ¡ | _Y nw | j| jv �rK| j| j d du �r't d| j| j| jf ¡ dS t d| j| j| jf ¡ | j| j   d| j¡| _| j| j d j!| _!nt d| j| j| jf ¡ dS |d t@ �rs| jd }|  |d |d d¡ dS | jd }|  |d |d d¡ dS ) NÚTypez2Unexpected packet type %d instead of TDS_PRE_LOGINFs    U  ÚVersionÚ
Encryptionz<Lr   iÿÿ  ÚThreadIDó    ÚInstancez.Unexpected packet type %d instead of TDS_LOGINÚDataÚOptionFlags2ÚNTLM_CHALLENGEÚ	user_namez%s/%sÚdomain_namezutf-16leÚUserNameú/z/%sÚinUseTz<MSSQL: Connection for %s@%s(%s) is being used at the moment!z,MSSQL: Proxying client session for %s@%s(%s)r(   r*   z)MSSQL: No session for %s@%s(%s) availableÚAUTH_ANSWER)"rM   ÚrecvTDSr   r   Údebugr   r2   ÚstructÚpackÚrandomÚrandintÚsendTDSr
   ÚgetDatar   r   r   r   Ú
fromStringr   ÚsessionDatar   ÚusernameÚdecodeÚupperÚUnicodeDecodeErrorÚfindr!   Úerrorr   r   Úinfor.   r   )r   ÚtdsÚpreloginÚloginÚTDSResponseÚauthenticateMessager"   r"   r#   ÚskipAuthenticatione   sˆ   

ÿÿþþþÿÿÿ

ýz"MSSQLSocksRelay.skipAuthenticationc                 C   sž   z4	 |   ¡ }|d }|d tkr|  ¡ r| j |¡}| j |d |d¡ | j  ¡ }|  |d |d d¡ q ty>   Y dS  tyN   tj	ddd� Y dS w )NTrU   rO   r   z
Exception:)Úexc_info)
r^   r   rN   r   Ú_wrap_sql_batch_datard   ÚEOFErrorÚ	Exceptionr   r_   )r   ro   Úpacket_datar"   r"   r#   ÚtunnelConnectionÁ   s"   
óüüz MSSQLSocksRelay.tunnelConnectionrG   c                 C   s  t |ƒd | jkrn|| jd d … }tƒ }||d< t|d< ||d< |d | jd … |d< |  | ¡ ¡ t |ƒ| jd krh|d7 }||d< |d | jd … |d< |  | ¡ ¡ || jd d … }t |ƒ| jd ks<|}|d7 }tƒ }||d< t|d< ||d< ||d< |  | ¡ ¡ d S )Né   rO   ÚStatusÚPacketIDrU   rG   )Úlenr   r   r   ÚsocketSendallre   r   )r   Ú
packetTyper(   ÚpacketIDÚ	remainingro   r"   r"   r#   rd   Û   s.   ûzMSSQLSocksRelay.sendTDSc                 C   s<   | j d u r| j |¡S | j  |¡ | j  | j¡}| j |¡S r%   )r   r    ÚsendallÚbio_readr   )r   r(   Úddr"   r"   r#   r   õ   s
   
zMSSQLSocksRelay.socketSendallc                 C   s‚   | j  |¡}| jd ur?d}| j |¡ 	 z
|| j |¡7 }W n tjy8   | j  |t|ƒ ¡}| j |¡ Y nw |}	 |S q|S )Nr   )r    rI   r   Ú	bio_writeÚreadr   ÚWantReadErrorr~   )r   r   r(   r…   Údata2r"   r"   r#   Ú
socketRecvý   s"   
ýö
zMSSQLSocksRelay.socketRecvNc                 C   sr   |d u r| j }|  |¡}|d }|tkr7|  |¡}|d }|d  |d 7  < |d  |d d 7  < |tks|S )Nr|   rU   ÚLengthr{   )r   Ú_recv_tds_packetr   )r   r   ÚpacketÚstatusÚ	tmpPacketr"   r"   r#   r^     s   

üzMSSQLSocksRelay.recvTDSc                 C   s   |   |¡}|stdƒ‚|S )Nz$MSSQL SOCKS client closed connection)rŠ   rw   )r   r   r(   r"   r"   r#   Ú_recv_chunk  s   
zMSSQLSocksRelay._recv_chunkc                 C   sR   t | jƒ|k r|  j|  |¡7  _t | jƒ|k s| jd |… }| j|d … | _|S r%   )r~   r   r�   )r   Úlengthr   r(   r"   r"   r#   Ú_recv_exact#  s   ÿzMSSQLSocksRelay._recv_exactc                 C   s4   |   d|¡}t|ƒ}|d d }|   ||¡|d< |S )Nr{   r‹   rU   )r’   r   )r   r   Úheaderr�   Ú	packetLenr"   r"   r#   rŒ   +  s
   z MSSQLSocksRelay._recv_tds_packet)rG   r%   )Ú__name__Ú
__module__Ú__qualname__ÚPLUGIN_NAMEÚPLUGIN_SCHEMEr   Ústaticmethodr$   r'   r1   r2   rF   rM   rN   rt   rz   rd   r   rŠ   r^   r�   r’   rŒ   r"   r"   r"   r#   r   +   s*    	
	\

) r4   rJ   r`   rb   r:   r7   Úimpacketr   Ú0impacket.examples.ntlmrelayx.servers.socksserverr   Ú&impacket.examples.ntlmrelayx.utils.sslr   Úimpacket.tdsr   r   r   r   r	   r
   r   r   r   r   r   r   Úimpacket.ntlmr   ÚOpenSSLr   ÚcriticalÚPLUGIN_CLASSr   r"   r"   r"   r#   Ú<module>   s$   8
