近日白帽汇安全研究院关注到,Axis摄像头被报存在一系列安全漏洞。该漏洞可使攻击者在连环利用多个漏洞后获取root 权限shell进行远程命令执行或直接进行拒绝服务或获取敏感信息。该漏洞影响Axis从1.x 到8.x 众多系列390 多个型号(具体版本详情见附件)。安全监控摄像头作为服务于安全使用的设备,却存在如此之多的安全漏洞,是用来监控还是被“监控”令人深思。
Axis产品专注于安全监视和远程监控应用领域,在全球的20个国家和地区开设有分支机构,并与超过70个国家和地区的合作伙伴展开合作。根据华顺信安FOFA系统数据显示,目前全网共有 25908个系统对外开放。Axis的使用受众数量庞大,该漏洞将影响众多的企业单位使用者,相关企业、使用者需要高度重视。
AXIS网络摄像头全球网络资产分布情况(仅为分布情况,非漏洞影响情况)
AXIS网络摄像头中国网络资产分布情况(仅为分布情况,非漏洞影响情况)
漏洞原理与危害
这些漏洞将直接导致攻击者可访问摄像头视频流,冻结摄像头视频流,控制摄像头 – 将镜头移动到需要的位置,开启/关闭 运动检测,将此摄像头纳入僵尸网络中,替换摄像头的软件,使用摄像头作为网络的渗透点(进行横向移动),渲染无用的摄像头,使用摄像头执行其他恶意的任务(如 DDOS 攻击,挖矿等)。
以下为相关漏洞分析:
0x01 授权绕过漏洞(CVE-2018-10661)–连环利用第一步
此漏洞允许攻击者发送未通过身份验证的请求到 /bin/ssid 的 .srv 功能来绕过 web 服务器的授权机制,而无需提供用户凭证。
当收到 http://CAMERA_IP/index.html/a.srv 的 HTTP 请求时,会出现以下(抽象的)逻辑。
- 当 Apache httpd 解析 URI 请求时,他在请求的 request_rec 结构体中设置以下成员字段。
uri = “/index.html/a.srv”
filename = “/usr/html/index.html” # 假设 web 根目录是 /usr/html
path_info = “/a.srv”
2.对 web 根目录下的文件访问由 Axis 自定义的授权代码 so 模块控制(由于 httpd 配置文件中的 /usr/html 目录指令中需要 axis-group-file 指令)。
3.既然请求获得了授权,那么配置的 <LocationMatch “.+.(shtml|shtm|srv)($|&)”> 指令与 URI(我们请求的完整 uri,见上文)进行正则匹配。因为通过正则表达式匹配到的 URI 都是以 .srv 结尾,因此调用 .srv 处理代码 – “TransferMime /var/run/ssid/ssidsocket” 处理。它的功能是将请求传输到 /var/run/ssid/ssidsocket unix 套接字,以便 /bin/ssid 进程处理。
4.随后,/bin/ssid 进程接收到这个请求检查其(完整的)URI,并将请求视为对 .srv 文件的合法请求 —— 允许请求到达 .srv 功能。
为了展示能够到达 /bin/ssid 的 .srv 功能,我们发送一个带有 return_page 参数的请求。这是用于 HTTP 重定向的一个特殊参数。 当参数值(字符串 “it_worked”)出现在响应中,我们就知道了我们已经到达了 /bin/ssid 的 .srv 功能。
0x02 .srv 功能用户不受限制的 dbus 访问 (CVE-2018-10662) — 连环利用第2步
达到 /bin/ssid 的 .srv 功能的合法请求可以通过在请求的查询字符串中设置操作参数来选择其中的一个功能。其中的一个功能是 dbus,它允许用户以 root(/bin/ssid 进程的 uid 和 gid) 权限调用任何 dbus 请求,并且不会受到目的地或者内容的限制。由于是来自 root 进程的 dbus 请求 —— 被授权不受限制的访问许多 dbus 服务接口。之所以会这样,是因为旨在限制此类请求的授权机制 PliocyKit 被配置成为来自 root 的请求自动授予访问权。
查看 PolicyKit.conf 手册得知,/etc/PolicyKit/PolicyKit.conf 最初设置为 “yes” 意味着已授予权限。
虽然 /bin/ssid 中 的 dbus 接口仅用于从某些特定的启用了 dbus 的服务中获取特定值,但是它暴露了更广泛的功能,从而产生了安全后果。
例如,该接口允许用户控制设备 parhand 参数的任意值。可以通过发送 dbus 请求来调用 policykit_parhand 进程的 dbus-interface (PolicyKitParhand)函数来实现。这个接口提供了可由 root dbus-client 调用的 SetParameter 和 SynchParameter 方法。通过在执行 SynchParameter 后面的 SetParameter,用户可以设置任意的 parhand 参数值并应用更改。
在存在此漏洞的摄像头上运行这些命令后,视频的左上方会叠加一张图片(默认是 Axis 的小标志)。可以登录到 web 界面查看:
、
0x03 shell 命令注入漏洞 (CVE-2018-1066) — 连环利用第3步
需要有修改参数 parhand 的权限才能利用这个漏洞。这可以通过以下几步实现:
获得/拥有管理员权限(通过使用 cgi 接口)
在 upnp 守护进程中执行代码
找到其他方法来控制 parhand 参数 —— CVE-2018-10662 在直接调用 policykit_parhand 函数的示例中实现了这一点(见上文)。
parhand 参数处理程序负责获取、存储、更改设备的许多内部参数。当用户通过 web 界面设置参数时,相关的 CGI 脚本(param.cgi) 转发设置参数请求到二进制文件 parhand,它检查访问权限,并将参数值保存在相关的配置文件中。
一些参数用于提供 shell 脚本,并被定义为 shell 挂载(在 parhand 配置文件中 mount =“shell()”)。参数值由 parhandshell 解析器解析,它不清理特殊的 shell 字符,也不引用参数值。其中的一些参数(例如,我们使用的 Time.DEST.Enable)以 shell 赋值的格式(例如,FOO=Bar)保存在配置(例如,/etc/sysconfig/openntpd.conf)文件末尾。之后,shell 初始化脚本(例如,parhand-systemctl restart time-source.service),它们作为设置命令的结果运行,该命令在为参数应用新值时执行 —— 通过 sync 命令。
shell 脚本直接执行配置文件(目的是包含配置参数),并且通过使用分号(“;”)设置参数值,使我们能够以 root 权限注入任意命令。
这个漏洞的关键因素在于:
解析 shell 环境中输入值时缺乏过滤
设备使用了一个过时的方法,使用 shell 脚本去是设置参数并将它们以 shell 赋值的方式存贮在文件中,然后执行这些文件。
请注意这些参数不仅能够通过摄像头的 upnp 守护进程设置。如果攻击者恰巧有能力在 UPnP 守护进程中执行代码,也能利用这个漏洞来提升权限。
0x04 使 httpd 进程崩溃 (CVE-2018-10664)
这个漏洞允许未授权的攻击者击崩 httpd 进程 —— 导致(至少)使用默认配置的用户通过 web 界面查看到的视频界面为黑屏状态。
在触发这个漏洞后,系统日志会出现以下一行(接下来是崩溃转储)。
[ ERR ] kernel: [ 2819.017996] httpd: httpd: potentially unexpected fatal signal 11.
POC
这个漏洞通过向 .cgi 脚本 URL 发送带有 PATH_INFO 参数并以 .srv 拓展结束的 HTTP 请求触发。
0x05 /bin/ssid 进程信息泄露漏洞 (CVE-2018-10663)
这个漏洞不需要任何用户凭证。用户控制着在 /bin/ssid 的 .srv 功能中的查询字符 return_page 和 servermanager_return_page。当在响应构建代码处理时 —— 这些字段的值被缩减为 0x200 字节,并通过使用安全的 __snprintf_chk 函数复制到已分配的 0x200 字节的空间。然后 __snprintf_chk 函数的返回值(假设它们的长度)保存在结构体成员变量中,以便以后计算响应的内容长度。
__snprintf_chk 的返回值保存在结构体成员变量的 IDA 截图(部分)
_snprint_chk 函数的返回值的问题在于,“The number of characters that would have been written if n had been sufficiently large…”(摘自 sprintf 的手册)。这导致计算出来的内容的长度大于实际数据的大小,因此,内存中额外的字节会泄露在响应中。
0x06 使 /bin/ssid 进程崩溃 (CVE-2018-10658)
这个漏洞不需要任何用户凭证。未认证的用户能够发送带有特殊的字符 dbus 请求致使 ssid 服务崩溃。崩溃源于 libbus-send.so 共享对象或相似的代码中。它生成的日志如下:
[ INFO ] ssid[2334]: process 2334: arguments to dbus_message_new_method_call() were incorrect, assertion “iface == NULL || _dbus_check_is_valid_interface (iface)” failed in file ../../dbus-1.10.14/dbus/dbus-message.c line 1373.
程序崩溃同样出现在直接调用带有相似字符的 “/usr/bin/dbus-send“ 时。他可能还影响到包含这些代码其他进程。值得注意的是 /bin/ssid 进程将会重启。
0x07 使 /bin/ssid 进程崩溃 (CVE-2018-10659)
未授权用户可以发送(通过 /bin/ssid .srv 接口)特殊构造的命令,该命令将调用 UND undefined ARM 指令(MIPS 或者其他架构的摄像头可能也有类似的情况),这样导致进程崩溃。值得注意的是 /bin/ssid 进程将会重启。
在触发这个漏洞以后会出现以下的日志:
[ ERR ] kernel: [ 2390.374778] ssid: ssid: potentially unexpected fatal signal 11.
这个漏洞不需要任何的用户凭证。
CVE编号
CVE-2018-10661 CVE-2018-10662 CVE-2018-1066 CVE-2018-10664 CVE-2018-10663 CVE-2018-10658 CVE-2018-10658
漏洞影响产品列表
漏洞POC
目前,FOFA客户端已经支持该相关漏洞的POC。
漏洞修复及建议
1。将摄像头恢复到出厂设置,在重新设置设备后,把摄像头直连到互联网之前执行固件升级。你可以使用 Axis 设备管理器,摄像头的 web 界面或者 FTP。在 https://www.axis.com/en-in/support/tecnical-notes/how-to-upgrade 页面查看厂商关于固件更新的说明。
白帽汇会持续对该漏洞进行跟进。后续可以关注本链接。
参考
[1] https://blog.vdoo.com/2018/06/18/vdoo-discovers-significant-vulnerabilities-in-axis-cameras/
[2] https://www.axis.com/files/sales/ACV-128401_Affected_Product_List.pdf
[3] https://github.com/xqcyberscore/nvt/blob/dd7beba2f5733f3733e61fafd81a891735f64880/2018/axis/gb_axis_network_camera_mult_vuln_june18.nasl
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/54226.html