Impacket は、ネットワークプロトコルを扱うための Python クラスのコレクションです。特に SMB や MSRPC といったプロトコルに対して、低レベルのプログラマティックなアクセスを提供することに焦点を当てています。この強力なライブラリ群には、様々なネットワークタスクを実行するための便利なスクリプト(ツール)が含まれています。
その中の一つである lookupsid.py
は、Windows 環境における SID (Security Identifier) の列挙、特にブルートフォース(総当たり)を通じてリモートシステムのユーザーやグループを発見するために設計されたツールです。
この記事では、lookupsid.py
の基本的な使い方から、少し応用的なテクニック、そしてセキュリティ上の注意点までを詳しく解説していきます。
lookupsid.py とは? 🤔
lookupsid.py
は、Impacket スイートに含まれる Python スクリプトの一つです。その主な目的は、Windows の SID (Security Identifier) を列挙することです。Windows 環境では、各ユーザーアカウントやグループアカウントには一意の SID が割り当てられています。
このツールは、ターゲットとなる Windows システムに対して [MS-LSAT] MSRPC (Microsoft Remote Procedure Call) インターフェースを介して接続し、SID のブルートフォース(総当たり攻撃的な試行)を行います。具体的には、既知のドメイン SID をベースに、相対識別子 (RID) を順番に試していくことで、対応するユーザー名やグループ名を探し出します。
主な機能と目的:
- リモート Windows システム上のユーザーアカウントの列挙
- リモート Windows システム上のグループアカウントの列挙
- SID とユーザー名/グループ名のマッピング
- ペネトレーションテストやセキュリティ評価における情報収集フェーズでの活用
このツールは、SMB (Server Message Block) プロトコルを利用して通信を行います。したがって、ターゲットシステムへのネットワークアクセスと、認証情報(ユーザー名/パスワードまたはハッシュ)が必要になる場合があります。
lookupsid.py
は、特にドメイン環境において、どのようなユーザーやグループが存在するのかを把握するための強力なツールです。
前提条件と準備 🛠️
lookupsid.py
を使用するには、いくつかの準備が必要です。
-
Impacket のインストール:
lookupsid.py
は Impacket の一部なので、まず Impacket 本体をインストールする必要があります。通常、以下のコマンドで GitHub からクローンしてインストールします。git clone https://github.com/fortra/impacket.git cd impacket/ python setup.py install # または pip を使用 pip install impacket
※ 環境によっては
python3
やpip3
を使用してください。 -
ネットワークアクセス:
lookupsid.py
を実行するマシンから、ターゲットとなる Windows システム(通常はドメインコントローラーやメンバーサーバー)の RPC エンドポイント(通常は TCP ポート 139 または 445)へのネットワーク到達性が必要です。ファイアウォールなどで通信がブロックされていないか確認してください。 -
認証情報:
ターゲットシステムに対して認証を行うための情報が必要です。これは以下のいずれかの形式で指定できます。
- ユーザー名とパスワード:
DOMAIN/username:password
- NTLM ハッシュ:
DOMAIN/username:LMhash:NThash
(LM ハッシュは空でも可:aad3b435b51404eeaad3b435b51404ee:NThash
) - Kerberos 認証: (後述)
NULL セッション(認証なし)で試行することも可能ですが、多くの環境では匿名での SID 列挙は制限されています。通常は、何らかのドメインユーザーアカウント(必ずしも管理者権限は必要ない場合が多い)の認証情報が必要となります。
- ユーザー名とパスワード:
lookupsid.py
の使用は、適切な許可を得た環境でのみ行ってください。無許可のシステムへのアクセスや情報収集は不正アクセスとみなされます。
基本的な使い方 💻
lookupsid.py
の基本的なコマンド構文は以下の通りです。
lookupsid.py [[DOMAIN/]USERNAME[:PASSWORD]@] [options]
主要な要素:
DOMAIN/USERNAME:PASSWORD
: 認証情報。ドメイン名、ユーザー名、パスワードを指定します。ドメイン名とスラッシュは省略可能な場合があります(ローカルアカウントの場合など)。@TARGET_IP_ADDRESS
: ターゲットとなる Windows システムの IP アドレスまたはホスト名。options
: 追加の動作を指定するオプション(後述)。
例1: パスワード認証
ドメイン CONTOSO
のユーザー Alice
、パスワード Password123
を使用して、IP アドレス 192.168.1.100
のドメインコントローラーに対して SID 列挙を行う場合:
lookupsid.py CONTOSO/Alice:'Password123'@192.168.1.100
※ シェルによってはパスワード中の特殊文字をエスケープする必要があるため、シングルクォートで囲むのが安全です。
例2: NTLM ハッシュ認証
ユーザー Bob
の NTLM ハッシュ (aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef
) を使用して、IP アドレス 192.168.1.100
に対して SID 列挙を行う場合:
lookupsid.py CONTOSO/Bob@192.168.1.100 -hashes aad3b435b51404eeaad3b435b51404ee:0123456789abcdef0123456789abcdef
-hashes
オプションを使用し、LMhash:NThash
の形式で指定します。LM ハッシュが不要または存在しない場合は、aad3b435b51404eeaad3b435b51404ee
(空の LM ハッシュ) を指定します。Pass-the-Hash 攻撃シナリオで有効です。
例3: NULL セッション (認証なし)
認証情報なしで試行する場合:
lookupsid.py @192.168.1.100
または
lookupsid.py ''@192.168.1.100
現代の多くの Windows 環境では、セキュリティ設定により NULL セッションによる SID 列挙はデフォルトで許可されていませんが、古いシステムや設定が変更されている場合に成功する可能性があります。
主要なオプション ⚙️
lookupsid.py
には、動作をカスタマイズするためのいくつかのオプションがあります。
オプション | 説明 | 例 |
---|---|---|
target |
ターゲットの指定 (必須)。[[domain/]username[:password]@] の形式。 |
CONTOSO/Alice:Pass@192.168.1.100 |
-hashes LMHASH:NTHASH |
NTLM ハッシュを使用して認証します。パスワードの代わりに指定します。 | -hashes aad...:abc... |
-no-pass |
パスワード認証を行いません(NULL セッションや Kerberos チケット使用時に利用)。 | lookupsid.py CONTOSO/Alice@192.168.1.100 -no-pass -k |
-k |
Kerberos 認証を使用します。事前に kinit などで有効な Kerberos チケット (TGT) を取得し、KRB5CCNAME 環境変数を設定しておく必要があります。 |
lookupsid.py CONTOSO/Alice@192.168.1.100 -k -no-pass -dc-ip 192.168.1.10 |
-aesKey HEX_KEY |
Kerberos 認証用の AES キー (128 または 256 ビット) を指定します。 | -aesKey f0f0... |
-dc-ip IP_ADDRESS |
ドメインコントローラーの IP アドレスを指定します。Kerberos 認証時や、ターゲット名から DC を解決できない場合に必要です。 | -dc-ip 192.168.1.10 |
-target-ip IP_ADDRESS |
ターゲットの IP アドレスを指定します。ターゲット名をホスト名で指定した場合に、名前解決をバイパスして直接 IP アドレスで接続したい場合に使用します。 | lookupsid.py CONTOSO/User@DC01 -target-ip 192.168.1.100 |
-port {139, 445} |
接続先のポート番号を指定します。デフォルトは 445 (SMB over TCP)。 | -port 139 |
-maxRid NUMBER |
ブルートフォースを行う RID の最大値を指定します。デフォルトは 4000。大規模なドメインでは増やす必要があるかもしれません。 | -maxRid 10000 |
-domain-sids |
ターゲットシステムのドメイン SID だけでなく、信頼関係のあるドメインの SID も解決しようと試みます。NTLM リレー攻撃などでプロキシ経由で利用する際に役立つことがあります。 | proxychains lookupsid.py @target -domain-sids |
-debug |
デバッグモードを有効にし、詳細なログを出力します。問題発生時のトラブルシューティングに役立ちます。 | lookupsid.py ... -debug |
応用的な使い方とシナリオ 🚀
シナリオ1: ドメインユーザーとグループの完全列挙
基本的な使い方でもありますが、lookupsid.py
の主な目的は、ドメイン内のユーザーやグループを可能な限り列挙することです。デフォルトでは RID 1 から 4000 までを試行しますが、大規模なドメインではこれを超える RID が存在する可能性があるため、-maxRid
オプションで範囲を広げることが有効です。
lookupsid.py CONTOSO/User:Password@DC01 -maxRid 20000
これにより、標準的な RID 範囲外に作成されたアカウントも発見できる可能性があります。
シナリオ2: Kerberos 認証による実行
パスワードや NTLM ハッシュが直接利用できない場合でも、有効な Kerberos チケット (TGT) があれば、それを利用して lookupsid.py
を実行できます。これは、Kerberoasting や AS-REP Roasting などでチケットを取得した場合や、他のツールで Kerberos 認証が成功した場合に有用です。
- まず、
kinit
や他のツールで TGT を取得し、キャッシュファイル(例:user.ccache
)を生成します。 - 環境変数
KRB5CCNAME
にキャッシュファイルのパスを設定します。 lookupsid.py
を-k
および-no-pass
オプション付きで実行します。DC の IP アドレス指定が必要になることが多いです。
export KRB5CCNAME=/path/to/user.ccache
lookupsid.py CONTOSO/User@DC01 -k -no-pass -dc-ip 192.168.1.10
シナリオ3: NTLM リレー攻撃との連携 (SOCKS プロキシ経由)
ntlmrelayx.py
などのツールで NTLM リレー攻撃を行い、SOCKS プロキシを立てている状況を考えます。ntlmrelayx.py
がリレーに成功したセッションは、SOCKS プロキシ経由で利用できます。たとえリレーされたアカウントが管理者権限を持っていなくても、lookupsid.py
をプロキシ経由で実行することで、そのアカウントの権限で SID 列挙を試みることができます。
proxychains
などのツールと組み合わせ、-domain-sids
オプションを使用すると効果的な場合があります。
# ntlmrelayx で SOCKS プロキシを起動 (-socks オプション)
# ... リレー成功 ...
# proxychains の設定 (例: /etc/proxychains4.conf) で SOCKS プロキシを指定
# socks4 127.0.0.1 1080 (ntlmrelayx のデフォルトポート)
# proxychains 経由で lookupsid.py を実行
proxychains lookupsid.py @TARGET_IP -no-pass -domain-sids
この方法で、認証情報が未知でも、リレー攻撃が成功すればドメイン内のユーザー情報を収集できる可能性があります。
シナリオ4: ゴールデンチケット作成のためのドメイン SID 特定
ゴールデンチケット攻撃を行うには、ターゲットドメインの SID が必要です。lookupsid.py
は、特定の既知のアカウント(例えば Administrator アカウント、RID 500)の情報を取得することで、間接的にドメイン SID を特定するのに役立ちます。
lookupsid.py CONTOSO/AdminUser:Password@DC01
出力結果から、例えば CONTOSO\Administrator (SidTypeUser)
のような行が見つかれば、その SID (S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ-500
) のドメイン部分 (S-1-5-21-XXXXXXXXXX-YYYYYYYYYY-ZZZZZZZZZZ
) がドメイン SID となります。
※ secretsdump.py
など、より直接的にドメイン SID を取得できるツールもありますが、lookupsid.py
でも副次的に情報を得られます。
出力結果の解釈 📊
lookupsid.py
の実行が成功すると、以下のような形式で結果が出力されます。
[*] Brute forcing SIDs at DC01.contoso.com
[*] StringBinding ncacn_np:DC01.contoso.com[\pipe\lsarpc]
[*] Trying RID 500... Found: CONTOSO\Administrator (SidTypeUser)
[*] Trying RID 501... Found: CONTOSO\Guest (SidTypeUser)
[*] Trying RID 502... Found: CONTOSO\krbtgt (SidTypeUser)
[*] Trying RID 512... Found: CONTOSO\Domain Admins (SidTypeGroup)
[*] Trying RID 513... Found: CONTOSO\Domain Users (SidTypeGroup)
[*] Trying RID 514... Found: CONTOSO\Domain Guests (SidTypeGroup)
[*] Trying RID 515... Found: CONTOSO\Domain Computers (SidTypeGroup)
[*] Trying RID 516... Found: CONTOSO\Domain Controllers (SidTypeGroup)
[*] Trying RID 517... Found: CONTOSO\Cert Publishers (SidTypeGroup)
[*] Trying RID 518... Found: CONTOSO\Schema Admins (SidTypeGroup)
[*] Trying RID 519... Found: CONTOSO\Enterprise Admins (SidTypeGroup)
[*] Trying RID 520... Found: CONTOSO\Group Policy Creator Owners (SidTypeGroup)
... (省略) ...
[*] Trying RID 1101... Found: CONTOSO\DnsAdmins (SidTypeGroup)
[*] Trying RID 1102... Found: CONTOSO\DnsUpdateProxy (SidTypeGroup)
[*] Trying RID 1103... Not Found!
[*] Trying RID 1104... Found: CONTOSO\HelpDesk (SidTypeGroup)
[*] Trying RID 1105... Found: CONTOSO\SQLAdmins (SidTypeGroup)
[*] Trying RID 1106... Found: CONTOSO\Alice (SidTypeUser)
[*] Trying RID 1107... Found: CONTOSO\Bob (SidTypeUser)
... (省略) ...
[*] Brute force finished
各行は、試行した RID (Relative Identifier) と、それに対応する名前が見つかったかどうかを示します。
Trying RID XXX...
: どの RID を試行しているかを示します。Found: DOMAIN\Name (SidType)
: 指定された RID に対応する名前が見つかったことを示します。DOMAIN\Name
: ドメイン名と、見つかったユーザー名またはグループ名。(SidType)
: 見つかったオブジェクトの種類を示します。主な種類は以下の通りです。SidTypeUser
: ユーザーアカウントSidTypeGroup
: グローバルグループまたはユニバーサルグループSidTypeDomain
: ドメインオブジェクトSidTypeAlias
: ローカルグループ (エイリアス)SidTypeWellKnownGroup
: よく知られたグループ (例: Everyone, Authenticated Users)SidTypeComputer
: コンピューターアカウント
Not Found!
: 指定された RID に対応する名前が見つからなかったことを示します。
この出力から、ドメイン内にどのようなユーザーやグループが存在するかのリストを作成できます。特に、標準的でない名前の管理者グループやサービスアカウントなどが発見されると、攻撃者にとって有用な情報となり得ます。
セキュリティ上の考慮事項と対策 🛡️
lookupsid.py
は強力な情報収集ツールですが、その利用にはセキュリティ上のリスクと対策を理解しておく必要があります。
攻撃者による悪用
攻撃者は lookupsid.py
を使用して以下のような情報を得ようとします。
- ユーザー/グループ名の列挙: パスワードスプレー攻撃、ブルートフォース攻撃、Kerberoasting などのターゲットリストを作成します。
- 特権アカウントの特定: “Admin”, “Backup”, “SQL”, “SVC” といった文字列を含むアカウント名を探し、侵害の足がかりにします。
- ドメイン構造の把握: 列挙された情報を元に、Active Directory の構造や命名規則を推測します。
検知とログ
lookupsid.py
の実行は、ターゲットシステム上でセキュリティイベントログを生成する可能性があります。
- イベント ID 4662 (監査ポリシーによる): オブジェクトへのアクセス試行が記録されます。”SAM_SERVER” オブジェクトに対するアクセスが短期間に多数発生した場合、SID 列挙の兆候である可能性があります。監査ポリシーで「ディレクトリサービスアクセスの監査」を有効にする必要があります。
- イベント ID 4624/4625 (ログオン/ログオン失敗): 認証試行が記録されます。特に、存在しないユーザーアカウントでのログオン失敗 (4625) や、短期間に同一アカウントからの多数のログオン (4624) が見られる場合、ブルートフォース的な試行を示唆する可能性があります。
- ネットワークトラフィックの監視: RPC (特に LSARPC over SMB) 通信が特定のホストから異常に多く発生している場合、
lookupsid.py
のようなツールが使用されている可能性があります。IDS/IPS やネットワーク監視ソリューションで検知できる場合があります。
緩和策と防御
lookupsid.py
による SID 列挙のリスクを軽減するための対策:
-
匿名 SID/名前変換の制限: グループポリシーで「ネットワーク アクセス: 匿名 SID/名前変換を許可しない」(
Network access: Do not allow anonymous enumeration of SAM accounts and shares
) を有効にします。これにより、認証されていないユーザー (NULL セッション) による SID 列挙が困難になります。(ただし、認証されたユーザーによる列挙は防げません)場所: コンピューターの構成\Windows の設定\セキュリティの設定\ローカル ポリシー\セキュリティ オプション - 最小権限の原則: ドメインユーザーに不要な権限を与えないようにします。SID 列挙自体は一般ユーザー権限でも可能な場合がありますが、その後の攻撃ステップを困難にします。
- 強力なパスワードポリシーとアカウントロックアウト: ブルートフォース攻撃やパスワードスプレー攻撃のリスクを軽減します。
- 監査ログの監視: 上記のイベント ID を SIEM (Security Information and Event Management) などで監視し、不審なアクティビティを早期に検知する体制を整えます。
- ネットワークセグメンテーション: ファイアウォールなどを用いて、不要な RPC 通信を制限します。特に、クライアントセグメントからドメインコントローラーへの直接的な RPC アクセスを制限することを検討します。
まとめ ✨
impacket-lookupsid
は、Active Directory 環境におけるユーザーおよびグループの SID を列挙するための強力なツールです。ペネトレーションテストやセキュリティ評価において、環境の理解を深め、潜在的な攻撃対象を特定するために広く利用されています。
基本的な使い方から、ハッシュ認証、Kerberos 認証、SOCKS プロキシ経由での利用など、様々なシナリオで活用できます。しかし、その能力ゆえに攻撃者によって悪用されるリスクも伴います。
防御側としては、匿名での列挙制限、適切な監査ログの監視、最小権限の原則の適用、ネットワークセグメンテーションなどの対策を講じることで、SID 列挙による情報漏洩のリスクを軽減することが重要です。
このツールを正しく理解し、倫理的に使用することで、Active Directory 環境のセキュリティ向上に貢献することができます。 💪
コメント