pyLDAPGui开发全记录:跨平台LDAP图形化工具诞生记

本文详细记录了pyLDAPGui工具的开发历程,从跨平台LDAP浏览需求出发,到Python GUI框架选型、功能设计实现,再到Opsec安全考量和GitHub Actions自动化部署,完整呈现了一个安全工具的诞生过程。

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安全考量

在开发过程中,我还考虑了限流和操作安全问题。工具对一些查询进行了翻转和随机化处理:

1
2
3
4
5
self.attribute_variations = {
    'samaccountname': ['sAMAccountName', 'samAccountName', 'SAMACCOUNTNAME', 'sAmAcCoUnTnAmE'],
    'objectclass': ['objectClass', 'OBJECTCLASS', 'ObjectClass', 'oBjEcTcLaSs'],
    # ...更多属性变体
}

我还希望输出尽可能最小化,使用尽可能少的查询来维持BloodHound所需的输出。工具进行以下类型的LDAP查询:

  • 树导航(get_children):在展开树节点时触发
  • 条目详情(get_entry):在选择项目时触发
  • 批量导出(get_bloodhound_data):6个大型BloodHound导出查询
  • 通用搜索(search):用于CSV导出和浏览

除了减少查询外,我还添加了查询间的限流功能,尝试不向服务器发送过多请求,同时保持一定程度的隐蔽性。查询之间有基本随机延迟(0.5-2秒),每次运行时查询都会被打乱以尝试规避标准签名。

GitHub Actions集成

另一个挑战是GitHub Actions。我喜欢CI/CD,并尽可能在所有工具创建中使用它,主要是因为它消除了每个系统需要标准开发环境的痛苦,并允许临时构建以便于部署。

需要注意的是,如果要从GH Actions构建发布版本,需要设置以下两个权限:

1
2
3
permissions:
  contents: write
  packages: write

最终成果

将所有内容整合后,GUI实际上表现不错,带有一些按钮(有些目前还没有实用功能,但至少有计划)。目前可用的核心功能集:

  • 连接到LDAP/LDAPS服务器并在树状视图中列出
  • 导出为CSV/导出为BloodHound格式
  • 直接摄取到Neo4j(前提是你可以从运行此工具的主机访问它)

我还有一些进一步改进代码和添加更多功能的计划,比如前面提到的使用OpenGraph for BloodHound CE进行摄取,以及导出特定详细信息并从数据中解析更多信息的能力,这是我希望ADCS分析按钮最终能够实现的功能!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计