AWD的搭建

一、About Cardinal
Cardinal 由 Vidar-Team 团队开发,接受并允许各大高校、安全团队、技术爱好者使用 Cardinal 作为比赛训练平台或举办内部训练赛。

环境要求:

(1) 基础操作系统(ubuntu、centos、Windows 等)
(2) docker 环境(含 docker-compose)
(3) mysql 数据库
(4) python 环境

二、Cardinal 部署过程
1、ubuntu 和 centos 默认是没有 docker 和 mysql 的,因此在环境部署开始前需要安装 docker 和 mysql。
Docker 安装可以使用官方安装脚本自动安装:

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

mysql 安装:

1
2
apt-get update
apt-get install mysql-server

2、准备好基础环境之后,下载 Cardinal。
下载地址:https://github.com/vidar-team/Cardinal/releases这里选择 linux_amd64 的包

image-20240923164317850

下载下来后,通过 SSH 工具将包上传至虚拟机上。

2、解压 .tar.gz

image-20240923164353903

3、由于 mysql 的 root 用户默认为空密码,设置密码比较麻烦,而Cardinal 配置需要 mysql 密码,因此最简单的方式就是新建一个用户,即可。

1
GRANT ALL PRIVILEGES ON *.* TO 'cardinal'@'%' IDENTIFIED BY 'cardinal' WITH GRANT OPTION; 

4、新建 cardinal 数据库。

1
CREATE DATABASE `cardinal` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

![image-20240923164427731](F:\new myblog\STUDY\source\img\image-20240923164427731.png)

5、执行 ./Cardinal

首次执行,由于没有配置文件,因此需要跟着向导进行配置,配置完成后,在 Cardinal 的同级目录下的 conf 文件夹下可以看到配置文件Cardinal.toml。

image-20240923164448841

image-20240923164457793

6、按照引导配置成功 Cardinal 平台后,不要关闭 Cardinal 的进程!!!不然平台就直接退出了。
7、Cardinal 搭建成功后,平台地址如下:

管理端地址:http://ip:19999/manager 选手端地址:http://ip:19999

管理端登录的账号密码为刚才引导过程设置的账号密码,选手端账号密码需要在登录管理端之后进行设置。

image-20240923164521861

image-20240923164528676

8、在访问平台的时候,我们在 shell 界面可以看到平台的部分日志信息。

image-20240923164539997

9、至此,AWD Cardinal 平台就已经搭建完毕了。

三、管理端配置
1、管理端配置流程
上载 awd 靶机(通常为 tar 包)至虚拟机并 load 为镜像 -> 根据队伍数量手动创建对应数量的容器 -> 队伍管理页面添加队伍 -> 题目管理页面创建题目 -> 靶机管理页面创建靶机绑定题目并分配给各队伍 -> 在配置管理页面编辑比赛名和 flag 前缀 -> Flag 管理页面生成 flag -> 等待比赛开始。
说明:在命令行配置比赛开始时间时,尽量将比赛设置在至少15-25 分钟后,因为需要留出部分时间在 web 端做相关配置。
2、数据大屏

image-20240923164601525

3、队伍管理
添加队伍,并上传队伍图片 logo,添加队伍后,会弹出队伍账号和密码,需保存。若忘记可通过管理端更改账号密码。

image-20240923164616693

image-20240923164623791

4、题目管理
题目可自定义分数,并可以设置为自动更新 Flag,自动更新 flag默认方式是将 flag 写入根目录下的 flag 文件,当然,flag 存在的位置可以使用命令进行自定义。

image-20240923164640310

5、靶机管理
添加靶机前,需要手动创建对应队伍数量的 docker 容器,这里以三个队伍为例。

image-20240923164656007

创建靶机这里有一个需要注意的一个点是,Flag SSH 的用户必须为 root,否则,flag 是写入不到靶机里的。

image-20240923164718071

设置完成 SSH 账号密码后,可以测试是否可以正常连接。

image-20240923164729286

6、Flag 管理

完成题目和靶机创建后,需要生成 flag。 直接点击 Flag 管理页面的“生成 Flag”即可。

image-20240923164744601

7、配置管理
在管理端配置管理页面可以自定义比赛名称、Flag 前后缀等,也可设置队伍靶机是否相互可见。
若设置队伍靶机相互可见,则在选手端可以看到所有靶机列表内的所有靶机。
8、重建竞赛
因为该平台无法通过 web 页面进行创建比赛,所以只能通过执行 Cardinal 使用命令行进行创建。
非首次创建比赛,默认不会重新进行引导设置,因为 Cardinal 会去加载 conf 文件夹下的 Cardinal.toml 配置文件。
再次创建竞赛时,直接编辑 Cardinal.toml 文件,保存并执行即可。

image-20240923164758772

关于 Cardinal.toml 配置文件,重建竞赛时,只需要关注比赛开始时间、结束时间、轮次刷新时间、攻击/check 分数等项即可。
9、注意事项

​ 需要注意的是,以上配置均需要在竞赛开始前完成。

四、选手端

​ 根据在管理端创建生成的队伍账号密码进行登录。

image-20240923164833089

选手端,可以看到竞赛靶机,提交 Flag,查看排名和公告等。

五、Asteroid 3D 实时大屏配置
Asteroid 是使用 Unity3D 开发的一款 AWD 3D 实时大屏,后端已与 Cardinal 平台深度整合。

Asteroid 下载地址:https://github.com/wuhan005/Asteroid/releases

image-20240923164903182

1、下载后解压压缩包

image-20240923164915894

2、编辑 ./Asteroid_Data/ StreamingAssets/ 目录下的 asteroid.ini 文件。

将 localhost 改为平台 ip 地址并保存,如下:

image-20240923164940685

3、回到 Asteroid_Data 文件夹同级目录,打开 Asteroid.exe。

4、展示效果如下:

image-20240923164954387

六、靶机 check
1、关于 Cardinal 平台的 Check 功能
平台里并没有集成 Check 的功能,Check 和平台是分开的。
平台会为 Check 提供一个 Check 账号,用来请求题目接口进行扣分。

账号管理 -> 添加管理员账号 -> 勾选“Check 账号”。

image-20240923165012778

当 Check 检测到靶机服务器不可用时,Check 会使用管理员账号向平台接口发送请求,平台收到后将对应靶机状态设为 Down,并在本轮结束分数结算时扣分。

2、Check 示例脚本

1
2
3
4
5
6
7
8
9
10
11
import requests 
# Check 判断逻辑
# 发送 CheckDown 信息到平台
TOKEN = 'CHECK_MANAGER_TOKEN_HERE' # Check Token
GameBoxID = 1
resp = requests.post('http://localhost:19999/api/manager/checkDown',
json={'GameBoxID': GameBoxID},
headers={'Authorization': TOKEN}).json()

if resp['error'] != 0:
print(resp['msg'])

3、如何实现自动 Check
由于 Cardinal 平台不能实现自动 Check 功能,因此若想实现自动 Check,需依赖第三方工具。这里推荐 Linux 下的 Crontab 定时任务工具来实现 Check 脚本的定时运行。

Crontab 定时任务工具使用教程,请参见

七、靶机的批量创建与重置
1、靶机的批量创建
Cardinal AWD 平台并未集成关于靶机的创建和靶机的重置功能,因此,正常情况下,需要我们通过手动方式去创建靶机(docker 容器)。这种方式可行,但是如果队伍对较多或靶机数量多的时候,手动创建靶机是一件非常麻烦的事情,因此我们可以使用 shell 脚本去实现批量创建靶机的功能。
2、批量创建靶机 shell 脚本
执行脚本,根据提示输入需要创建靶机的 docker images、服务端口以及数量即可。

脚本涉及参数可根据靶机情况自行修改使用。

image-20240923165240321

3、重置靶机
与靶机的创建一样,Cardinal AWD 平台依然没有集成重置靶机的功能,所以我们还是使用 shell 脚本来实现该功能。
重置靶机的功能我们虽然可以使用 shell 脚本的方式来实现,但是,重置扣分的行为并无法实现,需要我们手动来进行统计。后续再对平台的研究过程中会逐步考虑该功能的加入。

4、重置靶机 shell 脚本
重置靶机的功能是依据队伍靶机的端口来进行寻找的,因为队伍对应靶机的端口是唯一的。
根据提示,输入队伍对应靶机的端口号,这里限制了需要同时输入 http 服务和 ssh 服务的端口来判断队伍的唯一性,如果输入的 http服务端口和 ssh 服务端口是不同靶机的,则会要求重新输入。

image-20240923165305211

脚本详见附件 reset_target.sh

八、靶机的隔离与全通
在 AWD 竞赛中,通常在比赛开始后的前半小时至一小时的时间是加固时间。在加固时间段内,每支队伍只能访问自己队伍的靶机,不能访问和攻击其他队伍的靶机。但是,这个功能该平台是无法实现的,因此我们利用 iptables 探索出了一个新的方案。
1、iptables 实现端口隔离
实验原理:配置 iptables 规则,来限制指定 ip(或 ip 段)访问指定端口。由于我们使用和访问的端口是容器映射到虚拟机上的端口,要实 现真正的端口隔离,我们就需要将 iptables 规则配置在 DOCKER-USER 链上,同时添加链接追踪模块,来负责解决 docker 容器内部 ip和端口与虚拟机 ip 和端口不匹配的问题。
Demo:

image-20240923165354383

解释:
限制 192.168.63.180 只能访问该靶机的 8801 端口,其他同理。最后一条限制其他 ip 访问。其中,ens33 为虚拟机网卡。
当队伍数量(含 ip 数量)交多的时候,我们如果手动来去创建iptables 规则,会相当的麻烦,因此,我们还是使用批量 shell 脚本来实现该功能。
批量创建 iptables 规则实现隔离的批量脚本详见附件:create_iptbs.sh
2、iptables 实现所有队伍(选手)与所有靶机全通
当加固时间结束后,需要保证以下两点:第一,所有队伍的所有选手与所有靶机是可以通信的;第二,除了参赛队伍 ip 以外的所有ip 进制访问竞赛靶机。
实现所有选手与所有靶机全通的难度要比实现隔离的难度要低一些,规则跟实现隔离的规则差不多,demo 如下:

image-20240923165409303

脚本的原理:添加规则允许所有参赛选手访问所有靶机的所有端口。

脚本详见附件:del_iptbs.sh

九、其他
1、关于比赛时间的设置
创建竞赛前,需确认平台宿主机时间是否为东八区时间,以免竞赛时间设置错误。

1
date -R    #查看当前时区 

若时区不符合东八区时间,请参见解决方案:Linux 下修改时区为东八区2、一定要留出足够的时间来配置题目,尽量提前创建竞赛,或尽量将比赛设置在 15-25 分钟后的时间作为开始时间,留出足够的时间来进行队伍、题目、靶机等功能的配置。
3、建议 Cardinal 使用 mysql 的非 root 用户,并设置好复杂密码。 4、关于 AWD 靶机 Check 问题,靶机的 Check 脚本需要根据不同的靶机来定制编写,编写时按照上述平台对于 Check 接口的定义来编写,可将 Check 结果上传至平台进行数据的处理。


AWD的搭建
https://theganlove.github.io/2024/09/23/AWD的环境/
作者
uert
发布于
2024年9月23日
许可协议