ペネトレーションテストやネットワーク管理に役立つ smbclient.py の使い方を学びましょう。
1. Impacket とは?
Impacket は、ネットワークプロトコルを扱うための Python クラスのコレクションです。特に、Windows 環境でよく使われる SMB (Server Message Block), MSRPC, NTLM, Kerberos などのプロトコルを低レベルで操作することに長けています。これにより、セキュリティ研究者やペネトレーションテスターは、ネットワークサービスの探索、脆弱性評価、認証情報の抽出、横展開 (Lateral Movement) などのタスクを効率的に行うことができます。
Impacket はライブラリとしてだけでなく、すぐに使える便利なコマンドラインツール群 (Example Scripts) も提供しており、`smbclient.py` もその一つです。これらのツールは、実際の攻撃シナリオをシミュレートしたり、システムのセキュリティ設定をテストしたりする際に非常に強力です。
2. smbclient.py とは?
impacket-smbclient
(または smbclient.py
) は、Impacket フレームワークに含まれるツールの1つで、SMB/CIFS プロトコルを使用してリモートのファイル共有に接続するためのクライアントです。Linux 標準の smbclient
コマンドと似ていますが、Impacket ならではの機能、特に高度な認証方式 (NTLM ハッシュや Kerberos チケットなど) のサポートが特徴です。
主な機能は以下の通りです:
- リモート共有のリスト表示
- ファイルやディレクトリのリスト表示
- ファイルのアップロード (put)
- ファイルのダウンロード (get, mget)
- ディレクトリの作成 (mkdir)
- ファイルやディレクトリの削除 (rm, rmdir)
- ファイルのリネーム
- 対話的なシェルインターフェース
ペネトレーションテストにおいては、侵害したシステムから機密情報を探索したり、マルウェアやツールをアップロードしたり、共有設定の不備を調査したりする目的で広く利用されます。
3. インストール方法
Impacket は Python で書かれており、pip を使って簡単にインストールできます。Kali Linux などのペネトレーションテスト用ディストリビューションには、多くの場合プリインストールされています (`impacket-smbclient` のようなコマンド名で提供されることもあります)。
もしインストールされていない場合は、以下のコマンドでインストールできます。pipx
を使うと、依存関係の衝突を避けてツールを独立した環境にインストールできるため推奨されます。
# pipx を使う場合 (推奨)
pipx install impacket
# pip を使う場合
pip install impacket
または、GitHub リポジトリから直接クローンしてインストールすることも可能です。
git clone https://github.com/fortra/impacket.git
cd impacket
pip install .
インストール後、smbclient.py
スクリプトは Impacket の examples ディレクトリ内、またはシステムパスが通っていれば直接実行できます (Kali Linux では impacket-smbclient
として実行できる場合が多いです)。
4. 基本的な使い方
smbclient.py
の基本的な接続書式は以下の通りです。
smbclient.py [[ドメイン/]ユーザー名[:パスワード]@]ターゲット名またはIPアドレス
例えば、IP アドレス 192.168.1.100
のサーバーに、ユーザー名 user
、パスワード password
で接続する場合は以下のようになります。
smbclient.py user:password@192.168.1.100
ドメイン CORP
のユーザー admin
として接続する場合:
smbclient.py CORP/admin:SecretPass123@192.168.1.100
パスワードを省略すると、対話的にパスワードの入力を求められます。
smbclient.py CORP/admin@192.168.1.100
Password:
接続に成功すると、smb: \>
というプロンプトが表示され、対話的なシェルモードに入ります。ここで様々なコマンドを実行できます。
対話モードの主なコマンド
コマンド | 説明 |
---|---|
help |
利用可能なコマンドの一覧を表示します。 |
shares |
ターゲットサーバー上の利用可能な共有をリスト表示します。 |
use <共有名> |
指定した共有に接続します。例: use C$ , use IPC$ , use SHARE |
ls [マスク] |
現在のディレクトリ内のファイルやディレクトリをリスト表示します。ワイルドカード (* ) も使用可能です。例: ls , ls *.txt |
cd <ディレクトリ名> |
リモートサーバー上のカレントディレクトリを変更します。例: cd Users\Public |
pwd |
リモートサーバー上の現在のディレクトリを表示します。 |
get <リモートファイル名> [ローカルファイル名] |
リモートファイルをローカルにダウンロードします。ローカルファイル名を省略すると、リモートファイル名と同じ名前で保存されます。 |
put <ローカルファイル名> [リモートファイル名] |
ローカルファイルをリモートにアップロードします。リモートファイル名を省略すると、ローカルファイル名と同じ名前で保存されます。 |
mget <マスク> |
指定したマスクに一致する複数のファイルをダウンロードします。例: mget *.log |
mkdir <ディレクトリ名> |
リモートサーバー上に新しいディレクトリを作成します。 |
rm <ファイル名> |
リモートサーバー上のファイルを削除します。 |
rmdir <ディレクトリ名> |
リモートサーバー上の空のディレクトリを削除します。 |
info |
サーバー情報を表示します (NetrServerInfo)。 |
who |
現在接続しているセッションの情報を表示します (ローカル管理者権限が必要な場合があります)。 |
password |
現在のユーザーのパスワードを変更します (古いパスワードと新しいパスワードの入力が求められます)。 |
exit |
smbclient を終了します。 |
5. 認証方法
smbclient.py
は、通常のパスワード認証以外にも、ペネトレーションテストでよく利用される認証方式をサポートしています。
5.1. パスワード認証 (Password Authentication)
これは最も基本的な認証方法です。前述の通り、ユーザー名:パスワード@ターゲット
の形式で指定します。
smbclient.py WORKGROUP/user:Password123@10.0.0.5
5.2. NTLM ハッシュ認証 (Pass-the-Hash)
パスワードそのものではなく、パスワードの NTLM ハッシュ値を使用して認証する手法です。Windows 環境では、パスワードを知らなくてもハッシュ値があれば認証を突破できる場合があります (Pass-the-Hash 攻撃)。これは、特に内部ネットワークに侵入した後、他のシステムへ横展開する際によく用いられます。
-hashes
オプションを使用し、LM ハッシュと NTLM ハッシュをコロン (:
) で区切って指定します。LM ハッシュは通常不要であり、空欄にして NTLM ハッシュのみを指定することが一般的です。
# LMハッシュは空、NTLMハッシュを指定
smbclient.py DOMAIN/administrator@192.168.1.200 -hashes :<NTLMハッシュ>
# 例: NTLMハッシュが aad3b435b51404eeaad3b435b51404ee の場合
smbclient.py MYDOMAIN/admin@dc01.mydomain.local -hashes :aad3b435b51404eeaad3b435b51404ee
NTLM ハッシュは、mimikatz
や Impacket の secretsdump.py
などのツールを使用して、侵害済みのシステムから抽出できることがあります。
5.3. Kerberos 認証 (Pass-the-Ticket / Kerberos Keys)
Active Directory 環境では、Kerberos 認証が広く使われています。smbclient.py
は、Kerberos 認証もサポートしており、いくつかの方法があります。
Kerberos チケット (ccache ファイル) を使用
Kerberos 認証を行うと、チケットがキャッシュファイル (通常は /tmp/krb5cc_<UID>
や環境変数 KRB5CCNAME
で指定されたファイル) に保存されます。このチケットを利用して認証を行うことができます (Pass-the-Ticket)。
-k
オプションを指定し、パスワードを要求されないように -no-pass
オプションも併用します。smbclient.py
は、環境変数 KRB5CCNAME
で指定されたキャッシュファイル、またはデフォルトの場所にあるチケットを自動的に探し出して使用します。
# 環境変数 KRB5CCNAME にチケットファイルのパスを設定
export KRB5CCNAME=/path/to/user.ccache
# -k と -no-pass を使用して接続
smbclient.py -k -no-pass DOMAIN/user@fileserver.domain.local
impacket-getTGT
や impacket-getST
などのツールで取得したチケットを利用する場合に便利です。
AES キーを使用
ユーザーアカウントの Kerberos AES キー (通常は NTLM ハッシュから派生) が分かっている場合、-aesKey
オプションで指定して認証できます。
smbclient.py DOMAIN/user@target-server -aesKey <128ビットまたは256ビットの16進数キー>
Keytab ファイルを使用
-keytab
オプションで keytab ファイルを指定して認証することも可能です。
smbclient.py -k -keytab /path/to/service.keytab service_principal@target-server
5.4. 認証ファイルを使用
-A
オプションで、Linux の smbclient
と同様の認証情報ファイル (username = <ユーザー名>
, password = <パスワード>
, domain = <ドメイン>
の形式で記述) を指定することもできます。スクリプトなどで認証情報を直接コマンドラインに含めたくない場合に有用です。
smbclient.py //server/share -A /path/to/authfile
6. ファイル操作の例
対話モードでのファイル操作の具体例をいくつか示します。接続後の smb: \>
プロンプトで実行します。
共有の確認と接続
smb: \> shares
IPC$
ADMIN$
C$
Users
SharedData
smb: \> use SharedData
smb: \SharedData\>
ファイルリスト表示とディレクトリ移動
smb: \SharedData\> ls
. D 0 Wed Mar 20 10:15:00 2024
.. D 0 Wed Mar 20 10:15:00 2024
Confidential_Report.docx A 123456 Tue Apr 01 09:30:00 2025
Project_Files D 0 Mon Mar 10 14:00:00 2025
backup.zip A 5432100 Fri Mar 28 18:00:00 2025
smb: \SharedData\> cd Project_Files
smb: \SharedData\Project_Files\> pwd
\SharedData\Project_Files\
ファイルのダウンロード
smb: \SharedData\> get Confidential_Report.docx
[*] Downloading \SharedData\Confidential_Report.docx.....
smb: \SharedData\>
上記コマンドを実行すると、ローカルのカレントディレクトリに Confidential_Report.docx
がダウンロードされます。
ファイルのアップロード
smb: \SharedData\> put /tmp/my_tool.exe malicious_tool.exe
[*] Uploading file /tmp/my_tool.exe, remote name 'malicious_tool.exe'
smb: \SharedData\>
ローカルの /tmp/my_tool.exe
をリモートの \SharedData\
に malicious_tool.exe
という名前でアップロードします。
ディレクトリの作成と削除
smb: \SharedData\> mkdir MyWork
smb: \SharedData\> ls
... (略) ...
MyWork D 0 Tue Apr 01 09:32:00 2025
... (略) ...
smb: \SharedData\> rmdir MyWork
smb: \SharedData\>
複数ファイルのダウンロード (mget)
smb: \SharedData\Project_Files\> mget *.log
[*] Downloading \SharedData\Project_Files\debug.log.....
[*] Downloading \SharedData\Project_Files\access.log.....
smb: \SharedData\Project_Files\>
カレントディレクトリにある .log
拡張子のファイルをすべてダウンロードします。
7. 高度なオプションとヒント💡
-debug
: デバッグモードを有効にし、詳細な通信ログを出力します。問題解決に役立ちます。-ts
: ログ出力にタイムスタンプを追加します。-target-ip <IPアドレス>
: ターゲット名が NetBIOS 名などで名前解決できない場合に、直接 IP アドレスを指定します。-dc-ip <IPアドレス>
: Kerberos 認証などでドメインコントローラーの IP アドレスを明示的に指定する必要がある場合に使用します。省略した場合、ターゲット名のドメイン部分から FQDN を解決しようとします。-inputfile <ファイル名>
: ファイルに記述されたコマンドを順番に実行します。スクリプト化する際に便利です。-outputfile <ファイル名>
: smbclient の操作ログを指定したファイルに出力します。-codec <コーデック名>
: ターゲットシステムからの出力エンコーディングを指定します。デフォルトはutf-8
ですが、文字化けする場合はターゲットのコードページ (chcp.com
コマンドで確認可能) に合わせて適切なコーデック (例:cp932
) を指定します。
8. ユースケースとペネトレーションテストでの活用例
smbclient.py
は、ペネトレーションテストの様々なフェーズで活用されます。
- 情報収集 (Enumeration):
shares
コマンドでアクセス可能な共有をリストアップし、機密情報が含まれていそうな共有 (例: `IT`, `Backup`, `HR`) を特定する。- 管理者権限で
C$
やADMIN$
共有に接続し、システム構成ファイルやユーザープロファイルなどを探索する。
- 横展開 (Lateral Movement):
- Pass-the-Hash や Pass-the-Ticket で得た認証情報を使用し、他のサーバーやワークステーションの共有にアクセスを試みる。
- ツールやペイロード (例: リバースシェル、Mimikatz) をターゲットの共有 (例: 書き込み可能な共有、
ADMIN$
) にアップロードし、psexec.py
やwmiexec.py
など他の Impacket ツールと連携して実行する。
- 情報漏洩 (Exfiltration):
get
やmget
コマンドを使用して、ターゲットシステムから機密ファイル (設定ファイル、パスワードリスト、顧客データなど) を攻撃者のマシンにダウンロードする。
- 設定不備の検証:
- 認証なし (Null Session) や Guest アカウントでアクセス可能な共有がないか確認する。
- 共有フォルダのアクセス権設定が適切か確認する (一般ユーザーが意図せず機密ファイルにアクセスできないかなど)。
例えば、2024年に報告された Volt Typhoon や BlackCat (ALPHV), LockBit 3.0 といった攻撃グループも、Impacket ツール群を横展開や認証情報窃取のために悪用していることが確認されています。これらのツールは正規の管理ツールとしても利用されるため、単にツールが使われたという事実だけでなく、その活動が正当なものか悪意のあるものかを文脈で判断することが重要になります。
9. まとめ ✨
impacket-smbclient
(smbclient.py
) は、SMB/CIFS 共有にアクセスするための強力で柔軟なツールです。特に、NTLM ハッシュや Kerberos チケットを用いた高度な認証機能は、ペネトレーションテストにおいて非常に役立ちます。基本的なファイル操作から、他の Impacket ツールと連携した高度な攻撃シナリオまで、幅広い用途に対応できます。
この記事で紹介した基本的な使い方や認証方法、コマンドをマスターし、日々のセキュリティ業務や学習に役立ててください。ただし、その強力さゆえに、常に倫理的な観点と法的枠組みを意識し、責任ある使用を心がけましょう。🛡️
コメント