SUID提权(一)

大家好,我是东北码农。今天和大家分享linux下的SUID提权。
本文会按照下面主题进行分享:

  • 什么是提权
  • 什么是SUID提权
  • 用户、进程凭证、文件权限

下一篇文章会分享:

  • CVE-2021-4034 漏洞讲解
  • CVE-2021-4034 利用实战
    这个漏洞发现还不到3个月,应该还可以用奥。

0x1 什么是提权

最近研究了一下CVE-2021-4034,利用polkit在linux上提权得漏洞。提权就是一个非root用户,不知道root密码,利用漏洞获得root权限的过程。

看一下CVE-2021-4034利用程序的效果:

***@xxx:~/test/CVE-2021-4034$ whoami
***

***@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提权。

SUID提权,本质就是利用具有Set-UID的程序,精心构造参数,使其加载任意so,或执行任意程序,就可以达到提权目的。

理解SUID提权,需要了解linux的用户管理、进程凭证、文件权限的知识。这部分知识我学习时主要参考了《Linux/UNIX系统编程手册》这本书,这本书号称是超越了《APUE》的经典书籍,全面的讲解了linux api和系统调用,可以作为工具书用的时候翻看。


0x3 基础:用户、进程凭证、文件权限

0x31用户与UID

我们登录linux输入的账号就是用户,UID(user id)与用户一一对应。用户名和UID的对应记录在/etc/passwd文件中,打开看一下:

***@xxx:~/test$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
***:x:1000:1000:,,,:/home/***:/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

有一种情况例外如果进程的程序文件具有SUID权限(set-user-id)时,进程的有效UID为文件属主的UID。

0x33文件权限

文件属主
文件都是进程创建出来的.文件的属主,等于创建文件进程的有效UID。

例如root用户用vim创建了一个文件,这个文件的属主就是root。root用户用gcc编译了一个程序,这个程序的属主也是root。

ll命令可以查看文件的属性,第三列root就是属主信息,代表passwd这个程序属主是root用户。

***@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用户可以修改。那如果每次修改密码都需要通知管理员,岂不是很麻烦?

***@xxx:~$ ll /etc/passwd
-rw-r--r-- 1 root root 1668 Feb 13 13:56 /etc/passwd
***@xxx:~$

所以产生了SUID权限的程序,无论哪个用户执行,进程的有效UID都和程序的属主一样,也就是root权限,这样就解决了临时需要一下高级权限的问题。

SUID权限会不会带来安全问题?
会~
这些SUID设计初衷是会做好安全校验,只做该做的事。但是难免写出问题,执行了不该执行的程序,加载了不该加载的so。这些就是所谓的SUID提权。


到这里,所有铺垫都准备好了,下一篇文章分享CVE-2021-4034,从理论到实践。

谢谢大家,欢迎大家关注、转发、分享、点击再看~

posted @ 2022-02-19 01:11  东北码农  阅读(419)  评论(0编辑  收藏  举报