点击蓝字
关注我们
声明
本文作者:说书人
本文字数: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
通过一个下划线来分割成两部分,组成新的key
和value
继续往上,$paramArr
数组由前端传入参数initParams
,然后通过两个下划线来分割,组成新的数组。另外前端还可以传入key
和sign
参数,这两个参数后面会用到。
至此我们可以构造出根据相关法律法规,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/
后记
作者
说书人
stay hungry,stay foolish.
扫描关注公众号回复加群
和师傅们一起讨论研究~
长
按
关
注
WgpSec狼组安全团队
微信号:wgpsec
Twitter:@wgpsec
原文始发于微信公众号(WgpSec狼组安全团队):某友天翼应用虚拟化系统漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论