本工具旨在解决我在使用 ldapsearch 以及与 AD 交互过程中遇到的许多问题。具体来说,该工具解决了以下我遇到过的痛点:
无法从 AD 返回超过一千个结果。本工具支持 LDAP 记录分页,并绕过了其他 AD 缺陷,允许检索任意数量的记录。
无法以直观的方式使用 NTLM 凭据进行身份验证。您可以提供 NETBIOS 域名、用户名和密码来向 Windows DC 进行身份验证。
无法精确控制返回的记录数量、返回速度以及每次拉取的记录数。本工具允许您控制所有这些参数,包括在每次分页调用之间添加延迟。此外,可以指定多个 DC 以实现轮询查询。
无法以易于消化的形式返回结果。本工具目前支持三种格式:
无法只返回您关心的属性。本工具允许您返回所有属性,或仅返回您需要的属性。
无法保存自定义的常用查询列表。
git clone ...
pip install -r requirements.txt
# python3 ldapper.py
usage: ldapper.py [-h] --domain DOMAIN --user USER --password PASSWORD
--server SERVER [--basedn BASEDN] --search SEARCH
[--maxrecords MAXRECORDS] [--pagesize PAGESIZE]
[--delay DELAY] [--format {plain,json,json_tiny}]
[--encryption {1,2,3}]
[--advanced [ADVANCED [ADVANCED ...]]] [--outfile OUTFILE]
[--engine {ldap3,impacket}]
[attribute [attribute ...]]
AD LDAP 命令行搜索工具,不再糟糕。
positional arguments:
attribute 要返回的属性(对于自定义查询默认为全部。对于预设查询,传递 "*" 可获取所有属性而非默认值。)
optional arguments:
-h, --help 显示此帮助信息并退出
--domain DOMAIN, -D DOMAIN
域名
--user USER, -U USER 用户名
--password PASSWORD, -P PASSWORD
密码或 LM:NTLM 格式的哈希
--server SERVER, -S SERVER
DC 的 IP 或可解析名称
--basedn BASEDN, -b BASEDN
基础 DN 通常应为 "dc=",后跟长域名,其中句点替换为 ",dc="。如果未提供,将尝试从 LDAP 服务器推导。
--search SEARCH, -s SEARCH
LDAP 搜索字符串或数字,表示从“自定义搜索”列表中选择的搜索项。使用 "-" 表示从标准输入读取。
--maxrecords MAXRECORDS, -m MAXRECORDS
要返回的最大记录数(默认为 100),0 表示全部。
--pagesize PAGESIZE, -p PAGESIZE
每次拉取返回的记录数(默认为 10)。应小于等于最大记录数。
--delay DELAY, -d DELAY
分页请求之间的延迟(毫秒,默认为 0)。
--format {plain,json,json_tiny}, -f {plain,json,json_tiny}
输出格式(默认为 "plain")。可选:plain, json, json_tiny。
--encryption {1,2,3}, -n {1,2,3}
3) 连接到 636 TLS(默认);2) 连接到 389 不启用 TLS,但尝试 STARTTLS 并在需要时回退(impacket 不可用);1) 连接到 389,强制明文。
--advanced [ADVANCED [ADVANCED ...]], -a [ADVANCED [ADVANCED ...]]
高级方式:为需要额外输入的预设搜索传递参数(如有多个提示,请按提示顺序传递参数)。
--outfile OUTFILE, -o OUTFILE
输出文件(如果指定,输出将定向到文件而非标准输出 [可防止 Windows 中的编码错误])。
--engine {ldap3,impacket}, -e {ldap3,impacket}
选择使用的引擎(默认为 "ldap3")。请参阅 OPSEC 注意事项!
Custom Searches:
1) 获取所有用户
1.1) 获取特定用户(会提示您输入用户名)
2) 获取所有组(及其成员)
2.1) 获取特定组(会提示您输入组名)
3) 获取所有打印机
4) 获取所有计算机
4.1) 获取特定计算机(会提示您输入计算机名)
5) 获取域/企业管理员
6) 获取域信任关系
7) 搜索不受约束的 SPN 委派(潜在权限提升)
8) 搜索不需要预认证的帐户(ASREPROAST)
9) 搜索用户 SPN(KERBEROAST)
9.1) 搜索特定用户 SPN(会提示您输入用户主体名称)
10) 显示所有可见的 LAPS LA 密码
10.1) 搜索特定工作站的 LAPS 密码(会提示您输入工作站名称)
*11) 搜索常见的明文密码属性(UserPassword、UnixUserPassword、unicodePwd 和 msSFU30Password)
12) 显示所有 Quest 双因素种子(如果您有访问权限)
13) Oracle "orclCommonAttribute" SSO 密码哈希
*14) Oracle "userPassword" SSO 密码哈希
15) 获取 SCCM 服务器
16) 搜索不需要密码的帐户(PasswordNotRequired)
带星号的项目从未在实际环境中经过验证,如果它们有效,请告知我。
在这些示例中,假设以下信息:
NETBIOS NAME: EMP
FULL DOMAIN NAME: EXAMPLE.LOCAL
DC IPs: 10.0.0.2, 10.0.0.3
USERNAME: bob
PASSWORD: password
检索所有记录,仅返回 cn 属性:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(cn=*)' cn
检索特定用户的详细信息(将提示输入用户名):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1'
检索特定用户的详细信息(传递用户名以避免交互提示):
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '1.1' -a 'alice'
检索前 100 个用户 Kerberos SPN,每次最多检索五个,每次分页请求间隔两秒,以紧凑 JSON 格式输出:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 100 -p 5 -d 2000 -f json_tiny -s '(&(objectcategory=user)(serviceprincipalname=*))' serviceprincipalname userprincipalname
手动检索所有打印机记录并显示所有相关属性:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s '(objectClass=printQueue)'
轻松搜索不受约束的 SPN 委派:
python ldapper.py -D 'EMP' -U 'bob' -P 'password' -S '10.0.0.2,10.0.0.3' -m 0 -s 4
使用 Impacket 引擎且未提供 baseDN 时,该工具将尝试通过 SMB 身份验证并连接到域控制器以获取域的 NETBIOS 名称,从而推导出 baseDN。在高度敏感的环境中,此行为可能导致检测。请勿在此类环境中使用 Impacket,或者始终指定 baseDN。
Impacket 要么进行完全 LDAPS 连接,要么进行完全未加密的连接。它目前无法使用 STARTTLS,因此如果明文 LDAP 连接会被检测到,请仅尝试完全 TLS 连接,或者不要使用 Impacket 引擎。
Impacket 在控制记录拉取速度方面提供的控制能力有限。因此,“--delay”选项仅部分实现。如果延迟记录拉取至关重要,请勿使用 Impacket 引擎。
Kerberoast: https://adsecurity.org/?p=2293
ASREPRoast: http://www.harmj0y.net/blog/activedirectory/roasting-as-reps/
Unconstrained Delegation Abuse: http://www.harmj0y.net/blog/activedirectory/the-most-dangerous-user-right-you-probably-have-never-heard-of/
Oracle nonsense: https://blogs.oracle.com/mwilcox/entry/clarifying_ovd-ad_eus_password and http://onlineappsdba.com/index.php/2014/03/03/what-hashing-algorithm-oid-uses-to-store-user-password-ssha-or-md5/
Qwest/Defender/Oneidentity 2nd Factor Token Data: http://support-public.cfm.quest.com/43565_Defender_5.9_AdminGuide.pdf
Common plaintext passwords: https://www.blackhillsinfosec.com/domain-goodness-learned-love-ad-explorer/
添加了 Impacket 作为 LDAP3 的替代方案,因为 LDAP3 并不总是有效(Impacket 也是如此)。
移除了多 LDAP 服务器选择功能,因为该功能并非必需,且在 Impacket 中也不存在。
重构了所有内容。
添加了 SCCM 搜索功能。
添加了输出文件选项。
修复了一些格式输出问题。
添加了从标准输入接收 LDAP 查询的功能。
如果用户未添加括号,则自动将查询包裹在括号中。
修复了 Python 2 支持错误。
如果您有一些常用的搜索枚举,请告诉我,以便我将其添加到列表中。
...
由 Shelby Spencer (shellster) 编写。如有错误或功能请求,请联系我。