0%

如何用docker出一道ctf题(web)

如何用docker出一道ctf题(web)

目前docker的使用越来越宽泛,ctfd也支持从dockerhub一键拉题了。因此,学习如何使用docker出ctf题是非常必要的。

安装docker和docker-compose

100种方法,写个最简单的。之前一篇文章CTFD部署里我也提到过如何安装。

安装docker

1
curl -fsSL https://get.docker.com -o get-docker.sh
1
sh get-docker.sh --mirror Aliyun

安装docker-compose

1
sudo apt update
1
sudo apt install python3-pip -y
1
pip3 install docker-compose

无数据库篇

这个比较简单,先挂一下tree。

image-20210928171223267

我本人习惯在windows下出题,主要是因为方便。实际上是因为我虚拟机里一堆bug

接下来我们一层一层解析。

flag.php

1
2
3
<?php
$flag = 'flag{1234}';
?>

先从最底层html文件夹内的内容说起。这里面就放题目和flag.php即可,flag如果在根目录的情况我会另外标注(在flag.sh中改)。

flag.sh

1
2
3
4
5
6
#!/bin/sh
sed -i "s/flag{1234}/$FLAG/" /var/www/html/flag.php
export FLAG=not_flag
FLAG=not_flag

rm -f /flag.sh

ctfd-whale会自动生成一个随机flag的变量在$FLAG里。

第二行就是将你存储flag的位置,做个替换,3,4行清空环境变量值,否则执行echo $FLAG就能直接出flag。

如果要把flag放入根目录/flag,把第二行改成:

1
echo $FLAG >> /flag

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 请务必保证该出能从 hub.docker.com 上拉取下来。
# 尽量使用能在 hub.docker.com 上查看到 Dockerfile,下载量高的官方认证镜像,推荐使用 https://github.com/DASCTF.
FROM ctftraining/base_image_nginx_php_73

# 拷贝源码到相应目录下。
COPY src /var/www

# 如需自定义 FLAG 请将自定义脚本覆盖到 /flag.sh
# COPY files/flag.sh /flag.sh

# 如需操作数据库请将 sql 文件拷贝到 /db.sql
# COPY files/db.sql /db.sql

# 如有上传文件等操作请务必将权限设置正确!
RUN chown -R www-data:www-data /var/www/html/ && \
mv /var/www/flag.sh / && \
chmod +x /flag.sh && \
dos2unix /flag.sh

# 如需静态 FLAG 请在此利用环境变量声明
# ENV DASFLAG=DASCTF{flag_test}

# 请声明对外暴露端口
# EXPOSE 80

直接用集成镜像了,太猛了。这个镜像不需要暴露端口。DASCTF的镜像需要暴露端口。相关源码可以去github上搜ctftraining去看。

注意第18行dos2unix /flag.sh,个人习惯在windows上出题,写的shell脚本的换行符在linux系统中会炸,因此需要执行该命令。当然也可以使用编辑器,例如notepad++或sublime text中设置文件为unix格式。

有数据库篇

正在学习,玩不明白数据库,蕾姆。之后看情况更新密码nc题出题方法。

-------------本文结束感谢您的阅读-------------