Linux提权系列20: [训练营]利用linux能力漏洞3
2023-4-14 08:2:39 Author: 奶牛安全(查看原文) 阅读量:17 收藏

在之前的文章中,讨论了如何通过相应的能力绕过 DAC 权限,以及它们是否设置在不需要的文件(如文本编辑器和程序解释器(如 python))上。

在这篇文章中,将讨论系统管理员级别的能力,如挂载文件、更改系统时间、终止进程和更改文件所有权。

CAP_SYS_ADMIN

当在根目录中递归地查找具有至少一种能力的二进制文件时,发现 python2.7 在有效和允许的集合中都设置了 cap_sys_admin 能力

当程序以 cap_sys_admin 能力运行时,它可以执行所有与系统管理相关的任务,如安装文件系统等。该能力因操作而过载。可以查看它的手册页

所以在这种情况下,由于不能直接更新 /etc/passwd 文件中的密码,但是可以执行绑定挂载。将 /etc/passwd 文件复制到当前工作目录 (/home/student) 并更改 root 用户密码。

可以从 OpenSSL 程序生成新密码,如下所示

exploit.py:

from ctypes import *
libc = CDLL("libc.so.6")
libc.mount.argtypes = (c_char_p, c_char_p, c_char_p, c_ulong, c_char_p)
MS_BIND = 4096  # defined in /usr/include/sys/mount.h:55
source = b"/home/student/passwd"
target = b"/etc/passwd"
filesystemtype = b"none"
options = b"rw"
mountflags = MS_BIND
libc.mount(source, target, filesystemtype, mountflags, options)

运行漏洞利用代码并检查 /etc/passwd 文件的第一行,它已经由 /home/student/passwd 中创建的密码更新了

使用 su -l root登录root并进入其主目录(即 /root

CAP_SYS_TIME

在本实验中,在搜索具有能力的程序时,发现 date 二进制文件具有 cap_sys_time 能力

通常,如果程序以普通用户身份运行并尝试更改日期,该能力将失败并显示“Operation not permitted”消息

$ date +%T -s "00:00:30"
date: cannot set date: Operation not permitted
00:00:30

但是,如果程序有 cap_sys_time,它可以更改系统日期(硬件时钟)

不能使用此能力直接升级到特权。如果有任何错误配置的cron正在运行,可以修改脚本内容并更改日期和时间以立即执行

发现每天 23:00 有一个 cron 任务在运行。这会执行来自 /tmp/archive-log.sh 的脚本

幸运的是 /tmp/ 目录中没有文件。因此,在/tmp/下创建同名恶意文件对 /bin/bash 程序上设置 SUID 位。

当前时间是 00:08:41,crontab 将在 23:00:00 执行。没有人会有那么大的耐心。由于日期二进制可以更改系统时间。设法将它更改为 22:59:59,这是时间脚本执行前 1 秒

看到 /tmp/done 文件后,这意味着脚本已成功执行,可以继续使用 bash -p 命令获取特权 shell

CAP_KILL

这次发现python解释器在有效集和允许集都有cap_kill能力

通常,用户可以终止由同一 uid 创建的进程。但是,如果程序在当前登录用户会话中具有 cap_kill 能力,它可以终止任何进程,包括由另一个用户启动的进程

不能直接升级到 root 用户。但是,如果正在运行诸如 Web 服务或 cron 作业之类的服务,则在被杀死时会自动重新启动。这是将 Web 应用程序部署到生产环境时的典型场景。

在本实验中,可以看到 nginx 服务器正在以 root 权限运行。由于没有正常重启服务器的权限,如果它在杀死后自动重启,将处理新配置。

在这种例子下,可以写入位于 /etc/nginx/nginx.confnginx 配置文件

在 HTTP 块下的配置文件中添加以下代码。当服务器重新启动时,它会打开一个端口 8080,当向这个端口发出 curl 请求时,它会返回静态内容。这样就可以通过访问http://localhost:8080/<file-name>来读取文件了。

server {
  listen 8080;
  location / {
    root /root;
    autoindex on;
  }
}

使用 pythonos.killpg 函数将 SIGKILL 发送到 nginx 进程组

不出所料,nginx 服务器重新启动,现在端口 8080 也打开了。这意味着现在可以继续读取根目录的内容。

发现标志文件位于 /root/flag 文件中,因此可以通过curlhttp://localhost:8080/flag 来获取它的内容

CAP_CHOWN

在本实验中,发现 python 在允许集和有效集上都具有 cap_chown 能力

当程序在有效集中以 cap_chown 能力运行时,它可以更改系统上任何文件的用户或/和组所有权。当然也可以改变/etc/shadow,并改变里面的密码。

当前登录用户的用户 ID 和组 ID 为 1000。调用 os.chown 系统调用来将 /etc/shadow 文件的所有权更改为 1000:1000

现在可以使用 OpenSSL 实用程序创建密码(如下所示)。由于现在拥有该文件,可以使用 vim 编辑器打开和更新文件中的密码


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