孟:智能设备漏洞挖掘的若干突破|看雪2018峰会

雷锋网编者按:如果一个安全大会能召集五湖四海的白帽子朝圣,薛雪学院的安全开发者峰会一定算一个。不久前,第二届安全开发者峰会在北京国家会议中心落幕。来自全国各地的近千名安全和开发者参加了此次峰会。
本届峰会以“万物互联,安全发展”为主题,聚焦物联网和区块链的发展安全。十大主题涵盖了物联网、智能设备、区块链、机器学习、网络安全、逆向、Android和iOS等前沿领域。
其中,来自绿盟科技的马良做了题为《智能设备漏洞挖掘的几个突破》的演讲,分享了智能设备固件提取的攻防手段。并从嵌入式系统的硬件和软件的基础架构,从智能设备中提取固件的十种方法,包括软硬件工具,以及工具的功能和用法两个方面进行了说明。除此之外,马良梳理了智能设备安全研究人员提取固件的常用方法,也给开发者提出了一些安全建议,避免厂商辛辛苦苦开发出来的产品和想要保护的固件没有得到很好的保护,容易被提取出来进行固件分析。
以下为演讲实录:
马良:今天,我谈到的目录大纲是四点。我既做过开发人员,也做过安全从业人员。在这次会议中,我向我的安全朋友介绍了固件知识,并把安全知识作为我的开发朋友。
这就是我今天讲的目录大纲中的四点。
一、智能设备的基础知识
二、提取固件的十个想法
第三,利用固件漏洞的想法
四。智能设备的加固建议
一、智能设备的基础知识
这是一个智能设备的组成,分为几个部分。一个智能设备必须具备这样几样东西。比如它必须有CPU,内存,相当于硬盘的flash,网络,网络接口,串口,有时候还有SD卡插座存储设备,还有一些显示接口。
CPU有很多架构,包括X86,Linux,ARM等。有几种类型的记忆。还有各种存储,比如flash、TF卡、mmc卡、硬盘;一般电路板都会留串口,特别是调试的时候。厂家做维护不得不面对的问题:智能设备使用中出现问题,客户要求立即解决。如果开发人员没有维护好的接口,开发人员可能无法现场解决问题。所以这些是必要的;有时候是串口,有时候是网口之类的;有时候是USB口。智能设备中运行的软件也称为固件。固件有引导系统的部分,常用Uboot,占市场份额较大;Linux作为操作系统被广泛使用,因为它很好地支持网络。
我来给你介绍一下什么是串口。串口一般分为两种,主要是RS232或者TTL。TTL为5V或3.3V,相当于CPU的电压。左下角是串口的定义,其实指的是三条线,分别是RXD、TXD、DCD。串行传输,当有三条线时,按照一定的时序传输,有一定的周期,这个周期是异步产生的。异步传输有:的波特率概念,比如:9600的波特率,换算成每秒1000字节左右。波特率越高,传输越快。
智能设备更重要的组件是flash,可以分为两种。一个是Nor falsh,特点是价格高,容量小,地址线和数据线分开。好处是可以直接寻址CPU,因为电路图上的每条地址线都是单独连接的,数据线也是单独连接的。它经常被用作代码存储。存储容量越大,地址线就越多。
计算上图中nor Flash地址线的地址范围:
Mb=0x800000(十六进制)
转换为二进制: 100000000000000000000
地址完全来自addr0-addr22。最大地址是22个1。
还有Nand Flash,价格便宜,容量大。主要用于数据存储,但是这个东西一般是没有地址的,需要驱动。
先说软件中的Uboot和busybox。Uboot在嵌入式系统中有一个功能,就是作为引导程序,启动时引导,还有一个功能就是更新。CPU支持有很多种,比如ARM,Linux,MIPS,PowerPC,简单的网络命令。Busybox集成了300多个常用的Linux命令和工具软件。它很小,编译后大概1-2 MB,但是支持很多命令,可以根据需要裁剪。比如有的把busybox的指令nc、dd、tar等剪下来。
这是智能设备的软件和硬件之间的协作关系。以Linux操作系统为例。上半部分是内存,下半部分是闪存,中间部分是固件。固件中的Uboot是用来引导的。启动时是内核,其次是文件系统,包括RAMFS和fallfs。
这是升级界面。我们应该对维护接口有所了解。为什么?因为接口很重要,一个是升级的时候要用,一个是调试的时候要用,一个是升级固件的时候要用。这些是调试界面的基本功能。
二、提取固件的十个想法
这十个想法我很熟悉,是我经常使用的十种方法。其他方法我不说不代表不存在。固件提取方法简单分为硬件和软件两种。
刚才我大概介绍了一下基础知识。比如我想把它的固件提取出来放到flash里。我肯定需要知道一些关于它的情况。还有串口和接口要研究。也有支持这些程序的固件。你必须对文件系统、基本的小命令等有一定的了解。如果这些知识和技能用得好,可以发挥很大的作用。
从设备中智能提取固件的十个想法:
下面是九种固件提取方法,最后一种方法会让大家大吃一惊!
1.官网或联系售后获取升级包。这个不多说了。
2.固件通过在线升级提取。如果你有手机应用或者电脑应用,可以点击“升级”。升级固件的时候,抓包就能抓到固件。如果老版本和新版本固件的下载地址有一定的命名规则,新版本被抓,老版本也能被猜到。这个PPT只是一个例子,并不针对任何厂商。
3.逆向升级软件,内置解包和通信算法。如果它被设计为在下一台计算机上解密,则稍微安全一些;上位机解密可以反过来。
4.从调试界面获取固件:JTAG/SWD等。
腾讯玄武实验室的Mark去年做了两次公开讲座,今天由于时间有限,就不描述了。
5.折叠闪存、SD/TF卡、硬盘等。并使用编程器/读卡器来获取固件。
常用的是焊接flash芯片,用编程器读取固件,读取后再将芯片焊接回去。
注意芯片是有方向的,第一脚有一个点。用编程器焊接或读数时,找出芯片的方向。
6.从串行端口(UART)调试端口获取固件。
这个方法是在安全测试中帮客户测试产品总结出来的。厂家自己的产品,是追求安全的,可能做不到,所以找我们做安全测试。有贴牌产品上市,有大厂的牌子。大厂肯定有安全要求。我不希望贴牌产品砸了它的牌子,所以这个时候会要求我们做一个检测。
在安全测试的过程中,我发现了uboot提取固件的漏洞,并总结了一系列的固件提取方法。
我最常做的是工控设备漏洞安全的研究。基本上我拿不到这个东西的固件,拿到的固件都是加密的,困扰了我很久。经过一段时间的摸索,大概有10个成功提取固件的案例。今年在摄像头方面,经过二三十个常见物联网路由器、摄像头等类似设备的成功案例,发现通过串口提取固件的方式是最安全可靠的。为什么这么说?我去找客户检测的时候,客户说:“你可以随便折腾,坏了也没关系,但这是唯一的样品!”我想焊闪存提取固件,但这是唯一的设备。万一焊接芯片损坏了设备,以后就无法验证漏洞了。关键是工控设备要2万,3万,5万,6万,10万。一旦设备被客户损坏,那就尴尬了。所以我慢慢想出了一些方法,在这里和大家分享。
串口识别:串口识别有两个标准。识别串口时,一般是在设备拆卸之后。串行端口通常有四个引脚。第一步是找到地面(GND),这很容易找到。连接到电源的地或连接到地的芯片。接地确定后,我们将其连接到USB接口。我先接接脚。双脚可能都是高压电。这时候把接收脚接到地上,然后随便接一只脚。一旦设备启动,如果此时有输出,则连接正确。然后另一只脚连上,三只脚连上。我平时找串口就是以上想法。
本页ppt是修改uboot启动脚本进入密码保护登录系统的思路,不赘述。一共五篇,每篇都是一个不用密码进入系统的想法。
到了uboot,每次启动需要3秒,是可设置的。一般需要3秒等待输入(或者其他快捷键,一般会有提示)。进入uboot模式后,uboot有帮助命令。其中一个命令引起了我的注意,是md,MD的作用是什么?显示内存,可以显示内存。那很有趣。发现只要是nor flash,md都可以显示Nor flash的内容(因为Nor flash可以被CPU直接寻址),相当于md命令提取固件。但是md命令需要知道起始地址和长度,知道起始地址和长度就可以提取固件。怎么知道起始地址和命令?我查了更多命令的资料,发现bdinfo和flinfo可以查看flash的起始地址和容量。如果还是找不到,就重启一下,重启的时候不要中断,看看会不会打印出更多的flash地址分配信息。通过这些信息,基本可以找到起始地址,提取固件。
最后总结了uboot提取固件的过程:第一步,获取flash的存储信息。这个flash的大小和型号是什么,CPU访问它的地址范围是什么?步骤2:使用md命令提取固件信息。第三步,记录。第四步,分析输出信息,获取固件。但这种方法的缺点是耗时稍长,有时半小时,有时两小时。不过没关系。只要能稳定提取固件,不损坏硬件,焊三根线就可以了。
请视频工作人员给我放一下。(视频回放)我用简单的命令试了一下,能够读取内核了。下一步是全部读出并提取固件。删除以上信息。当时的内存地址信息和固件无关,右边的ASCII码信息也无关。最后的文件转换成二进制,就是我想得到的固件。
成功的案例很多,暂时没有失败的案例。总结起来有三个难度(第三级难度不提)。级别1是最简单的。可以用md来做,只用Nor flash来存储。
Level2表示Nand flash中还有其他文件系统。这里有一个命令,先把nand flash读入内存,然后用MD读出,这个简单的思路就可以了。
这是我当时的调试经验,我发现使用上面的命令可以获取信息。另一种需要重新启动的方法有时会以
还有一个read命令,直接读出flash中的md。如果读不出来,就用别的思路,把SD卡或者其他文件系统的存储读入内存,最后从内存中读出。基本上就是这个想法。
Uboot提取固件并不是针对某个厂商的,几乎所有厂商都存在uboot安全问题,95%的嵌入式设备都使用uboot作为其启动,基本相当于嵌入式Linux的一个标准。在开发者大会上,希望和开发者交流,也希望安全研究人员能让开发者了解新的固件提取方法或者一些漏洞利用方法,让厂商更快的修复漏洞,为安全做贡献。这种方法以后可能会成为一种流行的提取固件的方法,我发现基本上可以提取固件。
7.利用网页和通信漏洞获取固件的敏感信息。这个我就不演示了。只要安全,都是小问题。可以通过网页提取敏感信息,然后通过字典产生密码暴力来猜测passwd的破解设备密码。一般来说,嵌入式系统的权限配置不当。
8.使用逻辑分析仪监控flash和ram以获取信息。它的优点是什么都不需要拆,只需要连接就可以了,很容易连接。但缺点是目前逻辑分析仪价格便宜,频率低,但flash频率普遍较高,有100 MB和200 MB。我做了一个实验,结果证明是可能的。你需要把这些脚引出来,在它启动的时候抓住数据,用夹子夹在芯片上。红脚是第一只。捕获后,通过SPI接口保存传输的数据。
前一个SPI命令,命令中的这个是输出数据。第一个是读的意思,这三个应该是地址,最后一个是数据。是这里发出的命令,那里收到的命令。结果这个逻辑分析仪提取的东西和flash中固件的二进制是一致的,说明这个思路是可行的。我当时找了一个稍微慢一点的设备,也可以提取固件。
9.使用tar/dd和nc提取固件。用原来的硬件接口,再用它原来的软件,可能事半功倍,不用焊板。这里先用串口,通过串口获取系统权限,nc从网络传输固件。
10.综合应用
第十种固件提取方法是对前面方法的整合和综合应用。相当于“降龙十八掌”的最后一掌。
如果通过串口获得权限,幸运的话,它没有登录密码。如果可以访问系统,可以用这个方法:通过USB或者SD卡,执行copy命令和package命令,把这个打包到u盘或者大内存文件系统,再拷贝到外部文件系统(u盘或者TF卡)。
二是发现echo命令可以二进制方式写入“1234567”,输入该命令可以发送二进制文件,通过该命令可以传播木马。这个木马通过串口输出固件并记录输出,也是一种思路。
固件提取方法总结:uboot常见于智能设备。如果md的类似命令没有被屏蔽,固件很容易被提取出来。设备的智能固件存储在flash中,flash没有保护固件不被非法读取的措施。如果CPU上集成了FLASH和RAM,并且开启了加密,那么很难提取固件。但如果换一种方式使用:(flash、RAM、CPU是独立的),那么提取固件就特别容易,因为程序员可以在去掉FLASH后直接读取FLASH的内容。
硬件调试接口方式方便了维修客户,但有时也方便了不速之客。如果软件留有后门,维护起来很容易,但如果密码太简单,很容易被破解或猜到,或者很容易被别人从固件中分析出来。结论目前一些智能设备的架构存在一定的安全隐患。
第三,利用固件漏洞的想法
用binwalk反汇编固件,有的同事用binwalk解决不了,我可以。为什么?因为它不知道binwalk的安装方法,binwalk有一些依赖的软件,这些依赖的东西都要安装。有一个命令(。/deps.sh)需要执行。它会安装所有相关的依赖软件,安装后解压会更容易。我通常使用-Me方法提取固件。
这里有一个例子。linux登录密码可以通过密码字典暴力破解。如果它的密码很简单,就会很快被破解。
我以前做过开发。如果所有问题都没有思路,就想想开发者会怎么做。他会留下什么调试后门?有什么界面?如果你提取固件。能否在固件中查看系统的敏感信息?看厂家有没有留后门密码维护?如果有后门密码就好办了。看完这些,看看总共有多少网络服务和网络端口,网络服务的二进制有没有溢出点。调试web调用接口,看看有没有问题。这些都是基本思路,很简单。时间有限,只能点一下。
四。智能设备的加固建议
隐藏信息非常重要。比如uboot提取固件,因为它知道是什么芯片。如果芯片被抛光,或者如果封装被改变,这一重要信息应该被隐藏,这可能会更好。
调试接口可以屏蔽吗,比如软硬件,或者可以把busybox不用的功能去掉裁剪掉吗?例如,所有智能设备都有进入系统的root权限。权限太大,能做的事情太多。这些都是可以避免的,所以没必要给root权限。PPT等其他强化建议。
雷锋。com雷锋网。com

其他教程

css3动画与css3过渡的区别(css3动画教程)

2022-8-19 10:19:08

其他教程

曾都区万店镇中心学校举办第六届快乐读书节了吗(曾都区万店镇中心学校举办第六届快乐读书节活动)

2022-8-19 10:21:11

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索