由于学校实验室这边
前情提要
由于疫情的结束,可能一些原本线下的比赛就要恢复了,而信息安全线下赛必不可少的、也是最刺激的一个环节——AWD就会恢复了,考虑到实验室之前没有打过AWD,所以这次打算拉上新生一起打一次AWD
选择平台
虽然学院给采购的有某联电子的攻防竞赛平台,But,那个平台没有手册,且纯靠蒙,所以暂时放弃了用它的念头,最后打算使用开源的AWD平台——Cardinal(https://github.com/vidar-team/Cardinal/)
由于队伍数量并没有太多,并且肯定也不能用校园网打,所以使用了一台搭载10代i9、32G RAM的工作站来部署平台和靶机(最后发现整机负载峰值也不到30%)
开始搭建
首先第一步当然是搭建平台了,环境要求:
- Cardinal主程序
- 一个有权限的DataBase
- 手
首先到Cardinal的仓库,我是Ubuntu系统,我选择Cardinal_v0.7.3_linux_amd64.tar.gz下载
创建好一个新的Mysql库来存放Cardinal的数据,然后开始运行Cardinal主程序
# 解压程序包
tar -zxvf Cardinal_VERSION_OS_ARCH.tar.gz
# 赋予执行权限
chmod +x ./Cardinal
# 运行
./Cardinal
第一次运行会初始化,输入比赛开始/结束时间、数据库配置、比赛配置之后会自动生成conf配置文件夹
此时浏览器访问平台(默认端口是19999)会进入选手登录地址,后台地址为/manager
首先第一步要创建队伍,Cardinal的一个小缺点就是不能批量导入队伍,头像可以选择是否上传,上传的好处就是AWD的大屏上会好看一下,创建完毕后会自动生成密码,队伍密码一定要保管好,忘了就只能重置了
队伍创建完毕后开始准备靶机,这次我是打算上一个Web题和一个Pwn题目,制作镜像部分我就忽略了,和制作Ctfd动态靶机镜像大同小异,需要注意的是,由于选手需要连接靶机,记得在DockerFile中添加上安装openssh-server的命令、修改sshd_config允许root用户远程登陆的、以及service ssh restart重启SSH服务,以及将业务端口、SSH端口都转发出来。
Docker容器不能桥接主机网络获取独立IP,这导致所有靶机服务都只能通过Docker的端口转发来连接,为了模拟比赛的环境,这里我先给主机获取了16个IP,随后把所有的Web靶机的服务端口通过Nginx反向代理,来实现每个IP对应独立的靶机的Web服务
靶机创建完成后需要修改靶机密码,这里是我唯一没有找到方法去批量完成的步骤,手动exec进去修改密码
修改完成需要添加到平台,首先创建题目,比如我这里创建Web题目,这里可以设置每次提交flag得分、以及更新flag命令等等,创建完成后到靶机管理菜单,去添加创建好的靶机,不过这里可以批量添加。
添加完成后可以点击导航栏的测试全部靶机连接来批量测试连接情况,如果这里卡了,就尝试一下自己能不能连上SSH,可能是没有给SSH端口转发出来或者没有允许root用户远程登陆。
全部靶机测试没有问题后,这时候已经准备完毕了,比赛开始时给题目设置成可见就OK了
DLC
这里有两个DLC,这两个功能官方没有提供,需要自己实现,首先是AWD的实时大屏
大屏这里用的还是Vidar Team的Asteroid,项目地址(https://github.com/wuhan005/Asteroid_backend)
下载Release后修改./Asteroid_Data/StreamingAssets/asteroid.ini配置文件后运行即可
[connect]
# 后端 WebSocket 接口,可以在 Cardinal 后台找到
url = ws://localhost:19999/api/asteroid
[scene]
# 飞船圆圈半径
radius = 20
其次还有CheckDown功能,顾名思义就是定时去检查靶机的业务服务是否异常,如果异常则要扣除CheckDown的分数,这个功能需要自己实现,不过也不复杂,最简单的使用Python写一个就行
首先在平台后台新建一个管理员账号,勾选Check账号,随后保存token
然后去定时请求,如果超时或者状态码不是200就去请求API判定为CheckDown状态就行
总结
搭建AWD平台与CTF平台不同,需要考虑因素较多且坑多,我这次的Pwn靶机一直踩坑
Pwn的靶机创建时我手头仅有一个elf文件,我偷懒使用了开源的Pwn动态靶机创建的Pwn_Docker项目,但这个项目是适用于Ctfd的靶机,所以我后来rebuild了两次,第一次是因为没有安装openssh服务,第二次是我给平台使用了普通用户,导致平台没有更新靶机flag的权限,所以其实还是自己做镜像比较稳妥