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 |
|
mysql 安装:
1 |
|
2、准备好基础环境之后,下载 Cardinal。
下载地址:https://github.com/vidar-team/Cardinal/releases这里选择 linux_amd64 的包
下载下来后,通过 SSH 工具将包上传至虚拟机上。
2、解压 .tar.gz
3、由于 mysql 的 root 用户默认为空密码,设置密码比较麻烦,而Cardinal 配置需要 mysql 密码,因此最简单的方式就是新建一个用户,即可。
1 |
|
4、新建 cardinal 数据库。
1 |
|
![image-20240923164427731](F:\new myblog\STUDY\source\img\image-20240923164427731.png)
5、执行 ./Cardinal
首次执行,由于没有配置文件,因此需要跟着向导进行配置,配置完成后,在 Cardinal 的同级目录下的 conf 文件夹下可以看到配置文件Cardinal.toml。
6、按照引导配置成功 Cardinal 平台后,不要关闭 Cardinal 的进程!!!不然平台就直接退出了。
7、Cardinal 搭建成功后,平台地址如下:
管理端地址:http://ip:19999/manager 选手端地址:http://ip:19999
管理端登录的账号密码为刚才引导过程设置的账号密码,选手端账号密码需要在登录管理端之后进行设置。
8、在访问平台的时候,我们在 shell 界面可以看到平台的部分日志信息。
9、至此,AWD Cardinal 平台就已经搭建完毕了。
三、管理端配置
1、管理端配置流程
上载 awd 靶机(通常为 tar 包)至虚拟机并 load 为镜像 -> 根据队伍数量手动创建对应数量的容器 -> 队伍管理页面添加队伍 -> 题目管理页面创建题目 -> 靶机管理页面创建靶机绑定题目并分配给各队伍 -> 在配置管理页面编辑比赛名和 flag 前缀 -> Flag 管理页面生成 flag -> 等待比赛开始。
说明:在命令行配置比赛开始时间时,尽量将比赛设置在至少15-25 分钟后,因为需要留出部分时间在 web 端做相关配置。
2、数据大屏
3、队伍管理
添加队伍,并上传队伍图片 logo,添加队伍后,会弹出队伍账号和密码,需保存。若忘记可通过管理端更改账号密码。
4、题目管理
题目可自定义分数,并可以设置为自动更新 Flag,自动更新 flag默认方式是将 flag 写入根目录下的 flag 文件,当然,flag 存在的位置可以使用命令进行自定义。
5、靶机管理
添加靶机前,需要手动创建对应队伍数量的 docker 容器,这里以三个队伍为例。
创建靶机这里有一个需要注意的一个点是,Flag SSH 的用户必须为 root,否则,flag 是写入不到靶机里的。
设置完成 SSH 账号密码后,可以测试是否可以正常连接。
6、Flag 管理
完成题目和靶机创建后,需要生成 flag。 直接点击 Flag 管理页面的“生成 Flag”即可。
7、配置管理
在管理端配置管理页面可以自定义比赛名称、Flag 前后缀等,也可设置队伍靶机是否相互可见。
若设置队伍靶机相互可见,则在选手端可以看到所有靶机列表内的所有靶机。
8、重建竞赛
因为该平台无法通过 web 页面进行创建比赛,所以只能通过执行 Cardinal 使用命令行进行创建。
非首次创建比赛,默认不会重新进行引导设置,因为 Cardinal 会去加载 conf 文件夹下的 Cardinal.toml 配置文件。
再次创建竞赛时,直接编辑 Cardinal.toml 文件,保存并执行即可。
关于 Cardinal.toml 配置文件,重建竞赛时,只需要关注比赛开始时间、结束时间、轮次刷新时间、攻击/check 分数等项即可。
9、注意事项
需要注意的是,以上配置均需要在竞赛开始前完成。
四、选手端
根据在管理端创建生成的队伍账号密码进行登录。
选手端,可以看到竞赛靶机,提交 Flag,查看排名和公告等。
五、Asteroid 3D 实时大屏配置
Asteroid 是使用 Unity3D 开发的一款 AWD 3D 实时大屏,后端已与 Cardinal 平台深度整合。
Asteroid 下载地址:https://github.com/wuhan005/Asteroid/releases
1、下载后解压压缩包
2、编辑 ./Asteroid_Data/ StreamingAssets/ 目录下的 asteroid.ini 文件。
将 localhost 改为平台 ip 地址并保存,如下:
3、回到 Asteroid_Data 文件夹同级目录,打开 Asteroid.exe。
4、展示效果如下:
六、靶机 check
1、关于 Cardinal 平台的 Check 功能
平台里并没有集成 Check 的功能,Check 和平台是分开的。
平台会为 Check 提供一个 Check 账号,用来请求题目接口进行扣分。
账号管理 -> 添加管理员账号 -> 勾选“Check 账号”。
当 Check 检测到靶机服务器不可用时,Check 会使用管理员账号向平台接口发送请求,平台收到后将对应靶机状态设为 Down,并在本轮结束分数结算时扣分。
2、Check 示例脚本
1 |
|
3、如何实现自动 Check
由于 Cardinal 平台不能实现自动 Check 功能,因此若想实现自动 Check,需依赖第三方工具。这里推荐 Linux 下的 Crontab 定时任务工具来实现 Check 脚本的定时运行。
Crontab 定时任务工具使用教程,请参见
七、靶机的批量创建与重置
1、靶机的批量创建
Cardinal AWD 平台并未集成关于靶机的创建和靶机的重置功能,因此,正常情况下,需要我们通过手动方式去创建靶机(docker 容器)。这种方式可行,但是如果队伍对较多或靶机数量多的时候,手动创建靶机是一件非常麻烦的事情,因此我们可以使用 shell 脚本去实现批量创建靶机的功能。
2、批量创建靶机 shell 脚本
执行脚本,根据提示输入需要创建靶机的 docker images、服务端口以及数量即可。
脚本涉及参数可根据靶机情况自行修改使用。
3、重置靶机
与靶机的创建一样,Cardinal AWD 平台依然没有集成重置靶机的功能,所以我们还是使用 shell 脚本来实现该功能。
重置靶机的功能我们虽然可以使用 shell 脚本的方式来实现,但是,重置扣分的行为并无法实现,需要我们手动来进行统计。后续再对平台的研究过程中会逐步考虑该功能的加入。
4、重置靶机 shell 脚本
重置靶机的功能是依据队伍靶机的端口来进行寻找的,因为队伍对应靶机的端口是唯一的。
根据提示,输入队伍对应靶机的端口号,这里限制了需要同时输入 http 服务和 ssh 服务的端口来判断队伍的唯一性,如果输入的 http服务端口和 ssh 服务端口是不同靶机的,则会要求重新输入。
脚本详见附件 reset_target.sh
八、靶机的隔离与全通
在 AWD 竞赛中,通常在比赛开始后的前半小时至一小时的时间是加固时间。在加固时间段内,每支队伍只能访问自己队伍的靶机,不能访问和攻击其他队伍的靶机。但是,这个功能该平台是无法实现的,因此我们利用 iptables 探索出了一个新的方案。
1、iptables 实现端口隔离
实验原理:配置 iptables 规则,来限制指定 ip(或 ip 段)访问指定端口。由于我们使用和访问的端口是容器映射到虚拟机上的端口,要实 现真正的端口隔离,我们就需要将 iptables 规则配置在 DOCKER-USER 链上,同时添加链接追踪模块,来负责解决 docker 容器内部 ip和端口与虚拟机 ip 和端口不匹配的问题。
Demo:
解释:
限制 192.168.63.180 只能访问该靶机的 8801 端口,其他同理。最后一条限制其他 ip 访问。其中,ens33 为虚拟机网卡。
当队伍数量(含 ip 数量)交多的时候,我们如果手动来去创建iptables 规则,会相当的麻烦,因此,我们还是使用批量 shell 脚本来实现该功能。
批量创建 iptables 规则实现隔离的批量脚本详见附件:create_iptbs.sh
2、iptables 实现所有队伍(选手)与所有靶机全通
当加固时间结束后,需要保证以下两点:第一,所有队伍的所有选手与所有靶机是可以通信的;第二,除了参赛队伍 ip 以外的所有ip 进制访问竞赛靶机。
实现所有选手与所有靶机全通的难度要比实现隔离的难度要低一些,规则跟实现隔离的规则差不多,demo 如下:
脚本的原理:添加规则允许所有参赛选手访问所有靶机的所有端口。
脚本详见附件:del_iptbs.sh
九、其他
1、关于比赛时间的设置
创建竞赛前,需确认平台宿主机时间是否为东八区时间,以免竞赛时间设置错误。
1 |
|
若时区不符合东八区时间,请参见解决方案:Linux 下修改时区为东八区2、一定要留出足够的时间来配置题目,尽量提前创建竞赛,或尽量将比赛设置在 15-25 分钟后的时间作为开始时间,留出足够的时间来进行队伍、题目、靶机等功能的配置。
3、建议 Cardinal 使用 mysql 的非 root 用户,并设置好复杂密码。 4、关于 AWD 靶机 Check 问题,靶机的 Check 脚本需要根据不同的靶机来定制编写,编写时按照上述平台对于 Check 接口的定义来编写,可将 Check 结果上传至平台进行数据的处理。