
SAMRおよびLSARPCを介したワンパス匿名Active Directory列挙 — nullセッション、認証情報不要、構造化された再利用可能な出力付き。
匿名(null)セッション用のシングルパス Active Directory 列挙ツールで、\samr および \lsarpc 名前付きパイプを使用します。認証情報は不要です。
古典的なツールにできないことは何もありません。これはそれを1回の実行でまとめて収集し、結果をきれいに整理して出力します。エンゲージメントでドメインアカウントを持たずに侵入し、DNS 経由で DC を見つけ、アカウント、ユーザーごとの詳細、グループ、ポリシー、LSA/DNS の情報を含む全体像を、rpcclient セッションや複数の個別スクリプトをつなぎ合わせてその stdout を手作業で解析することなく把握したい場合に使います。これはそのパスを代行し、構造化された再利用可能な出力を書き出します:
manifest.json、すぐに使える userlist.txt / computerlist.txt、そして二度ブルートフォースせずに再利用できる保存済み RID リスト。所有している、または明示的にテストを許可されているシステムに対してのみ実行してください。 許可なく他人のディレクトリを列挙するのは良くありませんし、場所によっては違法となる可能性があります。
同一の動作をする2つのバージョンがあります。お持ちのライブラリに合わせてどちらかを使用してください:
adnullenum.py — impacket 上に構築されています。$ で終わるもの)は実際のユーザーから分離されます。また、興味深いアカウントもフラグ付けします:「パスワード不要」、「パスワード無期限」、AS-REP ロースト可能、非制約委任、一度もログオンしていない、説明にパスワードが記載されている、などです。
これから自然に導かれるいくつかのこと:
ここにあるものはすべて標準的な匿名 SAMR/LSARPC であり、確立されたツールはすでに同じデータに到達できます。これは新しい機能ではなく便利なラッパーなので、代替手段を知っておく価値があります:
--rid-brute、--users、--pass-pol)は、はるかに大きなフレームワーク内で同じ列挙をカバーします。samrdump.py(ユーザー/グループ/エイリアス + ユーザーごとの詳細)と lookupsid.py(LSA 経由の RID サイクリング)。単一実行なし、SAMR→LSA フォールバックなし、stdout のみ。rpcclient は基盤となる呼び出し(queryuser、enumdomusers、querydominfo、lsaquery、lookupsids など)を公開しますが、対話的で stdout のみです。その enumdomusers は標準ユーザーを名前で一覧表示し、マシン()アカウントは含まれず、完全な詳細は を1つずつ実行する必要があります。組み込みの RID サイクリングループがないため、コンピュータを復元したり、制限された列挙を回避したりできません。 を参照してください。adnullenum が追加するのはパッケージングです:複数のツールではなく1回の null セッション実行、SAMR 優先でオプトインの LSA フォールバック、厳選された興味深いアカウントフラグ、そして次のステップにそのまま渡したり後で開いたりできる整ったマルチフォーマット出力。そのワークフローがあなたの働き方に合うなら使ってください。実戦で鍛えられたツールの方が良ければ、enum4linux-ng や NetExec を選んでください。
Python 3.9+ と1つの SMB ライブラリが必要です。仮想環境を使うとすっきりします:
# clone / copy the files, then from the project folder:
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install impacket # for adnullenum.py
以上です。python3 adnullenum.py --help を実行するとすべて確認できます。
すべては単一の --mode を通して実行されます。デフォルトは recon で、最初に実行するのに安全なものです。
# 1. Is anonymous access open, and how big is this domain?
python3 adnullenum.py 10.0.0.10
# 2. Grab everything
python3 adnullenum.py 10.0.0.10 --mode full
# 3. Just the account inventory, wider net for a big domain
python3 adnullenum.py 10.0.0.10 --mode rids --start-rid 1000 --max-rid 200000
# 4. Go slower to stay quiet
python3 adnullenum.py 10.0.0.10 --mode users --sleep 1 --jitter 40
# 5. Also write JSON (txt and csv are always written)
python3 adnullenum.py 10.0.0.10 --mode full --json
ドメインがユーザーを直接一覧表示させてくれない場合(よくあります)、ツールは RID サイクリング にフォールバックします:DC にアカウント ID を1000件ずつバッチで名前へ変換するよう要求します。デフォルトでは、DC が存在すると言うすべてを見つけるまで、または5000個の ID が連続して空で返るまで、上方向にスイープします。代わりに正確な範囲に固定することもできます:
python3 adnullenum.py 10.0.0.10 --mode rids --range 500-50000
一部の DC は匿名 SAMR を完全に拒否します(enumdomains と RID 変換が ACCESS_DENIED を返します)。実行は諦めません:
\lsarpc から取得され、これは SAMR が応答しないときによく応答します。--lsa-fallback を渡した場合、ツールはドメイン SID を使って LSA LsarLookupSids 経由で同じスイープを再試行し、それでもアカウントインベントリ(名前とタイプ、コンピュータを含む)が得られます。これは2回目のブルートフォースパスであるためデフォルトではオフです。フラグなしでは実行は偵察で停止し、その旨を通知します。アカウントの発見が遅い部分なので、ツールはリスト(rids.txt)を毎回の実行の出力フォルダに保存します。後の実行を --session でそのフォルダに向けると、ブルートをスキップしてすでに見つけたものを再利用します:
python3 adnullenum.py 10.0.0.10 --mode rids
# -> output/20260917-1530_10.0.0.10_rids/
python3 adnullenum.py 10.0.0.10 --mode users \
--session output/20260917-1530_10.0.0.10_rids
--session は前回の実行のフォルダを受け取ります。(--rid-file は1行に1つの RID を書いたプレーンテキストファイルから同じことを行います。)
各実行は output/ の下にタイムスタンプ付きフォルダを生成します:
output/20260917-1530_10.0.0.10_full/
├── rids.txt # the account IDs found (reuse with --session)
├── manifest.json # summary: counts, interesting accounts, run details
├── access_denied.txt # only if something was denied/restricted (with a timestamp)
├── output
├──── lists/ # ready-to-use lists (see below)
├──── txt/ # easy to read
└──── csv/ # easy to grep / open in a spreadsheet
txt と csv は常に書き出されます。--json を追加すると json/ フォルダも作成されます。
lists/ フォルダには、他のツールに直接渡すために作られた2つのプレーンファイルが入っています:
lists/userlist.txt — AS-REP ロースト、パスワードスプレー、またはクラッカーの --users リストにそのまま投入できます。users/full モードでは有効なアカウントのみが含まれます。rids モード(ユーザーごとの詳細なし)ではすべてのユーザーです。lists/computerlist.txt — マシンアカウント名($ を保持、sAMAccountName)、Windows 2000 以前のマシンアカウントチェック用。見るのを忘れた、または rids しか実行しておらず今リストが欲しい場合は、実行のフォルダを指定すると CSV から再構築されます。ネットワークは不要です:
python3 adnullenum.py --lists-from output/20260917-1530_10.0.0.10_full
画面上では大きなドメインがターミナルを溢れさせないように上限付きのプレビューが表示されます(--limit、セクションごとのデフォルトは100)— ファイルには常に完全なデータが入っています。カラーはターミナル上で有効です。--no-color でオフにできます。
テスト DC に対する full 実行(サニタイズ済み)。画面上では偵察、RID スイープ、興味深いアカウントのサマリー、書き出されたファイルのリストが得られます:
$ python3 adnullenum.py 10.0.0.10 --mode full
[*] Connecting to 10.0.0.10:445 anonymously ...
[+] SAM domain: CORP (S-1-5-21-1111111111-2222222222-3333333333)
...
[ COUNTS ]
Users: 43
Groups: 0
Aliases: 17
[ PASSWORD POLICY ]
Min length: 7
Max age: 42 days
Properties: COMPLEX
[*] Bruting RIDs via SAMR (chunk=1000, open-ended 500-100000, stop-after 5000)
[*] up to RID 1498: 31 resolved, gap=0
[*] stop: 5000 consecutive empty RIDs (--stop-after 5000)
[+] Resolved: 5 users, 4 computers, 22 groups, 0 other
[*] Deep-querying 5 users (skipping 4 computers)
[!] Administrator (RID 500) PWD_NEVER_EXPIRES
[!] Guest (RID 501) (disabled) PWD_NOT_REQUIRED, PWD_NEVER_EXPIRES
[!] svc_sql (RID 1104) ASREP_ROASTABLE
[+] 5 users: 3 enabled, 2 disabled, 3 interesting (full detail in the users file)
[ FILES WRITTEN in output/20260101-120000_10.0.0.10_full ]
txt/recon.txt / csv/recon.csv domain info + password/lockout policy
txt/inventory.txt / csv/inventory.csv all resolved accounts
txt/users.txt / csv/users.csv full per-user detail
txt/groups.txt / csv/groups.csv groups + aliases with members
rids.txt existing RIDs (reuse with --session)
lists/userlist.txt usernames, one per line
lists/computerlist.txt machine accounts (with $)
manifest.json run metadata + counts
txt/users.txt からの1レコード(プライマリグループと直接グループは名前に解決されます):
[+] RID 500
Enabled: True
SamAccountName: Administrator
SID: S-1-5-21-1111111111-2222222222-3333333333-500
Description/AdminComment: Built-in account for administering the computer/domain
Last Logon: 2026-09-03 17:58:26+09:00
Password Last Set: 2026-01-23 05:14:35+09:00
Primary Group: Domain Users (513)
Account Control: NORMAL_ACCOUNT | PASSWORD_NEVER_EXPIRES
Logon Count: 92
Direct Domain Groups: Domain Users; Administrators; Domain Admins
>> INTERESTING: PWD_NEVER_EXPIRES
ここにあるものはすべて標準的な SAMR/LSARPC なので、Samba の rpcclient で同じ事実を1回の呼び出しずつ取得できます。まず匿名で接続します:
rpcclient -U "" -N 10.0.0.10
enumdomusers は標準ユーザーアカウントを名前のみで返します。マシン($)アカウントは除外され、完全な詳細は queryuser を1アカウントずつ実行することを意味します。rpcclient には組み込みの RID サイクリングループがないため、サーバー側の列挙が制限されている場合にマシンアカウント(またはその他)を復元できません。範囲に対して lookupsids を自分でスクリプト化する必要があります。またロックアウトポリシーコマンドがなく、LSA DNS/フォレスト/GUID や信頼関係も返しません。これがこのツールが PolicyDnsDomainInformation を直接クエリする理由です。
スクリプト化された相当物と、このツールがそれらとどう関係するかについては、比較 を参照してください。
ブルーチーム側でこれを止めたい場合、匿名パスが閉じるべきものです:
RestrictAnonymousSAM / RestrictAnonymous 設定)を有効にします。これらはいずれも、ログイン済みユーザーが同じデータを読むことを止めません — それは正常で想定内です。認証情報なしのパスを閉じるだけです。
\samr に対する多数のアカウント ID ルックアップ、または \lsarpc に対するポリシー/ルックアップ呼び出し。--sleep と --jitter が呼び出しを分散させることができるため、レートだけでなくウィンドウ内の合計数でアラートを出します。--lsa-fallback を追加してインベントリのために LSA LsarLookupSids を試します(「SAMR がロックダウンされている場合」を参照)。LSA ルックアップもブロックされている場合、偵察(ドメイン名 + SID)のみが可能です。MIT。LICENSE を参照してください。
$queryuser| モード | 得られるもの |
|---|
recon | ドメイン情報、カウント、パスワード/ロックアウトポリシー、LSA/DNS の詳細。ブルートフォースなし。ただの偵察。 |
rids | どのアカウントが存在するかを見つけ、ユーザー / コンピュータ / グループに分類します。 |
users | 上記に加えて、すべての実ユーザーの完全な詳細と「興味深いアカウント」のサマリー。--include-groups を追加すると各ユーザーのグループも一覧表示します。 |
groups | ドメイングループと組み込みエイリアスをメンバーとともに表示します。 |
full | すべて。 |
| このツール | rpcclient の相当物 |
|---|
recon(ドメイン情報 + カウント) | querydominfo |
recon(パスワードポリシー) | getdompwinfo |
recon(LSA ドメイン + SID) | lsaquery、lsaenumsid |
rids(名前/SID 変換) | lookupnames <name>、lookupsids <SID> |
rids(サーバー側リスト) | enumdomusers(標準ユーザーのみ — $ マシンアカウントなし) |
users(ユーザーごとの詳細) | queryuser <rid> または queryuser <name>、querydispinfo |
groups | enumdomgroups、querygroupmem <rid>、enumalsgroups builtin、queryaliasmem builtin <rid> |