通过Cisco统一通信管理器实现未授权用户名枚举
这篇文章介绍了我最近在Cisco统一通信管理器(CUCM)中发现的一个安全问题。在使用SeeYouCM Thief工具(该工具旨在从Cisco电话系统下载和解析配置文件)时,我在配置文件中发现了一个有趣的XML元素<secureUDSUsersAccessURL>。该值指向https://cucm_server:8443/cucm-uds/users,令我惊讶的是,访问该URL返回了一个包含大量Active Directory用户的XML文档。出于好奇,我想进一步了解这个问题。
根据Cisco的文档: 用户数据服务(UDS) API是一组基于REST的操作,提供对用户资源和实体的认证访问,包括用户设备、订阅服务、快速拨号等,这些数据来自统一通信配置数据库。
这很有趣,因为我能够在没有认证的情况下获取数据。关于认证的进一步调查中,我发现了以下声明: 许多(但不是全部)UDS API请求需要认证才能访问。使用CUCM管理员创建的终端用户帐户来进行需要认证的API调用。
因此,虽然此API对某些资源需要认证,但许多资源不需要,其中users API就不需要认证。
users资源提供搜索功能,用于查找存储在Cisco Unified CM数据库中的用户。通常情况下(就像我的客户案例一样),该数据库通过LDAP/LDAPS直接链接到Active Directory。
从API获取数据很简单,但存在一些限制。默认情况下,此API调用最多只返回64个结果。如果用户搜索结果超过指定数量,则只返回部分结果,最多达到指定的搜索限制。要枚举数据库中超过前64个条目,可以通过查询字符串参数进行多次查询来过滤数据。
可以基于姓名、名字、姓氏、电话号码、用户名、电子邮件等进行过滤。我发现基于姓名过滤是最有用的,因为并非所有条目都包含其他属性的值。借鉴MailSniper的GAL转储功能,我决定通过请求字母表中的两个字母组合来缩小范围,希望每个查询的结果不超过64条限制。这将总共产生26 * 26(676)次查询。
使用这种技术,我能够编写脚本自动化这个过程,并在约53秒内恢复了约10,000个Active Directory用户名。该Active Directory环境总共有11,777个用户,我的恢复率达到85%。对于不到1分钟的枚举时间来说,这还不错。环境越小,恢复率越高。可以通过额外的查询提高恢复率,但就我的目的而言,这已经足够好了。
虽然整个过程可以用一行bash命令完成,但我还是创建了一个小的shell脚本来自动化整个过程:
|
|
此外,此功能现已移植到SeeYouCM Thief中,在针对CUCM服务器时只需使用–userenum标志。
2022年3月1日更新: 要缓解此问题,请启用联系人搜索认证。 Bug ID: CSCwa81008 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwa81008(需要客户认证)
启用联系人搜索认证的完整步骤:https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cucm/rel_notes/11_5_1/cucm_b_release-notes-cucm-imp-1151/cucm_b_release-notes-cucm-imp-1151_chapter_010.html#task_AE831C159B03176B3451FB5834A5C0B0