X康防火墙RCE分析
2022-9-19 23:54:49 Author: xz.aliyun.com(查看原文) 阅读量:54 收藏

事情起因是我在xx星球中看到有师傅公开了X康防火墙漏洞,我自己手里也存了好几个月了,到现在应该也修的差不多了,索性把之前的分析发出来吧

漏洞入口点:

可以看到用的是Ext_Diret类中的run方法,然后全局搜索run方法,并且可以看到该类的路由为/directdata/direct/router

先是37行的Ext_Direct_Request类中的factory方法,全局搜索factory,可以看到获取data的方法是利用php伪协议,这里要注意,外面有个json_decode函数,所以传参需要以json形式,这里先判断了有没有type tid action method传参,有的话就直接return

然后我们查找getAction

这段代码大致逻辑是先判断传没传action,action代表的是类,然后是method,这俩没有的话就直接抛出异常,然后判断

可以看到第56行有一个getParam函数,这是request是传进run的参数

可以看到这个Directdata_DirectController继承了Zend_Controller_Action
这个controller中找到getrequest函数,可以发现默认为空的

然后抛出异常之后往下走

然后注意下该函数用法
call_user_func_array((类,方法),参数)
获取类名赋值到dao,然后利用getMethod获取方法名和getArguments获取参数

此时我们就可以调用到最终的漏洞点

可以看到在NS_Rpc_HeartBeat类中的delTestFile函数 其中获取filename然后拼接cmd中

Exec_cmd文件是啥呢,找到该文件
Cmd获取到了环境变量ENV{‘CMD’}

这段代码的意义呢?我在本地的linux进行了测试如下

发现6,7行是可以删掉的,也能成功执行命令如下

前面几句都还好理解,cmd赋值环境变量中的cmd,这个在上文的putenv已经可以看到了,然后是删除其他几个env并且路径重新赋值

$cmd=~m/(.*)/;
$cmd=$1;

第一个就是正则表达式进行匹配全文本,因为赋值过来的env是不能直接使用的,$1就是第一个小括号的匹配结果,例子如下

最后整个漏洞数据包(type和tid中不空就行,随便填)
POST /directdata/direct/router HTTP/1.1
Host: x.x.x.x
Content-Type: application/json
Content-Length: 113

{"action":"NS_Rpc_HeartBeat","method":"delTestFile","data": ["/var/www/tmp/1.txt;%s>%s.txt"],"type":"rpc","tid":11,"f8839p7rqtj":"="}

这个RCE只是其一,整个源码审出来的不少于7个无条件RCE,后台RCE就更多了,不过基本原理一样,就不发出来赘述了


文章来源: https://xz.aliyun.com/t/11704
如有侵权请联系:admin#unsafe.sh