首先就是后台对应api的实现,直接用Whale插件处理好的dockerclient方便写代码,新增后端api如下
123456789101112131415161718192021222324252627282930313233343536373839@page_blueprint.route("/admin/getLog")@admins_onlydef admin_g...
之前对学长的计分板进行了二次开发,最近要准备办招新赛和校赛,需要团队模式,一看团队模式之前的计分板插件完全用不了了,索性直接推倒重构。
首先就是对standings的处理,原先学长的方法是通过多层嵌套循环查询数据表来获得数据,只能说确实能跑起来。我们直接把数据库查询都单独拿出循环外面,然后循环内只处理数据,能优化不少性能,代码修改如下:
123456789101112131415161718...
CTFd Whale提供的动态容器类型的题目是通过镜像名称创建service进而创建题目实例的,但是如果题目镜像并没有上传的dockerhub(比如只有题目的tar文件),或者题目更新了,这时候如果我们想要更新/创建题目就需要手动进入服务器上传镜像或者用tag进行区分,很是麻烦。为了解决这个问题,我们就给whale加点功能吧。
更新镜像首先就是更新镜像的功能,我们直接在前端题目页面...
CTFd的题目允许出题人增加提示,但是增加提示窗口最下面的地方却比较奇怪。。。
需求0-42,ID static,这都是些什么乱七八糟的?
查看源代码可知,原来本应该是ID的地方写成了Type,而神秘的0-42则是提示的花销和提示的ID,有点逆天只能说。
修改成正确的就可以了,改完的效果如下
这样就正常了。
PS:我们Scr1w战队二次开发的CTFd整合版地址:https://g...
这个计分板插件最开始是战队里一个学长开发的,能用是能用,但很多东西都是写死的,不够优雅,正好在整合CTFd,进行一手二次开发!
学长原始的仓库地址:https://github.com/Ephemeral1y/ctfd-matrix-scoreboard
二次开发的新的仓库地址:https://github.com/IShiraiKurokoI/CTFd-Matrix-Scoreboard...
实际上,由于他创建的服务需要自行再去创建task,而task有一个prepare的阶段,这阶段就是这段等待时间。如果我们想要前端进行等待,需要修改两个地方:
12345678910111213141516service = client.services.create( image=container.challenge.docker_image, name=f'...
CTFd-Whale通过数据库来记录存在哪些容器和服务,以便进行开启和关闭,但如果承载CTFd的服务器或者平台出现故障异常重启,或平台异常关闭,有可能导致记录丢失,容器和服务变身无主容器。有人可能就想问了,我直接 docker ps 然后 docker stop,之后docker rm不就移除了吗?错误的捏,我们通过研究Whale的代码可以发现,他是通过以下代码来创建容器的。
1234567...
众所周知,CTFd-Whale会按照题目中设置的镜像名称去创建题目容器,然而在前端返回创建成功后,可能等了很长时间都没有创建成功,去后台一查,诶您猜怎么着,服务器没镜像!
按理说他是应该自动拉取镜像的,所以找下问题所在吧。
也就是说,whale插件是创建了一个服务,由这个服务的task来创建容器docker。
那么Whale是如何判断创建是否成功的呢?
创建失败的条件是添加容器时报错...
这里简短说一下原理,CTFd在不配置的情况下使用的session名是默认的,会跟其他题目内部的session名重复,如果是通过direct frp将平台和docker靶机部署在同一host下,那么会产生Cookie污染。解决办法也很简单,修改CTFd Session名。在/CTFd/init.py里
123456def create_app(config="CT...
在使用CTFd上传题目附件时候发现题目文件只能使用英文,中文名文件上传后会直接只剩拓展名。原因在于CTFd使用了flask原生的filename = secure_filename(filename),导致中文名被抹去。
于是修复如下:
/CTFd/utils/init.py 增加如下:
12345678910111213141516171819202...