AWD(Attack With Defense,攻防兼备)是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。
这种模式非常激烈,赛前准备要非常充分,手上要有充足的防守方案和 EXP 攻击脚本,而且参赛越多,积累的经验就越多,获胜的希望就越大。
常见形式
常见的形式是这样:
每个队伍拥有四台服务器。其中三台服务器运行了一个Web服务,即网站服务。剩余一台(通常被称为Pwn服务器)运行一个网络服务,通常是一个在后台运行的二进制程序,通过TCP的某个端口对外提供服务。并且,每个队伍拥有的四台服务器都是一样的。
在三台Web服务器中,比赛主办方会在每个主机上预置一个或多个后门/漏洞。同样的,在剩下的一台服务器上的二进制程序里也会被预置二进制漏洞(跟Pwn题一样)。
比赛方法
在开始比赛前,通常会有一段时间(一般是30分钟)的加固时间。选手们要在这段时间内备份网站、安装防火墙、加固服务器,以防后续比赛时间被对手打穿。另外,队伍需要分工明确,在其他队友加固服务器的同时,另外的队友应该将备份的服务器文件下载,然后对其进行代码审计和漏洞挖掘(Web手)、逆向与二进制漏洞分析(Pwn手)。在发现漏洞后,及时对自身网站进行漏洞修补与加固。
比赛开始后分为两种情况,一种是主办方给出所有队伍服务器的IP地址,另一种情况是给一个网段,对手的服务器IP需要通过扫描等方法进行发现。
比赛将分为很多轮(一般可能是10分钟)。每轮开始,在每台服务器的某个地方(一般是根目录)会放置一个flag文件(每个队伍每台主机都不一样)。选手们需要通过挖掘到的漏洞编写漏洞利用代码(Exp),然后对其他队伍的服务器进行攻击并最终获取shell执行权限(getshell)或者通过文件读漏洞来读取对手服务器根目录下的flag文件,并向比赛平台提交flag。当攻击方成功攻击对手服务器并提交flag后,攻击方将获得一定的分数,同时防守方将丢失一定的分数(一般来讲,同一台机器被攻击会被扣除固定分数,而所有对这台服务器攻击成功的队伍将平分这些分数)。
在攻击的同时,也要注意自身服务器的防护。当自己的服务器被对手攻击提交flag后,队伍将被扣分。并且要防止服务器不要被破坏,因为每轮(一般是结束时)比赛时比赛平台会对所有队伍的服务器进行check,即检查服务是否正常运转。若出现服务被对手或自己破坏以至于无法提供正常服务的情况,平台将对其队伍进行扣分,同时其他队伍获得相应的加分。
每轮结束后将开始新一轮,此时所有flag文件将刷新,以开始新一轮的攻击和得分。若队伍发现自己服务器服务被破坏,此时可以刷新服务器回到初始状态。否则在比赛途中手动进行刷新服务器操作将导致扣分。
一般的比赛平台为了让比赛保持激烈的状态,会开放自动提交flag的API。即可以通过脚本更加方便地向比赛平台提交flag。
通用技巧
Web漏洞扫描可以使用例如D盾这样的工具,可以快速发现明显的Web后门。代码审计可以用Seay或者Fortify这样的工具。
一般AWD比赛禁止联网,所以队友间文件共享和通信可以使用FeiQ这样的内网通讯工具来进行。
当网站文件被修改,例如被植入木马的情况下,我们可以使用DiffMerge、Beyond Compare这样的工具来对比源文件进行检查。
防护技巧
防护是最重要的一环。一般来讲只要你保护到位了,不让别人打进来你就赢了一半。因为你不会扣分,还有机会平分其他倒霉蛋丢的分。
首先一定要更改服务器初始ssh密码(数据库密码也是一样的)。有些比赛会将所有服务器的ssh服务设置相同的密码,如果你不第一时间改密码别人可以直接登录获得flag并留下后门。同样的,在比赛开始时第一时间也可以去测试别人的服务器是否更改密码以通过最简单的方式得分。
然后就是对数据库、网站文件进行完全的备份。如果出现服务器被其他队伍破坏或其他情况,可以自己去通过备份的文件进行恢复、修复。不然的话只能被打穿等下一轮或者手动刷新服务器,这样将丢失大量分数。
然后就是安装防火墙。就是WAF,可以对不明请求进行拦截和记录,这样你就可以对恶意攻击请求进行拦截。并且通过监控请求日志来推测攻击方的攻击方法,从而发现前面没有发现的漏洞,并快速进行exp编写和攻击。
部署文件监控脚本。这样可以通过文件创建时间来监控后来生成的文件,并进行删除,防止挂马。
一般上面的都部署好了可以抵挡大部分攻击了。
攻击技巧
首先AWD比赛非常激烈,每一轮时间很短,所以几乎所有防护/攻击操作都会使用脚本的方式来进行。所以一般一个队伍的分工是这样的:Web手进行漏洞挖掘、修复;Pwn手进行Pwn题的漏洞挖掘、利用;防守者进行网站防护与日志、文件监控;如果还有一个人的话可以负责应急和exp编写。所有人都应该具备快速exp编写的能力,以适应激烈的比赛节奏。
很重要的一点是,因为所有队伍的服务器都是一样的,所以所有的防护操作都对应了相应的攻击操作。比如上面的初始密码,我们不仅要对其进行防护,也能够通过相同的方式进行攻击。
一般我们都是通过事先准备好的脚本进行攻击。IP扫描、WAF部署等操作也是一样,通过事先准备好的工具或脚本进行扫描。并且IP扫描、漏洞利用、flag获取、flag提交等所有操作都应该全部自动化。比如比赛开始,Web手发现漏洞后编写利用脚本,编入事先准备好的exp中并运行,此时脚本开始扫IP,得到对手服务器IP列表后逐个进行利用,攻击成功后自动获取flag,最后通过平台API自动提交。这样一来效率就会很高。
权限维持
漏洞利用后,例如成功上传服务器木马后需要注入不死马或者内存马以进行权限维持,否则对方发现后删除木马并且修复漏洞后就没用了。
常见漏洞
其他必看内容
AWD比赛入门攻略总结
CTF线下赛AWD新手入门Web篇 | Str3am’s Blog
还有很多内容,本文章只是简单从0到1,更加详细的内容需要读者自行准备、部署演练、实战才能体会。