TDS / MQTT / Exchange
このページでは、SQL Server の TDS、メッセージ配信用の MQTT、Exchange の NSPI を扱います。それぞれの通信の入口と、Impacket が応答をどう読むかを 確認できます。対応する CLI は MSSQL / Exchange / MQTT のコマンド一覧にまとめています。
TDS (MSSQL)
Section titled “TDS (MSSQL)”実装: 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 は名前付きパイプで
サポートされません。
sequenceDiagram
participant C as MSSQL client
participant S as SQL Server :1433
C->>S: PRELOGIN
opt encryption
C->>S: TLS handshake
end
C->>S: LOGIN7 (SQL auth または SSPI)
S-->>C: LOGINACK / ERROR / FEATUREEXTACK
C->>S: SQL Batch
S-->>C: COLMETADATA / ROW / DONE / INFO / ERROR
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) を決める材料です。
PRELOGIN と LOGIN7
Section titled “PRELOGIN と LOGIN7”TDS_PRELOGIN で version、encryption、instance、thread id を交換します。
encryption が要求されれば TLS に切り替え、以降の LOGIN7 をその上に載せます。
TDS 8 経路 (tds8) もあります。
TDS_LOGIN (LOGIN7) の認証:
| 経路 | CLI | wire |
|---|---|---|
| SQL authentication | 既定 | LOGIN7 に user / 難読化 password |
| Windows NTLM | -windows-auth | SSPI フィールドに Type1/Type2/Type3 |
| Kerberos | -k | SSPI に 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 を張る経路です。
Token stream
Section titled “Token stream”query は SQL Batch パケットです。サーバは token 列を返します。
| Token | 意味 |
|---|---|
| COLMETADATA | 列名と型 |
| ROW / NBCROW | 行 |
| DONE / DONEPROC / DONEINPROC | バッチ終端。エラー有無の status |
| ERROR / INFO | メッセージ。ERROR のあとにも DONE が来る |
| ENVCHANGE | database 切替など。session に残る |
| LOGINACK / FEATUREEXTACK / RETURNSTATUS | login と機能 |
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 の基本です。
Exchange NSPI
Section titled “Exchange NSPI”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 クライアント ではありません。
変更時の確認
Section titled “変更時の確認”- TDS version と token レイアウトを対で変える
- Windows auth と SQL auth の LOGIN7 フィールドを混在させない
- CBT / TLS 切替を PRELOGIN の encryption フラグと矛盾させない
- MQTT はプロトコル版 (3.1 / 3.1.1) の CONNECT flag を確認する

