漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

栏目: 编程工具 · 发布时间: 6年前

内容简介:前言在分析一些漏洞时,能从相关的漏洞预警和描述中获取的情报往往很少。很多时候,只能通过漏洞描述或者补丁中找到漏洞触发点,然而如何利用,如何找到从入口贯通到漏洞触发点的利用链,这时候就需要我们顺瓜摸藤了。

前言

在分析一些漏洞时,能从相关的漏洞预警和描述中获取的情报往往很少。

很多时候,只能通过漏洞描述或者补丁中找到漏洞触发点,然而如何利用,如何找到从入口贯通到漏洞触发点的利用链,这时候就需要我们顺瓜摸藤了。

有时候,顺着一个瓜(漏洞触发点),还能摸到很多条藤(利用链)。

正文

下面举一个小例子:

近日在PacketStorm看到一个关于国产cms的cve,

https://packetstormsecurity.com/files/151824/ZZZPHP-CMS-1.6.1-Remote-Code-Execution.html

cve编号:

CVE-2019-9041

cve描述

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

再看看packetstormsecurity上关于exploit的介绍

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

根据描述,猜测该漏洞应为SSTI类

如果有升级补丁参照看一下,这个漏洞就很明朗了。

然而官网上最新版本只是2019-1-28更新的1.6.1

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这个1.6.1版本,正是存在漏洞的版本。

之前完全没有听说过这个cms,这个漏洞又有cve。决定拿来和大家分享下,看看怎么顺瓜摸藤。

分析

从漏洞发现者所提供的exploit来看,这个漏洞的触发应该是需要后台权限。漏洞触发点位于inc/zzz_template.php中的parserIfLabel方法中,并且需要修改search模板并通过搜索功能执行该利用点。

首先先看下inc/zzz_template.php中的parserIfLabel方法

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

可以看到有一处eval方法,这个应该是最终代码执行触发的地方。

既然触发点(瓜)已经找到了,那继续往上跟,找到可用的调用链

parserIfLabel方法只在两处被调用

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

先看位于第2238行的第二处调用

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这处在parserIfLabel方法自身内部,递归调用来解析嵌套。此处虽然调用了parserIfLabel方法,但是并不处于parserIfLabel方法的调用链的上层,因此排除。

再看第一处:位于23行这处

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

parserCommom方法调用parserIfLabel方法并将$zcontent传入其中。

再看看parserCommom方法在何处被调用

跟入zzz_client.php中

zzz_client.php中一共四处调用了parserCommom方法,每一处都将名为$zcontent的参数传入其中。

这四处parserCommom分别位于四个ifelse条件中。

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

先一处处来看,首先选个短的看起来容易触发的条件分支先来。

先看第二处,这里elseif中的条件最短,为 $conf['iscache']==1

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

只要$conf['iscache']==1,就可以顺利的进入这个条件分支,parserCommom就能有机会被调用

查看配置文件,此处默认为0

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

但是由于漏洞介绍,这是个后台漏洞,那默认我们可以有后台的操作权限

于是我在后台管理那把缓存开启了

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

现在zzz_config.php中

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

可见iscache现在为1了。

现在的思路:

1、$conf['iscache'] 目前已经是1,稳稳的进入这个elseif分支

2、由于此处执行点位于zzz_client.php中,而zzz_client.php文件中没有定义任何函数,代码逐行执行,一马平川。可以看下图感受下

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

3、只有找到zzz_client.php被加载的地方,才能进入该elseif分支执行我们的parserCommom

4、找到控制传入parserCommom方法中$zcontent值的方法,将构造好的$zcontent传入我们的eval中执行。

首先要找zzz_client.php被加载的地方

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

看起来这四处都可以加载zzz_client.php

我们首先选主入口index.php

不出意外,直接执行到该条件分支内

此时传入load_file方法中$tplfile值为

C:/wamp64/www/analysis/zzzphp/template/pc/cn2016/html/index.html

加载的是index.html模板

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

也就是说,我们只要在index.html中加入payload,就可以触发底层的eval执行任意代码。

找到后台编辑模板处

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

编辑index.html,插入payload

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

不出所料,成功执行

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

此时传入eval中的$ifstr值是phpinfo()

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

但是需要注意的是 如下图

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

当cachefile在第一次执行create_file后,就会被成功创建

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

下一次再进入elseif($conf['iscache']==1)分支后,

由于

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这个if条件检测cachefile存在并且更改时间晚于tplfie(index.html),不满足此条件分支,不会再次调用$parser->parserCommom($zcontent)的。

总结来说,此处可以远程代码执行,但是当cachefile被创建后,此处调用链失效。

到此为止,已经找到了一处不同于原作者的利用链。但仅仅zzz_client中就有四个分支调用了存在漏洞的函数。

也就是说,同一个漏洞触发点所生产的利用链远远不止两处,后续分析有机会再放出,有兴趣的朋友也可以自己玩玩。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Philosophy of Software Design

A Philosophy of Software Design

John Ousterhout / Yaknyam Press / 2018-4-6 / GBP 14.21

This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first ......一起来看看 《A Philosophy of Software Design》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具