0x01 漏洞介绍
瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接入、协同办公等,从而为用户打造集中、便捷、安全、高效的虚拟化支撑平台
4月10日下午,微步在线发布了漏洞公告,次日23时长亭技术沙盒发布了检测工具,该漏洞是由于前台一些未授权接口在接受参数时没有进行处理校验,导致的sql注入写webshell,导致的任意代码执行漏洞
0x02 环境搭建
本实验环境采用的7.0.2.1版本
一路下一步,默认密码123

在线注册

15天试用

注册完毕登录就可以了

默认页面

控制台界面

后台界面

开启日志记录方便调试

默认的web路径C:/Program Files (x86)/RealFriend/Rap Server/WebRoot

0x03 影响版本
5.x<=version<=7.0.2.1
经测试5和6的版本大部分不存在漏洞接口,但是其他接口存在漏洞
查看版本方法,点击默认页面关于模块出现版本信息

通过/RapAgent.xgi?CMD=GetRegInfo接口查看

0x04 漏洞分析和利用
首先漏洞接口接收三个参数initParams、key、sign,且都不能为空

getfarminfo方法在Function.XGI中,在该方法中return了getfarminfofromdb($Name)的结果

getfarminfofromdb为从数据库中去查询farm表中$Name对应的value值,在这里的拼接Name是可控的,可以构造恶意数据进行sql注入

数据库中对应的值

三个参数中key进行了数据库查询,必须为数据库中存在的值
initparams为多个参数通过__拼接成的字符串,每个参数之间的key和value间隔为_
sign为keyval和initparams拼接后的md5值

注入类型1 无需sign验证
由于getfarminfo($key)方法是在验证sign之前,所以无需进行sign验证即可触发sql注入
发送数据包

写入了FarmName的值和我们需要写入的值

上传webshell

连接webshell

写哥斯拉和冰蝎的时候有一个小坑,碰到&符号的时候语句结束,后边内容无法写进去

这里的解决方法是对&符号进行url编码就可以绕过

写完之后发现还是连不上,对比发现+号也没了

继续对+号编码

成功写入

成功连接webshell

使用fputs或者file_put_contents方法写文件也可以

访问filewrite.XGI生成webshell.XGI

注入类型2 需要验证sign
当cmd为uploadAuthorizeKeyFile、uploadFileToMenu、uploadFileToMenuDo、delAppFile、uploadIcon其中一个且adminName和adminPwd不为空时进入sql查询,没有过滤造成了sql注入

此时的参数构造为initParams的值和FarmName数据库对应的值Farm1拼接,最后的md5就是sign
key=FarmName&initParams=cmd_uploadAuthorizeKeyFile__user_admin__pwd_admin&sign=xxxxxx

如图

admin'#

我们可以直接写文件,并且此接口可以将admin的密码读出来写到文件里
数据库测试

发送数据包

访问写入的文件,在文件头部可以看到202开头的就是管理员的加密密码

经测试该注入点写文件的内容里不能有 _ " 所以写文件的时候得选用不带_的解码函数,比如urldecode

访问filewrite.XGI生成webshell.XGI

Tips:burp发包的时候有个坑点,发包过去的数据到mysql那里会进行一次url解码,所以burp包里的编码内容需要二次编码,计算sign值的时候按一次编码计算即可
注入点类型3 sign验证固定的keyvaul值
类型2在进行sign判断时用到的keyval是从数据库里取出来的,这一切的前提都是目标没有进行过配置的修改,如果修改过之后生成的sign就无法与服务器进行验证了,导致无法进行漏洞利用
这里我们找到的这个接口有一个判断,当$key为inner的时候,$keyval是固定的Realor

找一个存在注入点的功能

写shell和类型二方法相同

访问filewrite.XGI生成webshell.XGI

0x05 后渗透相关
数据库
配置文件默认路径
C:\Program Files (x86)\RealFriend\Rap Server\data\Config\CasDbCnn.dat

把#换成=号base64解密即可

后台密码
登录密码就是md5加密的,解不开也无妨,往下看
控制台的登录过程,GET请求直接把加密的秘文直接拼接到最后,status为1即可登录成功

status为0是登录错误

默认界面也是通过加密密文来通过校验的

此前通过sql注入可以获取到管理员密码,直接使用加密的密码即可登录
登录的时候改数据包

0x06 解决方案
1.升级到最新版本,http://soft.realor.cn:88/Gwt7.0.3.1.exe
2.避免该应用暴露在公网中,或者对访问的ip做限制
0x07 参考链接
https://mp.weixin.qq.com/s/ZZYWISRS7D1YqJE9S3h7bw
https://x.threatbook.com/v5/article?threatInfoID=44165