如何控制数十万台中华电信Modem

摘要: 针对Modem的漏洞攻击

前言

我们的工作就是研究最新的攻击技术、挖掘出可以影响整个世界的漏洞,帮助厂商防御黑客和暗网的攻击,让这个世界变得更加安全!

漏洞研究当成工作,一直以来是许多安全爱好者的梦想,但大部分的人只看到发表漏洞或在安全大会上演讲时的光鲜亮丽,没注意到背后的辛苦。事实上,漏洞研究往往是一个非常朴实且枯燥的过程。

漏洞挖掘并不像CTF,一定存在着漏洞和解法,你只需在题目限定范围内,根据现有的条件和线索去推断出题者的意图,就可以找到flag。虽然还是有那种非常难的CTF比赛,例如HITCON CTFPlaid CTF,不过找出漏洞如何利用漏洞在本质上已经是两件完全不同的事情了!

CTF很适合有一定安全技术的人锻炼自己的能力,但缺点就是局限性,真实世界的网络攻防往往更复杂!要在一个成熟的、已使用多年且全世界安全研究人员都在关注的产品上挖掘出新漏洞,绝对不是简单的事!一场CTF竞赛顶多也就48小时,但真正挖掘漏洞所耗费的时间是个无底洞。

在我们上一个研究中,发现了三个知名SSL VPN厂商旗下产品的RCE漏洞,虽然成果丰硕,但这也是花了整个研究团队半年的时间(加上后续处理可能达到了一年),而且前两个月完全是零产出,无任何希望的曙光。所以对于一个漏洞研究人员来说,除了技术能力外,耐得住寂寞或许才是最重要的!

漏洞研究往往不是一家公司赚钱的项目,但却无法不投资。有多少公司能够允许员工半年,甚至一年都没有产出呢?

影响范围

故事回到今年年初的某天,我们监控到全台湾有大量的IP都开放着3097端口,而且有趣的是,这些IP地址并不是什么服务器,而是普通的家用电脑。一般来说,家用电脑都是通过Modem连接上国际网络,对外不会开放任何服务,就算是Modem的SSH及HTTP管理界面,也只有处于内网才能访问到,因此我们怀疑这与ISP的配置错误有关!我们也成功的在这个端口上挖掘出一个无需身份验证的RCE漏洞!

通过这个漏洞我们可以:

  1. 窃听网络流量,从中获取***、登录凭证等敏感信息

  2. 进行钓鱼和劫持,控制你的电脑甚至手机

  3. 结合红队演练去绕过各种开发者的白名单政策………

而相关CVE的漏洞编号为:

  • CVE-2019-13411

  • CVE-2019-13412

  • CVE-2019-15064

  • CVE-2019-15065

  • CVE-2019-15066

相较于以往针对Modem的攻击,这次的漏洞更为严重!以往就算漏洞再严重,只要Modem不对外开放任何端口,攻击者也无计可施,但这次你的Modem直接在网络上裸奔,攻击者仅仅只要知道你的IP,便可直接进入你家内网。

经过全网扫瞄,我们发现全台湾约有25万IP受到影响,这代表至少25万个家庭受影响。值得注意的是,扫描是有时效性的,真正的受害者一定大于这个数字!

而对IP地址的反查,发现有高达九成的受害者都是中华电信的动态IP,剩下的一成则是某些固定IP及其他电信公司。至于为何会有其他电信公司,我们猜测是由于中华电信作为台湾地区最大电信厂商,覆盖面最广,因此在一些比较偏僻的地段可能其他电信厂商也是使用中华电信的设备!由于我们不是厂商,无法得知完整受影响设备的型号列表,不过可以肯定最多人使用的中华电信光世代GPON数据机也在受影响范围内!

1.png

漏洞挖掘

只是一个配置错误并不能说是什么大漏洞,所以接下来我们希望能在这个设备上挖掘出更严重的漏洞!根据有无原始代码、执行文档以及API文件,我们可以把漏洞挖掘分为:

  • 黑盒测试

  • 灰盒测试

  • 白盒测试

在什么都没有的的状况下,我们只能依靠经验先进行黑盒测试。

黑盒测试

3097端口提供了许多跟电信网络相关的指令,推测是中华电信工程师日常使用网络设定页面!

2.png

我们可以透过HELP指令列出所有指令,其中发现了一个指令叫做MISC,看名字感觉就是把一堆不知道怎么分类的指令都归类在这,而另外一个叫做script的指令吸引了我们!它的参数为一个文件名,指令执行后会把文件当成Shell script来执行,但由于暂时无法往目标机器上传文件,因此也无法实现RCE。不过有趣的是,MISC script这个指令会将STDERR给显示出来,可以通过这个特性去实现任意文件读取!

从黑盒进化成灰盒

在漏洞的利用上,不外乎都围绕着读、写以及代码执行这三点,现在我们能够读,接下来呢?

这个管理界面貌似拥有很高的权限,所以可以直接读取系统敏感文件,得到某些登录密码!

3.png

通过对root密码的破解,我们成功的登录了SSH,将黑盒转化为灰盒。虽然目前可以成功控制自己的Modem,但一般家用Modem是不会对外开放SSH服务的,为了可以远程控制别人的Modem,我们还是得想办法从3097端口获取代码执行权限。

4.png

这个中华电信的Modem是一个跑在MIPS处理器架构上的嵌入式Linux系统,而3097服务则是由/usr/bin/omcimain文件来处理,大小有将近5MB,这对逆向来说工程量并不小,但与黑盒相较,至少有了东西可以分析了。

$ uname -a
Linux I-040GW.cht.com.tw 2.6.30.9-5VT #1 PREEMPT Wed Jul 31 15:40:34 CST 2019
[luna SDK V1.8.0] rlx GNU/Linux

$ netstat -anp | grep 3097
tcp0  0 127.0.0.1:3097  0.0.0.0:*   LISTEN

$ ls -lh /usr/bin/omcimain
-rwxr-xr-x1 root   root4.6M Aug  1 13:40 /usr/bin/omcimain

$ file /usr/bin/omcimain
ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked

从灰盒进化成白盒

现在,我们可以通过逆向了解每个指令背后的原理以及实现了!不过首先,逆向是一个痛苦且烦闷的过程,一个小小的程序可能包含几万、甚至十几万行的代码,因此挖洞的策略就变得很重要!从表面功能来看,命令注入相关漏洞的可能性较大,因此先以功能作为出发点开始挖掘!

整个3097服务的处理逻辑其实就是一个多层的IF-ELSE语句,每一个小框框对应的一个功能的实现,例如cli_config_cmdline就是对应CONFIG这条指令。

5.png

研究了一段时间后,并没有发现到什么严重漏洞。不过我们注意到,当输入未知指命时,会进入到了一个with_fallback函数,这个函数的主要目的是把匹配失败的指令接到/usr/bin/diag之后继续执行!

6.png

with_fallback的大致逻辑如下,其中s1为输入的指令,如果指令不在定义好的列表内或者指令中出现问号的话,就与/usr/bin/diag连接起来丢入system执行!当然,为了防止命令注入等相关攻击,在进入system之前会先根据黑名单进行恶意字符检查。

  char *input = util_trim(s1);
  if (input[0] == '\0' || input[0] == '#')
      return 0;

  while (SUB_COMMAND_LIST[i] != 0) {
      sub_cmd = SUB_COMMAND_LIST[i++];
      if (strncmp(input, sub_cmd, strlen(sub_cmd)) == 0)
          break;
  }

  if (SUB_COMMAND_LIST[i] == 0 && strchr(input, '?') == 0)
      return -10;

  // ...

  while (BLACKLISTS[i] != 0) {
      if (strchr(input, BLACKLISTS[i]) != 0) {
          util_fdprintf(fd, "invalid char '%c' in command\n", BLACKLISTS[i]);
          return -1;
      }
      i++;
  }

  snprintf(file_buf,  64, "/tmp/tmpfile.%d.%06ld", getpid(), random() % 1000000);
  snprintf(cmd_buf, 1024, "/usr/bin/diag %s > %s 2>/dev/null", input, file_buf);
  system(cmd_buf);

BLACKLISTS定义如下:

char *BLACKLISTS = "|<>(){}`;"

你能想到如何绕过吗?

答案很简单!命令注入往往就是这么的简单且朴实无华!

7.png

以下示范了如何从PTT(某个论坛)知道受害者的IP地址,从而实现真正意义上的指哪打哪!

视频地址:https://youtu.be/Pq00YUoBOsQ

后记

故事到这边差不多进入尾声,整篇文章看似轻描淡写,从结果上来说也许只是一个简单的命令注入,但实际上中间所花的时间、走过的歪路是正在读文章的你无法想像的,这就像是在黑暗中走迷宫,在没有走出迷宫前永远不会知道自己正在走的这条路是否正确!

通报流程

2019年07月28日——通过TWCERT/CC上报中华电信

2019年08月14日——厂商表示清查并修补设备中

2019年08月27日——厂商表示九月初修补完毕

2019年08月30日——厂商表示已完成受影响设备的安全更新

2019年09月11日——厂商表示部分用户需派人手动更新,延迟漏洞公开时间

2019年09月23日——与TWCERT/CC确认可公开

2019年09月25日——在DEVCORE Conference 2019进行漏洞发表

2019年11月11日——文章放出

原文链接:https://blog.orange.tw/2019/11/HiNet-GPON-Modem-RCE.html

上一篇:SMB远程代码执行漏洞(CV...
下一篇:Ghostcat Tomca...