功能定制,靶机定制,商务合作,问题/交流群: 512897146
特别说明, 本作品 前端FlawPlatformMatchVue, 后端FlawPlatformMatch可开源使用,但必须免费提供使用。用于任何形式的商务/盈利活动,请提前联系交流群群主。
靶机制作:https://mp.weixin.qq.com/s/TCVf5XKW20uOc6WfV0QIQQ
基于 Docker, 使用 Python + Django 开发的在线 CTF 竞技平台。
支持在线答题、比赛管理、批量用户导入、动态 Flag、题目实时发布/下架题目、题目Hints(提示)发布/关闭提示、排行、动态、公告、积分等。题目分数为动态分数,做得人越多分越少(会影响之前已答手上的分数)。
目前是用本校于校内比赛,所以批量导入会有学号、班级等信息,excel(.xls) 列为:姓名、班级、学号。
项目为前后端分离项目,前端仓库:https://github.com/S2eTo/FlawPlatformMatchVue
安装依赖环境
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
程序默认使用 SQLite3 数据库,但需要升级,若不想使用 SQLite3 可以直接跳转到下一章 3. 使用Mysql 数据库
获取安装包下载地址:https://www.sqlite.org/download.html
下载 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"
重新加载环境变量
source $HOME/.bash_profile
检查版本
解压项目压缩文件后,cd 切换工作目录到项目文件夹中,与 manage.py
同级
创建迁移记录
pyhton3 manage.py makemigrations
迁移创建数据库
pyhton3 manage.py migrate
centos 直接安装 mariadb 即可
yum -y install mariadb
建议设置只在内网开放 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
检查端口绑定情况
为了安全考虑,哪怕只开在回环口也需要设置登录密码。如果觉得不需要设置,可以跳过这一步
默认密码是空的,可以直接通过 mysql -u root -p
空密码登录即可
这里通过直接更新数据表的方式修改密码
UPDATE user SET Password = PASSWORD('密码') WHERE user = 'root';
刷新
FLUSH PRIVILEGES;
为程序创建一个数据库,名字自定义。但后面配置 Django 时需要填对
flaw_platform
编辑 /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
解压项目压缩文件后,cd 切换工作目录到项目文件夹中,与 manage.py
同级
安装 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
迁移创建数据库
pyhton3 manage.py migrate
通过 yum 一键安装即可
yum -y install docker
编辑服务配置文件
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
重启 Docker 服务
systemctl daemon-reload
systemctl restart docker
检查端口是否开启,如果 netstat command not found
需要安装 net-tools : yum -y install net-tools
netstat -ano | grep 2375
cd 切换工作目录到项目文件夹中,与 manage.py
同级
编辑 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
}
cd 切换工作目录到项目文件夹中,与 manage.py
同级
使用 pip 安装 requirements.txt
pip3 install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
cd 切换工作目录到项目文件夹中,与 manage.py
同级
启动服务
# python3 manage.py runserver IP:PORT
python3 manage.py runserver 10.8.7.46:8000
通过 createsuperuser
创建超级管理员用户
python3 manage.py createsuperuser
即可通过创建的用户民密码登录后台:http://ip:port/admin/
访问站点管理页面:http://xn.gdcp.edu.cn:8001/admin/ (连接为[host/ip]/admin/
),输入用户名密码登录即可。
需要管理时,选择点击左边模块即可。
导入需要特定的 excel 文件,与《信息安全管理与评估》赛项同样的三人一队设计
队伍名称、队员1姓名(队长)、队员1班级、队员1学号、队员2姓名、队员2班级、队员2学号、队员3姓名、队员3班级、队员3学号。
如下是示例。表中设计的名称、姓名均通过随机姓名生成网站生成,如有雷同纯属巧合
这里演示通过微信小程序《金山文档》来收集参赛队伍信息,创建好规定模板文档
点击右上角分享按钮,选择任何人可编辑,点击创建并分享
可以复制连接发送,也可以通过生成二维码的方式要去他人加入分享编辑。
将连接或二维码发送提供参赛选手填写队伍信息即可。
点击左上角选择导出为 Excel(.xls) 即可
进入用户管理界面,点击右上角批量导入用户信息
选择收集好的选手信息文件,点击执行导入即可。程序会自动判断队伍名称、选手是否重复,导入信息时间会很长,请耐心等待直到提示导入完成为止。导入成功后会自动创建队伍、用户并自动关联。**登录用户名(账号)为学号、密码默认 123456 **
特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面
在列表页选择点击用户名一栏即可进入编辑页面
在比赛中基本对选手做个人信息编辑即可,可以调整名字,队伍,积分等。
页面底部可以选择:删除、保存等操作
可以通过用户名(学号)、姓名、邮箱进行搜索,点击搜索按钮右侧的 总共 ..
可以返回所有列表页。
在用户列表页,点击右上角增加用户,进入添加用户页面
输入用户名、密码、确认密码后点击保存即可。
选择需要批量删除的队伍,选择删除所选队伍的动作,点击执行
在确认页面点击确认即可
特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面
进入队伍列表后,选择点击名称一列即可进入编辑页面
选择修改队伍名称或分数,点击保存即可
也可以点击左下角的删除按钮单独删除队伍
删除队伍会同步删除队伍成员
可以根据名称搜索队伍,点击搜索按钮右侧的 总共 ..
可以返回所有列表页。
点击右上角增加队伍进入添加队伍页面
输入用户名点击保存即可
选择队伍,选择删除所选队伍的动作,点击执行
在确认页面点击确认即可
这里有两种使用方法:添加一个比赛后,再次举办比赛时修改改信息就行。或每次举办比赛时添加一个比赛,程序会自动将最新记录作为当前比赛信息。
点击右上角增加比赛,
填写好比赛名称、logo、开始时间、结束时间点击保存即可。
logo和名称的效果位于页面左上角,比赛开始/结束时间用于比赛倒计时,及比赛信息。下面是态势页面,当然不仅态势页面。
在比赛管理列表页,点击比赛名称列可进入编辑页面
完成编辑后点击右下角保存即可
在列表页可以通过赛名称进行搜索
可以删除、批量删除、编辑、搜索、添加、过滤、排序分类,与文档前面的内容过于相似这里不再演示。
可以删除、批量删除、编辑、搜索、添加、过滤、排序题目,与文档前面的内容过于相似这里不再演示
在列表页点击右上角 增加题目 按钮
题目环境选择镜像环境,填入镜像 ID (这里需要本地的docker中存在该镜像)程序会自动根据 镜像ID 获取镜像标签与开发端口信息。镜像Flag形式选择环境变量随机flag
这样的环境本质上就是在容器环境变量中设置一个 RANDOM_FLAG
(可更改) 的环境变量值就是随机生成的 flag,通过PHP等程序可以获取该变量
<?php
echo(getenv('RANDOM_FLAG'));
填写完成基本信息后点击保存即可
在列表页点击右上角 增加题目 按钮
题目环境选择镜像环境,填入镜像 ID (这里需要本地的docker中存在该镜像)程序会自动根据 镜像ID 获取镜像标签与开发端口信息。镜像FLAG样式选择 本地文件随机flag, 填写文件路径、文件内容模板,填写完基本信息即可
如下是题目效果
在列表页点击右上角 增加题目 按钮
将题目环境切换为附件环境,选择附件,设置附件flag,填写完题目信息即可
添加完题目后,选手是看不到题目的,只有 在比赛开始后 在题目列表中点击上架题目
进入确认页面后点击确认即可,题目会实时推送上架,并实时推送公告。
如下公告
选手端小公告效果
在列表页点击下架题目
紧急下架题目后会自动关闭与题目相关的所有容器,这可能会非常耗费资源,谨慎使用。
在列表页可以根据 题目名称、题目来源、题目描述、镜像 ID 进行搜搜
添加靶机(容器)时选择响应题目,点击保存可以生成一个环境
添加成功
特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面
裁判组用户/管理员,可直接访问站点主页:http://xn.gdcp.edu.cn:8001/ (http://ip/host:port/
) 会自动跳转到态势页面,登录后台后可以通过点击右上角的查看站点跳转到态势页面
态势页面连接:http://xn.gdcp.edu.cn:8001/#/twinkingstar(`http://ip:port/#/twinkingstar`),
特别说明:管理员或裁判用户必须加入到名为:裁判组 的队伍中,否则无法访问态势/倒计时页面
访问连接:http://xn.gdcp.edu.cn:8001/#/countdown (http://ip:port/#/countdown
)
设有(每道题)前三作答额外奖励机制,第一额外奖励 20%,第二额外奖励 15%,第三额外奖励 10%.
用户名(账号)为学号,密码默认 123456,输入验证码即可登录
登录后可通过右上角 退出登录 按钮退出当前账号
可以同点击相应分类切换题目列表
点击相应题目
点击启动环境
启动成功后,回给出环境连接。
复制连接访问作答即可
获取到 flag (答案) 后
将答案提交即可
作答完成效果
动态、公告排行榜会实时推送更新。