如何反编译D-Link路由器固件程序并发现它的后门

OK,又是周末晚上,没有约会,只有一大瓶Shasta汽水和全是快节奏的音乐…那就研究一下程序吧。

一时兴起,我下载了D-link无线路由器(型号:DIR-100 revA)的固件程序 v1.13。使用工具Binwalk,很快的就从中发现并提取出一个只读SquashFS文件系统,没用多大功夫我就将这个固件程序的web server(/bin/webs)加载到了IDA中:

/bin/webs中的字符信息

基于上面的字符信息可以看出,这个/bin/webs二进制程序是一个修改版的thttpd,提供路由器管理员界面操作功能。看起来是经过了台湾明泰科技(D-Link的一个子公司)的修改。他们甚至很有心计的将他们很多自定义的函数名都辅以“alpha”前缀:

明泰科技的自定义函数

这个alpha_auth_check函数看起来很有意思!

这个函数被很多地方调用,最明显的一个是来自alpha_httpd_parse_request函数:

调用alpha_auth_check函数

我们可以看到alpha_auth_check函数接收一个参数(是存放在寄存器$s2里);如果alpha_auth_check返回-1(0xFFFFFFFF),程序将会跳到alpha_httpd_parse_request的结尾处,否则,它将继续处理请求。

寄存器$s2在被alpha_auth_check函数使用前的一些操作代码显示,它是一个指向一个数据结构体的指针,里面有一个char*指针,会指向从HTTP请求里接收到的各种数据;比如HTTP头信息和请求地址URL:

$s2是一个指向一个数据结构体的指针

我们现在可以模拟出alpha_auth_check函数和数据结构体的大概样子:

struct http_request_t{ char unknown[0xB8]; char *url; // At offset 0xB8 into the data structure};int alpha_auth_check(struct http_request_t *request);

alpha_auth_check本身是一个非常简单的函数。它会针对http_request_t结构体里的一些指针进行字符串strcmp比较操作,然后调用check_login函数,实际上就是身份验证检查。如果一旦有字符串比较成功或check_login成功,它会返回1;否者,它会重定向浏览器到登录页,返回-1;

alpha_auth_check函数代码片段

这些字符串比较过程看起来非常有趣。它们提取请求的URL地址(在http_request_t数据结构体的偏移量0xB8处),检查它们是否含有字符串“graphic/” 或 “public/”。这些都是位于路由器的Web目录下的公开子目录,如果请求地址包含这样的字符串,这些请求就可以不经身份认证就能执行。

然而,这最后一个strcmp却是相当的吸引眼球:

alpha_auth_check函数中一个非常有趣的字符串比较

这个操作是将http_request_t结构体中偏移量0xD0的字符串指针和字符串“xmlset_roodkcableoj28840ybtide”比较,如果字符匹配,就会跳过check_login函数,alpha_auth_check操作返回1(认证通过)。

我在谷歌上搜索了一下“xmlset_roodkcableoj28840ybtide”字符串,只发现在一个俄罗斯论坛里提到过它,说这是一个在/bin/webs里一个“非常有趣”的一行。我非常同意。

那么,这个神秘的字符串究竟是和什么东西进行比较?如果回顾一下调用路径,我们会发现http_request_t结构体被传进了好几个函数:

事实证明,http_request_t结构体中处在偏移量 0xD0处的指针是由httpd_parse_request函数赋值的:

检查HTTP头信息中的User-Agent值

将http_request_t + 0xD0指针指向头信息User-Agent字符串

这代码实际上就是:

if(strstr(header, "User-Agent:") != NULL){ http_request_t->0xD0 = header + strlen("User-Agent:") + strspn(header, " \t");}

知道了http_request_t偏移量0xD0处的指针指向User-Agent头信息,我们可以推测出alpha_auth_check函数的结构:

#define AUTH_OK 1#define AUTH_FAIL -1int alpha_auth_check(struct http_request_t *request){ if(strstr(request->url, "graphic/") || strstr(request->url, "public/") || strcmp(request->user_agent, "xmlset_roodkcableoj28840ybtide") == 0) { return AUTH_OK; } else { // These arguments are probably user/pass or session info if(check_login(request->0xC, request->0xE0) != 0) { return AUTH_OK; } } return AUTH_FAIL;}

换句话说,如果浏览器的User-Agent值是 “xmlset_roodkcableoj28840ybtide”(不带引号),你就可以不经任何认证而能访问web控制界面,能够查看/修改路由器的 设置(下面是D-Link路由器(DI-524UP)的截图,我没有 DIR-100型号的,但DI-524UP型号使用的是相同的固件):

访问型号DI-524UP路由器的主界面

基于HTML页上的源代码信息和Shodan搜索结果,差不多可以得出这样的结论:下面的这些型号的D-Link路由器将会受到影响:

  • DIR-100
  • DI-524
  • DI-524UP
  • DI-604S
  • DI-604UP
  • DI-604+
  • TM-G5240

除此之外,几款Planex路由器显然也是用的同样的固件程序:

  • BRL-04UR
  • BRL-04CW

你很酷呀,D-Link。

脚注:万 能的网友指出,字符串“xmlset_roodkcableoj28840ybtide”是一个倒序文,反过来读就是 “editby04882joelbackdoor_teslmx”——edit by 04882joel backdoor _teslmx,这个后门的作者真是位天才!

(0)

相关推荐

  • 路由器之基本维护经验

    下面介绍路由设置的一些基本概念 两种状态 进入路由有两种状态,如下: nb-r-01> "低级机密状态 nb-r-01# "高级机密状态 在低级机密状态输入enable,路由会提示输入密码,输入enable secrect password 路由验证正确后,就会进入高级机密状态.过程如下: nb-r-01>enable Password: "输入enable secrect password nb-r-01# 在高级机密状态下,就可以对路由的各种参数进行设置 帮助

  • Cisco 路由器常用命令

    Cisco 路由器常用命令 1 Exec commands: <1-99> 恢复一个会话 bfe 手工应急模式设置 clear 复位功能 clock 管理系统时钟 configure 进入设置模式 connect 打开一个终端 copy 从tftp服务器拷贝设置文件或把设置文件拷贝到tftp服务器上 debug 调试功能 disable 退出优先命令状态 disconnect 断开一个网络连接 enable 进入优先命令状态 erase 擦除快闪内存 exit 退出exce模式 help 交互

  • 路由器基础配置及传输协议

    在现今网络飞速发展的时代中,路由器有着举足轻重的作用.因为路由器作为网络层中的中继系统, 提供着一个在第三层网络间数据的路由选择与转发功能.因此,路由器的功能.作用及基础配置都是作为IT行业成员的我们必须熟练掌握的. 以下,我们将从两方面对路由器作一个简要的分析:即如何在实验中搭建一个最简单的网络环境,并在其配置中常会碰到的情况及相对应的解决方法:以及对在网际中的数据传输中应用不同的数据封装协议(HDLC与PPP).链路压缩进行传输速率的比较. 路由器配置及网络搭建 要组建一个网络,就须在应用中

  • 软件路由器coyote Linux安装使用指南

    coyote Linux(北美土狼)是一款非常小巧方便的软件路由器和防火墙软件,它以一张软盘为载体,可以使用一些比较古老的机器做为代理防火墙,而它的功能却很强大,本文简要介绍一些coyote Linux的安装及配置使用. 首先到http://www.vortech.net/ 上下载coyote Linux的最新版本,到目前为止,最新版本是2.4.0.注意:其网站上提供了若干平台的制作版本,我们一般采用Windows Disk Creation Wizard v2.24.0版本,意思是在windo

  • 路由技术,路由器与网络安全

    路由器(Router)是因特网上最为重要的设备之一,正是遍布世界各地的数以万计的路由器构成了因特网这个在我们的身边日夜不停地运转的巨型信息网络的"桥梁".因特网的核心通讯机制是一种被称为"存储转发"的数据传输模型.在这种通讯机制下,所有在网络上流动的数据都是以数据包(Packet)的形式被发送.传输和接收处理的.接入因特网的任何一台电脑要与别的机器相互通讯并交换信息就必须拥有一个唯一的网络"地址".数据并不是从它的"出发点"直

  • 路由器配置

    这部分将从基础的路由器配置开始,一步一步引导你的深入学习.这部分更适合于初学者,如果你拥有CCIE证书可以跳过. 基本路由器配置: 如果你从未接触过Cisco的路由器或者我们的结构,教育实验室将是你开始学习的一个好地方.我们会从最基本的部分开始,一步一步引导你进行我们大部分结构的配置. 在学习之前,最好先把左边边缘的示意图表和布局图打印下来,示意图表说明了机架是如何连线的,以及你激活的路由器部分的关系,布局图说明了我们在实验室中使用各种设备的连接关系.我们将要学习如何建立这些网络图表中讲述的内容

  • 网络基础学习之十八主要路由器技术

    路由器我们知道是一个相当复杂的设备,它的复杂性并不在于它的硬件如何庞大,而在于它的软件技术相当复杂.目前全球能生产出中.高档路由器的也只有少数的那么几家,国内就更少了.为了对路由器技术有一个较全面的了解,本节就路由器技术的几个重要方面作如下介绍. 一.主要路由协议 路由协议是路由器软件中重要的组成部分.路由器的路由功能就是通过这些路由协议来实现的,路由协议的作用是用来建立以及维护路由表.路由表是记录一些转发数据到已知目的节点的最佳路径,有了它,只需直接按路径转发数据包即可,可大大提高数据转发的速

  • 深入了解路由器

    路由器是什么 是什么把网络相互连接起来?是路由器.路由器是互联网络的枢纽."交通警察".目前路由器已经广泛应用于各行各业,各种不同档次的产品已经成为实现各种骨干网内部连接.骨干网间互联和骨干网与互联网互联互通业务的主力军. 所谓路由就是指通过相互连接的网络把信息从源地点移动到目标地点的活动.一般来说,在路由过程中,信息至少会经过一个或多个中间节点.通常,人们会把路由和交换进行对比,这主要是因为在普通用户看来两者所实现的功能是完全一样的.其实,路由和交换之间 的主要区别就是交换发生在OS

  • 路由器默认密码 精典

    你还没注册?或者没有登录?这篇文章要求至少是本站的注册会员才能阅读! 如果你还没注册,请赶紧点此注册吧! 如果你已经注册但还没登录,请赶紧点此登录吧! 文章录入:aaadxmmm    责任编辑:aaadxmmm

  • 路由器相关技术

    路由器发展到今天,已经成为一种成熟产品,但应用于其上的新技术仍在不断涌现,目前路由器的主流技术大致包括以下几方面: ■ADSL接入及PPPoE ADSL(Asymmetrical Data Subscriber Line)是一种宽带接入技术,是目前比较流行的宽带技术的一个代表,下行带宽可以达到8Mbps,上行带宽可以达到640kbps. PPPOE(PPP over Ethernet,PPP:Point to Point Protocol)是一种新型的协议,用于解决对以太网接入用户的认证和计费问

  • 路由器的基本配置

    参数设置 以下假设路由的名字为nb-r-01 登陆到路由上 nb-r-01>enable Password: "输入enable secrect password nb-r-01#conf ter Enter configuration commands, one per line. End with CN 网络号 nb-r-01#conf ter nb-r-01(config)#router rip nb-r-01(config-router)#network 202.96.102.0

  • 网络基础学习之十九路由器的硬件连接

    在了解了路由器的基础知识后,从本篇开始就要正式介入路由器的使用了.本篇所要介绍的就是使用前的基础工作--路由器的硬件连接. 因为路由器属于一种用于网络之间互联的高档网络接入设备,因其连接的网络可能多种多样,所以其接口类型也就比较多.为此,在正式介绍路由器的连接方法之前我们有必要对路由器的一些基本接口进行认识. 一.路由器接口 路由器具有非常强大的网络连接和路由功能,它可以与各种各样的不同网络进行物理连接,这就决定了路由器的接口技术非常复杂,越是高档的路由器其接口种类也就越多.路由器既可以对不同局

  • 网络基础学习之十七路由器原理、分类和选购

    上一篇我们已对路由器的基础方面有一个全面的了解,本篇要继续介绍路由器的其它几个方面.首先要介绍的是路由器的工作原理,只有在充分理解了路由器工作原理基础上,才能正确理解路由器的主要作用. 一.路由器的工作原理 我们知道路由器是用来连接不同网段或网络的,在一个局域网中,如果不需与外界网络进行通信的话,内部网络的各工作站都能识别其它各节点,完全可以通过交换机就可以实现目的发送,根本用不上路由器来记忆局域网的各节点MAC地址.路由器识别不同网络的方法是通过识别不同网络的网络ID号进行的,所以为了保证路由

  • 网关与路由器的区别

    Gateway(网关) 与 Router(路由) : Gateway 与 Router 也是节点当中相当重要的一环,他的主要工作是: · 将两个不同的网域 ( network ) 进行转译的功能: · 制作路由 ( route ) 的功能. 刚刚在上头我们知道在同一个 network 当中,资料可以在两个 IP 之间直接沟通,那么如果不在同一个 network 呢?举个例子来说,如果在上面的图标当中,那个 PC1 的 IP 是 192.168.0.1 而 PC2 的 IP 是 192.168.1

随机推荐