热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入分析EwonFlexy物联网路由器(下)

  0x0B 逆向分析Ewon文件根据之前的截图,我们无法在NAND Flash转储文件中找到太多信息。我希望系统会使用预设的工具(如apache2、lighthttpd或者nginx)来设置web接

 

 

0x0B 逆向分析Ewon文件

根据之前的截图,我们无法在NAND Flash转储文件中找到太多信息。我希望系统会使用预设的工具(如apache2、lighthttpd或者nginx)来设置web接口,或者使用vsftpd及其他解决方案来设置FTP服务。幸运的是,当开发者决定使用自己定制的服务版本时,可能会忽略掉许多安全功能或者保护措施。

逆向分析二进制文件时,我们很自然就会搜索其中包含的字符串。

我在文件中简单grep搜索某些字符串,比如passwordpass以及private,回头我们再来分析搜索出的结果。

利用IDA Pro分析二进制文件,获取反汇编代码。结果并不是特别完美,但至少能给出一些信息。

首先我想澄清的就是配置文件中加密存储的值(VPN秘钥、密码)。

一番搜索后,我找到了一个函数:cfgcrypt_DecryptCfgStr

该函数在IDA中的布局图如下:

详细布局如下:

在Dave小伙伴(人形自走反汇编器)的帮助下,我们发现#_1_可以表示正在使用的是什么加密算法。

此外,在Ewon的comcfg.txt文件中有一项设置:CryptMode:1,刚好与我们的判断相符。

此时我们还没有看到配置文件中有其他可变值,但相信我们的研究方向没有问题,因为Ewon二进制文件中硬编码了许多相同的秘钥及IV(初始向量)。

如果CryptModd设置>2的值,那么函数就会输出错误消息,将这个值设置为0

我认为如果是#_0_,那么设备就会使用blowfish加密算法,我们也拿到了算法所使用的秘钥及IV,然而这里设备使用的是#_1_

那么#_1_的具体代表的是什么?

固件中有个cfgcrypt_CheckCryptmode函数,该函数会检查加密字符串的头部,根据头部值返回一个结果值。

然而设备永远不会调用这个函数,这一点比较奇怪,但cfgcrypt_DecryptCfgStr函数中有一个相似的代码结构。

似乎设备会在多个地方复用代码。

最终所有的加密及解密函数都会汇聚到ctr_encrypt函数。

ctr_decrypt函数代码如下:

这里我不会讨论具体细节,只需要知道ctr_encrypt代码中包含一个XOR函数。

 

0x0C 逆向分析固件

一开始我就被固件困住了脚步,我们可以从Ewon官网上下载到这个 固件:

当想详细分析固件时,我们发现固件经过加密处理:

文件头部较为清晰,包含版本号、发布时间等都以明文表示,但后面就是一些看不懂的数据。

因此回到Ewon二进制文件,查找引用了固件文件名的部分数据。

首先我们可以找到对SD卡的引用:

因此,如果SD卡上存在固件,那么设备就会尝试更新。这一点非常正常,然而根据用户文档,我们可以将ewonfwr.ed文件上传到FTP(如果通过身份认证的话),随后Ewon就会根据需要处理固件。

我在固件文件中搜索满足这些处理逻辑的内容,最终找到了一个函数:loem_UncryptFile。该函数似乎会打开一个文件,然后调用解密函数。

Ewon程序会检查固件文件是否已上传到ftp服务器或者SD卡中,加载manifest信息(检查固件版本、日期等),然后解密固件文件及数据。

固件加密基于Blowfish算法(程序中大量引用了这个算法),并且程序中硬编码了加密秘钥。

非常棒,那么我们再次回到固件文件。

查看数据后,我判断加密数据从0x0140h开始,直到文件结尾。将这部分内容拷贝出来,尝试使用程序内置的秘钥进行解密。

我们的确能解出一些数据,但似乎只能解密一半数据,这一点非常奇怪,但至少我们的方向没有错。

回到二进制程序中,似乎程序会使用这个IV,在升级前备份固件,那么这个IV究竟在哪?

Dave又站了出来,提示我如果这个值不在程序中,那么很有可能在固件中,这一点非常正常。

再次回到固件上,查找头部数据。我们来寻找可以使用的8bit据流。删除加密后的无关信息后,我们留下了一部分数据,比较明显的8bit数据流就位于数据末尾(下图高亮部分):

将这个值输入python脚本中,观察运行结果:

现在我们终于解出完整数据。

来观察文件系统,特别是update.sh文件:

这里似乎出现了很多文件,但实际上只是NAND Flash转储数据中Ewon的/opt目录,因此这里并没有什么新的信息。

再来观察update.sh

非常好,来具体看一下程序的处理逻辑,能否找到有趣的点:

我看到可能存在命令执行点!

我修改了update.sh,重新生成固件,然后设置成高版本后重新上传该固件:

令人失望的是,这种方法无法奏效。似乎设备会对该文件执行CRC校验,因为我们在Ewon日志中找到了“riftp-Invalid checksum”错误:

再次回到程序逻辑上来:

这里包含一个CRC16x2校验。我不能百分版确定校验针对的是固件的加密数据,还是针对加密前的squashfs数据。

来对比两个固件版本。我将两个文件中共同的部分设置为相同值,以减少文件存在的差异:

上图中红色部分数据就是头部中存在差异的数据。

进一步分析后,我看到两个文件中红色区域仍有一些相似性:

在固件文件的加密数据上执行一些CRC校验操作,看我们能否在头部中找到相关的信息:

Ver 13_2s1 = 8.433 mb (Latest)
CRC16 (encrypted blob) = AF3C
CRC32 (encrypted blob) = F388096F
Ver 13_0s0 = 12,589 mb (Not Latest)
CRC16 (encrypted blob) = A65D
CRC32 (encrypted blob) = 259BC946

似乎有所收获!

这正是加密数据对应的CRC32值!正是在头部文件中!在0x00B0处!我们来稍微修改一下,看一下改动后的校验结果:

好吧,还是有些地方不对。

让我们再次回到Ewon程序中。当在程序中搜索时,我发现有个函数会涉及到一些头部数据:

这里riftp_EDFHeaderPtr是固件文件的开头处,因此为0

在144行,代码会比较rfiftp_EDFHeaderPtr + 16的值,判断这个值是否等于v10(CRC16 x 2校验值)。

比较困惑我(和其他小伙伴)的一个点就是CRC校验函数。从二进制代码中,我们知道(或者至少认为)程序正在计算加密数据块的CRC16x2校验值,但具体计算逻辑如下:

Dave和我决定重新CRC16x2函数,看一下能得到什么结果:

虽然我们得到的结果不大一样,但我们认为已经非常接近事实真相了。

此外我们还对固件文件进行暴力尝试,想看看是否有任何数据与头部中存储的值相匹配:

不幸的是,这也是我们研究的终点,不能再进一步。

我们尝试了各种不同的CRC16校验方法,不同的xor位等,但得不到更进一步的结果,无法匹配0xA8处的值。

这个过程中我们使用了pycrc,这款工具非常强大,帮我们省了不少功夫。

 

0x0D 披露时间线

2019-01-29 首次联系Ewon反馈漏洞

2019-02-04 官方确认漏洞并预估处理时间节点

2019-02-11 PTP与Ewon都认为处理周期有点长

2019-05-23 在最终披露前进行协商

2019-05-28 Ewon反馈并提供测试固件

2019-06-04 Ewon披露相关公告

2019-06-18 PTP披露相关公告,现在大家可以在此处下载更新版的FW 13.3s0

我们在2019年1月29日向EWon Flexy的制造商HMS Networks报告了相关情况。整个过程略微曲折,但最终官方确认并修复了漏洞,这里不再赘述。

 

0x0E 缓解措施及建议



用户角度

不要将Ewon Flexy(或者任何ICS设备)放在公开互联网中,这会引来不必要的麻烦。

记得修改默认凭据。

分段规划IT及OT网络,部署适当的访问控制机制。


厂商角度

HMS有一个安全远程访问解决方案:Talk2M,应该能缓解这个问题。

我们还没测试过Talk2M,无法发表关于安全性方面的意见,但添加一个防御层始终不算坏事。有空时我会分析一下新的固件。

修复bug后的新固件可从此处下载。


我们的建议

更新Ewon Flexy固件,升级到最新版。

同时记得更新所有的工控系统。如果无法更新ICS(版本太老、官方不再支持或者过于关键无法改动),可以考虑针对性部署额外的安全控制机制。

 

0x0F 总结

我不想草草结束这篇文章,回头我会发表第二篇分析文章。

整个研究过程比较曲折,我个人也学到了许多知识。现在我非常喜欢IDA,但我使用Ghidra的次数越来越多(这是款免费产品,某些地方更加方便)。

Ewon Flexy是一款非常不错的设备,这个研究过程也是我自己想看一下我的能力范围,还有哪些地方需要提高等。

如果我成功构造出能够正常工作的固件,那么后续会有更多研究成果可以公布。


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 短信验证码安全性堪忧,多因素认证或成未来主流
    短信验证码安全性堪忧,多因素认证或成未来主流 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 如果程序使用Go语言编写并涉及单向或双向TLS认证,可能会遭受CPU拒绝服务攻击(DoS)。本文深入分析了CVE-2018-16875漏洞,探讨其成因、影响及防范措施,为开发者提供全面的安全指导。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
  • 负载均衡基础概念与技术解析
    随着互联网应用的不断扩展,用户流量激增,业务复杂度显著提升,单一服务器已难以应对日益增长的负载需求。负载均衡技术应运而生,通过将请求合理分配到多个服务器,有效提高系统的可用性和响应速度。本文将深入探讨负载均衡的基本概念和技术原理,分析其在现代互联网架构中的重要性及应用场景。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • 将Jar包部署至Linux服务器的详细步骤与注意事项
    将Jar包部署至Linux服务器的详细步骤及注意事项包括:首先使用 `mvn install` 命令进行Jar包的打包构建。接着,需要停止当前正在运行的Jar进程,可以通过 `ps -ef | grep **.jar` 查找对应的进程ID(PID),然后使用 `kill -9 ` 终止该进程。最后,使用 `rm` 命令删除旧的Jar包文件,确保新版本能够顺利部署。在整个过程中,务必确保操作的准确性和安全性,避免对服务器造成不必要的影响。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 利用 Python Paramiko 库在远程服务器上高效执行 Shell 脚本的方法与技巧 ... [详细]
  • ;etcftpusers的设定是限制系统上的某些用户不能使用FTP传送文件,etcftphosts的设定是限制不允许某些主机连接到你的FTP服务器,这样做是为了保证系统的安全性。e ... [详细]
  • 服务器监控系统大概多少钱,服务器监控系统 报价
    服务器监控系统报价内容精选换一换设置“云服务器名称”。名称可自定义,但需符合命名规则:只能由中文字符、英文字母、数字及“_”、“-”、“.”组成。如果同 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
author-avatar
许琼博762375
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有