专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
内蒙古市场监管  ·  公开征集问题线索,事关网络餐饮食品安全! ·  15 小时前  
内蒙古市场监管  ·  公开征集问题线索,事关网络餐饮食品安全! ·  15 小时前  
丽水在线  ·  最新通报:查封!停售 ·  22 小时前  
丽水在线  ·  最新通报:查封!停售 ·  22 小时前  
计算机与网络安全  ·  2025 ... ·  2 天前  
51好读  ›  专栏  ›  看雪学苑

zyxel路由器CVE-2024-9200漏洞调用链分析

看雪学苑  · 公众号  · 互联网安全  · 2025-05-04 17:59

正文

请到「今天看啥」查看全文






2

漏洞分析


以下是从公告中获取的漏洞信息,知道了触发页面在诊断(diagnostic)中,参数就是host。



对应页面内容



点击按钮后抓包,发了三个包,第一个是put,但是参数被加密了,后面两个包是get类型,应该是获取结果。



上面的抓包获取了/cgi-bin/DAL?oid=PINGTEST这个关键信息,那么直接关键词在zhttpd中搜索即可,来到了cgi-bin_DAL这个函数。


(注:下文后面我贴的所有ida中看到的程序的代码,我都做了删改和注释,帮助快速看懂关键代码)


int __fastcall cgi_bin_DAL(int a1, unsigned __int8 a2)
{
  RdmObjHandler = 0;
  v34 = 0;
  oid = 0;
  method = 0;
  oid = (char *)cg_http_vallist_getvalue((a1 + 672), (int)"oid");//获取oid的值,也就是抓包中看到的pingtest
  method = (char *)cg_http_request_getmethod(a1);

  v23 = json_object_new_object(v2);
  if ( !strcmp(method, "POST") || !strcmp(method, "PUT") )
  {
    v24 = cg_string_getvalue((a1 + 4));//获取POST数据
    v3 = cg_http_packet_getheaderlonglong(a1, "Content-Length");
    
    v34 = (char *)json_tokener_parse(v24, HIDWORD(v3));
   
    insertLoginUserInfo((int)v34, a1 + 680, a1 + 712);
    RdmObjHandler = zcfgFeDalHandler((int)oid, (int)method, (int)v34, 0, (int)s);//根据oid值处理请求,具体实现在libzcfg_fe_dal.so中
   
  }
}


zcfgFeDalHandler这个函数在libzcfg_fe_dal.so中,继续跟进代码。这里的全局变量dalHandler,跟进后可确认就是handler表,保存oid值和对应处理函数。


int __fastcall zcfgFeDalHandler(char *oid, const char *method, int a3, int a4, char *dest)
{

  if ( !oid )
    return 0;
  v9 = 0;
  v10 = 24;
  while ( 1 )
  {
    v11 = *(&dalHandler + v10 * v9);
    if ( !v11 )
    {
      v12 = 0;
      goto LABEL_7;
    }
    v15 = v10;
    if ( !strcmp(oid, v11) )
      break;
    v10 = v15;
    ++v9;
  }
  v12 = 1;
LABEL_7:
  printf("handlerName=%s method=%s i=%d\n", oid, method, v9);

  v14 = 24 * v9;
  if ( !j_parseValidateParameter(a3, method, *(&dalHandler + v14), *(&dalHandler + v14 + 4), dest) )
    return -17;
  if ( !*(&dalHandler + v14 + 8) )
    return 0;
  return (*(&dalHandler + v14 + 8))(method, a3, a4, dest);//根据oid的值在dalHandler表中匹配到的函数指针,调用对应的函数
}


表中pingtest对应如下,这里很容易判断出zcfgFeDalPingTest就是处理函数。




跟进zcfgFeDalPingTest,其中还有多处调用,这里就忽略了,直接来到最后一层关键函数zcfgFeDalIpDiagIPPingEdit。


int __fastcall zcfgFeDalIpDiagIPPingEdit(int






请到「今天看啥」查看全文