bypass_disable_function
里面出现,以前php的bypass就是通过设置环境变量LD_PRELOAD
来加载恶意的动态链接库执行我们想要执行的恶意代码,可以通过动态链接库重写函数也可以通过__attribute__
这个特殊的函数直接执行恶意代码,在程序员的自我修养里面也提到过。LD_PRELOAD
这个环境变量存放的动态链接库是预加载的,那suid文件运行是设置这个环境变量不就行了,但是事实是glibc有验证,这里就可以看得如果是setuid(也就是suid文件)就不会加载这个环境变量的动态链接库了,因为这是非常不安全的。https://github.com/blasty/CVE-2021-3156
service_user
的那个pochttps://www.qualys.com/2021/01/26/cve-2021-3156/baron-samedit-heap-based-overflow-sudo.txt
https://bbs.pediy.com/thread-265669.htm
/usr/bin/sudd
,并且设置为root的suid权限(chown root:root /usr/bin/sudd;chmod u+s /usr/bin/sudd)
set_cmnd
的这个函数,不过开始不能执行下断点,得在sudd这个elf文件加载后才行__libc_start_main
打好断点,因为要进入子进程了set_cmnd
并没有加载了,因为这个是在sudoers.so里面的,得等到他加载了这个动态链接库才行
set_cmnd
打好断点了,继续运行了
\\x00
),这个就是\\x00
,当指向这里时from就会先向后移一位(就指到了\x00
),然后to写入\x00
,from又会加一这样就到了005c(\\x00
)后面的那个字符了,这样*from就不为空,就会继续循环,循环后会在最后那里写入空格,这也是为什么poc在创建恶意动态链接库时有个空格
__libc_start_main
断点之前都一样,现在没有一些符号字符串就比较难下断点了,不过通过刚才的流程可以知道,真正起作用的部分是在加载sudoers.so之后的操作,所以我们在_dl_open
下好断点
nss_load_library
继续运行,就可以发现指针指向的service_user
这个结构体的地方已经被我们修改了
service_user
结构体,我们看看这个结构体的定义,可以发现在ubuntu18下面修改的应该是compat的名字,对于的图中的0x55859fd2a3d0地址的值
nss_load_library
函数,发现如果ni->library->lib_handle
如果为空就可以触发__libc_dlopen
,这个就是加载动态链接库的,配合开始的动态链接库知识就知道,只要加载了我们的恶意链接库就成功了ni->library
此时是空,所以会初始化ni->library
,初始化的代码,发现他会先到database->library
里面找,如果存在就直接返回,不存在就会初始化设置(*currentp)->lib_handle = NULL
这样就满足后面的那个ni->library->lib_handle==NULL
了,所以我们修改的名字只要不出现在database->library
里面就可以了shlib_name
就为libnss_X/P0P_SH3LLZ_ .so.2
,这就和poc生成的动态链接库名字一样了