前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

[转] 我是如何反编译D-Link路由器固件程序并发现它的后门的 | 小谢的小站 折腾 编程 软件 站长 败家 摄影 生活 其他 网购导航 给我留言 English 搜索 TearSnow Fan ? 我一句话都不说…… 您当前位置 : 小谢的小站 ? 折腾 ? [转] 我是如何反编译D-Link路由器固件程序并发现它的后门的 Oct242013 [转] 我是如何反编译D-Link路由器固件程序并发现它的后门的 作者:xieyc 发布:2013-10-24 10:12 字符数:2721 分类:折腾 阅读: 791 次 2条评论 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 -1 int 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,这个后门的作者真是位天才! . 英文版:本站镜像,原始出处 翻 ? ?译:aqee . 分享到: 新浪微博 腾讯微博 QQ空间 人人网 腾讯朋友 开心网 本文固定链接: http://blog.xieyc.com/reverse-engineering-a-d-link-backdoor/ | 小谢的小站 该日志由 xieyc 于2013年10月24日发表在 折腾 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。 原创文章转载请注明: [转] 我是如何反编译D-Link路由器固件程序并发现它的后门的 | 小谢的小站 关键字: 刷机, 固件, 路由器 【上一篇】[航天院笔试启示] 自增、自减运算符的前缀和后缀形式区别【下一篇】印象笔记小窍门:通过发邮件来记笔记 您可能还会对这些文章感兴趣! TP741N(FW/MW150R)刷OpenWrt,DDWrt及 OpenWrt 路由器配置 IPv6穿透(1) 路由器中存储器的几个基本概念 那些年我折腾过的无线路由器(34) 小米手机/MIUI 线刷教程 DD-WRT刷回原厂固件教程 网件/NETGEAR 无线路由器和无线网卡信息一 网件WNDR3700刷OpenWrt后如何设置?(1) 目前共有 2 条留言 【 访客:1 条, 博主:1 条 】双方以 1:1 暂时持平 O(∩_∩)O~ 沙发 HanLee: 楼主,你简直就碉堡了,不过这样就能够黑进人家的路由器了吗? 2013-12-25 16:19 xieyc: 这个是转帖的。。。 @HanLee 2013-12-26 17:15 发表评论 点击这里取消回复。 昵称 * 邮箱 * (教你设置自己的个性头像) 网址 XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> --> 快捷键:Ctrl+Enter 最新日志热评日志随机日志 如何将IDE模式安装的Windows 7更改为 华擎B85M-ITX主板BIOS添加SL 一张图看懂电脑硬件 [转载] iOS技巧:和家人共用一个 App TP741N(FW/MW150R)刷OpenWrt, [海淘] 国际快递/转运单号追踪查询总结 [转载] 如何才能提高自己的「逼格」? 两款廉价SSD评测:三星840(120G)和影 NAS开箱:威联通/QNAP TS-212“ 从银联POS单判断信用卡消费是否有积分 NAS开箱:威联通/QNAP TS-212“超值版” 两款廉价SSD评测:三星840(120G)和影驰 比特币和挖矿简介 从银联POS单判断信用卡消费是否有积分 [海淘] 国际快递/转运单号追踪查询总结 [转载] 如何才能提高自己的「逼格」? TP741N(FW/MW150R)刷OpenWrt,DDWrt及刷 [转载] iOS技巧:和家人共用一个 Apple 一张图看懂电脑硬件 华擎B85M-ITX主板BIOS添加SLIC2.1硬激 在WordPress中插入表格的方法 [转] 我是如何反编译D-Link路由器固件 Visual Studio 不生成.vshost.exe和.p 窗体的FormBorderStyle属性的不同效果 常用的博客离线书写发布工具 Windows 7/XP 局域网络共享文件详细设 [户外]夜爬香山(夜来香)活动掠影 用C#进行Office应用程序开发(基础) 华擎B85M-ITX主板BIOS添加SL Char, String 和 Byte 等类型间的转换 分类目录 其他 (7) 折腾 (23) 摄影 (2) 生活 (10) 站长 (15) 编程 (35) 败家 (21) 软件 (27) 不要点我 标签云集 SEO Windows WordPress Microsoft 网络 网盘 C语言 TFS 晒单 北京交通大学 海淘 Visual Studio Victorinox 翡翠岛 莱泽曼 刷机 露营 中国移动 评测 Google SSD .Net 积分 败家 linux SLIC C# 硬盘 Windows8 固件 Leatherman Team Foundation Server 路由器 搜索引擎 VS 版本 户外 主题 共享 信用卡 控件 编码 工具钳 瑞士军刀 搞笑 BJTU 手机 dd-wrt 小米 BIOS 微软 Word 拆机 Router OpenWrt MIUI 单反 百度 运动 Plugin Windows7 ThinkPad Chrome Office STM32 官方微信扫一扫 最活跃的读者 最新评论 Marko: 请问 超值版其实和TS-212P feelfeelsister: 轻点败家,轻点鲁 南浦月: 博主真能折腾,这么多路由器,烧钱 风笛: 其实MP3只要能改相关的代码比如 HanLee: 楼主,你简直就碉堡了,不过这样就 Wall-E: 吊丝 xx: 用过就后悔,上当了 HeHe: 你好!我看到了你的blog上的有 tianw: 写的非常棒,留名了 shasha: 那个芯片就是用于普通的消费,在有 博客统计 日志总数:125 篇 评论总数:214 篇 分类总数:8 个 标签数量:217 个 链接总数:11 个 建站日期:2012-09-22 运行天数:504 天 最后更新:2014-2-8 捐赠本站 如果您觉得本站的内容对您有帮助,非要感谢一下不可,那么请狂点下方按钮给小谢捐赠。 用户登录 用户名: 密 码: 记住我 文章归档 | 友情链接 | 微博分享 | 小谢论坛 | 关于本站 Copyright &copy; 2012-2014 小谢的小站. Powered by WordPress 3.8.1. Theme by TearSnow. XML Sitemap. HTML SItemap.