Docker部署CTF综合性靶场,定时刷新环境
部署如DVWA或upload-labs这类综合性靶场的时候,虽然是使用Docker环境,设置好权限后容器被击穿的问题不需要考虑,但担心部分选手修改了题目环境,比如一直XSS弹窗,所以想要编写脚本每天定时刷新靶场,让靶场的可维护性更高。
第一时间想到的是使用Linux下的crontab定时任务加shell脚本实现,刷新环境的命令使用docker的restart命令,本以为restart就能够重置题目的环境,因为之前记得docker里面的数据没有持久化到硬盘上,重启后就相当于重置题目环境了,查了资料后才发现restart是不行的:
容器是镜像的实例,关闭了容器不意味着删除这个实例,当删除这个容器后,重新从镜像启动一个新的实例时才会丢失之前的数据。
所以这里刷新环境需要将之前的旧容器删除,时间暂定为一天刷新一次。
先启动一个upload-labs靶场,并且将其映射到13000端口上
docker pull c0ny1/upload-labs
docker run -d -p 13000:80 c0ny1/upload-labs:latest
访问之:
关于Linux下的定时任务
我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
Linux 系统里的 cron 守护进程,可以跟随系统启动,是一个用来创建定时任务的基本工具。
/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
查看cron状态:
/etc/init.d/cron status
可以看到定时任务是在running中的,即在运行
添加定时任务:
crontab -e
因为我们删除的容器还在运行当中,所以我们需要先将其停止再删除,命令格式大概如下:
每晚的23:30停止docker
30 23 * * * /usr/bin/docker stop xxxxx(容器ID)
但是我们不知道容器ID,使用docker ps命令查找,并使用grep和awk组合查找:
先时候docker ps -a查看所有容器
查找存在upload-labs字符串的行
docker ps -a | grep "upload-labs"
按照空格分隔,并获取其第一列,这里的第一列即我们想要获取的容器ID
docker ps -a | grep "upload-labs"| awk '{print $1}'
获取成功,接着合并暂停和删除的操作
docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'`
暂停删除成功,可以再使用
docker ps -a
查看运行或暂停的容器,可以看到已经没有upload-labs这个容器了
合并启动操作:
docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && docker run -d -p 13000:80 c0ny1/upload-labs:latest
并将其添加到定时任务中,定时任务中使用docker的绝对路径
添加定时任务:
30 23 * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest
为了方便测试是否成功,我这里将时间格式改为了
* * * * *
即每一分钟执行一次命令,这样我们只需要检查容器ID是否改变即可判断容器是否刷新成功
并且重定向删除了运行信息
crontab -e
写入任务
* * * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest >/dev/null 2>&1
保存后退出,查看当前的upload-labs的容器ID:
为:
6f53446a7ffe
等待一会
可以看到这个时候的容器ID由6f53446a7ffe 变为了
2837f421951c
说明docker定时刷新脚本没有出现问题,将其修改为每天23:30刷新一次,最终版本为:
30 23 * * * /usr/bin/docker stop `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker rm `docker ps -a | grep "upload-labs"| awk '{print $1}'` && /usr/bin/docker run -d -p 13000:80 c0ny1/upload-labs:latest >/dev/null 2>&1
这样就可以安心部署题目的时候就不需要环境长期人为检查维护了,但是引发的另外一个问题是可能docker的冗余文件会比较多,时间长了之后占用服务器的存储空间,这个问题下次写篇文章来解决,以上
日常夹带私货:http://biuctf.cc/
校内CTF平台,欢迎各位师傅来玩哇,虽然题目很少(已经在尽力出了呜呜呜,有什么问题可以私聊我
参考文章:
最新文章
- JavaScript权威设计--JavaScript词法结构(简要学习笔记二)
- Linux安装Node.js
- Windows下使用Git和GitHub.com
- HDU 1025 (LIS+二分) Constructing Roads In JGShining's Kingdom
- 服务端API的OAuth认证实现
- NLTK学习笔记(四):自然语言处理的一些算法研究
- C++ bitset用法
- 【转载】tolua之wrap文件的原理与使用
- java web(三):ServletContext、session、ServletConfig、request、response对象
- 第四课 VMP壳内爆破
- odoo 学习
- JavaScript 继承总结
- protobuf 嵌套示例
- JS数组去重算法实现
- [转]Creating a custom ribbon for Outlook 2013, 2010 and toolbar for Outlook 2007, 2003 – C# sample
- python_Appium测试环境搭建
- 嵌入式web服务器-thttpd
- 网络流量预测 国内外研究现状【见评论】——传统的ARIMA、HMM模型,目前LSTM、GRU、CNN应用较多,貌似小波平滑预处理步骤非常关键
- spring指导的index.html在spring文件夹中的位置
- angularJS 使用自定义指令输出模板
热门文章
- Shell 筛选符合条件的 ELF 文件
- 第14章——高级IO函数
- git bash: error: RPC failed; result = 18, HTP code = 200B
- Vue单元测试vue2-jest-coverage的package.json 配置
- 单线程的Redis有哪些慢动作?
- php 数据转储Excel文件
- springboot同一项目部署多实例
- Mac专用下载器Folx软件中有没有“下载速度控制”功能
- vulnhub: DC 4
- 与运算(&;)、或运算(|)、异或运算(^)、右移运算符(>;>;>;)本质介绍