Ruckus 路由器多个漏洞分析( 二 )


  • uVar6 = repoGetCurrent(attr_comp);
  • ...
  • }
  • 这里重新判断了 post data 中 ajax-request标签中 comp 属性的值 , 如果这里不为 system 的话 , 不会进入 if 判断 , 转而去执行repoGetCurrent函数中 , 参数为 comp 属性的值 。跟进函数:
     
    1. undefined4 repoGetCurrent(undefined4 uParm1)

    2. {
    3. undefined4 uVar1;

    4. uVar1 = repoGetCurChild(uParm1,0x0,0x1);
    5. return uVar1;
    6. }
    继续跟进 repoGetCurChild函数 , 第一个参数还是 comp 属性的值 , 使用psprintf函数格式化到 p_Var1 变量表示的栈上的内存空间之后 , 继续执行_repoGetCache函数 。
     
    1. int repoGetCurChild(char*pcParm1,char*pcParm2,bool bParm3){
    2. ...
    3. pcVar2 =(char*)psprintf(p_Var1,"%s/airespider/%s.xml",PTR_DAT_000a39cc,pcParm1);
    4. local_c = _repoGetCache("Current",p_Var1,pcParm1,pcVar2,pcParm2,bParm3,false);
    5. ...
    6. }
    继续跟进函数 , 函数中又调用了 FUN_00054aec函数 , 其中调用了_shash_insert函数 , 将 post data 中整个 admin 标签插入到psprintf函数格式化的字符串表示文件中 。
    Ruckus 路由器多个漏洞分析

    文章插图
    因为在 adapter_setConf 函数的 if 分支中 , 需要进行登录认证 , 而在 if 分支之外调用repoGetCurrent函数不需要进行认证 , 当 comp 属性的值为/system时 , 就可以绕过 strcmp 函数的判断 , 不会进入到 if 分支 。同时拼接的字符串文件名为:/etc/airespider-default//system.xml 。而 system.xml 存放的正是 admin 用户的登录凭证:
    Ruckus 路由器多个漏洞分析

    文章插图
    此时就可以达到未认证效果对 admin 用户的登录凭证进行覆盖 , 从而达到未授权访问的效果 。
     
    漏洞修复新版本的 ruckus unleased 中 , 直接将 /admin/_wla_conf.jsp脚本文件进行了删除 。
    Ruckus 路由器多个漏洞分析

    文章插图
     
    CVE-2020-13919 后台命令注入漏洞概述 
    关于 ruckus unleased 后台命令注入漏洞复现 。该漏洞是由一个历史的命令注入漏洞过滤不严格造成的新漏洞 。关于该历史漏洞的详情可以查看参考链接一 。
     
    固件下载 
    1. https://support.ruckuswireless.com/software/2328-ruckus-unleashed-ap-200-8-10-3-243-ga-software-for-r610
     
    漏洞分析将固件进行解压之后 , 进入 /web 目录 , 漏洞发生在 /web/admin/_cmdstat.jsp脚本文件中 , 因为该漏洞是认证后的漏洞 , 所以脚本代码中 if 判断的 check 会通过 , 进而会去执行AjaxCmdStat回调函数 。
     
    1. <%
    2. Delegate("SessionCheck", session["cid"],'true');
    3. var httpReq = request["headers"];
    4. Delegate("CsrfTokenCheck", session["cid"], httpReq.HTTP_X_CSRF_TOKEN);
    5. if(session["csrfAccepted"]=='true'){
    6. Delegate("AjaxCmdStat", session["cid"]);
    7. }
    8. %>
    同样在 /bin/emfd可执行文件中找到AjaxCmdStat函数的位置 , 该函数直接调用了AjaxCmdStat_impl函数:
     
    1. voidAjaxCmdStat(undefined4 uParm1,undefined4 uParm2)

    2. {
    3. AjaxCmdStat_impl(uParm1,uParm2,0x0,0x0,0x0);
    4. return;
    5. }
    跟进函数 , 在AjaxCmdStat_impl函数的末尾 , 会接着调用adapter_doCommand函数 , adapter_doCommand函数继续调用doCommand函数 , 该函数主要用来处理 post data 的 xcmd 子标签 , 判断 xcmd 子标签中 cmd 属性的值:


    推荐阅读