事情起因是我在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就更多了,不过基本原理一样,就不发出来赘述了