コンテンツにスキップ

TDS / MQTT / Exchange

技術目次へ戻る

このページでは、SQL Server の TDS、メッセージ配信用の MQTT、Exchange の NSPI を扱います。それぞれの通信の入口と、Impacket が応答をどう読むかを 確認できます。対応する CLI は MSSQL / Exchange / MQTT のコマンド一覧にまとめています。

実装: impacket/tds.py の MSSQL。 対話は impacket/examples/mssqlshell.py。

通常の搬送路は TCP です。mssqlclient.py -named-pipe は SMB で名前付き パイプを開き、同じ TDS メッセージを送ります。-auth-smb / -hashes-smb で SMB と SQL の資格情報を分けられます。Windows 認証では SMB 側の identity が SQL login に使われます。TDS 8.0 の strict encryption は名前付きパイプで サポートされません。

MSSQL.getInstances() は UDP 1434 (SQLR_PORT) に SQLR_CLNT_UCAST_EX を送ります。mssqlinstance と同じ Browser プロトコルです。応答は name;value; の繰り返しで、 instance 名、port、named pipe、version が入ります。Kerberos SPN (MSSQLSvc/host:port または MSSQLSvc/host:INSTANCE) を決める材料です。

TDS_PRELOGIN で version、encryption、instance、thread id を交換します。 encryption が要求されれば TLS に切り替え、以降の LOGIN7 をその上に載せます。 TDS 8 経路 (tds8) もあります。

TDS_LOGIN (LOGIN7) の認証:

経路CLIwire
SQL authentication既定LOGIN7 に user / 難読化 password
Windows NTLM-windows-authSSPI フィールドに Type1/Type2/Type3
Kerberos-kSSPI に SPNEGO + AP-REQ。kerberosLogin()

username に DOMAIN\user と書いてあるだけでは Windows auth になりません。 -windows-auth が login mechanism を切り替えます。

SQL password は LOGIN7 上で nibble swap と XOR による難読化 (encryptPassword()) であり、TLS が無いと保護になりません。

TLS 上では channel binding が効きます。クライアントは generate_cbt_from_tls_unique() で tls-unique を作ります。 checkMSSQLStatus は login 応答から CBT の強制度を見ます。TDS 8 (tds8) は PRELOGIN 前に TLS を張る経路です。

query は SQL Batch パケットです。サーバは token 列を返します。

Token意味
COLMETADATA列名と型
ROW / NBCROW行
DONE / DONEPROC / DONEINPROCバッチ終端。エラー有無の status
ERROR / INFOメッセージ。ERROR のあとにも DONE が来る
ENVCHANGEdatabase 切替など。session に残る
LOGINACK / FEATUREEXTACK / RETURNSTATUSlogin と機能

TDS_INFO_ERROR と TDS_DONE には 7.1 以前と 7.2 以降 (login7_uses_72_plus_token_layout) があります。packet 境界と token 境界は 別です。複数 result set と NULL を通常行と混同しないでください。

MSSQLShell の xp_cmdshell などの helper は、同じ session で サーバ側プロシージャを呼びます。database context と transaction は 残ります。

関連 CLI: mssqlclient

実装: impacket/mqtt.py。 mqtt_check が CONNECT を送り、 anonymous の可否と CONNACK を見ます。Windows 認証スタックとは独立です。 固定ヘッダ + remaining length の可変長整数が wire の基本です。

exchanger は nspi.py と oxabref.py を使い、 address book を列挙・dump します。transport は RPC over HTTP (ncacn_http) が多いです。

NSPI は MAPI address book の RPC interface です。GUID / DNT lookup、 table の制限付き列挙が中心で、メールボックス本体の EWS/MAPI クライアント ではありません。

  • TDS version と token レイアウトを対で変える
  • Windows auth と SQL auth の LOGIN7 フィールドを混在させない
  • CBT / TLS 切替を PRELOGIN の encryption フラグと矛盾させない
  • MQTT はプロトコル版 (3.1 / 3.1.1) の CONNECT flag を確認する