程序基于 Docker ,使用 Python + Django 前后端分离开发的在线答题程序
项目为前后端分离项目,前端仓库:https://gitee.com/J0hNs0N/FlawPlatformVue
安装依赖环境
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
下载 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.2.tgz
创建安装目录
mkdir -p /usr/local/python3
解压安装包
tar -zxvf Python-3.7.2.tgz
安装 gcc
yum install gcc -y
Python 3.7 版本之后需要多安装一个依赖环境
yum install libffi-devel -y
进入解压后的 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"
![image-20220330230801271](D:\广东省大学生计算机设计大赛\说明文档\FlawPlatform 漏洞靶场\image-20220330230801272.png)
重新加载环境变量
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
# 2.Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 2.Settings user and group are ignored when systemd is used.
# 2.If you need to run mysqld under a different user or group,
# 2.customize your systemd unit file for mariadb according to the
# 2.instructions in http://fedoraproject.org/wiki/Systemd
# 2.设置绑定的 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
#
# 2.include all files from the config directory
#
!includedir /etc/my.cnf.d
重启服务
systemctl restart mariadb
检查端口绑定情况
![image-20220329152729950](D:\广东省大学生计算机设计大赛\说明文档\FlawPlatform 漏洞靶场\image-20220329152729950-16488048778422.png)
为了安全考虑,哪怕只开在回环口也需要设置登录密码。如果觉得不需要设置,可以跳过这一步
默认密码是空的,可以直接通过 mysql -u root -p
空密码登录即可
这里通过直接更新数据表的方式修改密码
UPDATE user SET Password = PASSWORD('密码') WHERE user = 'root';
刷新
FLUSH PRIVILEGES;
为程序创建一个数据库,名字自定义。但后面配置 Django 时需要填对
flaw_platform
编辑 /etc/my.conf
,设置 编码。记得重启 mariadb 服务
[client]
# 2.设置编码
default-character-set=utf8
[mysql]
# 2.设置编码
default-character-set=utf8
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 2.Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# 2.Settings user and group are ignored when systemd is used.
# 2.If you need to run mysqld under a different user or group,
# 2.customize your systemd unit file for mariadb according to the
# 2.instructions in http://fedoraproject.org/wiki/Systemd
# 2.设置绑定地址
bind-address=127.0.0.1
# 2.设置编码
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
#
# 2.include all files from the config directory
#
!includedir /etc/my.cnf.d
解压项目压缩文件后,cd 切换工作目录到项目文件夹中,与 manage.py
同级
安装 mysqlclient
pip3 install mysqlclient
出现报错以下两种方法解决
# 2.更新pip
pip3 install --upgrade pip
# 2.安装 mysql-devel
yum install mysql-devel
编辑 common/settings.py
文件
vim common/settings.py
进行如下修改, 注意保存
# 2.Database
# 2.https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
'default': {
# 2.'ENGINE': 'django.db.backends.sqlite3',
# 2.'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql', # 2.数据库引擎
'NAME': '', # 2.数据库名,先前创建的
'USER': 'root', # 2.用户名,可以自己创建用户
'PASSWORD': 'xxxx', # 2.密码
'HOST': '127.0.0.1', # 2.mysql服务所在的主机ip
'PORT': '3306', # 2.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',
# 2.外部映射地址, 只起到显示作用。同时是提供外部访问容器端口的地址
'EXTERNAL_URL': '10.8.7.46',
# 2.随机 Flag 设置的环境变量名称,建议默认
'FLAG_ENVIRONMENT_NAME': 'RANDOM_FLAG',
# 2.自动删除容器/靶机时间如: +1 为一小时后自动关闭
'AUTO_REMOVE_CONTAINER': +1
}
已 QQ 邮箱为例子,打开 QQ 邮箱 点击设置
点击账户
![image-20220211005355961](D:\广东省大学生计算机设计大赛\说明文档\FlawPlatform 漏洞靶场\image-20220211005355962.png)
将服务全部开启
点击生成授权码获取授权码
![image-20220211005502921](D:\广东省大学生计算机设计大赛\说明文档\FlawPlatform 漏洞靶场\image-20220211005502922.png)
配置 common/settings.py
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
同级
启动服务
# 2.python3 manage.py runserver IP:PORT
python3 manage.py runserver 10.8.7.46:8000
通过 createsuperuser
创建超级管理员用户,我这里设置的用户为:gdcp_flawplatform_admin
,密码:gdcp123abc..
python3 manage.py createsuperuser
即可通过创建的用户民密码登录后台:http://ip:port/admin/
打开项目文件 src/common/http-service.js
根据后端部署的地址和端口进行设置
在项目目录文件夹下 使用 npm run build
进行打包,注意与 package.json
同目录
打包完成后回生成一个 dist 目录
将生成的文件部署到 http 服务中即可
这里使用 httpd 提供 http 服务,通过 yum 安装
yum -y install httpd
安装成功后,将打包的前端程序部署到 www 站点目录下
这里最好重启一下服务
systemctl restart httpd
即可通过浏览器访问
进入子页面后,可通过 breadcrumbs
跳转至父级页面(这里只是演示)
在浏览器访问 http://127.0.0.1:8000/admin
进入后台登录界面,输入用户名密码,点击登录进入后台。这里使用的是超级管理员账户,如果没有账户请回到本文 2.2.5 创建管理员账户 一章进行创建
登录成功
登录成功点击右上角 修改密码
根据提示要求,输入旧密码、新密码、新密码确认后点击右下角修改我的密码即可
点击题目可以进入题目列表
点击右上角增加 题目 +
进入添加界面
可选择题目环境:镜像环境或附件环境,默认为镜像环境。镜像环境模式下可选择 Flag 形式:环境变量随机 FLAG或文件内容随机FLAG,默认为环境变量随机 FLAG
这里以**j0hns0n/view_source:latest ID:81fb8003157e
**为例
填写完成 镜像ID 后程序会自动调用 Docker API 获取镜像信息:镜像标签与开放端口信息
填写完相应信息后点击保存即可添加成功
添加成功后会在列表中展示(当题目超过十条时,会自动分页,每页十条)
这里以 j0hns0n/robots:latest ID: 31d68e72be64
为例
1、选择本地文件随机FLAG形式,2、填写文件路径(程序会自动随机成FLAG,写入到填写的文件路径中),填写文件内容模板 {}
为FLAG 存放的位置
填写完成题目信息后点击保存即可
保存成功后会在列表中展示
选择题目环境为:附件环境、上传附件、设置附件FLAG:这里填写的 FLAG 不会影响附件内的FLAG,值用于校验。所以附件中应已有FLAG存在。
填写基本信息后点击保存即可
发布成功后会在列表中显示
在题目列表中可根据:题目名称、来源、描述、镜像 ID 进行搜索,输入搜索内容点击搜索即可
点击总共 [num]
可返回所有题目列表
题目列表右侧过滤器可以选择: 题目难度、题目环境、题目类型、题目状态、创建时间、最近更新时间 进行多选过滤
点击 “清除所有过滤器” 来显示所有内容
点击题目名称可进入编辑相应题目
修改完成后点击保存即可
删除题目后,会自动清理题目附件,但不会影响 Docker 镜像。
可以通过列表处的多选,使用 ”删除所选题目“ 的动作点击执行,删除选中的题目
在列表处,点击题目名称进入题目详细
在点击底部的按钮进行删除,进行删除
题目状态为下架时,前台是不会显示下架题目的。只有当题目状态为上架才会显示在前台的页面中
可以通过列表处的题目状态选择上/下架,选择完成后点击保存即可
前台效果
点击题目名称进入题目详细
在题目中的题目状态选择相应状态后点击保存即可
前台效果
重新上架后会显示在相应类型中
前台效果:进入相应题目类型
即可看到题目
可以在列表页点击表头进行排序
首次点击,如下效果为正序
再次点击为降序
鼠标移到表头处,点击如下按钮可清除该列的排序
可多列同时进行排序
用户启动题目容器后会在后台显示
点击右上角增加 靶机(容器)
选择题目(可以根据题目名称进行搜索)
选择好后点击保存
添加成功后,可以看到开放端口的信息 (当题目超过十条时,会自动分页,每页十条)
可以通过浏览器访问
在题目列表中可根据:题目名称、用户名称、容器ID、镜像 ID 进行搜索,输入搜索内容点击搜索即可(这里我为了演示效果所有加多了一条数据)
点击 **总共 [num]
** 可返回所有靶机(容器)列表
题目列表右侧过滤器可以选择: 创建时间、最近更新时间 进行多选过滤
点击 “清除所有过滤器” 来显示所有内容
这里设计是一旦开启(环境)容器就无法镜像修改任何内容
点击容器 ID 只能查看题目详细信息
可以通过列表处的多选,使用 ”删除所选靶机(容器)“ 的动作点击执行,删除选中的靶机(容器)
在列表处,点击容器 ID 进入靶机(容器)详细
点击底部的按钮进行删除,进行删除
可以在列表页点击表头进行排序
首次点击,如下效果为正序
再次点击为降序
鼠标移到表头处,点击如下按钮可清除该列的排序
可多列同时进行排序
用户在成功答题后,会答题记录中添加一条记录,在后台只有查看的权限。无法进行:增、删、改操作,
在首页点击用户进入用户列表页面
进入用户列表后,点击右上角 增加用户
按照提示要求,完成填写用户名密码,点击保存即可
保存成功后会进入该用户的详细编辑界面
这里只提一些较为难理解的权限方面的帮助
如下有三种状态:有效、工作人员、超级用户状态。其中在有效被选中时用户才可进行登录,当工作人员被勾选时可以登录后台,但不给予具体的权限只是能登录后台而已,无法进行任何操作。当勾选超级用户状态,无需给予具体权限可登录和操作后台所有功能(除开发者直接限制之外)。
前面说到可以分配具体权限,有两种形式:将用户添加到特定用户组中或者直接给予用户权限, 用户组后面说
对一个模块权限分为:Can add 添加、Can change 修改、Can delete 删除、Can view 查看。
选择相应权限,点击中间的右箭头添加权限
添加后效果
为了方便演示,勾选上工作人员状态
点击保存
保存成功后可以看到工作人员状态已开启
点击右上角注销,退出当前账户
点击重新登录
使用刚刚添加的用户进行登录
登录到后台,可以看到当前用户只能对题目进行管理
选择 ”选中的 用户权限“ 里的权限,点击左箭头可以删除分配的权限
登录后可以看到没有任何的权限
进入用户详细界面,点击 “这个表单” 进行密码修改
根据提示要求,填写新密码,与确认密码点击右下角修改密码即可,此处为强制修改,无需输入旧密码。
在题目列表中可根据:用户名、姓氏、名字、邮箱进行搜索查询
点击 **总共 [num]
** 可返回所有用户列表
用户列表右侧过滤器可以选择: 工作人员状态、超级用户状态、是否有效、用户组 进行多选过滤
点击 “清除所有过滤器” 来显示所有内容
可以通过列表处的多选,使用 ”删除所选 用户“ 的动作点击执行,删除选中的用户
在列表处,点击用户名进入用户详细页面
点击底部的按钮进行删除,进行删除
点击认证和授权中的 组 进入用户组列表
进入用户组列表后点击右上角 增加 组
输入用户组名称后,选择需要给予的权限,点击右箭头进行添加
选择好后, 点击保存即可
保存成功后会在列表中显示 (当题目超过十条时,会自动分页,每页十条)
进入用户详细,当前是刚刚演示中添加的用户 user001, 选择相应用户组,点击右箭头进行添加
重新登录后可以看到效果与直接分配权限是一样的
用于存储生成的验证码,让其在后台显示的初衷是防止验证码垃圾数据过多,可以定时在后台清理记录。
用于存储生成的有效认证 Token,让其在后台显示的初衷是防止验证码垃圾数据过多,可以定时在后台清理记录。
打开站点后, 若没有登录,会自动跳转到登录页面。在登录页面点击 “点击注册” 跳转到注册页面
输入邮箱,验证码点击立即注册,成功后会提示邮件已经发送指邮箱
打开邮件后,可以看到提示点击连接完成注册,该链接 30 分钟内有效,超过 30 分钟后就需要重新获取。若收件箱中没有邮件,请检查邮箱地址是否正确,并查看垃圾邮件,检查邮件是否被拦截
点击连接后会跳转到完成注册页面
根据提示完成输入:用户名密码及确认密码,验证码点击提交即可
注册完成后会自动跳转到登录页面
在登录页面根据提示输入用户名密码,验证码点击登录即可
登录成功后会自动跳转到主页
鼠标放在右上角的 “用户名和头像” 上,会显示 “个人中心” 及 “退出” 按钮,点击 “退出” 。会退出当前登录并跳转到登录页面
在登录页面点击 “忘记密码?” 进入找回密码页面
根据提示输入注册时的邮箱,验证码点击 “发送重置密码邮箱” 即可
根据提示,在 30 分钟内点击右键中连接进行密码重置。若 30 分钟内为进行密码重置,该链接会失效,需要重新获取。若收件箱中没有邮件,请检查邮箱地址是否正确,并查看垃圾邮件,检查邮件是否被拦截
跳转到重置密码页面后,根据提示输入密码、确认密码及验证码点击提交即可
重置成功后会跳转到登录页面
鼠标放在右上角的 “用户名和头像” 上,会显示 “个人中心” 及 “退出” 按钮,点击 “个人中心” 。会跳转到当前用户的个人中心页面
在个人中心页面可以看到自己的答题记录,邮件地址、当前积分等信息
鼠标移动到头像上回提示 “更换头像” ,点击更换头像,会弹出文件选择窗口, 图片只允许 JPG 格式图片,大小最大在 400 × 400 像素。
选择好后,即可替换成功。
点击相应分类,注:并不是只有 Web 分类能设置镜像环境题目,而是我只在 Web 分类中添加了镜像环境
进入题目后可以看到相题目,当当前分类及难度题目数量大于10题,会自动分页每页 10 题。
可以通过难度一栏切换当前分类的难度级别
点击 “入门” 切换至 入门难度,当前无入门难度的题目。
点击题目可进入题目详细页面
点击启动在线场景
启动成功后会显示当前环境的连接,和倒计时,倒计时结束后,程序会自动销毁当前环境。
访问提供的环境连接即可进行答题
找到题目中的 Flag 后,将 Flag 输入到输入框中,点击提交即可
提交成功后,会自动加分。
当不需要环境时,可以点击 “删除场景” -> “确认” 进行删除
答题完成后,在题目列表中,相应题目会变成金色
可以在个人中心看到答题记录,及当前分数
一个用户无法同时启动多个环境,当已经存在启动环境时,会提示:已启动 xxx 题目的环境,是否将其关闭并启动当前容器?
当点击确认后,会关闭正在允许的环境,启动当前题目环境
进入到附件题目,点击附件,可以下载附件
找到 flag 后,输入 Flag 点击提交即可
提交成功
答题完成后,在题目列表中,相应题目会变成金色
在排行榜中会显示,Top 10 的用户,只有积分大于 0 的情况下才会上榜。