
このツールは、ldapsearchやADとのインタラクション全般で私が経験した多くの問題を解決するために作成されました。特に、以下の問題に対処しています。
ADから1000件以上の結果を返せない。このツールはLDAPレコードのページングをサポートし、他のADのバグを回避して、任意の数のレコードを取得できるようにします。
NTLM資格情報を直感的な方法で認証に使用できない。NETBIOSドメイン名、ユーザー名、パスワードを指定してWindows DCに認証できます。
返されるレコード数、返される速度、一度に取得するレコード数を正確に制御できない。このツールでは、これらすべての項目を制御でき、ページング呼び出しごとに遅延を追加することもできます。さらに、ラウンドロビンクエリのために複数のDCを指定できます。
結果を読みやすい形式で返せない。このツールは現在、以下の3つの形式をサポートしています。
必要な属性のみを返せない。このツールでは、すべての属性を返すか、必要な属性のみを返すかを選択できます。
よく使うクエリのプリセットリストを保存できない。
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
AD LDAPコマンドライン検索ツール(使いやすいもの)。
位置引数:
attribute 返す属性(カスタムクエリの場合はデフォルトですべて。定型クエリの場合は、"*" を渡すとデフォルトの代わりにすべての属性を取得)
オプション引数:
-h, --help このヘルプメッセージを表示して終了
--domain DOMAIN, -D DOMAIN
ドメイン
--user USER, -U USER ユーザー名
--password PASSWORD, -P PASSWORD
パスワード、または LM:NTLM 形式のハッシュ
--server SERVER, -S SERVER
DCのIPまたは解決可能な名前
--basedn BASEDN, -b BASEDN
ベースDN。通常は "dc=" で始まり、長いドメイン名のピリオドを ",dc=" に置き換えたもの。指定されない場合はLDAPサーバーから推測を試みる。
--search SEARCH, -s SEARCH
LDAP検索文字列、または「カスタム検索」リストの番号(カスタム検索を示す)。stdinから読み込む場合は "-" を使用。
--maxrecords MAXRECORDS, -m MAXRECORDS
返す最大レコード数(デフォルトは100)、0はすべて。
--pagesize PAGESIZE, -p PAGESIZE
1回のプルで返すレコード数(デフォルトは10)。maxrecords以下である必要があります。
--delay DELAY, -d DELAY
ページング要求間の遅延(ミリ秒)(デフォルトは0)。
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
出力形式(デフォルトは "plain")。指定可能: plain, json, json_tiny
--encryption {1,2,3}, -n {1,2,3}
3) ポート636 TLS接続(デフォルト); 2) ポート389 非TLS接続、ただしSTARTTLSを試行し、必要に応じてフォールバック(impacketでは使用不可); 1) ポート389接続、強制的に平文
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
追加入力を促す定型検索にオプションを渡す高度な方法(複数のプロンプトがある場合は、プロンプトの順に引数を渡す)
--outfile OUTFILE, -o OUTFILE
出力ファイル(指定すると、出力はstdoutではなくここに送られます。[Windowsでのエンコードエラーを防げます])
--engine {ldap3,impacket}, -e {ldap3,impacket}
使用するエンジンを選択(デフォルトは "ldap3")。OPSEC注意事項を参照!
カスタム検索:
1) 全ユーザー取得
1.1) 特定のユーザー取得(ユーザー名の入力を求められます)
2) 全グループ(およびメンバー)取得
2.1) 特定のグループ取得(グループ名の入力を求められます)
3) 全プリンター取得
4) 全コンピューター取得
4.1) 特定のコンピューター取得(コンピューター名の入力を求められます)
5) ドメイン/エンタープライズ管理者の取得
6) ドメイン信頼の取得
7) 制約なしSPN委任の検索(権限昇格の可能性)
8) PreAuthが不要なアカウントの検索(ASREPROAST)
9) ユーザーSPNの検索(KERBEROAST)
9.1) 特定のユーザーSPNの検索(ユーザープリンシパル名の入力を求められます)
10) 表示可能な全LAPS LAパスワードを表示
10.1) 特定のワークステーションのLAPSパスワードを検索(ワークステーション名の入力を求められます)
*11) よくある平文パスワード属性の検索(UserPassword、UnixUserPassword、unicodePwd、msSFU30Password)
12) Quest Two-Factorシードをすべて表示(アクセス権がある場合)
13) Oracle "orclCommonAttribute" SSOパスワードハッシュ
*14) Oracle "userPassword" SSOパスワードハッシュ
15) SCCMサーバー取得
16) パスワードが不要なアカウントの検索(PasswordNotRequired)
アスタリスクの付いた項目は、検証可能な環境でテストされたことがないため、動作するかどうかお知らせください。
これらの例では、以下を想定しています。
NETBIOS NAME: EMP
FULL DOMAIN NAME: EXAMPLE.LOCAL
DC IPs: 10.0.0.2, 10.0.0.3
USERNAME: bob
PASSWORD: password
すべてのレコードを取得し、cn属性のみを返す:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
特定のユーザーの詳細を取得(ユーザー名の入力を求められます):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
特定のユーザーの詳細を取得(ユーザー名を指定してプロンプトを回避):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
上位100件のユーザーKerberos SPNを、一度に最大5件、各ページ要求の間に2秒の遅延を入れ、コンパクトなJSON形式で取得:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
すべてのプリンターレコードを手動で取得し、すべての関連属性を表示:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
制約なしSPN委任を簡単に検索:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
Impacketエンジンを使用し、baseDNを指定しない場合、ツールはドメインコントローラーへのSMB認証と接続を試行し、ドメインのNETBIOS名を取得してbaseDNを導出します。この動作は、高度に監視された環境では検出される可能性があります。そのような環境ではImpacketを使用しないか、常にbaseDNを指定してください。
Impacketは、完全なLDAPS接続または完全に暗号化されていない接続のいずれかを行います。現時点ではSTARTTLSを使用できないため、平文のLDAP接続が検出される可能性がある場合は、完全なTLS接続のみを試行するか、Impacketエンジンを使用しないでください。
Impacketは、レコードの取得速度を細かく制御することはできません。そのため、"--delay"オプションは部分的にしか実装されていません。レコード取得の遅延が重要な場合は、Impacketエンジンを使用しないでください。
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Unconstrained Delegation Abuse: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Oracle nonsense: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password and http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Qwest/Defender/Oneidentity 2nd Factor Token Data: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Common plaintext passwords: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
LDAP3が常に機能するとは限らないため(Impacketも同様)、LDAP3の代替としてImpacketを追加。
複数LDAPサーバー選択機能を削除。この機能はあまり必要なく、Impacketにも実質存在しないため。
すべてをリファクタリング。
SCCM検索機能を追加。
出力ファイルオプションを追加。
いくつかの出力形式の問題を修正。
LDAPクエリをstdinから受け取る機能を追加。
ユーザーが括弧を付けていない場合、自動的にクエリを括弧で囲む。
Python 2サポートのバグを修正。
よく使う列挙検索があれば、リストに追加できるようお知らせください。
...
Shelby Spencer (shellster) 作成。バグや機能リクエストは連絡先まで。