【CTF】AWDP总结(Web)
什么是adwp?
AWDP是一种综合考核参赛团队攻击、防御技术能力、即时策略的攻防兼备比赛模式。每个参赛队互为攻击方和防守方,充分体现比赛的实战性、实时性和对抗性,对参赛队的渗透能力和防护能力进行综合全面的考量。
比赛中,每支队伍拥有相同配置的虚拟靶机,参赛队员需对平台中的GameBox发起攻击,并向平台提交正确的flag(证明自己具备对该题的攻击能力);在此期间,由平台以轮次制的方式向参赛队伍的靶机发起攻击,检查其他选手的漏洞是否修补成功,若修补成功则认为参赛队伍具备该漏洞的防御能力。
计分规则如下:比赛过程中每支参赛队拥有相同的起始分数(10000分),截止比赛结束时的分数,作为各队伍比赛得分,由高至低在成绩榜排列。
参赛队伍可通过以下两种方式获取积分:
1)攻克:提交GameBox中存放的flag;
2)防御:成功防御平台对各个靶机的攻击,且服务无异常。
同时也会通过以下两种方式失分:
1)服务异常:队伍无法维护某GameBox的正常服务,平台检查不通过;
2)违规:因违反比赛纪律及发现违规等行为被裁判判罚扣分。
六种状态
–已攻击,说明这个题已经打下来了,交了flag,就是攻击成功。攻击的过程其实就是普通的ctf。有的题目会先给你一切源码让你来打,这就是白盒了,但是白盒还是很多题防御成功但打不出flag哈哈。有的题你只有黑盒打出flag来了,攻击成功才会给你源码,让你来防御。
–已防御,说明你拿到源码之后,把这个题的漏洞通过修改源码,已经补完了,裁判的poc打不动这个题了,就算是防御成功。
–防御异常,说明防御的过程中,你把网站应该提供的服务给搞没了,可能是防御过度,也可能是你把关键的功能删掉了。如果防御异常了,一定要第一时间重置环境,要不然等到一个轮次结束之后会扣分,扣分就特别伤了。
防御
赛前准备
1.赛前要做好充分准备,把一些漏洞的waf全部准备好,例如:
function wafrce($str){
return !preg_match("/openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|scandir|assert|pcntl_exec|fwrite|curl|system|eval|assert|flag|passthru|exec|chroot|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore/i", $str);
}
function wafsqli($str){
return !preg_match("/select|and|\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\x26|\x7c|or|into|from|where|join|sleexml|extractvalue|+|regex|copy|read|file|create|grand|dir|insert|link|server|drop|=|>|<|;|\"|\'|\^|\|/i", $str);
}
function wafxss($str){
return !preg_match("/\'|http|\"|\`|cookie|<|>|script/i", $str);
}
这些waf有点简陋,是因为要保证题目的环境不能出问题,题目要提供正常的服务。
这很重要很重要,直接决定能不能很快拿下题目的防御。
2.XFTP
文件上传工具要准备好
下载:
链接:https://pan.baidu.com/s/1eabfwy7b8TlM-0fquWAYxw
提取码:g32d
3.phpstudy等web环境
配置好本地web环境,越方便越好,就是拿到源码之后要很迅速能在自己本地跑起来,不要到了比赛的时候手忙脚乱的,一下子域名出问题一下子数据库出问题。比赛时,时间就是分!!
4.代码审计工具
Seay源代码审计系统之类的。
可以做到辅助作用,不是很重要。
第一时间上waf
对于awdp来说,防御的重要性远远大于攻击,因为是轮次制,每一轮防御成功或者攻击成功都会加对应的分,成功的人越多,每轮加的分就越少,而且分是累计制,**题目分少了,自己之前得到的分不会扣。**所以时间特别重要。有些人题目刚出没5分钟就防御成功了,一个题的分吃了一整天,从第一轮加500到最后一轮加50,累积起来大几千分。
所以我们的策略是,一上来一个题目,先分析是大概什么知识点,是命令执行?sql注入?文件上传?然后第一时间在源代码上加waf。
waf的形式不局限于上面展示的例子,过滤关键字,也可以是直接对输入的东西进行长度限制,比如说限制输入执行命令的长度为小于2。就可以达到修补漏洞又不破坏题目环境的目的。不过也要看具体题目,有的题目可能长度低于2就破坏了web服务导致防御失败了。
注意文件上传的路径
这个问题非常重要!!!
防御的时候我们是要把要修补的文件上传到服务器里,替换原来服务器中的文件,所以我们要知道文件具体的路径,但是一般来说题目不会直接给,不同开发语言不同框架的目录也不尽相同。
这个时候就要用到一个小tips:
题给示例:
mv -f explorer.php /www/html/
我们要替换的文件很有可能不是在根目录下的/www/html,所以这个示例很鸡肋
那就从根目录里面查找:
mv -f explorer.php $(dirname `find / -name 'explorer.php' 2>/dev/null`)/explorer.php
用find命令从根目录查找名为explorer.php
的文件,然后返回他的路径名(dirname)
2>/dev/null
的作用是避免返回一些错误的信息,比如说查找过程中会返回权限不足等错误。
patch包
patch包的内容组成
首先是存在漏洞的页面,比如index.php或app.py
再次的部署的sh文件,如果是php,就需要替换原题目存在漏洞的php页面,如果是pyhton或者java就得替换文件再重启服务
例子:
php update.sh
#!/bin/bash
cp /index.php /var/www/html/index.php
Python
#!/bin/sh
cp /app.py /app/app.py
ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup python app.py >> /opt/app.log 2>&1 &
Go
#!/bin/bash
kill -9 $(pidof app)
cp ezgo_patch /app
chmod +x /app
/app 2>&1 >/dev/null &
Nodejs
#!/bin/sh
cp server.js /app/server.js
ps -ef | grep node | grep -v grep | awk '{print $2}' | xargs kill -9
cd /app && nohup node server.js >> /opt/aa.log 2>&1 &
格式要求:一般会要求tar.gz的形式
打包命令:tar zcvf update.tar.gz send.php update.sh
攻击
攻击就没什么好讲的,就是打ctf,有的题是白盒,有的题你得先打出flag才有源码。
暂时想到的就是这些,打完了这么久了才记录,因为一直考试。
在这致敬一下工作室大佬们带我打awdp!