部署如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综合性靶场,定时刷新环境的更多相关文章

  1. docker 部署 flask(一)配置环境及测试

    简介: flask也是要部署的.不能老在我们的pycharm里面跑测试服务器. 各种配置linux,我看就算了吧.我们用docker部署. 也就两三行命令. 一:选择基础镜像 GitHub repo: ...

  2. 我使用celery以及docker部署遇到的问题

    首先我本机测试时没有问题的,但是在线上docker中,任务一直显示 "Sending due task".超时的任务是 django orm update 操作,本地不会出现这样的 ...

  3. Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...

  4. vue-cli3 项目从搭建优化到docker部署

    项目地址 vue-cli3-project 欢迎 star 原文地址 https://www.ccode.live/lentoo/list/9?from=art 1. 创建一个vue项目 相信大部分人 ...

  5. DotNet跨平台 - docker部署.net core2.0项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  6. Docker部署SDN环境

    2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...

  7. 在生产环境使用Docker部署应用

    导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产 ...

  8. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署

    运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...

  9. docker部署Javaweb环境数据库连接问题

    最近在docker部署了一个Javaweb项目运行的环境,在容器中部署了mysql和Javaweb项目,但是本地可以跑项目,放到容器里面不行. 具体报错内容是不能访问数据库. Could not ge ...

随机推荐

  1. 数字取证autopsy系列——保存证据镜像(一)

    简介: 在学习autopsy之前,我们先学习如何将犯罪嫌疑人的磁盘保存为一个证据镜像.我们使用的将磁盘保存为证据镜像的工具为AccessData FTK imager,你可以自行搜索下载. Acces ...

  2. MCscan-Python-jcvi 共线性画图最后一章更新

    经过几轮调试和修改,共线性图终于可以上眼了.如下: 图中红色的为目标基因,蓝色的为reference species目标基因周围15个基因,天蓝色为再往外15个基因,黄色为与reference spe ...

  3. ixgbe 驱动 为xxx驱动做准备1

    网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...

  4. VS2017新建MVC+ORM中的LinqDb访问数据库项目

    1.前提概述 ORM对象关系映射(Object-Relational Mapping)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说,它其实是创建了一个可在编程语言 ...

  5. ATM管理系统(三)

    一.作业信息 博客班级 软件工程 作业要求 作业要求 作业目标 你理解的作业目标具体内容 学号 3180701218 二.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能:(1)开户 ...

  6. 这个厉害了,ssm框架整合全过程,建议收藏起来好好看看

    1.0 环境要求 IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 1.1 数据库 创建书籍数据库表,包括书籍编号,书籍名称,书籍数量以及书籍描述. CREATE DATABA ...

  7. 新鲜出炉!面试90%会被问到的Java多线程面试题,史上最全系列!

    前言 最近很多粉丝朋友私聊我说能不能给整理出一份多线程面试题出来,说自己在最近的面试中老是被问到这一块的问题被问的很烦躁,前一段时间比较忙没时间回私信,前两天看到私信我也是赶紧花了两天给大家整理出这一 ...

  8. 攻克solo第六课(大调音阶与真的爱你)

    在本期文章中,笔者将通过guitar pro7和大家分享大调音阶的知识. 不知道大家有没有试着使用my song book里面的谱子,反正笔者是觉得赚大了,并且找了囊括民谣.爵士到摇滚在内不同风格的谱 ...

  9. MathType在AutoCAD中的应用方法

    我们都知道CAD是一款鼎鼎有名设计与绘图软件,有不少朋友可能用过或听说过CAD,相较而言,用过MathType的人可能要少一些,虽然它也是理科生与工科生的专用工具之一. 通过MathType我们能够在 ...

  10. 苹果电脑中怎么快速卸载Flash Player和浏览器扩展应用插件

    Adobe Flash Player是一款轻量级浏览器插件,帮助你在网页浏览过程中享受更广泛的多媒体体验.是一种拓展,与Java一样,成为安全和隐私问题的重要来源.这些都需要手动删除的Flash是令人 ...