08月06, 2020

一个字节的差错导致Cisco防火墙路由器远程代码执行

Author:
Zhou Aiting(@zhouat1) of Qihoo 360 Vulcan Team


0x1. 背景
上个月中旬的思科安全公告显示,一个我们早已发现但还没顾得上提交的RCE漏洞被补了。
编号:CVE-2020-3330,该漏洞是一个逻辑漏洞。漏洞公告细节如下: 111.jpg

0x2. 影响范围

涉及产品型号:Cisco Small Business RV110W Wireless-N VPN Firewall

受影响的固件:< 1.2.2.8

本文讨论版本:1.2.2.5 [2019-12-05 至 2020-06-17]

粗略统计下,全球潜在受影响的公网设备数如下:

222.png

0x3. 漏洞挖掘过程

针对 IOT 设备的安全研究,端口扫描属于常规选项,它可以辅助我们快速发现潜在的攻击面。

333.png

扫描结果令我们惊讶,默认开启telnet服务!顺藤摸瓜,接下来我们来看看 Cisco 公司的密码强度如何 :)

既然是默认开启telnet服务,那就看看它在哪里开启的。很快定位到一个疑似目标 start_services

undefined4 start_services(void)
{
  int iVar1;
  int iVar2;
  FILE *__stream;
  char *__nptr;
  char acStack4112 [4096];

  __nptr = (char *)nvram_get("lan_ip_mode");
  if (__nptr == (char *)0x0) {
    __nptr = "";
  }
  iVar1 = atoi(__nptr);
  ...
  ...


  if (iVar1 == 2) {
  ...
  }
  else {
    start_upnp();
    start_igd();
    start_eapd();
    start_nas();
    start_zebra();
    start_snmp();
    start_upnp();
    start_wps(0);
    start_lltd();
    start_telnet();  <---  (1)
  }

如果 lan_ip_mode 的值不是字符串 ”2”, 就会进入start_telnet的逻辑。

undefined4 start_telnet(void)

{
  char *__s1;
  int iVar1;
  undefined4 uVar2;
  FILE *__s;
  char **ppcVar3;
  char *local_158;
  undefined *local_154;
  undefined *local_150;
  char *local_14c;
  undefined *local_148;
  int local_144;
  undefined4 local_140;
  char *local_13c;
  undefined *local_138;
  undefined *local_134;
  int local_130;
  undefined *local_12c;
  char *local_128;
  undefined *local_124;
  int local_120;
  undefined4 local_11c;
  char acStack280 [256];

  __s1 = (char *)nvram_get("telnet_enable");                                <---  (2)
  if ((__s1 != (char *)0x0) && (iVar1 = strcmp(__s1,"1"), iVar1 != 0)) {
    return 0;
  }
  iVar1 = is_exist("/bin/login");
  if (iVar1 == 0) {
    __s = fopen("/dev/console","w");
    if (__s == (FILE *)0x0) {
      uVar2 = 0xffffffff;
    }
    else {
      fwrite("Start telnetd failed! Can\'t find /bin/login!\n",1,0x2d,__s);
      fclose(__s);
      uVar2 = 0xffffffff;
    }
  }
  else {
    __s1 = (char *)nvram_get("telnet_wan_enable");
...
...

start_telnet 的逻辑更简单了,判断只要telnet_enable的值为空或者“1”,就会开启 telnet 服务,否则直接return。

那么lan_ip_mode 、telnet_enable 的值是否满足条件呢?^_^

使用以下命令快速验证下: image.png

在后续的逻辑中,我们发现了admin账户的密码 hash 值,hash算法选择的是md5。 444.png

hashcat 刚启动,hash的明文值就已经映入眼帘了,是一个弱密码(*****123)。

0x4. 漏洞利用演示

555.png

0x5. 漏洞修复

最新版本固件将start_telnet()函数移除了。

666.png

注: 本文发布时,Cisco官方已经修复漏洞、固件也已更新。

Ref: https://www.cisco.com/c/en/us/support/docs/csa/cisco-sa-rv110w-static-cred-BMTWBWTy.html

本文链接:https://blogs.360.cn/post/yi-ge-zi-jie-cha-cuo-dao-zhi-Cisco-fang-huo-qiang-lu-you-qi-yuan-cheng-dai-ma-zhi-xing.html

-- EOF --

Comments