通过Cisco统一通信管理器(CUCM)实现未认证用户名枚举
2022年1月29日
n00py
最近在使用SeeYouCM Thief工具(专用于从Cisco电话系统下载解析配置文件)时,我在配置文件中发现了一个有趣的现象。配置文件中存在一个名为<secureUDSUsersAccessURL>的XML元素,其值指向https://cucm_server:8443/cucm-uds/users。令人惊讶的是,直接访问该URL会返回包含大量Active Directory用户的XML文档,这引起了我的深入探究兴趣。
根据Cisco官方说明:
用户数据服务(UDS) API是一组基于REST的操作,提供对统一通信配置数据库中用户资源和实体的认证访问,包括用户设备、订阅服务、速拨号等。
值得注意的是,我无需认证即可获取这些数据。关于认证要求,Cisco有如下说明:
许多(但非全部)UDS API请求需要认证访问。使用CUCM管理员创建的终端用户账户可调用需要认证的API。
这意味着虽然部分API资源需要认证,但许多接口(包括用户API)并不需要认证即可访问。
用户资源提供搜索功能,用于查找存储在Cisco Unified CM数据库中的用户。通常情况下(如我的客户案例),该数据库通过LDAP/LDAPS直接与Active Directory关联。
从API获取数据非常简单,但存在限制:默认情况下,该API调用最多返回64条结果。如果搜索结果超过指定数量,则仅返回部分结果。为了枚举数据库中超过前64条的记录,可以通过查询字符串参数进行多次过滤查询。
支持按姓名、名字、姓氏、电话号码、用户名、邮箱等字段过滤。我发现按姓名过滤最为有效,因为并非所有条目都包含其他属性值。借鉴MailSniper的GAL导出功能,我决定通过请求字母表中的两个字母组合来缩小查询范围,确保每次查询结果不超过64条限制。这将需要26*26=676次查询。
使用该技术,我编写脚本在约53秒内恢复了约10,000个Active Directory用户名。该AD环境共有11,777个用户,恢复率达到85%。对于不到1分钟的枚举时间来说效果显著。环境规模越小,恢复率越高。虽然可以通过增加查询次数提高恢复率,但当前结果已满足需求。
虽然整个过程可通过bash单行命令完成,我还是编写了一个shell脚本来自动化处理:
|
|
此外,该功能现已集成到SeeYouCM Thief工具中,只需在针对CUCM服务器时使用--userenum参数即可。
2022年3月1日更新: 缓解措施:启用联系人搜索认证功能。 漏洞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