o
    àý°j·  ã                   @   s¤   d dl Z d dlZd dl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 d dlmZ d dlmZmZ d dlmZ dZG dd	„ d	eƒZG d
d„ deƒZdS )é    N)ÚProtocolClient)
ÚMSSQLÚ
DummyPrintÚTDS_ENCRYPT_OFFÚ	TDS_LOGINÚTDS_INIT_LANG_FATALÚTDS_ODBC_ONÚTDS_INTEGRATED_SECURITY_ONÚ
TDS_LOGIN7ÚTDS_SSPIÚTDS_LOGINACK_TOKEN)ÚNTLMAuthChallenge)ÚSTATUS_SUCCESSÚSTATUS_ACCESS_DENIED)ÚSPNEGO_NegTokenRespÚMSSQLRelayClientc                   @   s>   e Zd Zdeƒ fdd„Zdd„ Zdd„ Zdd	d
„Zdd„ ZdS )ÚMYMSSQLé™  c                 C   s    t  | |||¡ d | _i | _d S ©N)r   Ú__init__ÚrespÚsessionData)ÚselfÚaddressÚportÚrowsPrinter© r   ú¨/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/clients/mssqlrelayclient.pyr   '   s   
zMYMSSQL.__init__c                 C   s   |   ¡  |  ¡ | _dS ©NT)ÚconnectÚ_negotiate_encryptionr   ©r   r   r   r   ÚinitConnection,   s   
zMYMSSQL.initConnectionc                 C   s  t ƒ }|  ¡ |d< |  |d ¡ d dd„ tdƒD ƒ¡ d¡|d< d dd„ tdƒD ƒ¡ d¡|d	< | j d¡|d
< |d	 |d< t dd¡|d< | j	|d< t
tB tB |d< ||d< t| ¡ ƒ|d< |  t| ¡ ¡ | jsv| jd tkrvd | _|  ¡ }|| jd< tƒ }| |d dd … ¡ |S )NÚ
TDSVersionÚ c                 S   ó   g | ]}t  tj¡‘qS r   ©ÚrandomÚchoiceÚstringÚascii_letters©Ú.0Ú_r   r   r   Ú
<listcomp>6   ó    z)MYMSSQL.sendNegotiate.<locals>.<listcomp>é   zutf-16leÚHostNamec                 S   r%   r   r&   r+   r   r   r   r.   7   r/   ÚAppNameÚ
ServerNameÚ
CltIntNamer   i   Ú	ClientPIDÚ
PacketSizeÚOptionFlags2ÚSSPIÚLengthÚ
EncryptionÚNTLM_CHALLENGEÚDataé   )r   Ú_get_default_login7_tds_versionÚ_set_session_login7_tds_versionÚjoinÚrangeÚencodeÚserverr'   ÚrandintÚ
packetSizer   r   r	   ÚlenÚgetDataÚsendTDSr
   Útds8r   r   Ú	tlsSocketÚrecvTDSr   r   Ú
fromString)r   ÚnegotiateMessageÚloginÚtdsÚ	challenger   r   r   ÚsendNegotiate1   s(   ""

zMYMSSQL.sendNegotiateNc                 C   s„   t  d|d d… ¡d tjkrt|ƒ}|d }n|}|  t|¡ |  ¡ }|  |d ¡| _t	| jv r:|| j
d< d tfS |  ¡  d tfS )NÚBé   r   ÚResponseTokenr<   ÚAUTH_ANSWER)ÚstructÚunpackr   ÚSPNEGO_NEG_TOKEN_RESPrH   r   rK   Ú
parseReplyÚrepliesr   r   r   ÚprintRepliesr   )r   ÚauthenticateMessageBlobÚserverChallengeÚ
respToken2ÚtokenrO   r   r   r   ÚsendAuthS   s   


zMYMSSQL.sendAuthc                 C   s   |   ¡ S r   )Ú
disconnectr!   r   r   r   Úclosed   s   zMYMSSQL.closer   )	Ú__name__Ú
__module__Ú__qualname__r   r   r"   rQ   r`   rb   r   r   r   r   r   &   s    
"r   c                   @   s\   e Zd ZdZd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 )r   r   r   Tc                 C   s.   t  | ||||¡ || _d | _d | _d | _d S r   )r   r   ÚextendedSecurityÚdomainIpÚmachineAccountÚmachineHashes)r   ÚserverConfigÚ
targetHostÚ
targetPortrf   r   r   r   r   k   s
   
zMSSQLRelayClient.__init__c                 C   s   t | j| jƒ| _| j ¡  dS r   )r   rk   rl   Úsessionr"   r!   r   r   r   r"   s   s   
zMSSQLRelayClient.initConnectionc                 C   s   d S r   r   r!   r   r   r   Ú	keepAlivex   s   zMSSQLRelayClient.keepAlivec                 C   s"   | j d ur| j  ¡  d | _ d S d S r   )rm   ra   r!   r   r   r   ÚkillConnection|   s   


þzMSSQLRelayClient.killConnectionc                 C   ó   | j  |¡S r   )rm   rQ   )r   rM   r   r   r   rQ   �   ó   zMSSQLRelayClient.sendNegotiateNc                 C   s   | j j| _| j  ||¡S r   )rm   r   r`   )r   r\   r]   r   r   r   r`   „   s   
zMSSQLRelayClient.sendAuthc                 C   rp   r   )rm   Úbatch)r   Úqueryr   r   r   Ú	sql_query‰   rq   zMSSQLRelayClient.sql_queryc                 C   ó
   | j  ¡ S r   )rm   r[   r!   r   r   r   r[   Œ   ó   
zMSSQLRelayClient.printRepliesc                 C   ru   r   )rm   Ú	printRowsr!   r   r   r   rw   �   rv   zMSSQLRelayClient.printRows)r   Tr   )rc   rd   re   ÚPLUGIN_NAMEr   r"   rn   ro   rQ   r`   rt   r[   rw   r   r   r   r   r   h   s    

)rV   r'   r)   Ú$impacket.examples.ntlmrelayx.clientsr   Úimpacket.tdsr   r   r   r   r   r   r	   r
   r   r   Úimpacket.ntlmr   Úimpacket.nt_errorsr   r   Úimpacket.spnegor   ÚPROTOCOL_CLIENT_CLASSr   r   r   r   r   r   Ú<module>   s   0B