dockerfile配置动态flag
- 一,思路
- 1环境
- 2思路
- 二,具体过程与“坑”
- 1文件以及源码
- (1)au.sh
- (2)dockerflie
- 2“坑”与“所以”
- 第一个坑:#!bin/bash
- 第二个坑:RUN
- 第三个坑:路径坑
- 3过程
- 1创建题目镜像
- 2创建含有shell自启的镜像
- 备注
- 三,接口
一,思路
1环境
tutum/lamp docker
2思路
总结:创建开机自启脚本
(1)编写自动生成flag脚本:采用覆盖flag.php的思路(删除旧的flag.php,再新建)
随机flag采用四十位。
(2)容器开启自动执行au.sh:采用dockerfile RUN 该脚本。
(3)该思路产生的原因
在这个bash下,我们可以进行各种Ubuntu系统上的操作,当然因为Docker本身的限制,有些涉及到磁盘、网络、设备等Linux特权命令是无法执行的,可以试试reboot命令,会提示你shutdown: Unable to shutdown system。
即无法通过shutdown或者reboot重启容器——所谓的/etc/init.d的网上常见linux开机自启的方法均无效。
二,具体过程与“坑”
1文件以及源码
(1)au.sh
#!bin/bash
MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"
LENGTH="40"
while [ "${n:=1}" -le "$LENGTH" ]
do
PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
let n+=1
done
cd /var/www/html
rm -rf flag.php
a='<?php $flag="flag{'
b='}";'
flag="$PASS"
echo "$PASS"
echo $a$flag$b > flag.php
exit 0
(2)dockerflie
FROM ceshi
RUN chmod -R 777 /etc/init.d/au.sh \
&& bash /etc/init.d/au.sh
2“坑”与“所以”
第一个坑:#!bin/bash
在某些平台SDK编译中Linux脚本需要改为bin/bash,由于Ubuntu系统模式的脚本是sh,安装SDK之后,编译过程一定会出现错误,所以必须要先更改默认的bash才行 。
ubuntu环境中报如下错误:
所以在使用的时候,需要将 #!bash/bin 改为 #!bin/bash 。
第二个坑:RUN
/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill。
所以在依照本思路设置动态flag的时候就没有必要使用CMD(dockerfile命令)了。
第三个坑:路径坑
#!/bin/bash - no such file or directory
该坑主要来源于“文档格式”。
所以,在Notepad++中是在编辑中的文档格式转换就可以了。
3过程
1创建题目镜像
首先,把tutum/lamp拉取下来(docker search lamp 就能看到,然后pull就行)
其次,配置题目环境,略(该内容无论如何都不会影响接下来的步骤,所以你可以放心的构建ctf环境)
最后,将au.sh放入指定位置我是放在了/etc/init.d/下“因爱生恨”(任意地址均可以但在dockerfile中要把路径修改了),au.sh内容见上。
2创建含有shell自启的镜像
在任意位置创建dockerfile,内容见上。
接下来的所有操作均在该目录进行,我习惯在/root下进行。
通过Dockerfile下构建镜像cehsi:1(说明,执行该命令后获得的镜像就是最终结果;不要忘记".")
docker build -t cehsi:1 .
构建并启动容器(说明,执行该命令后获得的容器只是为了验证shell是否生效)
docker run -it -d --name ceshi1 -p 85:80 -p 225:22 ceshi:1
备注
镜像和容器的名字相信大家都会修改
三,接口
至于接口的思路这里建议使用php的include,使用绝对路径调用——"/var/www/html/flag.php"。然后,再将变量$flag write到新的文件里即可。