逆向工程 Supermicro IPMI

发布员1号 发布于 2022-11-25 98 次阅读


本文转载自https://peterkleissner.com/2018/05/27/reverse-engineering-supermicro-ipmi/

Supermicro 通过 IPMI 对 BIOS 更新实施供应商锁定,即使他们在此处免费发布更新文件。唯一免费的选择是穿越到 1995 年并从 DOS 磁盘启动以提供更新。所有其他选项(包括Supermicro Server Manager)都需要许可证。

他们发布了 BIOS 更新以解决 Spectre 和 Meltdown 漏洞,但几乎不可能实际执行更新。即使您采用他们建议的方式,从授权的 Supermicro 经销商处购买密钥,互联网上的人也报告说获得它们既困难又耗时。我的报价是 25 欧元,预计交货时间为 2 周。

你买了一个全新的产品,它有一个已知的漏洞,你应该为更新付费?!这是不可接受的。作为我设备的所有者,我可以自由更新它。因此,我花了整整一晚的时间对这个东西进行逆向工程来找出许可证密钥算法。tl;dr 这是生成这些许可证密钥的算法:

MAC-SHA1-96(INPUT: BMC MAC地址, SECRET KEY: 85 44 E3 B4 7E CA 58 F9 58 30 43 F8)

任何人都可以在https://cryptii.com/pipes/QiZmdA上创建许可证密钥,方法是在左侧(选择字节)键入 IPMI(BMC)的 MAC 地址,在中间选择 HMAC 和 SHA-1,输入密钥和许可证密钥将出现在右侧!

这已在 2013-2018 年的 Supermicro 主板上成功测试。看来他们没有改变算法并使用相同的“秘钥”。前 6 组进入这里:

2019 年 1 月 14 日更新:Twitter 用户@astraleureka 发布了这段生成许可证密钥的 perl 代码:

#!/usr/bin/perl
use strict;
use Digest::HMAC_SHA1 'hmac_sha1';
my $key  = "\x85\x44\xe3\xb4\x7e\xca\x58\xf9\x58\x30\x43\xf8";
my $mac  = shift || die 'args: mac-addr (i.e. 00:25:90:cd:26:da)';
my $data = join '', map { chr hex $_ } split ':', $mac;
my $raw  = hmac_sha1($data, $key);
printf "%02lX%02lX-%02lX%02lX-%02lX%02lX-%02lX%02lX-%02lX%02lX-%02lX%02lX\n", (map { ord $_ } split '', $raw);

2019 年 3 月 27 日更新:还有使用 openssl 的 Linux shell 版本:

echo -n 'bmc-mac' | xxd -r -p | openssl dgst -sha1 -mac HMAC -macopt hexkey:8544E3B47ECA58F9583043F8 | awk '{print $2}' | cut -c 1-24

2019 年 9 月 15 日更新:Twitter 用户@zanejchua 提供了链接https://cryptii.com/pipes/QiZmdA,这使得生成代码变得更加容易。

2021 年 6 月 8 日更新:Ben 提供了以下改进的脚本:

#!/bin/bash
read -p "IPMI MAC: " macaddr
echo -n $macaddr | xxd -r -p | openssl dgst -sha1 -mac HMAC -macopt hexkey:8544E3B47ECA58F9583043F8 | awk '{print $2}' | cut -c 1-24 | sed 's/./&-/4;s/./&-/9;s/./&-/14;s/./&-/19;s/./&-/24;'
关于 IPMI 的信息(如果您是专家,请跳过此部分)

IPMI 是服务器的远程管理机制,嵌入在与操作系统可访问的典型资源分离的芯片中。即使在关闭时,它也允许远程管理服务器。当您的服务器没有响应并且您不想或不能亲自去那里进行故障排除时,它非常有用。您甚至可以通过 IPMI 安装操作系统、启动服务器甚至进入 BIOS。感谢 HTML5 Supermicro 放弃了那些旧的 Java 小程序(任何用 Java 开发任何东西的人都应该被禁止到一个非常非常偏远的岛屿;Java 应该死于火灾,它很慢并且有 9999 个漏洞,最重要的是Oracle 会追赶你出于商标和专利巨魔的原因,即使它是开源的)。

有帮助的参考资料

我想指出以前的研究工作对我有很大帮助。

第 1 步:下载并解压固件

Supermicro 在其网站上免费提供 IPMI 更新文件您需要选择主板并下载 IPMI 更新文件。在其他文件中,它将包含 1 个大固件 blob,在本例中为“REDFISH_X10_366.bin”。

binwalk 工具将扫描二进制文件并查找已知格式的签名:

HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------
0x19300 CRC32 polynomial table, little endian
0x400000 CramFS filesystem, little endian, size: 14254080, version 2, sorted_dirs, CRC 0xF105D0D5, edition 0, 8088 blocks, 1086 files
0x1400000 uImage header, header size: 64 bytes, header CRC: 0x8290B85A, created: 2017-06-09 12:33:02, image size: 1537474 bytes, Data Address: 0x40008000, Entry Point: 0x40008000, AA328F72, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: gzip, image name: "21400000"
0x1400040 gzip compressed data, maximum compression, has original file name: "linux.bin", from Unix, last modified: 2017-06-09 12:01:11
0x1700000 CramFS filesystem, little endian, size: 7507968, version 2, sorted_dirs, CRC 0x19806BFF, edition 0, 2973 blocks, 407 files

使用十六进制编辑器(例如 HxD)提取 CramFS 二进制文件并将它们存储到新文件中。它是一个嵌入式压缩的 Linux 文件系统,其中包含我们感兴趣的文件。

接下来获取一个 Linux 系统并使用此命令分别挂载这两个文件,然后将所有文件转储到一个 tar 文件中:

mount -o loop -t cramfs extracted.bin mnt1
tar -czf mnt1.tar.gz mnt1

恭喜!您现在拥有 IPMI 系统的实际文件。

第 2 步:对 IPMI 文件系统上感兴趣的文件进行逆向工程

查找提供用于激活的用户界面的 HTML/JS 代码很容易:使用浏览器的内置开发人员工具 (F12) 查看代码,然后在提取的 IPMI 文件系统中查找相同的代码。

正如您在下面看到的,IPMI 网站(您以系统管理员身份访问)调用“/cgi/ipmi.cgi”并使用某些参数来检查密钥是否有效。

以下是我从网站部分关注的面包屑:

响应是 XML,如果无效则检查设置为 0,如果有效则设置为 1(奇怪的是他们不使用 JSON 代替):

接下来,我们需要使用 IDA Pro 并打开存储在 IPMI 文件系统中且我们在上一步中提取的文件“ipmi.cgi”。您可以在下面看到处理许可证检查的代码。通过阅读这段代码,您可以了解许可证应该是什么样子。第一个循环是对输入进行十六进制解码,即文本密钥“1234-00FF-0000-0000-0000-0000”变为二进制(12 字节)12 34 00 FF 00 00 00 00 00 00 00 00。

许可证的实际检查在另一个文件“libipmi.so”中完成,该文件实现了引用的函数 oob_format_license_activate:

您可以在此处看到引用的实际许可证密钥算法 – HMAC_SHA1。请务必注意函数调用中的 12,这表示 96 位。96 位正好是密钥的长度,以十六进制表示给最终用户。

有趣的是,有一个函数“oob_format_license_create”可以创建许可证并且更容易阅读。您可以直接看到对私钥的引用。“oob”表示带外,即通过 IPMI 处理更新。

Supermicro 密钥是:

HSDC私钥:39 CB 2A 1A 3D 74 8F F1 DE E4 6B 87

OOB私钥:85 44 E3 B4 7E CA 58 F9 58 30 43 F8

这篇博文的开头解释了如何轻松使用它来创建您自己的 Supermicro 许可证密钥。