pyLDAPGui - 开发历程
背景起源
pyLDAPGui是我在过去几个月里一直在开发的一个应用程序,直到最近才决定以概念验证的形式发布,供大家试用。这个想法的诞生源于我在开发"无恶意软件对抗模拟"课程时,需要寻找能够在不同操作系统中有效进行"就地取材"的工具,这让我开始深入研究可移植的可用选项。
如果你曾经进行过任何形式的渗透测试、红队行动或专注于Active Directory环境的审计,很可能使用过Active Directory Explorer。这是一个在Windows主机上连接LDAP服务器(通常是域控制器)并查看AD环境的优秀工具。但它的最大限制是只能在Windows上使用,如果你希望在Linux虚拟机或Mac上操作,就无法使用它。
寻找替代方案
在寻找具有用户界面的替代LDAP浏览器时,我发现了一些有用的系统管理工具:
- GoDAP:终端用户界面工具
- ldap_shell:具有各种功能的优秀终端UI
- Softerra LDAP浏览器:类似老式C#应用程序的界面
但这些工具要么缺乏图形界面,要么仍然依赖Windows平台。
技术选型
编程语言选择
在创建GUI应用程序时,我考虑过多种语言:
- Go和Rust:最初尝试但学习曲线较陡峭
- Python:最终选择,因其多功能性和易用性
GUI库选择
评估了多个Python GUI库后,我选择了PyQt:
- Tkinter
- PyQt ✓
- Kivy
选择PyQt主要是因为其易用性、可扩展性和跨平台支持。
功能设计
工具的核心设计目标是与ADExplorer类似的功能:
- 通过树状视图连接到LDAP
- 支持LDAP和LDAPS
- 能够导出为合理格式(主要是CSV和JSON,支持BloodHound兼容性)
- 快速搜索功能,支持运行特定的LDAP查询
开发挑战
GUI设计
在Python中设计GUI比我想象的要复杂,特别是在确定导出文件的结构方面。
SOCKs支持
实现SOCKs功能比最初预期的要困难,通过大量谷歌搜索和试错最终解决了问题。
操作安全考虑
在开发过程中考虑了节流和操作安全问题:
self.attribute_variations = {'samaccountname': ['sAMAccountName', 'samAccountName', 'SAMACCOUNTNAME', 'sAmAcCoUnTnAmE'],'objectclass': ['objectClass', 'OBJECTCLASS', 'ObjectClass', 'oBjEcTcLaSs'],# ... 更多属性变体
}
工具执行以下类型的LDAP查询:
- 树导航(get_children):在展开树节点时触发
- 条目详情(get_entry):在选择项目时触发
- 批量导出(get_bloodhound_data):6个大型查询用于BloodHound导出
- 通用搜索(search):用于CSV导出和浏览
为了增强隐蔽性,在查询之间添加了随机延迟(0.5-2秒),并且每次运行时都会打乱查询顺序。
GitHub Actions集成
使用GitHub Actions进行CI/CD时遇到挑战,需要正确设置权限:
permissions:contents: writepackages: write
经过26多次尝试才成功实现清理提交历史和工作流提交的功能。
最终成果
完成后的GUI工具具有以下核心功能:
- 连接到LDAP/LDAPS服务器并以树状视图列出
- 导出为CSV/BloodHound格式
- 直接导入到Neo4j(支持通过网络连接)
未来计划
计划进一步改进代码并添加更多功能,包括:
- 使用OpenGraph支持BloodHound CE的导入功能
- 导出特定详细信息并解析更多数据
- ADCS分析按钮功能开发
这个PoC工具是我过去几个月开发工作的成果,希望能对大家有所帮助。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码