MIS 固件逆向漏洞挖掘

实验目的

选取任意一个路由器、摄像头或者其它智能设备的固件漏洞,对目标固件进行逆向工程和漏洞分析,剖析漏洞机理,找到漏洞利用方法,编写漏洞利用代码,展示漏洞利用效果,简述漏洞防护方法;标明漏洞的CVE编号,压缩包中包含固件、源代码等。

实验准备

  • 所选固件:施耐德NOE77101以太网模块固件

  • 漏洞编号:CVE-2011-4859

  • 漏洞选择理由:施耐德公司的大量PLC设备被大量部署于我国能源、电力、化工等行业工业控制网络中,比如Modicon Quantum 系列PLC作为高端PLC参与着我国核心能源调度网络系统,如西气东输区域子段SCADA系统。

    然而,作为全球能效管理专家的施耐德电气公司虽然有着同行业难以望其项背的技术产品,但至少在早年间暴露的CVE-2011-4859漏洞侧面反映了其对于网络安全的忽视,该漏洞涉及施耐德多款PLC设备,包含其CPU模块和以太网模块。通过默认账号,破坏者可以远程登录访问设备Telnet、Windriver或FTP服务,登录后可获取设备实时数据、掌握设备权限、甚至破坏网络,直接威胁到设备甚至设备所在网络的安全。而在这个漏洞被曝出后,施耐德公司花了两年时间才更新了固件,然而新固件仍旧存在大量安全漏洞,许多问题完全没有解决。

    因此,这一经典的漏洞及其衍生题目被不少信息安全比赛选用于题目中,笔者知道的有两个:2018工业信息安全技能大赛,与2020工业信息安全技能大赛(ICSC)石家庄站——简单的固件逆向分析(CTFHUB中已收录)。故而选择它作为本次作业的分析对象。

    固件下载链接:https://github.com/ameng929/NOE77101_Firmware

  • 主机:win 10

  • 虚拟环境:kali 2021.4 / win 7

实验步骤

下载固件后解压文件,名为FLASH0的文件夹中,wwwroot/classes/内的jar文件即是Web配置端APP文件,而wwwroot/conf/exec/NOE77101.bin很明显就是NOE77101的固件了。另外,fw/fw.ini文件内是固件版本,打开可以看到是6.40版本

讽刺的是,就笔者了解,这个6.40版本就是施耐德公司修了两年修出来的新固件,相关问题并没有完全得到修复,原先的版本是3.60

一、简单的破解-分析jar格式的APP文件

  1. 通常来说(比如实验准备中提到的两个信息安全比赛)要求仅仅找出后门密码即可,而如果只是想要实现这一目标,我们可以走捷径,要做的就是分析jar格式的APP文件即可。针对.jar文件的逆向分析,常使用的工具是JD-GUI,安装该工具需要提前配置java环境。

    jd-gui的github下载链接:https://github.com/java-decompiler/jd-gui/releases

    下载jd-gui-1.6.6.jar即可,拖入虚拟机中就可以直接使用,无需安装。

  2. 用下列命令打开工具,拖入所有.jar包,工具会自动反编译源码

    java -jar jd-gui-1.6.6.jar
    

    windows上使用的话可以直接双击打开

显然,工程师在打包文件的时候并没有使用加壳或者混淆等手段,源码清晰可读,那接下来就简单了,我们直接搜索pwd, password, PASSWORD等常见字符后,就直接得到了密码。

连带着用户名一起,我们就拿到了后门账户,进一步搜索我们还能看到,这是ftp连接的默认账号及密码

到这里,常规题目一般就不会要求更多了,但是我们本次作业的内容是固件漏洞分析,所以我们还需要更进一步,从固件本身开始逆向。

二、bin固件分析

  1. 首先我们先用binwalk跑一下,可以看出从0x385位置后为Zlib压缩格式

    这里我们可以直接打开16进制编辑器,将0x385之前的部分截掉,再用python调用zlib库解压并保存为新的固件,不妨就叫NOE77101_cut_de.bin

    import zlib
    results = zlib.decompress(open('NOE77101_cut_de.bin', 'rb').read())
    open('NOE77101_cut_de.bin', 'wb').write(results)
    

    又或者可以用binwalk -e命令提取文件,解压后的文件385存储在_NOE77101.bin.extracted目录中,实际上这个文件名就是以文件在固件升级包中的起始位置来命名的,再次binwalk385文件,我们能得到更多信息

    我们发现输出信息多了许多,包含LZMA压缩格式的数据、HTML、XML文件、系统内核固件以及重要的字符串信息等。可以解读的有固件依赖系统VxWorks WIND kernel version “2.5”,符号表的地址也给出来了,即最后一行的 0x301E74 ,这在之后的修复函数中会很有用。

    VxWorks 操作系统是美国WindRiver(风河)公司于设计开发。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至在火星登陆的探测器也都使用了VxWorks系统。最新的VxWorks7的口号是——为全球智能连接设备和系统提供动力。

    strings 385 命令我们可以提取文件中的字符串,虽然总的内容特别多,但是还是可以找到一些有用的信息,比如下图显示设备CPU为PowerPC,这对后面的逆向是很有用的信息。

  2. 接下来,我们用IDA来进行逆向分析,因为笔者在linux上没有IDA pro,所以将文件迁移到有IDA的win 7虚拟机上进行。

    将固件拖入IDA中,注意选择处理器型号为PPC,然后一路默认,IDA会提示你找不到代码段起始地址,这是正常的,我们接下来就要重定位代码段基址。确定基址的思路是寻找一条相对寻址方式的lis指令。在IDA中使用ALT+T直接搜lis指令,CTRL+T进行向下(上)搜索,发现在000009F8处的lis指令

    嵌入式系统固件需要加载到内存中特定位置运行,这个特定位置就是固件加载地址

    固件加载地址 = 符号表中字符串的地址 - 相应字符串在固件中的偏移

    嵌入式系统固件的函数调用地址是基于固件加载地址所计算出的内存位置,而不是固件中的地址


    观察地址后面的@ha确定基址为0x10000,这也是固件常用基址,关于@h与@ha的问题是PowerPC汇编的特性问题,这里不详细说,可以看这个blog:

    http://blog.chinaunix.net/uid-20663797-id-35772.html

    接下来重新载入ida,还是处理器选择PPC模式,这次的基址就可以填上0x10000了


这时候我们发现其实也不能真正的找到函数,这是因为IDA找不到代码段起始地址从而反编译失败,我们从网上找到了相关的脚本文件用来重构符号表,从而修复函数名。

脚本链接:https://github.com/p1Kk/idc-idapython/blob/main/noe711.idc

执行重构符号表脚本的前提是需要先确定符号表在固件的具体位置,还记得之前binwalk出来的符号表起始位置吗?我们再次打开hex编译器,这次我们还需要找到符号表的结束位置。

所以符号表的结束位置是 0x3293b4 ,据此我们就能完成脚本的填写了

/* 脚本内容 */
/* Ruben Santamarta - IOActive */
/* Rebuild VxWorks Symbol Table */#include <idc.idc>static main()
{auto load_addr;auto ea;auto offset;auto sName;auto eaStart;auto eaEnd; // You'll need to adjust these valuesload_addr = 0x10000; /* 加载地址 */ eaStart = 0x301E74 + load_addr; /* 符号表起始地 */eaEnd = 0x3293b4 + load_addr; /* 符号表结束地址 */SetStatus(IDA_STATUS_WORK);ea = eaStart;while( ea < eaEnd) {MakeDword( ea );offset = 0;if ( Dword( ea ) == 0x900 || Dword( ea ) == 0x500){offset = 8;}else if( Dword( ea ) == 0x90000 || Dword( ea ) == 0x50000 ){  offset = 0xc;}     if( offset ){MakeStr( Dword( ea - offset ), BADADDR);           sName = GetString( Dword( ea - offset ), -1, ASCSTR_C ) ; if ( sName ){if( Dword( ea ) == 0x500 || Dword( ea ) == 0x50000){if (  GetFunctionName( Dword( ea - offset + 4) ) == "" ){MakeCode( Dword( ea - offset + 4) );MakeFunction( Dword( ea - offset + 4), BADADDR );   }}MakeName( Dword( ea - offset + 4 ), sName );             }}ea = ea + 4;            }SetStatus(IDA_STATUS_READY);
}

将上面的代码复制,写入记事本中,更改后缀名为.idc

在IDA中选择file-script file,将写好保存的.idc文件导入,我们就能得到所有真正的函数了。

  1. 接下来就是枯燥的分析函数调用了,从_sysInit函数开始,我们找到一个usrInit的函数比较可疑

    我们可以接着用view-open subviews-proximity browser查看它的调用关系图

    顺着一个个查下来,大致的调用关系是这样的:

    重点在于最后一个函数,usrAppInit,可以看到他有许多调用它的函数,我们点进去就能看到相应的后门账户点击查看固件后门账户还是存在。

至此,本次试验结束。

参考链接

固件分析技术(3)-漏洞复现

施耐德PLC以太网模块后门账户解密

施耐德PLC以太网模块固件后门引发的血案

施耐德PLC以太网模块固件后门引发的血案(二)

施耐德NOE77101以太网模块固件逆向及后门挖掘

施耐德PLC以太网模块固件NOE77101后门账户漏洞

施耐德NOE77101以太网模块固件逆向漏洞挖掘相关推荐

  1. 基于固件的漏洞挖掘方法梳理

    相关论文 方案 2013 Fie on firmware: Finding vulnerabilities in embedded systems using symbolic execution, ...

  2. 物联网固件逆向分析记录(初步概念记录)

    20201206 - 1. 引言 机缘巧合,自己居然有生之年又接触到了这个东西.但是多学点东西也没什么坏处,就当扩宽视野了:不过,以前这种事情,都没有记录,挺可惜的,所以这次记录一下. 关于物联网固件 ...

  3. 重生之我是赏金猎人-SRC漏洞挖掘(二)-逆向app破解数据包sign值实现任意数据重放添加

    0x00前言 本期登场的目标虽不是SRC,但是整个漏洞的利用手法很有学习意义.目前在很多大厂的http数据包中都会添加sign值对数据包是否被篡改进行校验,而sign算法的破解往往是我们漏洞测试的关键 ...

  4. 工控安全PLC固件逆向三

    之前我们详细分析了bootram和Vxworks的基本启动流程,这篇文章中我们把视线转到plc的网络部分,同时来复现我们第一个.第二个工控安全漏洞. 一.VxWorks的网络设备驱动 一般我们说有三种 ...

  5. 工控安全PLC固件逆向一

    在工控领域,我们会遇到许多协议,为了进行安全研究,经常需要对协议的具体内容进行探索,今天我们就来聊聊关于工控协议逆向的问题. 接下来会简单介绍一下常用的协议逆向方法并配合一些实战,当然,从未知到已知的 ...

  6. 对目前物联网设备的漏洞挖掘技术的学习记录

    物联网设备漏洞挖掘技术 目前物联网设备的使用越来越普遍,而对应的漏洞攻击现象也越来越频繁,究其原因主要有两点: ① 物联网设备开发过程中, 在设计上忽略了安全性的考虑; ② 由于设备硬件资源受限, 难 ...

  7. ie 打开后端发过来的pdf_某办公软件PDF阅读器漏洞挖掘及Crash分析

    摘要 本文主要讲述如何利用winafl对***pdf阅读器程序进行漏洞挖掘的过程. 准备 winafl.DynamoRIO ***pdf(11.6.0.8537)32位 测试环境:win7 32位.4 ...

  8. 漏洞挖掘、漏洞分析和漏洞利用

    漏洞挖掘.漏洞分析和漏洞利用     利用漏洞进行***可以大致分为漏洞挖掘.漏洞分析.漏洞利用三个步骤.这三部分所用的技术有相同之处,比如都需要精通系统底层知识.逆向工程等:同时也有一定的差异. 1 ...

  9. 二进制漏洞挖掘_漏洞挖掘的艺术-面向二进制的静态漏洞挖掘

    本文首发于"合天智汇"公众号 作者: 萌新 0 本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍与分析. 面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构 ...

最新文章

  1. 一款实用可行的支付系统,专供互联网企业使用,赶紧收藏了!
  2. 高一计算机组装,高中生计算机组装与维护,呼市新华互联网学校
  3. JUC锁-框架与基本概念(一)
  4. 海思芯片怎么使用tde给qt加速_基于Hisi芯片,交叉编译、移植Qt4.8.6(可旋转)
  5. (dijkstra记录路径)find the longest of the shortest
  6. 【Node】—nodemon的简单使用
  7. python tushare获取股票数据并可视化_使用Python获取股票数据Tushare
  8. filebeat日志采集的一次流程记录
  9. 无外网环境下CentOS 7安装MySQL 5.7.18
  10. 计算机组成原理期末复习整理 白中英版本
  11. OCR 脱机手写汉字识别与印刷汉字识别
  12. 【编译原理】第三章语法分析
  13. 类似 Teambition 的9大最佳项目管理软件
  14. CF 513D. Social Circles 思维,贪心
  15. ASP.NET 缓存技术(一)——启用页面输出缓存
  16. JavaScript中函数上下文this指向问题#面试常见读代码
  17. 快播王欣布局区块链,他能否卷土重来?
  18. 【控制工程基础】五、线性反馈系统的稳定性
  19. solidworks安装教程2021
  20. 爬虫之 爬取京东计算机书籍

热门文章

  1. 【转】CTO专访:坚守还是追新,开发者如何应对新技术暗潮
  2. 安卓自定义View基础05-Canvas之基础图形绘制,点,线,矩形,圆,椭圆,弧形等
  3. 干货 | 携程酒店安卓地图开发实践
  4. PTA天梯赛L1-011 A-B(C++实现)
  5. EC20 4G LTE模块在FriendlyElec友善电子的R2S软路由(运行FriendlyWrt)上的应用演示
  6. [c#]通过一个枚举值获取另一个枚举值———通过国家全称获取国家简称
  7. socket.io 在java与微信小程序上的应用
  8. GraphicsMagick
  9. 第一关:干掉链表这个小喽啰
  10. 阶梯电价计算:电价分三个档次,一档:0~110(含110)度电,每度电0.5元;二挡:110~210(含210)度电,超出110部分每度电0.55元;三挡:超过210度电,超出210部分每度电0.70