-
-
[讨论]看雪换的衣服到了~以及最近一个很火的cve
-
发表于:
2021-1-28 19:47
3666
-
[讨论]看雪换的衣服到了~以及最近一个很火的cve
前几天换了个衣服,今天就到了,还蛮快的。
不错不错,好看。
关于CVE-2021-3156
其实昨天就看到这个洞的预警了。不过想的是等调完了手上afl再回来看这个。
我找到的比较详细的利用在:
https://blog.qualys.com/vulnerabilities-research/2...
https://github.com/reverse-ex/CVE-2021-3156/blob/m...
稍微看了一下,来简单总结一下文章中提到了三种可以利用成功的手段。
覆写struct sudo_hook_entry。
这是一个被分配到heap上的结构体,可以通过堆溢出覆写其中的函数指针getenv_fn(他指向的函数存在于sudo.so中,并且在sudo.so的开头有对execv的调用),而对于其的调用又和execve其one_gadgets的参数很像。
所以思路如下:
通过堆溢出,劫持函数指针getenv_fn,在存在aslr的情况下进行部分覆写(低两字节为 0x8a00),然后爆破execv函数的地址,最后通过execv以root来执行我们自己的文件。(比如我们的文件叫:"SYSTEMD_BYPASS_USERDB",这是正常执行getenv_fn中的第一个参数)
覆写struct service_user。
(也是视频中演示的方法)
我们可以通过堆溢出,劫持堆上的struct service_user结构体中的library指针。在nss_load_library (service_user *ni)中会基于此结构体进行一些操作。 我们的思路如下: 首先劫持service_user中的library为NULL以通过一些检查。 接着覆写serviceuser中的name变量。以视频中为例,他将name覆写为"X/X",这样做的目的在于,当函数正常执行时,会做如下的文件路径拼接:"libnss" + name + ".so.2",正常情况下是:libnss_systemd.so.2,而当我们劫持了name后就变成了:"libnss_X/X.so.2",也就是说,此时加载了恶意的lib文件。 通过观看poc视频我们可以看到在lib中的_init函数是constructor,那么他会作为初始的构造函数在main前执行,通过执行恶意的lib中的_init来root。
覆写def_timestampdir。
第三种是比较玄学的一种利用,简单提一下:
sudo有这样一种行为,大致就是会在我们的工作目录下创建一些属于root用户的目录。每个这样的目录下都有且仅有一个文件:Sudo's timestamp file。 如果我们尝试将def_timestampdir覆盖为一个不存在的目录。然后我们可以与sudo的ts_mkdirs()竞争,创建一个指向任意文件的符号链接。并且尝试打开这个文件,向其中写入一个struct timestamp_entry。我们可以符号链接将其指向/etc/passwd,然后以root打开他,然后实现任意用户的注入从而root。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)