Kernel Exploit環境構築

Rona October 17, 2024 #Setup #Kernel Exploit

想定環境

カーネルのビルドとソースコードリーディングの環境整備

GCCを最新にする

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-13 g++-13
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 --slave /usr/bin/g++ g++ /usr/bin/g++-13

提供ファイルのバージョン確認

以下を実行しカーネルのバージョンを特定する

cd /path/to/ctf
strings bzImage | grep -E '[0-9]+\.[0-9]+\.[0-9]+'

Linuxソースのclone

git clone https://github.com/gregkh/linux.git -b linux-6.6.y
cd linux
git fetch --tags origin linux-6.6.y:linux-6.6.y
git checkout v6.6.77

デバッグシンボルをつけてビルド

# 依存パッケージのインストール
sudo apt install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm bear dwarves

- デフォルトでビルドする場合

make alldefconfig && make menuconfig

- configファイルが提供されている場合

cp /path/to/ctf/config .config
make olddefconfig && make menuconfig

以下のコンフィグをオンにする

ビルド(5分くらいかかる)

bear -- make -j$(nproc) bzImage vmlinux

/vmlinuxがデバッグシンボル付きのカーネルイメージで/arch/x86/boot/bzImageがカーネルなのでこれを問題ファイルにコピー

mv vmlinux /path/to/ctf/vmlinux.own
mv bzImage /path/to/ctf/bzImage.own

ソースコードリーディング

- CLionの場合

  1. 初期画面からopenを選択
  2. /compile_commands.jsonを選択
  3. Open as Projectを選択

- VSCodeの場合

https://p3land.smallkirby.com/kernel/prepare を読むといいらしい(VSCodeを使ってないので詳しくはわからない)

ツール類のインストール

lysithea

お好きな場所で

git clone git@github.com:smallkirby/lysithea.git

vermagic

git@github.com:yaxinsn/vermagic.git
cd vermagic
make -j$(nproc)

gef

wget -q https://raw.githubusercontent.com/bata24/gef/dev/install.sh -O- | sudo sh

QEMU

sudo apt install qemu-system qemu-system-common qemu-utils

パスへの追加

bashrcに以下を追加

export PATH="$PATH:/path/to/lysithea"
export PATH="$PATH:/path/to/vermagic"

問題を解く

一般に以下のファイルが提供される

追加でこれらのファイルが提供されていると嬉しい

ディレクトリの初期化

cd /path/to/ctf
lysithea init
lysithea extract

extractディレクトリにrootfsの内容が展開される。まずはデバッグようにルートでシェルを得られるようにする

grep -r 'setsid cttyhack setuidgid ' extracted

を実行し出てきたファイルがCTF用の初期化ファイルである。そのファイルの中身を以下のように書き換える

- setsid cttyhack setuidgid 9999 sh
+ setsid cttyhack setuidgid 0 sh
...
- echo 2 > /proc/sys/kernel/kptr_restrict
+ echo 0 > /proc/sys/kernel/kptr_restrict
...
- echo 1 > /proc/sys/kernel/dmesg_restrict
+ echo 0 >/proc/sys/kernel/dmesg_restrict

KASLRの無効化

run.sh.devを以下のように変更

- -kernel ./bzImage
+ -kernel ./bzImage.own
...
- -append "console=ttyS0 kaslr quiet
+ -append "console=ttyS0 nokaslr verbose
...
+ -s

実行

以下のコマンドがexploitのコンパイルと便利ファイルの追加をした上で、extractedの圧縮を行い、run.sh.devを実行してくれる

lysithea local

ここで、別タブでgdbを起動してアタッチするとカーネルの動きが追える

sudo gdb vmlinux.own

gef> target remote:1234
gef> directory /path/to/linux # ソースコードの表示

image

トラブルシューティング

Invalid module formatというエラーが出た場合

linux/include/linux/vermagic.hを確認して必要なビルドオプションをつけて再度ビルドする

例:

strings [chal].ko | grep -E '[0-9]+\.[0-9]+\.[0-9]+'

を実行して、6.6.58 SMP preempt mod_unloadが出てきたとする

上記のコンフィグを設定してカーネルを再度ビルド

参考文献