o
    j                  
   @   s`  d Z ddlm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 ddlmZmZmZ G d	d
 d
Zedkr.eej ejddZejdddd ejdddd ejdddd ejddddd edZejddd d! ejd"dd#d ejd$dd%d ejd&d'd(d! ed)Zejd*d+d,d! ejd-d+d.d! eejd/kre  ed/ e Ze
 ej!ej" eej#\Z$Z%Z&Z#e$du rd0Z$ej'rej'Z#ej(rde_)e&d0kre%d0krej*sej+sej(sed1Z&zeee%e&e$e#,  W dS  e-y- Z. ze/ j0ej1krddl2Z2e23  e4e5e. W Y dZ.[.dS dZ.[.ww dS )2z
mssql_cbt_check.py
Check whether Channel Binding Token (CBT) is enforced on a MSSQL server.

Usage:
    mssql_cbt_check.py [domain/]username[:password]@target [-port PORT] [-debug]

Writen by @Defte_
    )print_functionN)getpass)version)logger)parse_target)MSSQLTDS_ENCRYPT_REQTDS_ENCRYPT_OFFc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
MSQLCBTCheckc                 C   s.   || _ || _|| _|| _t|j| _|| _d S )N)usernamepassworddomaintargetintportoptions)selfr   r   r   r   r    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/checkMSSQLStatus.py__init__   s   
zMSQLCBTCheck.__init__c                 C   s   t | j| jd}|  |S )N )r   r   r   connect)r   connr   r   r   	_new_conn"   s   zMSQLCBTCheck._new_connc                 C   sX   | j }|jr|jd | j| j| j|j|j|jd d d|dS |j	d | j| j| j|jd|dS )NT)useCachecbt_fake_value)useWindowsAuthr   )
r   kkerberosLoginr   r   r   hashesaesKeydc_iplogin)r   r   cbtoptsr   r   r   _login'   s0   zMSQLCBTCheck._loginc              
   C   s  t d| j d| j  z!|  }| }|d }|tks,|tks,t d |  W d S W n tyL } zt	
d|  t d W Y d }~d S d }~ww t d z|  }| j|d d}|  W n ty~ } zt	
d	|  d
}W Y d }~nd }~ww t d|rdnd  t d z|  }| j|dd}|  W n ty } zt	
d|  d
}W Y d }~nd }~ww t d|rdnd  |r|rt d d S |r|st d d S |s|st d d S d S d S )Nz([*] Checking Channel Binding status on: :
Encryptionz?[!] Encryption not activated nor required. Channel Binding off.zpreLogin failed: z/[-] Prelogin failed, cannot check MSSQL status.zF
[*] First try: TDS computes the real Channel Binding Token (cbt=None))r#   zFirst try exception: Fz	 Result: SuccessFailurez7
[*] Second try: invalid Channel Binding Token (cbt='')    zSecond try exception: zW
[+] The two authentications succeded. Channel Binding not required (CBT not enforced).z[
[!] First authentication succeded, second failed. Channel Binding required (CBT enforced).z9
[!] The two authentications failed, invalid credentials.)printr   r   r   preLoginr   r	   
disconnect	Exceptionloggingdebugr%   )r   r   prelogin_respencefirst_ok	second_okr   r   r   runB   sZ   zMSQLCBTCheck.runN)__name__
__module____qualname__r   r   r%   r6   r   r   r   r   r
      s
    r
   __main__T)add_helpr   storez6[[domain/]username[:password]@]<targetName or address>)actionhelpz-porti  zPort MSSQL (default: 1433))defaultr>   z-debug
store_truezTurn DEBUG output ONz-tsz&Adds timestamp to every logging output	timestamp)r=   r>   destauthenticationz-hasheszLMHASH:NTHASHzNTLM hashes)metavarr>   z-no-passz'Don't ask for password (useful with -k)z-kz3Use Kerberos authentication (ccache via KRB5CCNAME)z-aesKeyzhex keyz&AES key for Kerberos (128 or 256 bits)
connectionz-dc-ipz
ip addresszIP of the domain controllerz
-target-ipz3IP of the target (overrides target name resolution)   r   z
Password: )6__doc__
__future__r   sysr/   argparser   impacketr   impacket.examplesr   impacket.examples.utilsr   impacket.tdsr   r   r	   r
   r7   r+   BANNERArgumentParserparseradd_argumentadd_argument_groupgrouplenargv
print_helpexit
parse_argsr   initrA   r0   r   r   r   r   	target_ipr    r   r   no_passr6   r.   r3   	getLoggerlevelDEBUG	traceback	print_excerrorstrr   r   r   r   <module>   sd   	
T



"