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r¸e ¡  e d/¡ e ¡ Ze
  ej!ej"¡ eej#ƒ\Z$Z%Z&Z#e$du rÓd0Z$ej'rÙej'Z#ej(rßde_)e&d0krôe%d0krôej*sôej+sôej(sôed1ƒZ&zeee%e&e$e#ƒ ,¡  W dS  e-�y- Z. ze /¡ j0ej1k�rddl2Z2e2 3¡  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|r…d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|rÂdnd› �ƒ |rÑ|rÑt dƒ d S |rÛ|sÛt dƒ d S |så|sçt 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



"€üÖ