浅谈用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/
相关推荐
Lupino32 分钟前
我把 OpenClaw 装到服务器上后,才明白它真正该装在哪里(实战复盘)
运维
Lupino3 小时前
别再只聊 AI 写代码了:技术负责人要把“变更治理”提到第一优先级
python·docker·容器
Java陈序员2 天前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
爱吃橘子橙子柚子3 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Sheffield4 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽4 天前
win10下运行Start Broker and Proxy报错解决
docker
用户962377954485 天前
VulnHub DC-3 靶机渗透测试笔记
安全
舒一笑5 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData5 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库