PPPwn 完整指南:PS4 7.00–11.00 固件的 PPPoE RCE 实操教程
【免费下载链接】PPPwnPPPwn - PlayStation 4 PPPoE RCE项目地址: https://gitcode.com/GitHub_Trending/pp/PPPwn
PPPwn 是针对 PlayStation 4 内核 PPPoE 协议栈漏洞(CVE-2006-4304)的远程代码执行工具,适用于固件 7.00 至 11.00 的主机;操作完成后不写入固件,重启系统即恢复原状。先给出本次实操的摘要,再按「原理 → 检查 → 实施 → 排错 → 参数附录 → 边界」的顺序展开。
- 能做什么:在以太网上伪造 PPPoE 协商报文,使 PS4 内核执行攻击者提供的载荷;默认
stage2.bin仅在主机屏幕打印PPPwned(概念验证,proof-of-concept),不会自动运行自制软件。 - 适用版本:固件 7.00/7.01/7.02、7.50/7.51/7.55、8.00/8.01/8.03、8.50/8.52、9.00、9.03/9.04、9.50/9.51/9.60、10.00/10.01、10.50/10.70/10.71、11.00,取值见文末附录。
- 预计耗时:拉取代码、安装依赖、编译两个载荷合计约 10 分钟;单次触发从按键到出结果在数秒内。
- 风险等级:中低。不修改任何系统文件,但注入过程中 PS4 可能短暂崩溃,失败后必须按「验证与排错」一节的规则等待重试。
- 结束后状态:屏幕先出现
Cannot connect to network,随后显示PPPwned(两者顺序可能相反);重启后一切复原。
原理速览:从 PPPoE 握手到内核执行的四段流水线
PS4 内核的 PPPoE 实现在处理 LCP/IPCP 配置报文时存在缓冲区溢出——CVE-2006-4304 最早披露于 FreeBSD 网络栈,该实现一直保留到 PS4 11.00。pppwn.py基于 scapy 在以太网上直接构造 PPPoE 会话,把 PS4 当作对端接入设备。整个注入分四段完成,与示例日志中的 STAGE 编号一一对应:
- STAGE 0 初始化:完成 PPPoE 发现(PADI/PADO/PADR/PADS)与 LCP/IPCP 协商,取得
pppoe_softc结构体地址和对端 MAC,并做堆布局准备(日志中的Heap grooming)。 - STAGE 1 内存破坏:把注入进程钉在 CPU 0(
Pinning to CPU 0)后发送恶意 LCP configure request,触发溢出,再扫描定位被污染的内存对象。 - STAGE 2 绕过 KASLR:读取
pppoe_softc_list等内核符号地址,算出kaslr_offset,得到未随机化的内核基址。 - STAGE 3/4 代码执行:发送 LCP terminate 后重建 PPPoE 会话,触发已注入的代码,最后把编译好的
stage2.bin作为任意载荷发送执行。
各固件版本的内核符号地址预置在stage1/offsets.h和 offsets.py 中,这是编译必须传FW参数的原因:载荷按固件版本生成,版本不匹配时地址全部失效。项目各部分分工如下:
pppwn.py:主控制脚本,负责报文构造与会话时序;stage1/:第一阶段载荷,负责内存破坏与 KASLR 绕过,编译产物为stage1/stage1.bin;stage2/:第二阶段载荷,负责任意代码执行,默认只打印PPPwned,编译产物为stage2/stage2.bin;freebsd-headers/:编译时引用的 BSD 内核头文件。
实施前检查:硬件、系统与载荷编译
硬件与系统要求(对照 README 的 Requirements 一节):
- 一台带以太网口的电脑,USB 转以太网适配器也可用;Wi-Fi 不可用,整个流程依赖网线直连。
- 一根网线,连接电脑与 PS4。
- Linux 环境:物理机,或把网络适配器设为 Bridged Adapter(桥接)的虚拟机,例如 VirtualBox 方案。
- 已安装 Python3 与 gcc(Makefile 还依赖
objcopy,通常随 build-essential 一并提供)。 - PS4 固件在支持列表内,可在「设置 → 系统」中查看版本号。
获取代码并安装依赖,作用:拉取完整仓库(含freebsd-headers子模块)并安装唯一的 Python 依赖 scapy;通过信号:第二条命令无报错返回。
git clone --recursive https://gitcode.com/GitHub_Trending/pp/PPPwn cd PPPwn sudo pip install -r requirements.txt编译两个载荷,作用:FW决定编译时选用的内核符号地址;通过信号:分别生成stage1/stage1.bin与stage2/stage2.bin。以 11.00 固件为例:
make -C stage1 FW=1100 clean && make -C stage1 FW=1100 make -C stage2 FW=1100 clean && make -C stage2 FW=1100其他固件把1100换成附录中的对应取值,例如 9.00 固件用FW=900。若目标固件不在offsets.h覆盖范围内,编译会因缺少地址而失败,不要自行猜测地址补齐。
注:Apple Silicon(M 系列)Mac 无法直接编译,仓库提供./build-macarm.sh脚本在 Docker 中构建 amd64 二进制,例如./build-macarm.sh 900生成 9.00 固件对应的 bin 文件,再把结果拷回 Linux 环境使用。
分步实施:PS4 网络配置与同步触发
第 1 步:配置 PS4 的 PPPoE 连接
按以下顺序操作,通过信号:连接设置保存成功,「测试互联网连接」选项可点击。
- PS4「设置」→「网络」。
- 「设定互联网连接」→「使用 LAN 连接线」。
- 选择「自定义」。
- IP 地址设置选「PPPoE」。
- PPPoE 用户 ID 与密码任意填写,内容无意义,攻击端不校验。
- DNS 设置与 MTU 设置都选「自动」。
- 代理服务器选「不使用」。
第 2 步:在电脑上准备注入命令
先用ifconfig或ip link确认直连 PS4 的物理接口名,再把命令输入提示符但不执行,通过信号:光标停在命令末尾,终端尚未开始输出。
sudo python3 pppwn.py --interface=enp0s3 --fw=1100--interface必须填直连 PS4 的接口;--fw与编译参数保持一致。脚本启动后打印Waiting for PADI...,表示已进入监听状态,等待 PS4 发出的 PPPoE 发现报文。
第 3 步:同步触发
这是唯一有实时性要求的环节。PS4 端停在「测试互联网连接」界面,手指放在手柄 X 键上;电脑端命令已就绪。PS4 发起测试的一瞬间,同时按下手柄 X 键与电脑回车键。原因很直接:PADI 报文只在 PS4 发起测试的极短窗口内出现,脚本必须在那之前进入监听,差一拍 PADI 就会被系统丢弃,本次注入作废。
通过信号:终端依次打印 STAGE 0 至 STAGE 4 的日志,最后出现Done!。
第 4 步:确认主机端结果
成功时 PS4 屏幕先显示Cannot connect to network,数秒后出现PPPwned(两者顺序可能相反);失败时主机长时间停在连接界面或直接崩溃。两种情况都进入下一节处理。
验证与排错:连接失败、卡 PADI 与重试规则
⚠️ 重试前必须遵守一条硬规则:每次重试前,都要等 PS4 显示Cannot connect to network: (NW-31274-7)提示后,再发起下一次注入。上一轮的内核pppoe_softc对象未清理时重复注入,地址扫描会读到脏数据。
快速重试通道:一次注入失败或 PS4 崩溃后,不必重走网络设置——终止电脑上的pppwn.py,重新运行命令,然后在 PS4 主界面直接点击「测试互联网连接」,两端仍然同时操作。
按症状排查:
- 终端一直停在
Waiting for PADI...:接口名填错、PS4 未真正发起 PPPoE 测试,或本机防火墙拦截。核对--interface与ifconfig输出,必要时临时关闭防火墙。 - PS4 报「无法获取 IP 地址」或停留在设置界面:PPPoE 参数未按第 1 步配置,重新确认 IP 设置是否为 PPPoE、用户名和密码非空。
- 编译阶段报错:确认
FW取值在附录范围内;M 系列 Mac 上改用./build-macarm.sh或 Docker 构建。 - 日志在 STAGE 1 的
Scanning for corrupted object之后卡住:溢出未命中,通常是固件版本与FW参数不匹配,重新核对版本、重新编译后再试。
排除环境因素的顺序:重启 PS4 与电脑 → 清理两个载荷目录下的中间产物重新编译(make -C stage1 clean同理适用于stage2)→ 更换网线。
固件参数对照(附录)
编译参数FW与运行参数--fw的取值必须一致,且都要对应 PS4 的实际固件。offsets.h中每个小版本都有独立分支,下表给出各组的常用代表值:
| 对应固件 | make 参数(FW=) | 脚本参数(--fw=) |
|---|---|---|
| 11.00 | 1100 | 1100 |
| 10.50 / 10.70 / 10.71 | 1050 / 1070 / 1071 | 同左 |
| 10.00 / 10.01 | 1000 | 1000 |
| 9.50 / 9.51 / 9.60 | 950 | 950 |
| 9.03 / 9.04 | 903 | 903 |
| 9.00 | 900 | 900 |
| 8.50 / 8.52 | 850 | 850 |
| 8.00 / 8.01 / 8.03 | 800 | 800 |
| 7.50 / 7.51 / 7.55 | 750 | 750 |
| 7.00 / 7.01 / 7.02 | 700 | 700 |
固件 12.00 及以上不在支持范围内,offsets.h中没有对应分支;上游也接受为更多版本补充偏移量的 PR。
适用边界与合规
- 只是概念验证:默认载荷只打印
PPPwned。要启动 Mira 等自制软件启动器,需要自行改写stage2.c并重新编译stage2.bin,这属于逆向工程工作,不在本文范围。 - 不持久:攻击全部发生在内存中,不写固件、不写磁盘,重启后系统状态复原。
- 环境限制:需要真实以太网口(USB 适配器可),Wi-Fi、手机热点,或中间隔着路由器 NAT 的拓扑都不适用;注入窗口依赖「PS4 发起网络测试」这一动作,无法在主机之外远程触发。
- 可能的故障:注入失败时 PS4 可能崩溃或停在错误提示,按 NW-31274-7 规则等待后重试;项目不提供数据保护机制,重要数据建议先备份。
- 使用边界:仅建议在自己拥有的主机上用于研究目的;在系统状态被改变的会话中登录 PSN 等在线服务,后果由使用者自行承担,并遵守所在地法律法规。
下一步:确认屏幕打印PPPwned后,打开 stage2/stage2.c 阅读默认载荷如何接管执行流,并对照 offsets.py 中你固件版本对应的符号类,梳理把启动器引导逻辑替换进stage2.bin需要改动的位置。
【免费下载链接】PPPwnPPPwn - PlayStation 4 PPPoE RCE项目地址: https://gitcode.com/GitHub_Trending/pp/PPPwn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考