linuxカーネル脆弱性利用プローブ(1):環境構成


主にmuhe師匠を学ぶシリーズのチュートリアルを記録して、その中の穴を記録します.muhe師匠のチュートリアルは32ビットubuntu環境でテストされ、本稿は64ビット環境でテストされ、修正が必要なところが多いので、後者の学習のために本稿を記録します.

環境の説明:


カーネルバージョン2.6.32.1 busyboxバージョン1.19.4 gccバージョン4.7実験環境ubuntu 16.04,64ビット

1.gccの更新


コア2.6.xはgcc 3のみをサポートする.xと4.x.yは、より高いバージョンのgccが古いバージョンのkernelのいくつかの構文フォーマットをサポートしていない可能性があります.gcc低下:
sudo apt-get install -y gcc-4.7
sudo apt-get install -y g++-4.7
#  
cd /usr/bin    # /usr/bin 
sudo rm -r gcc  # 
sudo ln -sf gcc-4.7 gcc # gcc4.7 
sudo rm -r g++  # gcc
sudo ln -sf g++-4.7 g++

インストール依存度:
$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc qemu qemu-system
$ sudo apt-get install bison flex libncurses5-dev

2.ソースのダウンロード


公式サイト:https://mirrors.edge.kernel.org/pub/linux/kernel/国内ミラー(超高速):https://mirrors.tuna.tsinghua.edu.cn/kernel/
#  
$ wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.1.tar.gz -O linux-2.6.32.1.tar.gz
$ tar -xvf linux-2.6.32.1.tar.gz

3.コンパイルプロセス

$ cd linux-2.6.32.1/
$ make menuconfig
$ make
$ make all
$ make modules

問題1:include/linux/compiler-gcc.h:86:30: fatal error: linux/compiler-gcc5.h: No such file or directory include/linux/compiler-gcc.h:86:1: fatal error: linux/compiler-gcc9.h:No such file or directory解決1-1:https://blog.csdn.net/u014525494/article/details/53573298現在のlinuxシステム/usr/srcのcompiler-gcc.hコンパイルするlinuxソースディレクトリにコピーします.$ cp /usr/src/linux-headers-4.4.0-103-generic/include/linux/compiler-gcc.h ./linux-2.6.32.1/include/linux/compiler-gcc5.hはまだ間違っています.解決1-2:理由:コンパイルされたカーネルバージョンは低く、gccバージョンは高い.gccは4.7に低下した.問題ないようです.
問題2:本文で述べた4つの問題に遭遇したのは、古いバージョンのカーネルコードに問題がある可能性があるため、以下のように一つ一つ解決すればよい.(2番目の質問を除く)https://www.anquanke.com/post/id/85837

4.syscallを追加


https://o0xmuhe.github.io/2017/02/08/Adding-your-own-syscall-in-linux-kernel/https://arvindsraj.wordpress.com/2012/10/05/adding-hello-world-system-call-to-linux/(1)syscall tableに情報ファイルarch/x86/kernel/syscall_table_32.Sを追加独自の呼び出しを追加する
.long sys_muhe_test .long sys_hello
(2)syscallを定義するマクロ32ビットファイルarch/x86/include/asm/unistd_32.hに追加
#define __NR_hello 337 #define __NR_muhe_test 338 #ifdef KERNEL #define NR_syscalls 339
NR_に注意Syscallsは既存の呼び出し数に変更します.例えば、0~336の合計337個の呼び出しがあったが、現在2つ増えた場合は339に変更します.
64ビット修正arch/x86/include/asm/unistd_64.h#define __NR_hello 299 __SYSCALL(__NR_hello,sys_hello) #define __NR_muhe_test 300 __SYSCALL(__NR_muhe_test,sys_muhe_test)
(3)関数定義ファイルinclude/linux/syscalls.hの追加
asmlinkage long sys_muhe_test(int arg0); asmlinkage long sys_hello(void);
(4)syscallコードを作成新規ディレクトリカスタムsyscallのコードを配置,./linux-2.6.32.1/muhe_test
# muhe @ ubuntu in ~/linux_kernel/linux-2.6.32.1/linux-2.6.32.1/muhe_test [2:43:06] 
$ cat muhe_test.c
#include 
asmlinkage long sys_muhe_test(int arg0){
     
    printk("I am syscall");
    printk("syscall arg %d",arg0);
    return ((long)arg0);
}
asmlinkage long sys_hello(void){
     
    printk("hello my kernel worldn");
    return 0;
}
# muhe @ ubuntu in ~/linux_kernel/linux-2.6.32.1/linux-2.6.32.1/muhe_test [2:43:12] 
$ cat Makefile
obj-y := muhe_test.o

(5)Makefileの修正
# muhe @ ubuntu in ~/linux_kernel/linux-2.6.32.1/linux-2.6.32.1 [2:44:59] 
$ cat Makefile| grep muhe
ifeq ($(KBUILD_EXTMOD),)
core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/ muhe_test/

!!!注意:この文は必ず元の文「core-y+=kernel/mm/fs/ipc/security/crypto/block/」を修正します.
(6)コンパイル
$ make -j2

5.busyboxコンパイル構成


(1)コンパイルステップピット:make menuconfigの場合は必ず静的コンパイルを選択する.
$ make menuconfig
$ make
$ make install

(2)busybox 1.19バージョンはエラーが発生します.2箇所修正すればいいです.最新の1.31で間違いなく報告しました.(2-1)質問:linux/ext 2_fs.h:そのファイルまたはディレクトリmake menuconfigがない場合Linux System Utilities—>選択空[]mkfs_ext 2および[]mkfs_vfat(2-2)質問:'RLIMIT_FSIZE’ undeclared $ vim include/libbb.h#includeの追加
(3)構成(3-1)シナリオ1
$ cd _install
$ mkdir -pv {
     bin,sbin,etc,proc,sys,usr/{
     bin,sbin}}
$ cat init
#!/bin/sh
echo "INIT SCRIPT"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mkdir /tmp
mount -t tmpfs none /tmp
mdev -s # We need this to find /dev/sda later
echo -e "nBoot took $(cut -d' ' -f1 /proc/uptime) secondsn"
exec /bin/sh
$ chmod +x init
$ find . | cpio -o --format=newc > ../rootfs.cpio
$ qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ../rootfs.cpio

質問:常にエラーが発生します.kernel panic-not syncing no init found.try passing init=option to kernel解決:ctf問題のclioファイルで正常に動作するbusy boxの問題であるはずです.make menuconfigのときに静的コンパイルを選択すればいい(Busybox Settings->Build Options->Build BusyBox as a static binary)です.ここで生成したいファイルは、ホストシステムの共有ディレクトリに依存しないため、生成したいファイルは動的ライブラリファイルではなく静的ライブラリファイルです.http://www.dataguru.cn/thread-475271-1-1.html
(3-2)シナリオ2のディレクトリ構造と以前の差は多くなく、inittabファイルを追加し、最初の行はinit初期化スクリプトを指定し、shellを実行することができる.一般的なctf問題はルートディレクトリの下の「init」を実行し、ネットワークを初期化し、flagを作成し、権限を指定するなどである.
$ cat etc/inittab 
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init

rcSファイルの追加
$ cat etc/init.d/rcS 
#!/bin/sh
#!/bin/sh
mount -t proc none /proc
mount -t sys none /sys
/bin/mount -n -t sysfs none /sys
/bin/mount -t ramfs none /dev
/sbin/mdev -s
$ chmod +x ./etc/init.d/rcS

下devディレクトリの構成
$ mkdir dev
$ sudo mknod dev/ttyAMA0 c 204 64
$ sudo mknod dev/null c 1 3
$ sudo mknod dev/console c 5 1
$ find . | cpio -o --format=newc > ../rootfs2-1.img
$ qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ../rootfs2-1.img -append "root=/dev/ram rdinit=/sbin/init"

6.テストシステム呼び出し

$ cat muhe_test_syscall_lib.c
#include 
#include 
#include 
int main(int argc,char **argv)
{
     
        printf("n Diving to kernel levelnn");
        syscall(300,1337);
        return 0;
}
$ gcc muhe_test_syscall_lib.c -o muhe -static

busyboxリンクライブラリに入っていないので、静的リンクを必要とします.
$ cp muhe_test_syscall_lib/muhe ../busybox-1.19.4/_install/usr/muhe
$ find . | cpio -o --format=newc > ../rootfs_test_syscall.img
$ qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ../rootfs_test_syscall.img -append "root=/dev/ram rdinit=/sbin/init"

エラー:/bin/sh can't access tty job control turned off解決:https://blog.csdn.net/qq_26093511/article/details/53464468加えて、console::askfirst:-/bin/sh(注意:私が前に書いたのはconsole::askfirst:/bin/shで、欠けています-、だから間違っています).ubootの起動パラメータはconsole=ttySAC 0、すなわちシリアルポートコンソールを指定するためである.だから/bin/shの前に-を追加します.

!!!に注意


QEMU画面をマウスで終了:
ctl+alt+マウスクリック
保護メカニズムのクローズ方法:
mmap_min_addr: $ sysctl -w vm.mmap_min_addr="0" kernel cannary: .config , CONFIG_CC_STACKPROTECTOR , 。
コンパイルdriver:
1.自分の書いたdriverコンパイルカーネルをロードするためにmake menuconfig->Enableloadable module support->Forced module loading Source checksum for all modules$make 2を閉じる.driverコンパイル時のMakefileネイティブコンパイル時指向/usr/src/linux-headers-4.4.0-103-generic qemuテスト時指向ダウンロードしたkernelソースディレクトリ、~/desktop/kernel/linux-2.6.32.1/

参照先:


https://www.anquanke.com/post/id/85837 https://www.anquanke.com/post/id/85840 https://www.anquanke.com/post/id/85848