浅谈用docker搭建一个ctf镜像

什么是宿主机?

宿主机其实是对于子主机来说的父主机

plain 复制代码
"8080:80"
左边是宿主机映射出来的右边docker容器的80端口

Docker-compose

常用的yml模板

yaml 复制代码
version: '2'
services:
  kali:
    user: root
    image:  kali
    command: ["tail", "-f", "/dev/null"]
    networks:
      net1:
        ipv4_address: 172.16.0.10
    privileged: true
    cap_add:
      - NET_RAW

  nginx:
    image: nginx:1.25-alpine
    ports:
    - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    restart: always
    depends_on:
    - tomcat
    networks:
      net1:
        ipv4_address: 172.16.0.101
      net2:
        ipv4_address: 10.20.0.100

  tomcat:
    depends_on:
    - mysql
    build: .
    ports:
    - "8080:8080"
    restart: always
    networks:
      net2:
        ipv4_address: 10.20.0.10
  
  mysql:
    image: vulhub/mysql:5.5.23
    expose:
      - "3306"
    restart: always
    networks:
      net2:
        ipv4_address: 10.20.0.11

networks:
  net1:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.0.0/16
  net2:
    driver: bridge
    ipam:
      config:
        - subnet: 10.20.0.0/16

编写yml参考手册

plain 复制代码
https://yeasy.gitbook.io/docker_practice/compose/compose_file

自动拉取镜像特性

用来docker自动化的命令,需要用YML文件配置启动所有的服务

yaml 复制代码
version: '2'
services:
 mysql:
   image: vulhub/mysql:5.5.23
   ports:
    - "3306:3306"

比如本地不存在 vulhub/mysql:5.5.23镜像

配置好docker-compose.yml文件后,使用下面这个命令则会自动的拉取镜像,同时也会配置好网络的端口

bash 复制代码
docker-compose up -d 

常用的命令

bash 复制代码
docker-compose up -d --build # 重建镜像,并且启动所有服务
docker-compose up -d   # 创建并启动所有服务(常用)
docker-compose build --no-cache  # 禁用缓存重建,比如修改了文件,但是还是没反应

docker-compose build  xxx服务  # 重建服务,镜像也会变。已有的服务不会删掉,增加没有的东西
docker-compose down -v  # 关闭所有服务、顺便删除数据卷
docker-compose down     # 关闭所有服务
docker-compose --version #  查看docker-compose 的版本
docker network prune -f  # 删除未使用的网络(包括自定义网桥)
docker logs 容器id			 # 查看容器的日志

若构建后需保留镜像供多环境使用,优先选择 build --no-cache

若需快速验证代码变更,up -d --build 更高效

Dockerfile

什么是Dockerfile

Dockerfile是一个用来构建镜像的文本文件,文本里面的内容都是构建镜像的指令

常用的指令

bash 复制代码
FROM alpine:latest  #  基于什么镜像
LABEL Author="cike_y" # 标识
LABEL Blog="xxx.com"
SHELL /bin/bash 		# 默认是/bin/sh  指定shell的设置
WORKDIR /app				#	 设置镜像的目录,没有则自动创建
COPY .src/ /app/		#	 复制宿主机的目录内容到镜像里的/app路径中
RUN echo 321 >> flag.txt	# 相当于shell命令
CMD echo "Success"				# 结尾、运行时生效,比如docker run test ,则会运行你要的shell命令,相当于提示。
ENTRYPOINT ["/root/run.sh"] # 和CMD类似,但是都要使用jons格式,就可以拼接CMD

构建镜像使用这个命令

bash 复制代码
docker build -t test .
# -t 指定镜像名字 

# 清理缓存并重新构建(避免旧缓存干扰)
docker build --no-cache -t flag_web .

# 自动清理未使用的缓存
docker system prune -f
# 补充清理构建缓存
docker builder prune -af

制作镜像

docker build

PHP_RCE

弄好下面这些之后使用这个命令制作镜像即可

bash 复制代码
docker build -t php_rce .
# -t 指定要创建的镜像名字 
项目结构

src文件下存放漏洞源码,以及其他的

Dockerfile
dockerfile 复制代码
FROM ubuntu:16.04

LABEL Author="cike_y"

# 下载源
RUN's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 安装依赖
RUN apt-get update && \
    apt-get install -y apache2 php libapache2-mod-php


# 安装 PHP
RUN apt-get install -y php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-zip

WORKDIR /var/www/html

RUN rm -rf /var/www/html/*
COPY src/index.php /var/www/html/index.php
COPY src/flag /flag

# 启动脚本
COPY run.sh /root/run.sh
RUN chmod +x /root/run.sh

ENTRYPOINT ["/root/run.sh"]


# 暴露端口
EXPOSE 80
run.sh
bash 复制代码
#! /bin/bash

# 定义动态flag字段
uuid=$(cat /proc/sys/kernel/random/uuid)
flag="flag{$uuid}"
sed -i "s/flag{this_is_flag}/$flag/" /flag


export FLAG=NOT_FLAG
FLAG=NOT_FLAG

# 启动服务
service apache2 restart

tail -f /var/log/apache2/access.log

参考链接:

bash 复制代码
https://www.bilibili.com/video/BV1k7411B7QL/
https://www.zeker.top/posts/f7e6aba0/
https://yeasy.gitbook.io/docker_practice/image/dockerfile/entrypoint
https://www.v0n.top/2020/05/01/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8Docker%E5%87%BA%E4%B8%80%E9%81%93CTF%E9%A2%98%E7%9B%AE/
相关推荐
鸽芷咕30 分钟前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann
晚霞的不甘37 分钟前
守护智能边界:CANN 的 AI 安全机制深度解析
人工智能·安全·语言模型·自然语言处理·前端框架
枷锁—sha37 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
池央38 分钟前
CANN 算子生态的深度演进:稀疏计算支持与 PyPTO 范式的抽象层级
运维·人工智能·信号处理
数字护盾(和中)39 分钟前
信创生态 + 国密算法 筑牢数字安全韧性根基
安全
OJAC1111 小时前
当所有人都在说“运维稳了”,近屿智能看到了另一种可能
运维
人鱼传说1 小时前
docker desktop是一个好东西
运维·docker·容器
阿梦Anmory2 小时前
Ubuntu配置代理最详细教程
linux·运维·ubuntu
devmoon2 小时前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
成茂峰2 小时前
软考高级·系统架构设计师 | 四、信息技术安全知识
安全·信息安全·系统架构·架构设计师