コンテンツにスキップ

コマンド共通アーキテクチャと依存関係

Impacket の CLI は console entry point ではなく、setup.py が examples/*.py を scripts としてインストールします。このため、 コマンド名、実行権限、shebang、トップレベルの argparse 処理は各ファイル 自身が所有します。ファイル名の変更は配布されるコマンド名の変更になります。

多くのコマンドは次の共通フローを持ちます。

impacket.examples.logger がログ形式を、impacket.version がバナーを、 impacket.examples.utils が domain/user[:password]@target 形式の解析や LDAP 接続などを共通化します。認証系オプションはコマンドによって差がある ため、共通に見える引数を一括変更せず、各 CLI の対応プロトコルを確認して ください。

コマンド横断の wire 仕様とモジュール責務は プロトコルとライブラリモジュール に分けています。

知りたいことページ
Structure のフィールド DSLstructure.md
SMB dialect、署名、named pipesmb.md
NTLM Type1/2/3、AV pair、MIC、SPNEGOntlm-spnego.md
AS/TGS、PAC、S4U、ccachekerberos.md
string binding、NDR、RPC interfacedcerpc.md
LDAP bind、CBT、security descriptorldap.md
boot key、SAM/LSA/NTDS、DPAPIdpapi-secrets.md
TDS / MQTT / NSPItds-messaging.md
ImpactPacket、hive、ESE、NTFSpackets-storage.md
レイヤー主なモジュール責務
CLIexamples/*.py引数、操作選択、結果表示、終了コード
CLI 共有impacket.examples.*target 解析、シェル、secretsdump、relay、サービス配置
高水準プロトコルsmbconnection, ldap.ldap, tds, dcerpc.v5.transportセッション、認証、transport
プロトコル構造smb*, ntlm, krb5.*, dcerpc.v5.*, dpapi, esewire 構造、暗号処理、RPC interface
外部パッケージ下表ASN.1、暗号、LDAP、Web UI、文字コードなど
OS / ネットワークsocket、raw socket、pcap、対象サービス実際の I/O

setup.py と requirements.txt が宣言する実行時依存は次のとおりです。

パッケージ主な利用箇所
sixPython 互換ヘルパー、byte/string 変換
charset_normalizerGPP XML の文字コード判定
pyasn1, pyasn1_modulesKerberos、CMS、LDAP ASN.1
pycryptodomex (Cryptodome)AES、RC4/MD4、HMAC、RSA
pyOpenSSL (OpenSSL)TLS、LDAP/MSSQL の接続検査
ldap3LDAP の変更操作と security descriptor control
ldapdomaindumpLDAP 属性・SID の書式化補助
flaskntlmrelayx の SOCKS/HTTP API 周辺
pyreadline3Windows 上の対話シェル

追加で、sniff.py と split.py は pcapy を直接 import しますが、 setup.py / requirements.txt には宣言されていません。また CheckLDAPStatus.py と GetADComputers.py は dns.resolver を使用しますが、 dnspython は直接依存として宣言されていません。これらは開発・実行環境で 別途必要になる可能性があり、依存整理を行う場合は後方互換性と各 OS での ビルド可否を確認してください。

kintercept.py は標準ライブラリの asyncore を直接使用します。 asyncore は Python 3.12 で削除されているため、project が掲げる Python 3.12/3.13 では現在のまま import できません。保守する場合は event loop の 置換または互換 package の明示的な採用と、partial I/O の回帰試験が必要です。

代表的な入力形式は [domain/]user[:password]@target です。パスワードを 省略し、-no-pass を指定しない場合は対話入力になるコマンドがあります。 NTLM の LMHASH:NTHASH、Kerberos の -k、AES key、keytab の対応は コマンドごとに異なります。

  • target は名前解決・SPN 構築に使われる論理名です。
  • -target-ip は通信先 IP を上書きし、名前解決と接続先を分離します。
  • -dc-ip は KDC または Domain Controller の接続先です。
  • Kerberos では SPN と DNS 名の整合性が重要で、IP への置換だけでは 認証できない場合があります。
  • RPC コマンドは DCERPCTransportFactory で string binding を生成し、 SMB named pipe、TCP、RPC over HTTP などへ分岐します。
  • dce.set_credentials() は auth level を CONNECT まで上げます。 DRSUAPI など PKT_PRIVACY が必要な interface は明示してください。
  • LDAP 変更系 (dacledit / rbcd / owneredit) は ldap3、列挙系は impacket.ldap.LDAPConnection です。impacket.acl はファイル ACL です。

CLI の多くはプロトコル固有例外を捕捉してログへ出力します。変更時は SessionError、DCERPCException、LDAPSessionError、 KerberosError を無差別に一般例外へ畳み込まず、診断に必要な status code を保持してください。

リモートサービス、一時ファイル、共有、WMI オブジェクト、ローカル一時 ファイルを作るコマンドでは、成功時だけでなく例外時の cleanup() / finish() / disconnect() も契約の一部です。新しい return や例外経路を 追加するときは、必ず後始末を通ることを確認します。

コマンドを変更・追加する場合

Section titled “コマンドを変更・追加する場合”
  1. 既存 CLI の positional 引数と認証オプションを維持する。
  2. CLI では入力と処理の流れを扱い、再利用可能な通信処理は impacket/ 側へ置く。
  3. 対象 protocol の既存 transport/session class を利用し、独自 socket 実装は protocol 実験など必要な場合に限定する。
  4. 読み取りと変更操作を明確に分け、変更操作は対象と action をログに残す。
  5. 出力形式を変える場合は、パイプ処理やツール連携への互換性を確認する。
  6. unit test は構造体・変換・分岐を tests/ で、実環境依存の接続確認は TESTING.md の remote test 方針に従う。
  7. 新しい examples/*.py は自動的に配布対象になるため、意図しない補助 スクリプトを直下へ置かない。

応答やファイルから値を取り出すときは、欠落した項目や未知の値も考慮します。 また、デバッグログにパスワード、ハッシュ、チケット、鍵、復号済みの秘密情報を 追加しないようにします。これらはコマンドを問わず共通の確認事項です。

  • 構文: python -m compileall examples impacket
  • CLI: 変更したコマンドの -h と、不正入力時の終了動作
  • unit test: 変更した protocol/module に近い tests/ のテスト
  • remote test: 資格情報、対象 OS、サービス状態を固定した隔離環境
  • packaging: wheel を作成し、期待したスクリプトだけが含まれること

ネットワーク越しの統合試験は対象側へ状態変更を起こし得ます。特に サービス、レジストリ、LDAP security descriptor、WMI 永続化を扱う試験では、 作成物とロールバック手順を先に定義してください。