pyLDAPGui - 开发历程全记录
pyLDAPGui是我在过去几个月里一直在开发的一个应用程序,直到最近才决定以概念验证的形式发布,供大家试用。这个想法的诞生源于我在开发课程"无恶意软件对抗模拟(MAE)“时,需要寻找能够在跨操作系统环境中有效使用的便携式工具,这让我开始深入研究现有的各种选项。
背景与动机
如果你曾经进行过任何形式的渗透测试、红队行动或专注于Active Directory环境的审计,很可能使用过Active Directory Explorer(AD Explorer)。这是一个在Windows主机上连接LDAP服务器(通常是域控制器)并查看AD环境的优秀工具。但AD Explorer存在诸多限制:速度较慢、快照输出为.dat格式,并且仅限于Windows主机使用。
AD Explorer最大的限制在于仅支持Windows平台,如果你想要在*nix虚拟机或Mac上操作,就无法使用它(虽然可以通过mono和wine等技术实现,但并非原生支持)。
探索替代方案
在寻找带有UI的替代LDAP浏览器时,我发现了一些有用的系统管理工具。GoDAP作为终端UI存在,虽然功能不错但仍然是命令行界面。同样,ldap_shell具有功能丰富的终端UI。还有Softerra LDAP浏览器,这让我回想起旧的C#应用程序,但同样依赖Windows环境。
技术选型决策
Python与GUI框架
在创建GUI应用程序方面,我最终选择了Python,因为它在多功能性和可用库方面表现最佳。接下来需要决定在Python中使用哪个GUI库,经过阅读各库文档后,我选择了PyQt,因为它易于使用、可扩展且支持跨平台。
考虑过的选项包括:
- Tkinter
- PyQt
- Kivy
放弃Go和Rust的原因
最初我也考虑了Go和Rust,但后来意识到学习曲线和构建易用工具的支持成本太高。虽然Rust在GUI外观上提供了更多选择,感觉类似于Proxmox的UI,但所需的功能集配置不够方便。
功能设计
确定了库和语言后,我开始规划工具的功能。设计需要简单易用,同时具备足够的功能使其易于使用和访问。核心功能需要类似于AD Explorer:
- 通过树状视图连接LDAP
- 支持LDAP和LDAPS
- 能够导出为合理格式,主要是CSV和JSON(为了BloodHound兼容性)
- 具有快速简便的搜索功能,以及运行特定LDAP查询的能力
开发挑战
编写这个工具时遇到了一些挑战,主要是在Python中设计GUI不如我想象的那么直接,还有确定某些导出文件的结构。此外,让SOCKs正常工作也不像最初想象的那么容易,最终通过大量谷歌搜索和试错才解决了问题。
Opsec安全考量
在开发过程中,我还考虑了限流和操作安全问题。工具对一些查询进行了翻转和随机化处理:
|
|
我还希望输出尽可能最小化,使用尽可能少的查询来维持BloodHound所需的输出。工具进行以下类型的LDAP查询:
- 树导航(get_children):在展开树节点时触发
- 条目详情(get_entry):在选择项目时触发
- 批量导出(get_bloodhound_data):6个大型BloodHound导出查询
- 通用搜索(search):用于CSV导出和浏览
除了减少查询外,我还添加了查询间的限流功能,尝试不向服务器发送过多请求,同时保持一定程度的隐蔽性。查询之间有基本随机延迟(0.5-2秒),每次运行时查询都会被打乱以尝试规避标准签名。
GitHub Actions集成
另一个挑战是GitHub Actions。我喜欢CI/CD,并尽可能在所有工具创建中使用它,主要是因为它消除了每个系统需要标准开发环境的痛苦,并允许临时构建以便于部署。
需要注意的是,如果要从GH Actions构建发布版本,需要设置以下两个权限:
|
|
最终成果
将所有内容整合后,GUI实际上表现不错,带有一些按钮(有些目前还没有实用功能,但至少有计划)。目前可用的核心功能集:
- 连接到LDAP/LDAPS服务器并在树状视图中列出
- 导出为CSV/导出为BloodHound格式
- 直接摄取到Neo4j(前提是你可以从运行此工具的主机访问它)
我还有一些进一步改进代码和添加更多功能的计划,比如前面提到的使用OpenGraph for BloodHound CE进行摄取,以及导出特定详细信息并从数据中解析更多信息的能力,这是我希望ADCS分析按钮最终能够实现的功能!