某友天翼应用虚拟化系统漏洞分析

渗透技巧 12个月前 admin
1,856 0 0

点击蓝字

某友天翼应用虚拟化系统漏洞分析

关注我们



声明

本文作者:说书人
本文字数:5700字

阅读时长:约20分钟

附件/链接:点击查看原文下载

本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载


由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。

狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。



一、前言

看到某步公众号发了一个瑞友天翼应用虚拟化系统的rce的情报(https://mp.weixin.qq.com/s/zeH6p5lFQ4kzu5HpfTpXog),恰好团队的师傅弄了一套安装包来,于是顺便挖一挖。

某步给出的影响版本如下某友天翼应用虚拟化系统漏洞分析

贴心的@zhizhuo师傅已经在团队内部服务器安装好了环境,直接开冲

版本查看,我这边是7.0.2.1的,刚好符合http://xxx/RapAgent.xgi?CMD=GetRegInfo某友天翼应用虚拟化系统漏洞分析

二、sql注入到rce

程序有一部分是thinkphp3.2.3的,还有就是一些xgi(实际上也是php)

关键函数dologin(),位置casweb/Home/Controller/IndexController.class.php某友天翼应用虚拟化系统漏洞分析

构造路由访问该方法http://192.168.52.159/index.php?s=/Index/dologin/

一步步来,334-241行,getfarmvalue('UseCheckCode'),看起来像是检查是否开启验证码,跟进函数casweb/Home/Common/function.php某友天翼应用虚拟化系统漏洞分析

做了一个sql查询,根据上下文猜测应该就是检查是否开启验证码。

为了方便查看后端实际执行的完整sql,我们可以使用框架提供的getLastSql()方法来获取最近一次执行的SQL语句

$sql = $mFarm->getLastSql();
echo $sql;
某友天翼应用虚拟化系统漏洞分析
某友天翼应用虚拟化系统漏洞分析

如果值为1的话还得检查一下验证码,我这边的环境默认没开,所以如果返回Msg_102就再传一个验证码进去某友天翼应用虚拟化系统漏洞分析

继续往下看到344行某友天翼应用虚拟化系统漏洞分析

这里需要传递一个name,我们用上面同样的方法来看一下实际的sql语句某友天翼应用虚拟化系统漏洞分析

SELECT * FROM `cuser` WHERE ( name='ssr' and is_group=0 AND is_admin !=1 ) LIMIT 1

终于找到一个可控参数的sqli了,而且程序的mysql数据库是集成安装的,看了下是dba权限,且mysql版本为5.1.x某友天翼应用虚拟化系统漏洞分析

还需要知道路径,开了debug前端能看到报错路径(实际上路径固定,直接相对路径来写就完事了)某友天翼应用虚拟化系统漏洞分析

所有条件都满足,直接构造sql来写shell

根据相关法律法规,不展示POC信息
某友天翼应用虚拟化系统漏洞分析
某友天翼应用虚拟化系统漏洞分析

三、获取管理员权限

找到管理员登录口http://192.168.52.159/index.php?s=/Admin/login某友天翼应用虚拟化系统漏洞分析

看一下具体代码某友天翼应用虚拟化系统漏洞分析

这里跟前面一样判断是否开启验证码,默认没开。

获取cookie中的UserAuthtype参数值,用该参数值判断登录方式,我们这边就是通过账号密码去登录,可以随便输个账号密码抓个包也能看到UserAuthtype=0某友天翼应用虚拟化系统漏洞分析

因为下文判断$InfoLogin["AdminLonginSucceed"] ,需要不等于0才算登录成功,所以我们先跟一下上文的adminuserlogin方法

$InfoLogin = adminuserlogin($myAuthType, $this->DeConvText($_REQUEST['name']), ($_REQUEST['pwd']), ""); //非ukey,ikey,没有digest

传入4个参数,分别为前面提到的UserAuthtype,和账号密码,最后一个是$IKeyRandom不用管它。至于DeConvText方法,看了下就是个转换编码的,无需在意某友天翼应用虚拟化系统漏洞分析

进去先查询用户是否存在某友天翼应用虚拟化系统漏洞分析

上面被选中的代码是我自己加上的,和之前一样为了查看后端完整的sql语句某友天翼应用虚拟化系统漏洞分析

可以看到,此处去cuser表查询name字段,且is_group=0 以及 is_admin=1

再往下看第580行,我们要让UserAuthtype=0某友天翼应用虚拟化系统漏洞分析

去数据库中看了下符合条件的管理员用户名是Admin,但是看起来像密码的字段有好多个某友天翼应用虚拟化系统漏洞分析

继续往下走,还是找到UserAuthtype=0的地方某友天翼应用虚拟化系统漏洞分析

可以看到这里取的是数据库中的pwd字段作为密码

到这里我们就可以利用之前的sql注入来取出管理员用户名和md5加密后的密码了

查用户名

根据相关法律法规,不展示POC信息

查密码

根据相关法律法规,不展示POC信息
某友天翼应用虚拟化系统漏洞分析

别问我为啥是md5…之前代码看错了,跟到了windows账号登录那边去了,然后找加密方法,逆向解密一顿操作…某友天翼应用虚拟化系统漏洞分析

顺便也放一下解密脚本,虽然在这里并没有什么用

import base64

def crypt2(s, bEncrypt=True):
    result = bytearray()
    Key = 3562
    SeedA = 5891
    SeedB = 5920
    a = 0
    for i in range(len(s)):
        a = s[i] ^ Key >> 8 & 268435455
        a &= 255
        result.append(a)
        if bEncrypt:
            Key = (a + Key) * SeedA + SeedB & 268435455
        else:
            Key = (s[i] + Key) * SeedA + SeedB & 268435455
    return bytes(result)


password = "SprIrAp3pUpm0QaLsKjkREG8Y9k="
password = base64.b64decode(password)
password = crypt2(password, False)
password = password.decode('utf-8')
print(password)
某友天翼应用虚拟化系统漏洞分析

最后说一句,上面的md5不需要解密,直接参数传递过去就行。。。某友天翼应用虚拟化系统漏洞分析

四、中言

还没结束,上面测试用的7.0.21版本,不是最新版。我们测试了用上面的洞去打最新版本7.0.31,发现也失败了。代码几乎没变,但是传入的参数都被转义了。

百思不得其解,看下图:某友天翼应用虚拟化系统漏洞分析某友天翼应用虚拟化系统漏洞分析

传进去的参数没有经过任何处理,不存在什么全局过滤,检查了php.ini等配置也没开魔术转换,非常吊诡的事情~~

然后群里有师傅说了一句某友天翼应用虚拟化系统漏洞分析

有道理~~因为新版本的php版本反而比旧版本要低了,这个操作本身就很可疑,难道这就是一键修洞大法?(开个玩笑~实际发现新版本的php版本并不一致)

为了通杀其他版本,团队贴心的zhizhuo师傅继续搭建了最新版,这次我们将视线放在xgi上面。

五、sql注入到rce

看到WebRootConsoleExternalApi.XGI文件,先找到最近的一个执行sql的地方某友天翼应用虚拟化系统漏洞分析

往上看条件,只要$cmd != "getLongXinClientList"就走不到我们需要的地方,但是下面又没有$cmd == "getLongXinClientList"这个条件能够走进来,写的什么勾八代码,下面的代码等于永远都不会被运行的废代码~~

继续找下一个执行sql的地方某友天翼应用虚拟化系统漏洞分析

这里最终带入sql的参数为account,这个参数来源于前台提交的json数据,而且我们还需要传一个userPwd字段来使之不为空。

这里需要一个$cmd参数才能走进来 继续往上看,$cmd$requestObj里面某友天翼应用虚拟化系统漏洞分析

继续往上,$requestObj这个数组是通过遍历$paramArr数组,并且将$paramArr遍历的value通过一个下划线来分割成两部分,组成新的keyvalue某友天翼应用虚拟化系统漏洞分析

继续往上,$paramArr数组由前端传入参数initParams,然后通过两个下划线来分割,组成新的数组。另外前端还可以传入keysign参数,这两个参数后面会用到。某友天翼应用虚拟化系统漏洞分析某友天翼应用虚拟化系统漏洞分析

至此我们可以构造出根据相关法律法规,POC内容不予展示

继续回到执行sql的地方再往上看其他条件某友天翼应用虚拟化系统漏洞分析

这里需要$keyVal有值,满足的前提条件是$key=="wusuokey"$key=="inner",前面说了$key由前端直接传入。$key=="wusuokey"条件下还有个方法,懒得看,当然是选择$key=="inner"啦。

继续回到执行sql的地方再往上看其他条件某友天翼应用虚拟化系统漏洞分析

这里要求$signCalculate != $sign,前面说了$sign由前端传入,而$signCalculate = md5($initparams . $keyVal);,因为我们前面已经构造好了$initparams参数,也构造好了$key参数得到啦$keyVal参数,所以这里就计算一下$initparams+$keyVal的md5的值就好了。

至此,我们已经能过走到执行sql的点了,最后来看看sql

$result = mysql_query("select * from cuser where name='" . $account . "'"$DSCon);

简单构造即可rce

根据相关法律法规,POC内容不予展示
某友天翼应用虚拟化系统漏洞分析
某友天翼应用虚拟化系统漏洞分析

当然,这里也可以去跑管理员账号密码,不过这里走的是xgi,不会触发thinkphp的debug,可以用sqlmap跑盲注,当然机智的小伙伴会选择将账号密码查询输出到文件直接查看~


官方已发布修复方案,建议升级至安全版本下载地址http://www.realor.cn/product/xiazaishiyong/




后记



团队漏洞复现研究组招人中…
简历投至  [email protected]


作者



某友天翼应用虚拟化系统漏洞分析

说书人

stay hungry,stay foolish.



扫描关注公众号回复加群

和师傅们一起讨论研究~


WgpSec狼组安全团队

微信号:wgpsec

Twitter:@wgpsec


某友天翼应用虚拟化系统漏洞分析
某友天翼应用虚拟化系统漏洞分析


原文始发于微信公众号(WgpSec狼组安全团队):某友天翼应用虚拟化系统漏洞分析

版权声明:admin 发表于 2023年4月12日 下午5:04。
转载请注明:某友天翼应用虚拟化系统漏洞分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...