本文发布于398天前,本文最后更新于349 天前,其中的信息可能已经过时,如有错误请留言或评论。
很长时间没有写博客了,开学之后一直在复习考研,在看数学,今天开始上微专业课,需要搭建AWD平台,所以特此学习一下WAD,并且记录一下如何搭建。
AWD的介绍
什么是AWD
AWD(attack with defence)攻防兼备模式 AWD模式是一个非常有意思的模式,你需要在一场比赛里扮演攻击方和防守方,攻击成功得分, 失守也会扣除相应的分数。在比赛中,评分的关键点是flag,通过漏洞攻击得到flag,可以获取分数;反之,失守flag会被扣除相应的分数。从而模拟现实的网络攻击防御,以此提高选手的网络攻防能力。
特点: 选手同时具备攻击方和防守方两种角色,对选手的攻击能力、防御能力、团队协作能力及实时 的应变能力都是极大的考验,更偏向实战能力的较量。
比 赛 规 则 和 内 容
- 一般分配web服务器和pwn服务器(称:gamebox),多数为linux,在某处存在 flag(一般存放在根目录);通常是一个GameBox就是一个题,一场比赛通常是2-3个 GameBox
- 参赛选手需保证所有GameBox向外映射的所有端口正常开启,且提供的服务功能正常。
- 尽快修复本团队GameBox上的漏洞,防止其他选手利用相关漏洞攻破GameBox获 取Flag。
- 尽可能多的获取其他选手GameBox上的Flag串并提交。
- 可能会提供一台流量分析的虚拟机,可以下载流量文件进行数据分析(较少提供) 比赛一般分为两个阶段,前期加固阶段,后期的攻防阶段(此时还可对自己靶机进行加固操作);
- 此比赛模式在线下独立局域网模式举行;
- 比赛前每个队伍有一个初始分值(比如50000分)。
- Flag会在主办方的设定下每隔一定时间刷新一轮;在同一轮内,无法多次利用同一 对手的同一台GameBox上的Flag得分。
- 每个队伍的每台GameBox在同一轮中被对手成功获取Flag后会被扣分
- 裁判方会对所有选手靶机服务进行相关check,宕机扣分(有些比赛会把扣除的分值给check正常的队伍均分);
- 每个队伍会分配一个低权限账户(非root);
- 禁止对服务器平台进行攻击Ddos等,一经发现,终止比赛后果自负;
题 目 类 型 分 析
- 语言:多数php、少数java、python站;
- 常见出题人自己写的cms,添加对应的漏洞点;
- 常见或不常见的一些cms,网上均有exp;
- 一些框架漏洞;(thinkphp、MVC)
- Pwn
- WEB:
- 主要包括HTTP 协议、注入漏洞、XSS 漏洞、SSRF 漏洞、CSRF 漏洞、文件处理漏洞、访问控制漏洞、会话管理漏洞等
- PHP网站
- SQL注入
- 文件包含
- php反序列化
- 任意命令执行
- 任意文件读取
- 最新cms框架漏洞
- JAVA网站(Tomcat、Resin、Jboss、Weblogic)
- 命令执行(JSP一句话木马等)
- SQL注入
- 条件竞争(Servlet线程不安全)
- SSRF
- 文件上传
- 代码执行(Java反射机制)
- 任意文件读取/目录遍历攻击
- Python网站(Django、flask、Tornado)
- SQL注入
- 模板注入 SSTI
- 任意命令执行
- 文件上传
- 文件包含
- 反序列化
- 格式化字符串
G e t f l a g
- 一种flag预留在靶机的根目录或家目录下,getshell后读取flag内容,提交即可得分;
- 另一种有专门的flag靶机,成功getshell后,通过执行curl http://x.x.x.x/ ,即可从flag服务器中获取flag;
竞赛分工
- 此类比赛一般为多人成队 建议成员分配:
- 攻击2人:通过各种手段获取对手flag;
- 防守2人:对自己靶机持续加固,并进行流量分析和有利信息的及时通报;
- 注:比赛中可能有多台靶机,也可一人维护一台,根据自己组内选手的专业情况进行 相关分配。
简单介绍就到这里,上面内容都来自老师ppt,还有一些没有放上来。
搭建AWD平台
之前一直用的kali2022,安装了很多东西,今天顺便有时间,安装了个kali2023,然后从头开始配置
Kali换源参考Linux换源
安装docker
sudo apt install docker.io
下载项目
下载后解压到本地,我这里有老师给的包,就没去github下载
git clone https://github.com/zhl2008/awd-platform
拉取镜像
# 拉取镜像,要是下载太慢就换个docker源 sudo docker pull zhl2008/web_14.04 # 重命名镜像 sudo docker tag zhl2008/web_14.04 web_14.04
启动比赛
- 进入项目
cd awd-platform
- 创建队伍
注意这里是python2,使用python3会报错python2 batch.py web_yunnan_simple 3 # 创建了3个队伍,赛题是web_yunnan_simple
运行结果如下
[*] copy team1 [*] chmod all [*] write run.sh team1 [*] write docker.sh team1 [*] write flag.py team1 [*] chmod run.sh & docker.sh team1 [*] copy team2 [*] chmod all [*] write run.sh team2 [*] write docker.sh team2 [*] write flag.py team2 [*] chmod run.sh & docker.sh team2 [*] copy team3 [*] chmod all [*] write run.sh team3 [*] write docker.sh team3 [*] write flag.py team3 [*] chmod run.sh & docker.sh team3
- 可以根据赛题修改check.py(awd-platform/check_server/目录下)文件,找到check类修改为以下内容(仅限此题)
class check(): def __init__(self): print "checking host: "+host def index_check(self): res = http('get',host,port,'/','',headers) if 'Home' in res: return True if debug: print "[fail!] index_fail" return False def test_check(self): res = http('get',host,port,'/about.php?file=header.php','',headers) if 'About' in res: return True if debug: print "[fail!] test_fail" return False def test_check_2(self): headers['Cookie'] = '' data = 'key=1' res = http('get',host,port,'/services.php',data,headers) if 'Services' in res: return True if debug: print "[fail!] test_2_fail" return False
- 也可以修改flag刷新时间,同样是check.py文件中,默认120s,2分钟
sleep_time = 120
- 创建好队伍后就可以开始比赛了,输入命令启动比赛
sudo python2 start.py ./ 3
启动成功如下
049fcc5dc65930c09989a822942320e2836ff6dd5b513cce920032f991282753 [*] start docker team1 a53beae898ec1443cbbe135c929eabd0e95497826d62de82c07cee2dba7205b2 [*] start docker team2 c726b5513076f0cdd3acfe0dd72da830fffdd536040084307919afaa7950de8a [*] start docker team3 9be0a2caf06668880695dbf5b6f6f74c800bf6f1aea769a135682ef0a89b10d3 [*] start docker check_server 48446cf723f76a6740a316ef37c3edacc5f7fe35f9e3e8eda0fef008a0c7daff [*] start docker flag_server
这里要用到docker,由于权限问题,所以我这里使用了sudo
- 比赛拓扑图
web站点
team1:192.168.159.140:8801
team2:192.168.159.140:8802
team3:192.168.159.140:8803
ssh连接
team1:192.168.159.140:2201
team2:192.168.159.140:2202
team3:192.168.159.140:2203
ssh连接的账号密码在项目下的pass.txt里面- ssh的端口规则是:
- team1 ---- 2201
- team2 ---- 2202
- team3 ---- 2203 ....以此类推
- 想连接到队伍服务器,直接ssh连接即可
#如下面连接到队伍1的服务器 ssh -p 2201 ctf@192.168.159.140
- ssh的端口规则是:
- 启动check服务器
cd check_server python2 check.py # 启动成功如下 0|0|0 ****************************************************************** team1:0*************team2:0*************team3:0************* ****************************************************************** --------------------------- round 0 ------------------------------- --------------------------------------------------------------- checking host: 172.17.0.2 Host: 172.17.0.2 seems ok --------------------------------------------------------------- checking host: 172.17.0.3 Host: 172.17.0.3 seems ok --------------------------------------------------------------- checking host: 172.17.0.4 Host: 172.17.0.4 seems ok
- 查看实时分数
直接访问这个网址即可,ip要替换为自己的http://192.168.159.140:8080/score.txt
- 加分的方法是访问一个为地址并且以get的形式上交flag
注意替换iphttp://192.168.159.140:8080/flag_file.php?token=teamx&flag=... (x为队伍号)
- 然后就可以看到得分情况
结束比赛
在项目目录下执行以下命令
sudo python2 stop_clean.py
参考
AWD简单介绍和搭建AWD平台:https://blog.csdn.net/kukudeshuo/article/details/120799308