Impacket karmaSMB.py
クライアントが要求した共有名やファイル名に合わせてペイロードを返す、検証用の SMB サーバーを起動します。
| 項目 | 内容 |
|---|---|
| 実装 | examples/karmaSMB.py |
| カテゴリ | SMB / MSRPC / NTLM |
| 規模 | 635 行 |
| 配布 | setup.py の scripts=examples/*.py によりスクリプトとしてインストール |
CLI と入力
Section titled “CLI と入力”オプションの最新の定義は python examples/karmaSMB.py -h で確認できます。
| 引数 | 説明 |
|---|---|
--help | show this help message and exit |
fileName | Pathname’s contents to deliver to SMB clients |
-config | config file name to map extensions to files to deliver. For those extensions not present, pathname will be delivered |
-smb2support | SMB2 Support (experimental!) |
-ts | Adds timestamp to every logging output |
-debug | Turn DEBUG output ON |
詳細な処理フロー
Section titled “詳細な処理フロー”config と default file、extension mapping を読み、SimpleSMBServer の SMB1/SMB2 handler を command 単位で差し替えます。tree connect/create/query/read request を観察し、requested path に合う local file を仮想 share として提供します。server は停止されるまで待機します。
仕組みの詳細
Section titled “仕組みの詳細”通常の SMB server は設定済み share/path だけを公開しますが、KarmaSMB は client が要求した share/file 名を観察し、extension mapping または default file に基づいて応答内容を差し替えます。これは SMB client の自動取得動作を 検証するため、server command handler を SMB1/SMB2 の両方で置換しています。
tree connect では任意 share を受け入れる仮想的な mapping を作り、create/open では requested path を正規化して返す local file を選びます。read は handle に 対応する file と offset/length から byte 列を返し、query directory/basic info は client が次の処理へ進める metadata を構築します。名前だけ差し替えても size、attributes、end-of-file が一致しなければ client は正常に読めません。
server state には session、tree ID、file ID と local file handle の対応が
あります。別 client の handle を共有しないこと、.. や separator を含む
path を local 任意 file へ解決しないこと、SMB2 compound request でも response
ID を保つことが重要です。default file と extension config の優先順位も
protocol handler 間で統一します。
主要な実装要素
Section titled “主要な実装要素”| シンボル | 位置 | 責務を追う入口 |
|---|---|---|
KarmaSMBServer | 77 | __init__()、findFirst2()、smbComNtCreateAndX()、queryPathInformation()、smb2Read()、smb2Close()、smb2Create()、smb2QueryDirectory()、smb2TreeConnect()、smbComTreeConnectAndX()、run()、setDefaultFile() ほか |
Impacket 内部
Section titled “Impacket 内部”| モジュール | 使用する主な名前 |
|---|---|
impacket.examples | logger |
impacket | smb, smbserver, version |
impacket.smb3structs | * |
impacket.smb | FILE_APPEND_DATA, FILE_OVERWRITE, FILE_OVERWRITE_IF, FILE_WRITE_DATA, GENERIC_WRITE |
impacket.nt_errors | STATUS_ACCESS_DENIED, STATUS_NO_MORE_FILES, STATUS_OBJECT_PATH_NOT_FOUND, STATUS_SUCCESS, STATUS_USER_SESSION_DELETED |
impacket.smbserver | SRVSServer, STATUS_SMB_BAD_TID, decodeSMBString, encodeSMBString, findFirst2, queryPathInformation |
出力・副作用・必要権限
Section titled “出力・副作用・必要権限”- 照会や認証の試行が中心です。実行回数が多いと監査ログやアカウントロック、対象の負荷に影響します。
- 待受 socket または長時間 loop を開始します。bind address、port、停止方法、同時接続時の共有状態を確認してください。
失敗経路と後始末
Section titled “失敗経路と後始末”- 失敗時は、名前解決、接続、認証、サービスの状態、権限のどこで止まったかを、プロトコルのステータスから切り分けます。
- 後始末に関係する実装として
smb2Close()があります。新しい早期 return や例外経路でも到達するか確認します。 - 停止要求、client 切断、partial read/write、worker 例外で listener 全体が不整合にならないことを確認します。
実装を変更するとき
Section titled “実装を変更するとき”impacket.smbserver と SMB1/SMB2 structures に依存します。KarmaSMBServer の protocol handler が中心で、path 正規化、file size/offset、handle lifecycle を両 dialect で揃える必要があります。
- 構文:
python -m py_compile examples/karmaSMB.py - CLI:
python examples/karmaSMB.py -h - 関連テスト:
tests/SMB_RPC/test_smb.py - 関連テスト:
tests/SMB_RPC/test_smbserver.py

