大家好,我是东北码农。今天和大家分享linux下的SUID提权。本文会按照下面主题进行分享:
- 什么是提权
- 什么是SUID提权
- 用户、进程凭证、文件权限
下一篇文章会分享:
- CVE-2021-4034 漏洞讲解
- CVE-2021-4034 利用实战这个漏洞发现还不到3个月,应该还可以用奥。
0x1 什么是提权
最近研究了一下CVE-2021-4034,利用polkit在linux上提权得漏洞。提权就是一个非root用户,不知道root密码,利用漏洞获得root权限的过程。
看一下CVE-2021-4034利用程序的效果:
xjp@xxx:~/test/CVE-2021-4034$ whoamixjpxjp@xxx:~/test/CVE-2021-4034$ ./cve-2021-4034ruid=1000,euid=0,suid=0ruid=0,euid=0,suid=0r1=0,r2=0# whoamiroot
提权成功。变为root了。wsl2 亲测可用。
0x2 SUID提权
网上对CVE-2021-4034介绍的文章大多是介绍polkit的代码有什么漏洞,怎么精心构造参数可以加载任意so。但是都没有介绍为啥加载个so可以提权,后来才知道此类漏洞叫SUID提权。
SUID提权,本质就是利用具有Set-UID的程序,精心构造参数,使其加载任意so,或执行任意程序,就可以达到提权目的。
理解SUID提权,需要了解linux的用户管理、进程凭证、文件权限的知识。这部分知识我学习时主要参考了《Linux/UNIX系统编程手册》这本书,这本书号称是超越了《APUE》的经典书籍,全面的讲解了linux api和系统调用,可以作为工具书用的时候翻看。
0x3 基础:用户、进程凭证、文件权限
0x31用户与UID
我们登录linux输入的账号就是用户,UID(user id)与用户一一对应。用户名和UID的对应记录在/etc/passwd文件中,打开看一下:
xjp@xxx:~/test$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bash...xjp:x:1000:1000:,,,:/home/xjp:/bin/bashxxx:x:1001:1002::/home/xxx:/bin/sh
每一行是一个用户信息,第1列是用户名,第3列是UID。可以看出root的UID是0。
0x32进程凭证
进程运行时,它的实际UID和有效UID被称作为进程凭证。
先来区分两个概念:
- 程序:静态的,在文件系统里的文件。
- 进程:动态的,程序被用户执行,在内存中的。
程序被用户执行变成进程。
实际UID进程的实际UID,就是执行程序的用户的UID。例如root用户的UID为0,则root账号启动的任何进程的UID都为0。
有效UID进程的有效UID,决定进程执行各种操作时,是否有权限。有效用户 ID 为 0(root 的用户 ID)的进程拥有超级用户的所有权限。这样的进程又称为特权级进程(privileged process)。而某些系统调用只能由特权级进程执行。
默认情况下,进程的有效UID等于进程的实际UID。也就是说哪个用户执行进程,进程的有效UID就是哪个用户的UID。
有一种情况例外如果进程的程序文件具有SUID权限(set-user-id)时,进程的有效UID为文件属主的UID。
0x33文件权限
文件属主文件都是进程创建出来的.文件的属主,等于创建文件进程的有效UID。
例如root用户用vim创建了一个文件,这个文件的属主就是root。root用户用gcc编译了一个程序,这个程序的属主也是root。
ll命令可以查看文件的属性,第三列root就是属主信息,代表passwd这个程序属主是root用户。
xjp@xxx:~/$ ll /usr/bin/passwd-rwsr-xr-x 1 root root 68208 Jul 15 2021 /usr/bin/passwd*
SUID权限文件常规的权限包括可读、可写、可执行。这里介绍一个特殊的:SUID(set-user-id)权限。set-user-ID 程序会将进程的有效用户 ID 置为可执行文件的用户 ID(属主),从而获得常规情况下并不具有的权限。例如passwd是linux上修改密码的指令,passwd程序的属主刚刚看过是root,并且具有SUID权限(第一列中-rwsr的s代表SUID权限)。所以任意用户执行passwd程序,passwd进程的有效UID都是0(root)。
0x04 一些思考
SUID权限有什么用?还以passwd举例,所有用户的信息都保存在/etc/passwd文件中,这个文件只有root用户可以修改。那如果每次修改密码都需要通知管理员,岂不是很麻烦?
xjp@xxx:~$ ll /etc/passwd-rw-r--r-- 1 root root 1668 Feb 13 13:56 /etc/passwdxjp@xxx:~$
所以产生了SUID权限的程序,无论哪个用户执行,进程的有效UID都和程序的属主一样,也就是root权限,这样就解决了临时需要一下高级权限的问题。
SUID权限会不会带来安全问题?会~这些SUID设计初衷是会做好安全校验,只做该做的事。但是难免写出问题,执行了不该执行的程序,加载了不该加载的so。这些就是所谓的SUID提权。
到这里,所有铺垫都准备好了,下一篇文章分享CVE-2021-4034,从理论到实践。
谢谢大家,欢迎大家关注、转发、分享、点击再看~