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平台,欢迎各位师傅来玩哇,虽然题目很少(已经在尽力出了呜呜呜,有什么问题可以私聊我
参考文章:
Docker部署CTF综合性靶场,定时刷新环境的更多相关文章
- docker 部署 flask(一)配置环境及测试
简介: flask也是要部署的.不能老在我们的pycharm里面跑测试服务器. 各种配置linux,我看就算了吧.我们用docker部署. 也就两三行命令. 一:选择基础镜像 GitHub repo: ...
- 我使用celery以及docker部署遇到的问题
首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...
- Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈
版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...
- vue-cli3 项目从搭建优化到docker部署
项目地址 vue-cli3-project 欢迎 star 原文地址 https://www.ccode.live/lentoo/list/9?from=art 1. 创建一个vue项目 相信大部分人 ...
- DotNet跨平台 - docker部署.net core2.0项目
参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...
- Docker部署SDN环境
2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...
- 在生产环境使用Docker部署应用
导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...
- Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...
- docker部署Javaweb环境数据库连接问题
最近在docker部署了一个Javaweb项目运行的环境,在容器中部署了mysql和Javaweb项目,但是本地可以跑项目,放到容器里面不行. 具体报错内容是不能访问数据库. Could not ge ...
随机推荐
- 利用 Docker 构建一个简单的 java 开发编译环境
目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...
- Vue+nodejs+npm完美结合入门==vue入门
因为我的是win7系统 64位 只能下载低版本的nodjs: 传送门:https://nodejs.org/dist/v9.7.1/ 一.使用之前,我们先来掌握3个东西是用来干什么的. npm: No ...
- CSP-S 2020 Travels
CSP-S 2020 Travels DAY 0 I hit the board in the morning before departure The rest of the time is dec ...
- python <12> socket 编程
1.socket编程需要两个部分 服务器与客户端我们的python中调用 socket包就不需要自己写协议了(socket编程中windows 与Linux中的效果是完全不相同了,次代码最好是放在Li ...
- 加速OSD的启动
ceph是目前开源分布式存储里面最好的一个,但是在高负载下会有很多异常的情况会发生,有些问题无法完全避免,但是可以进行一定的控制,比如:在虚拟化场景下,重启osd会让虚拟机挂起的情况 重新启动osd会 ...
- 分布式监控系统之Zabbix网络发现
前文我们了解了zabbix的宏,自定义item和模板的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14013331.html:今天我们来了解下zab ...
- windows下mysql的远程访问和权限设置
如果想要用户root可以远程登录,则可通过修改user表中root用户对应的host字段值为"%"即可.我们用以下语句进行修改: update user set host = '% ...
- C++深拷贝与浅拷贝区别
浅拷贝只是对指针的拷贝,浅拷贝后两个指针指向同一个内存空间: 深拷贝不仅对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针. 当对一个已知对象进行拷贝时,编译系统会 ...
- java开发两年了,连个java代理模式都摸不透,你怎么跳槽涨薪?
前言 代理模式(Proxy Pattern),23种java常用设计模式之一.代理模式的定义:代理类对被代理对象提供一种代理以控制对这个对象的访问.代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...
- 分享用MathType编辑字母与数学公式的技巧
利用几何画板在Word文档中画好几何图形后,接着需要编辑字母与数学公式,这时仅依靠Word自带的公式编辑器,会发现有很多公式不能编辑,所以应该采用专业的公式编辑器MathType,下面就一起来学习用M ...