接上文,这篇主要是结合阿里云ACR来实现动态flag题型的创建。
这里顺便也介绍一下阿里云的ACR服务。
阿里云容器镜像服务(简称 ACR)是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、大规模/大镜像分发加速、多代码源构建加速等全链路提效,与容器服务 ACK 无缝集成,帮助企业降低交付复杂度,打造云原生应用一站式解决方案。
说白了就是对标dockerhub的,但是dockerhub很难访问,需要科学上网,所以这里我们就使用阿里云提供的ACR镜像服务来完成动态flag题型的创建了。
回到虚拟机内,进入到【GZCTF】下面。
新建一个文件夹,命名为【WEB】。
同时,WEB下再新建一个文件夹,命名为【src】。
在src中,新建flag.sh和index.php。
web题,首先是需要按照常规逻辑写一个网页,这里就写一个带flag的简单网页,把flag放在源代码里,并注释掉。代码如下,保存为index.php。
在当前路径下打开命令行界面,执行如下命令:
vi index.php
并复制如下内容到php文件中:
<!DOCTYPE html>
<html>
<head>
<title>签到</title>
</head>
<!--flag{testflag}-->
<body>
<?php
echo "welcome !!!";
?>
</body>
</html>
这里值得注意的是,ubuntu的输入按住方向键时会变成大写字母,需要提前进行修改,具体修改方式如下:
首先进入该目录。
cd /etc/vim
如果你有root权限,直接进入文件编辑即可,如果没有root权限,在下面的代码前面加一个sudo就可以编辑了。
vi vimrc.tiny
回车后,先把光标调到set和compatible中间(为了避免插入时使用方向键),让光标覆盖"c"的位置,像这样。
然后按下键盘"i"键进入插入模式,之后输入"no",完成后是这个样子的:
set nocompatible
完成后按esc键,然后输入:wq退出编辑并保存。
:wq
这样按住上下左右键就是正常的了。
创建完index.php,接下来创建flag.sh。
vi flag.sh
同样复制如下内容到sh文件中:
#!/bin/sh
sed -i "s/flag{testflag}/$GZCTF_FLAG/" /home/XXX/GZCTF/WEB/src/index.php #使用平台的动态flag替换index.php中的flag,这里我使用的平台为GZCTF,因此动态flag环境变量为$GZCTF_FLAG,其他平台一般
为$FLAG
export GZCTF_FLAG="" #命令用于设置或声明环境变量,使得该变量能在子进程中可见
此处注意要按照自己创建的实际路径来填写。
当创建完src文件下的内容后,回到上级目录,编写Dockerfile文件。
vi Dockerfile
FROM ctftraining/base_image_nginx_mysql_php_56 #web题docker基础镜像,这里使用ctftraing打包好
的,包含了基础的nginx,mysql,php环境,并且会自动运行flag.sh脚本,本题使用php环境。
COPY src /home/XXX/GZCTF/WEB/src/ #将你编写的网页源码复制到docker容器中,这里为php网页,因此只需要
复制源码到对应路径下就可以了,其他类型网页按照实际部署情况COPY到docker中相应目录下就可以了
RUN mv /home/XXX/GZCTF/WEB/src/flag.sh / \ #把你源码中的flag.sh复制到根目录以便自动执行
&& chmod +x /flag.sh #添加运行权限
编译时记得删除注释内容。
到这里文件就准备完毕了,下面我们进入到阿里云的ACR界面。
点击免费试用。
创建个人实例。
设置完密码创建完成后,进入访问凭证,复制登陆实例的语句。
登陆成功。
这里需要先安装好docker和docker-compose,具体安装过程可以见我之前的文章。
接下来使用build命令,构建题目镜像,需要回到ACR中创建一个命名空间,建议设置为私有,名字是全局唯一性!
接下来执行构建命令,name为阿里云命名空间名字,webtest为镜像名(自定义),"."为版本号,代表latest,也可以自定义。
sudo docker build -t name/webtest .
执行命令查看镜像构建情况:
sudo docker images
给它打上tag,表明版本:
sudo docker tag IMAGEID 镜像在阿里云里的地址:1.0.0
再push到我的阿里云镜像仓库,name为命名空间名,webtest为镜像名
sudo docker push 镜像在阿里云里的地址:1.0.0
这时可以回到阿里云的ACR界面下,进入镜像仓库查看。
可以看到已经成功了。
接下来部署题目,类型记得选择动态容器。
在这个位置填入阿里云地址下的路径地址:
点击后面的创建测试容器,这里会创建一个入口,点击查看网页。
可以看到实例创建成功!
查看源码可以看到就是我们之前编辑的index.php文件。
我们更换账号去尝试答题。
点击创建实例。
可以看到生成的是新的flag。
再更换个账号,可以看到flag有所变化。
至此,基于阿里云ACR实现动态flag题型的创建完成。