Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

S2eTo/FlawPlatformMatch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

25 Commits

Repository files navigation

一、软件运行环境和简介

功能定制,靶机定制,商务合作,问题/交流群: 512897146

特别说明, 本作品 前端FlawPlatformMatchVue, 后端FlawPlatformMatch可开源使用,但必须免费提供使用。用于任何形式的商务/盈利活动,请提前联系交流群群主。

靶机制作:https://mp.weixin.qq.com/s/TCVf5XKW20uOc6WfV0QIQQ

1.1 软件简介

基于 Docker, 使用 Python + Django 开发的在线 CTF 竞技平台。

支持在线答题、比赛管理、批量用户导入、动态 Flag、题目实时发布/下架题目、题目Hints(提示)发布/关闭提示、排行、动态、公告、积分等。题目分数为动态分数,做得人越多分越少(会影响之前已答手上的分数)。

目前是用本校于校内比赛,所以批量导入会有学号、班级等信息,excel(.xls) 列为:姓名、班级、学号。

二、安装说明

2.1 前端地址

项目为前后端分离项目,前端仓库:https://github.com/S2eTo/FlawPlatformMatchVue

2.2 安装 Python 3

安装依赖环境

yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc libffi-devel 

下载 python 3.7.1。若出现 command not found 的错误,通过命令 yum -y install wget 安装 wget 即可

wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz

创建安装目录

mkdir -p /usr/local/python3

解压安装包

tar -zxvf Python-3.7.1.tgz

进入解压后的 Python 3 安装包目录

cd Python-3.7.1

生成编译脚本

./configure --prefix=/usr/local/python3

编译安装

make && make install

测试安装是否成功

/usr/local/python3/bin/python3

创建软连接

ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装所需依赖

yum install python-devel -y
yum install zlib-devel -y
yum install libjpeg-turbo-devel -y

2.3 使用 SQLite3 数据库

程序默认使用 SQLite3 数据库,但需要升级,若不想使用 SQLite3 可以直接跳转到下一章 3. 使用Mysql 数据库

2.3.1 升级 SQLite3

获取安装包下载地址:https://www.sqlite.org/download.html

image-20220329121505366

下载 Sqlite 最新版安装包

wget https://www.sqlite.org/2022/sqlite-autoconf-3380200.tar.gz

解压安装包

tar zxvf sqlite-autoconf-3380200.tar.gz

进入解压后的安装包目录

cd sqlite-autoconf-3380200

生成编译脚本

./configure --prefix=/usr/local/sqlite3

编译安装

make && make install

检查安装是否成功

/usr/local/sqlite3/bin/sqlite3 --version

检查旧版本

/usr/bin/sqlite3 --version

将旧版本更换名字

mv /usr/bin/sqlite3 /usr/bin/sqlite3_old

设置新版本软连接

ln -s /usr/local/sqlite3/bin/sqlite3 /usr/bin/sqlite3

检查 sqlite3 版本

sqlite3 --version

编辑环境变量文件 $HOME/.bash_profile 添加下列变量

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/sqlite3/lib"

image-20220408233636108

重新加载环境变量

source $HOME/.bash_profile

检查版本

image-20220329123359686

2.3.2 迁移数据库

解压项目压缩文件后,cd 切换工作目录到项目文件夹中,与 manage.py 同级

image-20220402231631573

创建迁移记录

pyhton3 manage.py makemigrations

迁移创建数据库

pyhton3 manage.py migrate

2.4. 使用 Mysql 数据库

2.4.1 安装 Mysql 数据库

centos 直接安装 mariadb 即可

yum -y install mariadb

2.4.2 修改程序配置文件

建议设置只在内网开放 3306 端口 通过 bind-address 设置(注意保存后重启服务)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# 设置绑定的 IP 地址为环回口地址 127.0.0.1
bind-address=127.0.0.1
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

重启服务

systemctl restart mariadb

检查端口绑定情况

image-20220329152729950

2.4.3 设置 Mysql 密码

为了安全考虑,哪怕只开在回环口也需要设置登录密码。如果觉得不需要设置,可以跳过这一步

默认密码是空的,可以直接通过 mysql -u root -p 空密码登录即可

image-20220329152835883

这里通过直接更新数据表的方式修改密码

UPDATE user SET Password = PASSWORD('密码') WHERE user = 'root';

刷新

FLUSH PRIVILEGES;

2.4.4 创建数据库

为程序创建一个数据库,名字自定义。但后面配置 Django 时需要填对

flaw_platform

image-20220329160204619

2.4.5 配置编码

编辑 /etc/my.conf ,设置 编码。记得重启 mariadb 服务

[client]
# 设置编码
default-character-set=utf8
[mysql]
# 设置编码
default-character-set=utf8
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# 设置绑定地址
bind-address=127.0.0.1
# 设置编码
collation-server=utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server=utf8
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

2.4.6 配置 Django 使用 Mysql 数据库

解压项目压缩文件后,cd 切换工作目录到项目文件夹中,与 manage.py 同级

image-20220402231623965

安装 mysqlclient

pip3 install mysqlclient

出现报错以下两种方法解决

# 更新pip
pip3 install --upgrade pip
# 安装 mysql-devel
yum install mysql-devel

编辑 common/settings.py 文件

vim common/settings.py

进行如下修改, 注意保存

# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
 'default': {
 # 'ENGINE': 'django.db.backends.sqlite3',
 # 'NAME': BASE_DIR / 'db.sqlite3',
 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
 'NAME': '', # 数据库名,先前创建的
 'USER': 'root', # 用户名,可以自己创建用户
 'PASSWORD': 'xxxx', # 密码
 'HOST': '127.0.0.1', # mysql服务所在的主机ip
 'PORT': '3306', # mysql服务端口
 }
}

创建迁移记录

pyhton3 manage.py makemigrations

image-20220402231618940

迁移创建数据库

pyhton3 manage.py migrate

2.5. 配置 Docker

2.5.1 安装 docker

通过 yum 一键安装即可

yum -y install docker

2.5.2 配置 Remote API

编辑服务配置文件

vim /usr/lib/systemd/system/docker.service

再 ExecStart 值中添加多一行,注: 这里最好不要暴露在公网上,因为这里的 Remote API 没有身份校验。任何人都可以通过这个 Remote API 操作你的 Docker,进行操作。

-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock

image-20220329104619088

重启 Docker 服务

systemctl daemon-reload
systemctl restart docker

检查端口是否开启,如果 netstat command not found 需要安装 net-tools : yum -y install net-tools

netstat -ano | grep 2375

image-20220329104535343

2.5.3 配置 Django Docker Remote API 信息

cd 切换工作目录到项目文件夹中,与 manage.py 同级

image-20220402231609883

编辑 common/settings.py 文件

vim common/settings.py

进行如下修改, 注意保存

DOCKER_API = {
 'URL': 'tcp://127.0.0.1:2375',
 
 # 外部映射地址, 只起到显示作用。同时是提供外部访问容器端口的地址
 'EXTERNAL_URL': '10.8.7.46',
 
 # 映射端口区间如:30000-30500, 设置为 None 表示不设限制区间
 'PUBLIC_PORT_RANG': None,
 
 # 随机 Flag 设置的环境变量名称,建议默认
 'FLAG_ENVIRONMENT_NAME': 'RANDOM_FLAG',
 
 # 自动删除容器/靶机时间如: +1 为一小时后自动关闭
 'AUTO_REMOVE_CONTAINER': +1
}

2.6. 部署后端

2.6.1 安装所需包

cd 切换工作目录到项目文件夹中,与 manage.py 同级

image-20220402231553787

使用 pip 安装 requirements.txt

pip3 install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2.6.2 启动服务

cd 切换工作目录到项目文件夹中,与 manage.py 同级

image-20220402231551118

启动服务

# python3 manage.py runserver IP:PORT
python3 manage.py runserver 10.8.7.46:8000

image-20220402231825845

2.6.3 管理后台

通过 createsuperuser 创建超级管理员用户

python3 manage.py createsuperuser

即可通过创建的用户民密码登录后台:http://ip:port/admin/

image-20220402232104258

image-20220402232138409

三、管理员使用说明

访问站点管理页面:http://xn.gdcp.edu.cn:8001/admin/ (连接为[host/ip]/admin/),输入用户名密码登录即可。

image-20220406151913946

需要管理时,选择点击左边模块即可。

image-20220406152151832

3.1 选手信息导入

导入需要特定的 excel 文件,与《信息安全管理与评估》赛项同样的三人一队设计

队伍名称、队员1姓名(队长)、队员1班级、队员1学号、队员2姓名、队员2班级、队员2学号、队员3姓名、队员3班级、队员3学号。

如下是示例。表中设计的名称、姓名均通过随机姓名生成网站生成,如有雷同纯属巧合

image-20220406150335317

3.1.1 选手信息收集

这里演示通过微信小程序《金山文档》来收集参赛队伍信息,创建好规定模板文档

image-20220406150853186

点击右上角分享按钮,选择任何人可编辑,点击创建并分享

image-20220406150928630

可以复制连接发送,也可以通过生成二维码的方式要去他人加入分享编辑。

image-20220406151211757

将连接或二维码发送提供参赛选手填写队伍信息即可。

image-20220406151320198

3.1.2 导出选手信息

点击左上角选择导出为 Excel(.xls) 即可

image-20220406151630061

3.1.3 选手信息导入

进入用户管理界面,点击右上角批量导入用户信息

image-20220406152240729

选择收集好的选手信息文件,点击执行导入即可。程序会自动判断队伍名称、选手是否重复,导入信息时间会很长,请耐心等待直到提示导入完成为止。导入成功后会自动创建队伍、用户并自动关联。**登录用户名(账号)为学号、密码默认 123456 **

image-20220406152347711

3.2 用户(选手)管理

特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面

3.2.1 编辑用户

在列表页选择点击用户名一栏即可进入编辑页面

image-20220406154324135

在比赛中基本对选手做个人信息编辑即可,可以调整名字,队伍,积分等。

image-20220406154405455

页面底部可以选择:删除、保存等操作

image-20220406154519551

3.2.2 用户搜索

可以通过用户名(学号)、姓名、邮箱进行搜索,点击搜索按钮右侧的 总共 .. 可以返回所有列表页。

image-20220406154746552

3.2.3 手动添加用户(选手)

在用户列表页,点击右上角增加用户,进入添加用户页面

image-20220406154931184

输入用户名、密码、确认密码后点击保存即可。

image-20220406155016960

3.3.4 批量删除用户(选手)

选择需要批量删除的队伍,选择删除所选队伍的动作,点击执行

image-20220406160725455

在确认页面点击确认即可

image-20220406160825576

3.3 队伍管理

特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面

3.3.1 编辑队伍

进入队伍列表后,选择点击名称一列即可进入编辑页面

image-20220406155238311

选择修改队伍名称或分数,点击保存即可

image-20220406155417504

也可以点击左下角的删除按钮单独删除队伍

image-20220406155519601

删除队伍会同步删除队伍成员

image-20220406155538816

3.3.2 搜索

可以根据名称搜索队伍,点击搜索按钮右侧的 总共 .. 可以返回所有列表页。

image-20220406155637512

3.3.3 手动添加队伍

点击右上角增加队伍进入添加队伍页面

image-20220406160552232

输入用户名点击保存即可

image-20220406160632664

3.3.4 批量删除队伍

选择队伍,选择删除所选队伍的动作,点击执行

image-20220406155748607

在确认页面点击确认即可

image-20220406160140311

3.4 比赛管理

这里有两种使用方法:添加一个比赛后,再次举办比赛时修改改信息就行。或每次举办比赛时添加一个比赛,程序会自动将最新记录作为当前比赛信息。

3.4.1 添加比赛

点击右上角增加比赛,

image-20220406182902535

填写好比赛名称、logo、开始时间、结束时间点击保存即可。

image-20220406183722319

logo和名称的效果位于页面左上角,比赛开始/结束时间用于比赛倒计时,及比赛信息。下面是态势页面,当然不仅态势页面。

image-20220406183828154

3.4.2 编辑比赛信息

在比赛管理列表页,点击比赛名称列可进入编辑页面

image-20220406224202627

完成编辑后点击右下角保存即可

image-20220406224235244

3.4.3 搜索

在列表页可以通过赛名称进行搜索

image-20220406224336134

3.5 分类管理

可以删除、批量删除、编辑、搜索、添加、过滤、排序分类,与文档前面的内容过于相似这里不再演示。

image-20220406233513838

3.6 题目管理

可以删除、批量删除、编辑、搜索、添加、过滤、排序题目,与文档前面的内容过于相似这里不再演示

3.6.1 镜像环境 - 环境变量随机flag

在列表页点击右上角 增加题目 按钮

image-20220406224835640

题目环境选择镜像环境,填入镜像 ID (这里需要本地的docker中存在该镜像)程序会自动根据 镜像ID 获取镜像标签与开发端口信息。镜像Flag形式选择环境变量随机flag

image-20220406224921485

这样的环境本质上就是在容器环境变量中设置一个 RANDOM_FLAG(可更改) 的环境变量值就是随机生成的 flag,通过PHP等程序可以获取该变量

<?php
echo(getenv('RANDOM_FLAG'));

填写完成基本信息后点击保存即可

image-20220406225119013

3.6.2 镜像环境 - 本地文件随机flag

在列表页点击右上角 增加题目 按钮

image-20220406224835640

题目环境选择镜像环境,填入镜像 ID (这里需要本地的docker中存在该镜像)程序会自动根据 镜像ID 获取镜像标签与开发端口信息。镜像FLAG样式选择 本地文件随机flag, 填写文件路径、文件内容模板,填写完基本信息即可

image-20220406225638522

如下是题目效果

image-20220406225756827

3.6.3 附件环境

在列表页点击右上角 增加题目 按钮

image-20220406224835640

将题目环境切换为附件环境,选择附件,设置附件flag,填写完题目信息即可

image-20220406225914236

3.6.4 实时发布题目

添加完题目后,选手是看不到题目的,只有 在比赛开始后 在题目列表中点击上架题目

image-20220406230110083

进入确认页面后点击确认即可,题目会实时推送上架,并实时推送公告。

image-20220406230222449

如下公告

image-20220406230354977

选手端小公告效果

image-20220406232044028

3.6.5 紧急下架题目

在列表页点击下架题目

image-20220406232640950

紧急下架题目后会自动关闭与题目相关的所有容器,这可能会非常耗费资源,谨慎使用。

image-20220406232700685

3.6.6 题目搜索

在列表页可以根据 题目名称、题目来源、题目描述、镜像 ID 进行搜搜

image-20220406233129959

3.7 靶机(容器)管理

添加靶机(容器)时选择响应题目,点击保存可以生成一个环境

image-20220406233606469

添加成功

image-20220406233645933

3.8 比赛态势

特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面

image-20220406233948227

裁判组用户/管理员,可直接访问站点主页:http://xn.gdcp.edu.cn:8001/ (http://ip/host:port/) 会自动跳转到态势页面,登录后台后可以通过点击右上角的查看站点跳转到态势页面

image-20220406234039216

态势页面连接:http://xn.gdcp.edu.cn:8001/#/twinkingstar(`http://ip:port/#/twinkingstar`),

image-20220406234232706

3.9 大屏幕倒计时

特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面

访问连接:http://xn.gdcp.edu.cn:8001/#/countdown (http://ip:port/#/countdown)

image-20220406234508400

四、选手使用说明

设有(每道题)前三作答额外奖励机制,第一额外奖励 20%,第二额外奖励 15%,第三额外奖励 10%.

4.1 登录

用户名(账号)为学号,密码默认 123456,输入验证码即可登录

image-20220407000053598

4.2 退出登录

登录后可通过右上角 退出登录 按钮退出当前账号

image-20220407000354840

4.3 切换分类

可以同点击相应分类切换题目列表

image-20220407000629099

4.4 镜像环境题目作答

点击相应题目

image-20220407000856016

点击启动环境

image-20220407001024005

启动成功后,回给出环境连接。

image-20220407001047336

复制连接访问作答即可

image-20220407001200664

获取到 flag (答案) 后

image-20220407001228357

将答案提交即可

image-20220407001302876

作答完成效果

image-20220407001323816

4.5 其他

动态、公告排行榜会实时推送更新。

image-20220407001535962

About

基于 Docker 开发的:在线 CTF 竞技平台。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /