浅谈用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/
相关推荐
云和数据.ChenGuang10 小时前
运维工程师技术之openEuler 网卡基础查询指令
运维·中间件·mycat·运维工程师·运维技术
意疏10 小时前
不用云服务器也能跨设备转写!CapsWriter+cpolar 实现离线语音协作自由
运维·服务器
自己的九又四分之三站台11 小时前
Docker容器启动中需要增加一个端口
docker·容器·eureka
FED_AF11 小时前
CUPS打印系统完全指南:从安装配置到故障排除
运维
cqsztech11 小时前
docker环境下 Oracle 19c 标准版如何转换为19c 企业版
docker·oracle·容器
white-persist12 小时前
【攻防世界】reverse | re1-100 详细题解 WP
c语言·开发语言·网络·汇编·python·算法·网络安全
牛分享12 小时前
frida安装
安全
普普通通的南瓜12 小时前
一年期免费IP证书,为公网IP地址提供HTTPS加密
网络·网络协议·tcp/ip·安全·http·金融·https