🛁

这是👴第一次打高达80支队伍的大型AWD,👴此行的目标就是称霸酒店的游泳池。后来发现游泳池要钱,👴只能遗憾败北。(后来发现情报出了问题,根本不要钱,血亏)总的来说,酒店浴缸很带,主办方态度很好,赛场很清真,参赛体验很爽,赚了。

“终端越炫,嗨客越带;嗨客越带,帽子越带”

🐐AWD复盘

首先根据参赛手册,进行一个规则的复制:

1、 采用线下赛的方式,参赛团队通过有线连接到局域网,并进行网络连通性的测试。请自备连接网络所需要的设备如usb转RJ45转换器等工具。
2、 攻防赛部署若干道赛题,初始分值为10500分。
3、 使用xctf用户通过ssh连接GameBox,GameBox的ip地址和登录密码通过赛事页面下载获取。
4、 比赛10分钟/回合,每个回合会更新GameBox上的flag。
5、 每个回合内,一个战队的一个服务被渗透攻击成功(被获取到flag并提交),则扣除10分,攻击成功的战队平分这些分数。
6、 每个回合内,服务宕机或无法通过check则会被扣除10分,服务正常的战队平分这些分数。
7、 参赛战队在修复漏洞时,请保持服务的正常功能和打印字符、界面样式,否则将无法通过系统check。
8、 每个回合内,服务异常和被拿flag可以同时发生,即战队在一个回合内单个服务可能会被扣除两者叠加的分数,最多扣除20分。
。。。
7、 请参赛战队在比赛开始时对所有服务进行备份,主办方仅提供2次重置机会,2次机会使用后不予重置。申请重置时请提供战队名称。
8、 禁止使用通用防御方法如waf等工具,违规者第一次被发现扣除当前分值的10%,第二次被发现扣除当前分值的50%,第三次被发现取消参赛资格并向其学校发文进行通报批评。
  • 比赛全程收手机,断外网,不能用waf,不准用不死马,大家都很清真,找回了ctf最初的快乐。

然后按照AWD开局的任务清单,进行一个盘的复:

准备阶段

  • ssh连接:
    • 主办方提供了ssh密钥,和靶机ip
      • 于是省略ssh-copy-id -i ~/.ssh/id_rsa.pub root@xx.xx.xx.xx环节。
    • 但是万能的Windows Terminal连不上去(依然不知道为啥),👴只能用图形化ssh客户端添加私钥连接。
  • IP扫描:
    • 共有7道题,3道web,4道pwn,每道题目一个独立靶机,有独立的ip地址。不同靶机d段不同,不同队伍c段不同,按初赛排名分配。平台上告知了全部的ip列表。
      • 于是省略nmap -sn xx.xx.xx.0/24环节。
    • 选手机和靶机池在一个局域网内。不同队伍c段不同,一个队伍内的不同电脑d段不同。
  • 流量监控:
    • 主办方贴心的提供了被打流量(但是只有下行流量),直接在~/package目录下给出.pcap文件。
      • 于是省略tcpdump tcp -i eth0 -t -s 0 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap环节。
      • (不过用户名叫xctf,权限卡的很死。不给流量的话估计也只能在站里上流量监控脚本)
    • 更新速度很快,被打之后几乎可以立刻找到流量。于是手速很重要。

开局阶段

  • 备份源码:tar -zcvf w.tar.gz /var/www/html
    • 结果> Permission Denied,遂跳过
  • 扫马删马:D盾
    • 👴直接在图形化shell里下载代码,然后崩屎了几次,手速慢了。
    • 每个web题都有一个不明小文件,显然是小马,删除之。
  • 备份数据库:mysqldump -uctf -p --databases [dbname] > /tmp/db.sql
    • 结果> Permission Denied,遂跳过
  • 改数据库密码:mysql>SET PASSWORD FOR ctf@localhost=PASSWORD('newpass');
    • 结果> Permission Denied,(╯▔皿▔)╯玩nm
  • 然后开始源码审计(❌)
  • 然后等待被打之后翻流量(✔️)

攻防阶段

👴只看得懂web题目。三道web题全是cms,是经典lamp环境。可是👴看不懂cms,👴是five。

web1:safecms

  • 比赛一开始,啪的一下很快啊,全场被打,翻流量抓到payload,是一个模板文件的任意读漏洞。直接批量拿flag。
  • 定位到路由,注释之,不好使,还是被打;删除这个.class.php,不好使;👴怀疑是运行时缓存不更新,直接service restart apache2
    • 结果>Permission Denied,👴佛了
  • 就这样被打了好一会,才发现直接修改index.php,能直接生效,血亏。

web2:eyou

  • 这道题被打的很少,被宕机的很多。抓流量,发现很多混淆流量。(日志写shell?)
  • 👴跟着流量尝试用过滤的方法修复,但是还是被宕。
  • 若干轮后,👴没办法,只好申请重置,并在下一轮被宕。
  • 若干轮后,👴没办法,只好申请重置,并在这一轮被宕。
  • 若干轮后,👴没办法,只好白给,并在某一轮恢复正常并坚持到最后。我???
    • 该不会是某队或者裁判看我们太可怜帮我们重置了吧,世界上还有这么温柔的人,我真的哭死
  • 这道题无了。(赛后才知道,有队伍找到sqli并登录后台,在后台关闭了站点并羊了管理员账号。修nm。

web3:lol

  • 这道题是最后三小时放的,👴这时候已经自闭了几个小时。于是👴痛定思痛,开局直接把admin.php羊了,然后奇迹般的守到了最后。坏了,好起来了。
  • 全场被打,翻流量找到payload,某路径下有白给shell,直接删马并反打。
  • 某队使用了在网页输出中塞随机字符串的防御方法,但是没破坏flag,且填充的字符是固定的,被我肉眼识破,我直接进行一个if ip == xx: flag = flag[12:]。虽然没什么卵用,但是很快乐。

pwn:

一看到4个pwn👴直接傻掉。👴觉得👴不会做,因此也没去看,但听大佬说,直接抓流量进行一个转发就能拿分,👴下次一定准备好pwntools。

🔒自动化攻防框架

AWD中,手交flag实在是很浪费时间的行为。虽然有时候自动化不太好写只能手交,像这次十分钟一轮,有72支队伍,就算你手速惊奇,也没有时间审计源码了。因此打AWD重点就在一个自动化。网上能找到各种框架,但是用的时候总是不顺手,遇到bug也不会修。只有自己写的才最好用。

先说说用处最大的工具,就是批量攻击框架/自动化攻击脚本。这个框架主要有以下要素:

  • 输入:
    • 待攻击ip列表:通常写在ip.txt里
    • 攻击函数:即封装好的payload请求
    • 交flag函数:根据平台接口封装
  • 输出:
    • 批量攻击,输出攻击结果
    • 攻击成功则提交
    • 反馈得分结果

框架的核心无非以下逻辑:

while True:
    for j in challenge_list: # 攻击函数索引
        for i in ip_list: # 首先生成ip列表
            flag = get_flag(i,j) # 根据j找到相应攻击函数
            if flag!='Attacked failed':
                submit_flag(flag)
    print_result(j)
    time.sleep(round)

比赛时,找到漏洞或者抓到流量,立刻写好相应的攻击函数,重启脚本即可。

为了提高稳定性和易用性,这套框架可以写的很复杂。比如:

  • 加入多线程,让框架非阻塞的持续运行
  • 加入面向对象,写成类库
  • 自带一些trick,比如流量混淆器等。
  • 当然,还可以写一个网站来可视化管理

这里就涉及框架编程了,能深挖的地方还有很多。

除了批量攻击脚本,用到的脚本还有:

  • 权限维持/批量shell脚本:用于管理多个shell
    • 但是不死马被禁用,因此本次比赛中shell出现的不是很多。
    • (👴还准备了拿到白给shell之后持久化的脚本,结果一个shell都没拿到,准备个🔨。
  • 文件监控脚本:用于监控flag等重要文件被读取和修改的准确时间,可以帮助确定payload
    • 再牛逼一点还可以提供系统备份和回复功能。

上述都是系统脚本,大多在本机用python写的。下面说几种网页脚本,即直接用require/include包含的php脚本

  • 流量监控脚本:区别于系统级流量监控,用于监控敏感流量以抓取payload
  • 通防脚本:也就是waf,可以进行很充分的过滤
    • 本次比赛中被禁用,因为确实破坏游戏体验

这些脚本,用好了才是趁手的兵器。这次比赛中👴的手速远不够快,延误了很多战机。

🌊快进到《考试周破防》

回顾整场比赛,相比正经的漏洞挖掘,随机应变的能力对分数也有很大影响。总结几个因素:

  • awd的得分是随时间积累的,因此要掌控全局,时刻盯紧每道题有无薄弱环节和突破口。本次比赛题目数量多达7道,👴队有大佬没来,还带了一个萌新,约等于二打四,出现了看不过来题的情况。

  • 还有就是手速,由于流量很及时,payload一被抓到,甚至可以在一轮check之内丢进批量攻击脚本,直接和首先挖掘到漏洞的队伍平分分数。这要求自动化脚本的熟练运用,尽量避免手交flag。

  • 最后还有一点策略问题。分析三种题目状态,列个表定性分析一波最优解:

能反打 不能反打
场上大多数Attacked 先反打再修洞 不能修洞则down自己
场上大多数CheckDown 打他喵的 尽量别down
  • 出现漏洞大部分人会被打,这时如果你不能立刻修补而能立刻反打,相当程度上是不亏的。如果你修不好也可以选择宕机,因为这样分摊了丢掉的分数。
  • 尽量避免被打+被宕,扣双倍分数属实是血亏。如果决定宕机,先摸清check的时间和结算的时间,最好在新一轮结算后立即删站down自己。
  • 当然,如果您能挖到洞,宁就是垂直上分的👴。

从8点半到6点半,打10个小时的AWD,要全程保持敏感和机智,确实对身体素质有些要求。👴坐高铁到合肥坐了6小时,打比赛坐了10小时,好悬没给我痔疮坐出来。晚上回到青岛并进行最后一次夜店,快进到《考试周破防》。