在之前的文章中,讨论了如何通过相应的能力绕过 DAC
权限,以及它们是否设置在不需要的文件(如文本编辑器和程序解释器(如 python))上。
在这篇文章中,将讨论系统管理员级别的能力,如挂载文件、更改系统时间、终止进程和更改文件所有权。
当在根目录中递归地查找具有至少一种能力的二进制文件时,发现 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
)
在本实验中,在搜索具有能力的程序时,发现 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
这次发现python
解释器在有效集和允许集都有cap_kill能力
通常,用户可以终止由同一 uid
创建的进程。但是,如果程序在当前登录用户会话中具有 cap_kill
能力,它可以终止任何进程,包括由另一个用户启动的进程
不能直接升级到 root
用户。但是,如果正在运行诸如 Web
服务或 cron
作业之类的服务,则在被杀死时会自动重新启动。这是将 Web
应用程序部署到生产环境时的典型场景。
在本实验中,可以看到 nginx
服务器正在以 root
权限运行。由于没有正常重启服务器的权限,如果它在杀死后自动重启,将处理新配置。
在这种例子下,可以写入位于 /etc/nginx/nginx.conf
的 nginx
配置文件
在 HTTP 块下的配置文件中添加以下代码。当服务器重新启动时,它会打开一个端口 8080,当向这个端口发出 curl 请求时,它会返回静态内容。这样就可以通过访问http://localhost:8080/<file-name>
来读取文件了。
server {
listen 8080;
location / {
root /root;
autoindex on;
}
}
使用 python
的 os.killpg
函数将 SIGKILL
发送到 nginx
进程组
不出所料,nginx 服务器重新启动,现在端口 8080 也打开了。这意味着现在可以继续读取根目录的内容。
发现标志文件位于 /root/flag
文件中,因此可以通过curl
向 http://localhost:8080/flag
来获取它的内容
在本实验中,发现 python
在允许集和有效集上都具有 cap_chown
能力
当程序在有效集中以 cap_chown
能力运行时,它可以更改系统上任何文件的用户或/和组所有权。当然也可以改变/etc/shadow
,并改变里面的密码。
当前登录用户的用户 ID 和组 ID 为 1000。调用 os.chown
系统调用来将 /etc/shadow
文件的所有权更改为 1000:1000
现在可以使用 OpenSSL
实用程序创建密码(如下所示)。由于现在拥有该文件,可以使用 vim
编辑器打开和更新文件中的密码