20200910-羊城杯-web4

记录时间:2020.09.11

比赛时间:2020.09.09-10

赛题

开始分析

绕过1
从页面文字与后来读取到的php源码可知,需要改点信息进行访问。一开始以为是改XFF,后来发现是改cookies。

FUZZ中发现有单引号时,返回值有很大偏差,而且不像过滤,先记录起来。

绕过2
通过robots.txt发现存在check.php,所以现在得知共有三个文件:index.phpGWHT.phpcheck.php

看路径:http://183.129.189.60:10021/?file=GWHT.php,先使用目录遍历尝试读取一下,发现可以遍历。

由于无法直接读取PHP文件,使用伪协议php://filter,但会显示hacker。

一开始以为是过滤了伪协议,但只输入php://filter时却没有报错,测试了几下发现是在base64这里做了限制。于是马上去翻手册。PHP转换过滤器

改一下编码形式,读取到了文件,然后在在线解码平台获取到了完整源码。

绕过3
先分析核心代码,在GWHT.php内:

发现输出字符串长度是使用wc -c进行统计的,同时把shell语法中的多条语句执行;,注释符#给过滤了。但可以看到对于printf的边界并没有做严格过滤,如没有过滤'|,使得我可以轻松构造管道执行shell。但最终输出还是逃不掉最后的wc -c,所以自然而然的想到把结果输出到文件里。

构造规则也很简单:

'|command'

一开始先测试能不能读取文件并输出保存,发现是毫无问题的。但读不到/flag,可能是存放在其他地方。通过语法'|find / -name flag*>keyboy',然后访问结果文件

不过通过各种方法都无法访问到该flag.txt,感觉考点没那么简单。由于每次使用非交互式shell进行操作挺麻烦的,于是打算写一个webshell进去。

绕过4

执行完之后用蚁剑连接,借用蚁剑的terminal终端进行后续操作。

网站结构:

绕过5
先进行简单的信息收集:自身是www-data,没有多少权限。flag.txt权限挺高的,怪不得不能访问,先查看/etc/passwd查看有什么用户。

除了root外还有一名拥有/bin/bash权限的用户:GWHT。很自然的想到切换到该用户,但还缺点密码信息。在/GWHT/README获取到了信息。

付费解密得到:GWHTCTF,应该就是密码了。配合之前的管道,构造终极payload:

'GWHTCTF|su - GWHT -c 'cat /GWHT/system/of/a/down/flag.txt'>keyboy'  # 页面填写
echo GWHTCTF | su - GWHT -c 'cat /GWHT/system/of/a/down/flag.txt'   # 终端

题目雷区

一开始没注意到flag.txt是有权限的,傻傻的以为是被人拿了删了,一直瞎等。后来觉得页面目录遍历那里也访问不了,伪协议也访问不了,才用ls -l看了一下,发现是权限问题。但一开始想到的是提权,最常用的方法是SUID和SGID提权,折腾了半小时也没啥收获。内核是4.4的,也不打算打内核提权了(估计也没有,用searchsploit查不到)。
然后看/GWHT,偏偏里面有个findaas,出题人真的是恶心,我以为突破点是这里,结果折腾了很久以后也利用不了,当看到permission denied时瞬间火大。

吐槽点

首先这次ctf体验极差,早上9点进入平台,发现一片空白,还以为是没有放题目。等很久还是空白,问其他人,说用Firefox浏览器才行,但我偏偏不行。还有人说用手机能看,emmm。后来中午吃了饭才用Firefox访问到题目。
然后是关于这题的,环境实在太乱了,感觉应该每个队伍独立环境的,自己写的马一直被人删,还经常崩溃,一等就是十几分钟才能恢复。

发表评论

电子邮件地址不会被公开。 必填项已用*标注