appleweiping/asu-cse365
GitHub: appleweiping/asu-cse365
该项目在本地 WSL2 环境中完整复现了 ASU CSE365 网络安全入门课程的七个实验模块,涵盖从 SUID 滥用到 Web 漏洞利用的进攻性安全基础技术,每个模块均附带可运行的 solver 脚本和真实输出验证。
Stars: 0 | Forks: 0
# ASU CSE365 — 网络安全简介(本地实验室)
-brightgreen)


## 教学范围(请先阅读)
本仓库是用于公立大学安全课程的**授权自学课程作业**。这里的每个练习都是**独立的本地复现**,由我在自己的 WSL2 沙箱中完全构建并运行,仅针对我自己的故意存在漏洞的靶机以及我植入的“flag”文件。这里没有任何针对真实、第三方或远程系统的内容;没有恶意软件,没有 C2,没有 DoS,也没有检测规避工具。内存错误模块中不安全的编译选项和禁用的 ASLR **仅在抛弃型实验沙箱中应用**,用于教授经典的内存安全概念。请将其用于学习。
## 概述
CSE365 以一系列 CTF 风格的模块来教授进攻性安全的基础知识。本仓库通过小型、真实、可在本地运行的实验室复现了模块主题——SUID 提权、脚本化的程序交互、手写的 x86-64 汇编、gdb 驱动的调试、二进制逆向工程、32位栈溢出以及存在漏洞的 Web 应用程序——每一个都带有可工作的 exploit/solver,并通过将真实输出捕获到 [`results/`](results/) 中进行了验证。
## 模块与结果(在 WSL2 Ubuntu 24.04, x86-64, 仅 CPU 环境下测量)
| # | 模块 | 本地复现 | 验证结果 |
|---|--------|--------------------|-----------------|
| 01 | 程序误用 | 仅限 root 的 flag + 6 个 SUID-root coreutils | 直接读取**被拒绝**;用户 `hacker` 通过所有 **6** 个 SUID 工具成功读取 flag |
| 02 | 程序交互 | token 握手 + 50 个限时问题,pwntools solver | **50/50** 问题已解答,flag 已恢复 |
| 03 | 汇编编写 | 6 个手写的 NASM 程序 + RWX 运行器 | **8/8** 检查通过;`execve("/bin/sh")` shellcode 成功启动真实 shell (`uid=0`) |
| 04 | 调试 | 运行时 keyed crackme,两种 gdb 解决方案 | 从实时内存中恢复了密钥 `JZL:=<`,**并**在运行时修补了比较逻辑;两种方式均成功捕获 flag |
| 05 | 二进制逆向工程 | 从 ELF 中逆向出密钥检查 | 从 `.rodata` 中恢复了 11 字节密钥 + 反向转换;二进制程序已解锁 |
| 06 | 内存错误 | 32位 `ret2win` → shell | saved-EIP 偏移量 **76** (cyclic/core dump),`ret2win`@`0x80491f6`,通过启动的 shell 获取 flag + `id` |
| 07 | Web 安全 | 存在漏洞的 Flask 应用,4 个 bug 类别 | **6/6** exploit:命令注入、SQLi 绕过 + UNION exfil、SSTI RCE、反射型 XSS |
**最近一次完整运行:`7/7` 模块全部通过** — 见 [`results/SUMMARY.txt`](results/SUMMARY.txt)
以及 [`results/`](results/) 中的各模块日志。Flag 在每次运行时都是随机生成的,因此每份日志显示的都是最新捕获的 `pwn.college{local_...}` 值。
## 已实现模块
- [x] **01 · 程序误用** — GTFOBins 风格的 SUID 误用 (`cat`, `sed`, `awk`, `tail`, `cut`, `find`)。
- [x] **02 · 程序交互** — pwntools `recvuntil`/正则表达式/`sendline` 自动化。
- [x] **03 · 汇编编写** — const/sum/max/memsum/popcount + `execve("/bin/sh")` shellcode。
- [x] **04 · 调试** — gdb 从内存中恢复密钥 + 运行时比较逻辑修补。
- [x] **05 · 二进制逆向工程** — 逆向 `(k^0x5A)+i`,从 `.rodata` 读取 `target[]`。
- [x] **06 · 内存错误** — 循环偏移栈溢出,`ret2win`,驱动已启动的 shell。
- [x] **07 · Web 安全** — 命令注入,SQLi(绕过 + UNION exfil),Jinja2 SSTI RCE,反射型 XSS。
## 项目结构
```
asu-cse365/
├── run_all.sh # copies repo to an ext4 workdir, runs every module, writes results/
├── 01-program-misuse/ # setup.sh + solve.sh + run.sh
├── 02-program-interaction/ # interaction_challenge.c + solve.py
├── 03-assembly-crafting/ # sol_*.asm + runner.c + shellcode_runner.c + run.py
├── 04-debugging/ # license.c + solve_recover.gdb + solve_patch.gdb
├── 05-binary-reverse-engineering/ # crackme.c + solve.py
├── 06-memory-errors/ # vuln.c + solve.py
├── 07-web/ # app.py + solve.py
└── results/ # REAL captured output (committed as evidence)
```
## 如何运行
要求使用安装了 `gcc` (+ `gcc-multilib`)、`nasm`、`gdb` 的 WSL2 Ubuntu,以及一个包含 `pwntools`、`flask`、`requests` 的 Python venv。该 venv 不保存在 `C:` 盘上:
```
# 一次性 toolchain
sudo apt-get install -y build-essential gcc-multilib nasm gdb python3-venv
python3 -m venv /mnt/d/Project/security/.venv-cse365
/mnt/d/Project/security/.venv-cse365/bin/pip install -r requirements.txt
# 运行所有内容(以 root 身份,用于 SUID + ASLR 切换),捕获 results/
wsl -d Ubuntu -e bash -lc 'bash /mnt/d/Project/security/asu-cse365/run_all.sh'
# 或单个 module
bash 03-assembly-crafting/run.sh
```
## 验证
每个模块都会将其真实的终端输出写入 `results/.txt`,并且 `results/SUMMARY.txt` 会记录每个模块的 PASS/FAIL 状态。每个 solver 都会对捕获的 flag / 预期值进行断言,因此绿色的运行结果是真实的(而不是打印出来的虚假声明)。重新运行会重新生成全新的随机 flag 并重新推导它们。
## 部分 / 仅限托管平台
**带有评分的 pwn.college dojo**(按用户分配的挑战二进制文件以及真实的服务器端 `/flag`)无法离线镜像——这部分属于已记录在案的不完整部分。本仓库针对本地类似环境复现了每个模块的*技术原理*,并进行了端到端的验证;它没有也无法向托管记分板提交 flag。要获得 dojo 积分,请在 [pwn.college](https://pwn.college/) 上运行相同的技术。
## 技术栈
C (gcc, 32位和64位), x86-64 汇编 (NASM), Python 3
([pwntools](https://github.com/Gallopsled/pwntools), Flask, requests), gdb,
objdump, 运行于 WSL2 Ubuntu。
## 核心思想 / 我学到了什么
- SUID 二进制文件以文件所有者的有效 UID 运行——单个被误用的实用程序就相当于一次完全的权限提升。
- 为程序 I/O 编写脚本(解析后响应的循环)在任何限时挑战-响应中都能击败人类。
- 手动编写 shellcode:SysV 调用约定,以及如何在 RWX 页面中通过原始字节实现 `execve("/bin/sh")`。
- 调试器是一种 exploit 基础手段:从实时内存中读取机密信息,或者重写内存/寄存器以改变控制流。
- 逆向检查程序意味着反向推导其算法,并直接从二进制文件的 `.rodata` 中提取常量。
- 栈溢出:使用循环模式(cyclic pattern)找到保存的返回地址偏移量,将其覆盖,并跳转到代码执行(`ret2win` → shell)。
- Web 安全的“四大金刚”:OS 命令注入、SQL 注入、模板注入(SSTI)以及反射型 XSS——所有这些的根源都在于未经处理的输入跨越了解释器边界。
## 致谢与许可
基于 Yan Shoshitaishvili、Connor Nelson 以及 pwn.college 团队编写的 **pwn.college / ASU CSE365 – 网络安全简介** 模块主题。
本仓库是对针对自行编写的本地目标所进行的*技术*的独立教育性复现;所有课程材料和托管 dojo 均归其原作者所有。此处的原创代码基于 [MIT License](LICENSE) 发布。
标签:Pwntools, Web报告查看器, 云资产清单, 快速连接, 搜索语句(dork), 汇编语言, 网络安全教育, 逆向工程