服务器固件提取

IoT 3年前 (2021) admin
1,187 0 0


0x0 相关知识

最近做的事情主要是服务器固件相关的测试,这篇文章就总结一下服务器固件获取的一些方法。

可能有人会有疑问,路由器摄像头的固件倒是经常听说,服务器固件是个啥?

服务器的固件主要分成两部分:一是BIOS,二是BMC固件。BIOS就和普通的PC的BIOS比较类似,主要都是负责设备的初始化以及启动时的介质引导等功能。

而服务器与PC的一个不同之处就是服务器上有一个单独的用于远程管理的板子,称为BMC(Baseboard Management Controller)。BMC可以为服务器提供一些管理相关的功能,包括上下电、固件更新、监控CPU内存状态等功能,一般服务器的BMC还会提供一个Web界面以便于管理。

看到这里的同学可能会觉得:这些相关的功能不就和路由器之类的比较相似吗?正是基于这个原因,如果能提取出BMC的固件,或许就可以分析出一些类似的漏洞。

实际上BMC要求能够支持IPMI协议规范,规范中明确需要有的功能包括:本地和远程诊断、控制台支持、配置管理、硬件管理和故障排除。

服务器固件提取

BMC

BIOS和BMC固件并不是完全靠主机厂商开发的,实际上有一些专门提供Basecode的厂商,绝大多数的BMC和BIOS都是通过在Basecode上二次开发的。当然也有像华为、浪潮这样的整机厂商的BIOS和BMC或许都是自己开发完成的(但是也会基于一些开源库,例如BIOS一般都会在EDK2基础上开发完成)。

服务器固件提取

BIOS、BMC产业链

下面就介绍几种获取服务器固件的方法

0x1 官网下载固件

官网下载固件可以说是最常用到的获取路由器摄像头固件的方法了,一般在官网下载路由器固件之后,直接使用binwalk就可以解包出文件系统(然而官网下载的固件也可能会被加密导致解压失败)。

但是这种方法在服务器上一般不太适用。

服务器的官网一般不对普通用户提供固件的下载,一些官网上要下载服务器的驱动及固件都需要输入服务器上的序列号,认证为客户后才可以下载(并且也只能下载特定型号的固件),道理也很简单,毕竟买服务器的一般都是商业上的合作伙伴,都会有专门的客服提供技术支持,也没必要像家用的物联网设备一样提供固件了。

另一方面即使服务器的固件能下载下来,绝大多数也是加密的(当然不排除就是有厂商不加密,并且还开放下载的,没错说的就是HPE),对后续的分析会带来一些困难。

2021年有关BMC相关的CVE漏洞很大一部分都是HPE的漏洞,在CVE官网上搜索BMC可以看到:

服务器固件提取

BMC相关漏洞

这很大程度上可能就是因为HPE的BMC固件可以直接在网上下载到吧,在官网就可以找到下载地址

并且下载下来之后使用binwalk分析可以直接看到里面的文件系统,解压之后就直接得到了里面的文件

不加密,难怪被挖出来这么多洞

服务器固件提取

HPE的BMC固件未被加密

(然而作者要分析的服务器固件下载下来是加密的,并不能直接分析)

0x2 控制台获取固件

服务器为了方便技术人员调试,会留有调试的串口,在连接了串口之后 一般是一个类似shell的界面(之所以说是类似shell的界面,是因为有一些功能可能会被砍掉,仅保留一部分指令,可以说处在一个限制性的shell中)。

有些BMC(例如AMI)调试接口的能力比较强,这时提取固件的方法就比较简单了,就如同常规的IoT设备固件提取,可以通过tardd打包固件之后用nc或是scp拷贝出来

在一些限制性的shell中,可能就没办法执行tardd这样的指令了,但是调试接口为了故障诊断,也会留有下载目前服务器上运行着的固件的方法,以某厂商的BMC为例,可以直接利用命令行的工具下载BIOS的文件

服务器固件提取

控制台获取固件

并且这样得到的固件是未被加密的。

0x3 uboot提取固件

因为BMC的板子本身类似于一块IoT的板子,在启动时可能也是通过U-Boot引导的,如果能够通过U-Boot引导,那么进入到U-Boot的命令行接口就可以利用flinfoprintenviminfobdinfo等指令输出uboot的相关信息,之后利用md输出内存。这里详细的思路在看雪2018峰会《智能设备漏洞挖掘中几个突破点》中有提到,可以见参考链接。

思路就是利用u-boot中能够打印一些信息的指令输出内容,确定到固件镜像在内存中的加载位置之后,利用md指令将内存逐字节打印出来,打印出来之后经过脚本处理就可以得到二进制的固件文件。

例如通过bdinfo查到boot_params0x86000100

UBOOT> bdinfo
arch_number = 0x00000AE7
env_t       = 0x00000000
boot_params = 0x86000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
ethaddr     = 00:11:22:33:44:AA
ip_addr     = 192.168.10.186
baudrate    = 9600 bps
Hi1710_UBOOT>

之后通过md 0x86000100 0x1000就可以输出U-Boot的启动参数

UBOOT> md 0x86000100 0x1000
86000100: 00000005 54410001 00000000 00000000    ......AT........
86000110: 00000000 00000003 54410007 00000020    ..........AT ...
86000120: 00000004 54410002 20000000 80000000    ......AT... ....
86000130: 0000004d 54410009 3d6d656d 4d363134    M.....ATmem=416M
86000140: 6e6f6320 656c6f73 7974743d 30414d41     console=ttyAMA0
86000150: 3531312c 6e303032 72204e38 3d746f6f    ,115200n8N root=
86000160: 7665642f 6d61722f 64722030 74696e69    /dev/ram0 rdinit
86000170: 62732f3d 692f6e69 2074696e 69747865    =/sbin/init exti
86000180: 3d74696e 6962732f 6e692f6e 65207469    nit=/sbin/init e
86000190: 6f727478 2f3d746f 2f766564 62636d6d    xtroot=/dev/mmcb
860001a0: 70306b6c 746d2036 72617064 683d7374    lk0p6 mtdparts=h
860001b0: 66735f69 3a302e63 6b323135 622d7528    i_sfc.0:512k(u-b
860001c0: 29746f6f 3635322c 6572286b 76726573    oot),256k(reserv
860001d0: 2c296465 6b363532 67666328 666e695f    ed),256k(cfg_inf
860001e0: 352c296f 286b3231 6f622d75 625f746f    o),512k(u-boot_b
860001f0: 2c296b61 6b343833 73657228 65767265    ak),384k(reserve
......

从日志中得到这样的二进制的文本之后可以直接用ultra edit转换成binary,也可以用python脚本处理一下得到文件。

首先用vim处理一下开头的地址和后面的ASCII,只在日志中保留内容部分

import binascii

with open('putty.log','r'as f:
  lines = f.readlines()
    fm = b''
    for line in lines:
        fm += binascii.unhexlify(line.strip().replace(' ',''))

最后读取出来的fm就是固件内容了,直接写到文件里面就可以

这个方法的一个缺点是,没有加载进内存的部分无法输出出来,并且在利用md指令输出内存的时候速度非常的慢,需要处理比较大的固件时可能会频繁出现错误,同时耗时很长。

0x4 拆焊Flash获取固件

前面也提到服务器的BMC板卡就像是一个常见的IoT设备,因此BMC上的存储芯片也会存着本身的固件,可能是Flash、也可能是其他存储芯片等等。

以某厂商的设备为例,在BMC板卡上发现了一个MXIC的8脚Flash,查询丝印相关信息得知这是台湾旺宏的芯片,大小为128Mb,也就是16MB。

服务器固件提取

拆掉Flash的时候需要注意这样几个地方:

  • 把周围的元件用隔热胶带贴好,防止其他元件被烧坏;
  • 注意带上防静电腕带,服务器上一些小的元器件都比较脆弱;

之后适当滴上一些助焊膏,用热风枪一边吹一边用镊子尝试拿下来Flash芯片就可以了。

吹下来Flash之后用编程器(需要注意编程器要支持这个具体型号的Flash芯片)读取Flash中的内容,读取完成后再一次焊回去就可以了

这样物理拆掉读取的内容一般就是服务器BMC的文件系统了,可以后续展开分析。

0x5 总结

总结一下最终获取到的内容:

  • 通过串口控制台提取到了BIOS的固件;
  • 通过U-Boot中的指令提取到了uImage;
  • 拆焊Flash提取到了文件系统的固件;

获取固件是安全分析的第一步,这之后就是对关键组件的逆向、漏洞挖掘等操作了。

参考链接

1. [服务器BIOS和BMC等知识详解](https://blog.csdn.net/weixin_38889300/article/details/106913495)

2. [智能设备漏洞挖掘中几个突破点]( https://bbs.pediy.com/thread-230095.htm)

3. [HPE固件下载](https://support.hpe.com/)


end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系[email protected]



服务器固件提取

版权声明:admin 发表于 2021年10月12日 上午12:00。
转载请注明:服务器固件提取 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...