web的题目按照docker来构建镜像

一般来说需要两个文件, 但是当只需要拉取别人制作好的镜像的时候其实只需要docker-compose.yml

docker-compose.yml和Dockerfile

下面是两个是简单示例

题目结构

image-20230909133516054

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
# docker-compose.yml
version: "3"
services:
web:
build: .
image: web_multi
# 当build和image同时出现时, 会把image当成这个镜像的名称
ports:
- "8080:80"
restart: always
environment:
- FLAG=flag{test_flag}

Dockerfile

1
2
3
4
5
6
FROM nginx:alpine

COPY 1.html /usr/share/nginx/html/

EXPOSE 80
#nginx版本
1
2
3
4
5
6
7
8
9
10
FROM php:7.2-apache

COPY ./src /var/www/html
#会把src目录下的文件全部复制过去, 不是复制src文件夹
COPY flag.sh /flag.sh
#把当前目录下的flag.sh复制到根目录下
RUN chmod +x /flag.sh
#apache版本


这样一道最简单的纯html题目就搭建好了

如果需要加入php, 则需要在Dockerfile里面拉取php的镜像并构建

比如FROM php:5.6-fpm-alpine

或者是FROM ctfhub/base_web_nginx_php_74

或者ctftraining/base_image_nginx_mysql_php_73

还可以加入flag.sh初始化脚本

1
2
3
4
5
6
7
8
#!/bin/sh

echo $FLAG > /flag # 将flag写入根目录

export FLAG=not_flag
FLAG=not_flag

rm -f /flag.sh
1
2
3
4
5
6
7
8
#!/bin/sh

sed -i 's/flag{test}/$FLAG/' /var/www/html/flag.php # 将flag写入根目录

export FLAG=not_flag
FLAG=not_flag

rm -f /flag.sh

这里有个坑, 一定要用\r也就是回车才行, 而回车在linux中是\n, 在windows中式\r\n, linux不认识\r, 故flag.sh会报错不能执行

image-20230909202502167

1
2
3
4
5
6
webapp
├── docker-compose.yml
├── Dockerfile
├── start.sh
└── src
└── index.php
  1. sed -i 后面一定跟着双引号, 单引号是会被当成字符串

我的实现方案是

1
2
3
4
5
6
7
8
9
10
11
#docker-compose.yml
version: "3"
services:
web:
build: .
image: nanamo/web_multi
ports:
- "8080:80"
restart: always
environment:
- FLAG=flag{test_flag}
1
2
3
4
5
6
7
8
9
10
11
12
#Dockerfile
FROM php:7.2-apache

COPY ./src /var/www/html

COPY flag.sh /flag.sh

RUN chmod +x /flag.sh

CMD /flag.sh # 执行flag.sh, 但是执行完就会停止容器, 不清楚为什么

EXPOSE 80
1
2
3
4
5
6
7
8
9
10
#flag.sh
sed -i "s/flag{test}/$FLAG/" /var/www/html/F14g.php

export FLAG=not_flag

FLAG=not_flag

service apache2 start #不启动就会卡在下一步

tail -f /dev/null #能够让flag.sh执行完之后不会停止容器

https://www.lewiserii.top/%E7%AB%9E%E8%B5%9B/ctf%E5%B9%B3%E5%8F%B0%E6%90%AD%E5%BB%BA%E5%92%8C%E5%87%BA%E9%A2%98%E6%8C%87%E5%8D%97.html#%E6%80%BB%E7%BB%93

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/

如果遇上要拉取的镜像太大的时候, 可以更换apt源和pip源, 能够提高速度

只需要在添加一个source.list在目录中,, 一般是Dockerfile的同级目录

里面填上需要更换的apt源

在Dockerfile里加上ADD ./sources.list /etc/apt

pip更新的话用这个

1
2
3
# Upgrade pip
RUN pip install --upgrade pip
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple