在本文中,介绍另一组在传统上需要在系统中进行 DAC
权限验证的能力。例如,绕过目录的读取和执行权限和文件的只读权限。
在本实验中,当在根目录中递归检查能力时,发现 tar
程序具有 dac_read_search
能力。
当任何程序在有效集中具有 cap_dac_read_search
能力时,这意味着它可以读取目录下任何文件和进行执行权限的操作。该程序无法在目录中创建任何文件或修改现有文件,因为它需要写权限,但这个能力不包括写权限。
因为在这种情况下, tar
具有此权限。虽然不能直接升级权限,但如果幸运的话,在检索/etc/shadow
文件后破解哈希密码。可以通过创建简单tar来包含 /etc/shadow
,然后再将其解压缩。
由于在本实验中,root
用户的哈希值是flag
,所以, 搞掂。
这次在根目录中递归检查能力,发现python3.6
和python3.6m
。区别在https://stackoverflow.com/questions/16675865/difference-between-python3-and-python3m-executables/16677339#16677339
在生成 ls
命令以检查 /root
目录中的文件时,执行失败,因为系统试图启动一个新进程并且它没有 cap_dac_read_search
能力。所以, 不能列出这些文件。
我生成了另一个 I/O
阻塞命令 (cat
) 并从 proc
文件系统检查了它的能力,发现该进程由 python
使用os.system
函数创建,不继承这些能力
因此,使用python
的os.listdir
函数对/root
目录进行枚举动作。在获得文件名,使用python
内置函数open
来打开,再读出第一行。
在这个实验,在根目录递归获取程序文件的能力时, 发现在这种情况下,vim.basic
程序在有效集合中具有 dac_override
能力
当程序具有 cap_dac_override
能力时,它可以绕过系统中任何文件的所有读写和执行检查。可以说是对任何文件的cap_dac_read_search + 写权限
由于本实验安装了 sudo
程序,这意味着可以将以下配置写入 /etc/sudoers
文件并使用 sudo su
升级到 root
用户
student ALL=(ALL:ALL) NOPASSWD: ALL
通过 vim.basic
程序打开 /etc/sudoers
文件,在文件中任意一行添加上面一行,并用 :x!
命令。现在,如果使用 sudo -l
检查当前用户的 sudo
权限,会发现当前用户无需输入密码即可以 root
以用户身份执行任何命令。
现在需要做的就是通过 root
用户登录并读取标志文件。在 Linux
中,可以通过 sudo su -
命令执行此操作
在这个实验,在根目录递归获取程序文件的能力时, 发现在这种情况下,python
程序在有效集合中具有 dac_override
能力
正如在之前的讨论中所演示的,可以在导入 os
模块后使用 os.listdir()
函数列出/root
下的文件,然后以读取模式打开标志文件以获取其内容。
或者,可以更新 /etc/passwd
文件中的密码并通过 su
命令执行登录。由于不能从 python
生成新的文本编辑器进程,因为 python
的能力不会被新进程继承。可以以读取模式打开文件,更新root
用户的内容以并再次保存文件
可以使用下面编写的代码
#!/usr/bin/python2.7import sys
password = sys.argv[1]
contents = []
with open("/etc/passwd") as file:
for line in file:
if line.startswith("root"):
contents.append(line.replace(":x:", ":%s:" % password))
else:
contents.append(line)
pass
with open("/etc/passwd", "w") as file:
file.writelines(contents)
print("done")
现在使用 openssl
工具创建一个密码,并将其作为第一个参数传递给漏洞利用脚本。这将更新 /etc/passwd
中的密码
由于现在修改了密码,可以通过su
命令进行简单登录,输入openssl
命令创建的密码,读取flag
文件
暗号:070257