-
-
[原创]CVE-2021-4034提权(一)进程凭证与文件权限
-
发表于: 2022-2-19 01:14 11180
-
大家好,我是东北码农。今天和大家分享linux下的SUID提权。
本文会按照下面主题进行分享:
- 什么是提权
- 什么是SUID提权
- 用户、进程凭证、文件权限
下一篇文章会分享:
- CVE-2021-4034 漏洞讲解
- CVE-2021-4034 利用实战
这个漏洞发现还不到3个月,应该还可以用奥。
0x1 什么是提权
最近研究了一下CVE-2021-4034,利用polkit在linux上提权得漏洞。提权就是一个非root用户,不知道root密码,利用漏洞获得root权限的过程。
看一下CVE-2021-4034利用程序的效果:
1 2 3 4 5 6 7 8 9 10 | xjp@xxx:~ / test / CVE - 2021 - 4034 $ whoami xjp xjp@xxx:~ / test / CVE - 2021 - 4034 $ . / cve - 2021 - 4034 ruid = 1000 ,euid = 0 ,suid = 0 ruid = 0 ,euid = 0 ,suid = 0 r1 = 0 ,r2 = 0 # whoami root |
提权成功。变为root了。wsl2 亲测可用。
0x2 SUID提权
网上对CVE-2021-4034介绍的文章大多是介绍polkit的代码有什么漏洞,怎么精心构造参数可以加载任意so。但是都没有介绍为啥加载个so可以提权,后来才知道此类漏洞叫SUID提权。
<font color=blue size=3>
SUID提权,本质就是利用具有Set-UID的程序,精心构造参数,使其加载任意so,或执行任意程序,就可以达到提权目的。
</font>
理解SUID提权,需要了解linux的用户管理、进程凭证、文件权限的知识。这部分知识我学习时主要参考了《Linux/UNIX系统编程手册》这本书,这本书号称是超越了《APUE》的经典书籍,全面的讲解了linux api和系统调用,可以作为工具书用的时候翻看。
0x3 基础:用户、进程凭证、文件权限
0x31用户与UID
我们登录linux输入的账号就是用户,UID(user id)与用户一一对应。用户名和UID的对应记录在/etc/passwd文件中,打开看一下:
1 2 3 4 5 | xjp@xxx:~ / test$ cat / etc / passwd root:x: 0 : 0 :root: / root: / bin / bash ... xjp:x: 1000 : 1000 :,,,: / home / xjp: / bin / bash xxx: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。
有一种情况例外<font color=blue size=3>如果进程的程序文件具有SUID权限(set-user-id)时,进程的有效UID为文件属主的UID。</font>
0x33文件权限
文件属主
文件都是进程创建出来的.文件的属主,等于创建文件进程的有效UID。
例如root用户用vim创建了一个文件,这个文件的属主就是root。root用户用gcc编译了一个程序,这个程序的属主也是root。
ll命令可以查看文件的属性,第三列root就是属主信息,代表passwd这个程序属主是root用户。
1 2 | xjp@xxx:~ / $ ll / usr / bin / passwd - rwsr - xr - x 1 root root 68208 Jul 15 2021 / usr / bin / passwd * |
SUID权限
文件常规的权限包括可读、可写、可执行。这里介绍一个特殊的:SUID(set-user-id)权限。
<font color=blue size=3>
set-user-ID 程序会将进程的有效用户 ID 置为可执行文件的用户 ID(属主),从而获得常规情况下并不具有的权限。
</font >
例如passwd是linux上修改密码的指令,passwd程序的属主刚刚看过是root,并且具有SUID权限(第一列中-rwsr的s代表SUID权限)。所以任意用户执行passwd程序,passwd进程的有效UID都是0(root)。
0x04 一些思考
SUID权限有什么用?
还以passwd举例,所有用户的信息都保存在/etc/passwd文件中,这个文件只有root用户可以修改。那如果每次修改密码都需要通知管理员,岂不是很麻烦?
1 2 3 | xjp@xxx:~$ ll / etc / passwd - rw - r - - r - - 1 root root 1668 Feb 13 13 : 56 / etc / passwd xjp@xxx:~$ |
所以产生了SUID权限的程序,无论哪个用户执行,进程的有效UID都和程序的属主一样,也就是root权限,这样就解决了临时需要一下高级权限的问题。
SUID权限会不会带来安全问题?
会~
这些SUID设计初衷是会做好安全校验,只做该做的事。但是难免写出问题,执行了不该执行的程序,加载了不该加载的so。这些就是所谓的SUID提权。
到这里,所有铺垫都准备好了,下一篇文章分享CVE-2021-4034,从理论到实践。
谢谢大家,我是东北码农,全网同名,欢迎大家用常用聊天软件关注、转发、分享、点击再看~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]gcc xxx.cpp究竟经历了什么? 6682
- [原创]mutex实现与性能 16274
- [原创]SUID提权:CVE-2021-4034漏洞全解析 9030
- [原创]原理+代码实战:SUID提权渗透 7603
- [原创]CVE-2021-4034提权(一)进程凭证与文件权限 11181