前几天换了个衣服,今天就到了,还蛮快的。 不错不错,好看。
其实昨天就看到这个洞的预警了。不过想的是等调完了手上afl再回来看这个。
我找到的比较详细的利用在:e28K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2M7i4g2S2L8s2W2K6i4K6u0W2j5$3!0E0i4K6u0r3N6Y4g2D9L8X3g2J5j5h3u0A6L8r3W2@1K9h3g2K6i4K6u0V1M7X3g2K6k6h3q4J5j5$3S2Q4x3V1j5J5i4K6u0W2i4K6u0W2i4K6u0W2c11K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5k6i4k6W2M7Y4y4W2i4K6u0V1k6i4S2Q4x3V1k6o6g2V1g2Q4x3X3b7J5x3o6t1I4i4K6u0V1x3K6p5#2y4W2)9J5c8X3u0D9L8$3u0Q4x3V1k6E0i4K6u0W2i4K6u0W2i4K6u0W2稍微看了一下,来简单总结一下文章中提到了三种可以利用成功的手段。
这是一个被分配到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结构体中的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。
第三种是比较玄学的一种利用,简单提一下:
sudo有这样一种行为,大致就是会在我们的工作目录下创建一些属于root用户的目录。每个这样的目录下都有且仅有一个文件:Sudo's timestamp file。 如果我们尝试将def_timestampdir覆盖为一个不存在的目录。然后我们可以与sudo的ts_mkdirs()竞争,创建一个指向任意文件的符号链接。并且尝试打开这个文件,向其中写入一个struct timestamp_entry。我们可以符号链接将其指向/etc/passwd,然后以root打开他,然后实现任意用户的注入从而root。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!