Supermicro-IPMI-license-反向破解

103次阅读

共计 4661 个字符,预计需要花费 12 分钟才能阅读完成。

原文地址:https://www.tony-yin.site/201…

调研 redfish 时,发现 supermicro IPMI 由于 license 没激活导致该功能使用不了,于是找厂商询问,得到的答复居然是他们也没有这个 license,并且表示这个license 需要另外付费购买,所以一般情况下也没有客户购买。笔者心里不禁 MMP,按道理来说,购买服务器已经付过费了,不应该连基本功能都用不了。一方面让厂商向总部购买license,另一方面想办法搞到一个license 先用起来,毕竟笔者只是用于调研,并不一定以后就会用到这个 license,甚至这款服务器。本文主要分享一下笔者破解超威服务器IPMI license 的方法和过程。

概述

IPMI是一种远程管理服务器的机制,嵌入到一个芯片中,该芯片与操作系统可访问的典型资源分离。它允许远程管理服务器,即使关闭了它。当您的服务器没有响应,您不想或无法亲自到那里进行故障排除时,它非常有用。你甚至可以通过 IPMI 安装操作系统,启动服务器,甚至进入BIOS

本文大部分参考 Peter 分享,在此基础之上进行翻译、完善、实践和优化。感谢 Peter 的分享和推特上耐心的回复。大家有兴趣深入的,可进入原文详细阅读。

方法

破解了 license 的生成算法,基于 MAC 地址,做 SHA1SECRET KEY85 44 E3 B4 7E CA 58 F9 58 30 43 F8

下面会介绍几种破解方法,但都基于以上的算法和 SECRET KEY。

方法 1

大家可以进入 https://cryptii.com/,最左边选择 Bytes,填写IPMIMAC地址,中间选择 HMAC,然后填写上述的SECRET KEY,算法选择SHA-1license 的结果就会在最右边出现!!!

<center></center>

这种方式生成的 licensesupermicro 2013~2018期间的主板上测试都成功了,说明 supermicro 内部没有改变算法,并且一直用的同样的 SECRET KEY。填写6key来激活 license 如下图:

<center></center>

方法 2

一个推特用户 @astraleureka 分享了他通过 perl 脚本生成 license 的方式,脚本代码如下:

#!/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);

但是经笔者实践发现脚本执行后第五行报错,稍作修改第五行如下(MAC 地址就采用举例中的):

#!/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 || '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);

修改了脚本还不够,还需要在环境上安装 perl-Digest-HMAC 来支持破解算法

yum install -y perl-Digest-HMAC

执行结果如下:

➜  ~ ./test.pl 
857A-B7A9-4A4C-103E-3A8C-C044

方法 3

还有 shell 脚本方式,通过 openssl 来实现,脚本代码如下:

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

执行结果如下:

➜  ~ echo -n '00:25:90:cd:26:da' | xxd -r -p | openssl dgst -sha1 -mac HMAC -macopt hexkey:8544E3B47ECA58F9583043F8 | awk '{print $2}' | cut -c 1-24
857ab7a94a4c103e3a8cc044

过程

破解过程相比上面的破解方法要复杂的多,建议非专业人员跳过以下环节。

步骤 1:下载和解压固件

Supermicro在其网站上免费提供了 IPMI 升级文件,你只需要根据自己的主板类型选择对应的升级文件进行下载。解压后会发现有一个很大的固件二进制文件,比如 REDFISH_X10_366.bin 如下图:

<center></center>

然后将该文件上传至 linux 环境中,通过 binwalk 工具扫描二进制文件并且寻找已知格式的签名:

➜  redfish binwalk REDFISH_X10_380.bin 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
103328        0x193A0         CRC32 polynomial table, little endian
4194304       0x400000        CramFS filesystem, little endian, size: 15200256, version 2, sorted_dirs, CRC 0x96C173E0, edition 0, 8603 blocks, 1099 files
20971520      0x1400000       uImage header, header size: 64 bytes, header CRC: 0xCD918E89, created: 2019-02-14 08:41:03, image size: 1537490 bytes, Data Address: 0x40008000, Entry Point: 0x40008000, data CRC: 0xB8D13E99, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: gzip, image name: "21400000"
20971584      0x1400040       gzip compressed data, maximum compression, has original file name: "linux.bin", from Unix, last modified: 2019-02-14 08:18:16
24117248      0x1700000       CramFS filesystem, little endian, size: 7376896, version 2, sorted_dirs, CRC 0xE5B38117, edition 0, 3029 blocks, 445 files

可以看出该二进制文件主要包括两个 cramfs 文件系统,这里面包含的就是 IPMI 系统文件。原文用的是 HxD 工具来解析,笔者试了不好用,就直接采用 dd 的方式将两个 cramfs 写到两个单独文件,然后再以 cramfs 的方式挂载出来。skip表示起始值,对应上面的 DECIMAL 一列,count表示大小,对应上面的size。(参考 Getting a root shell on the IPMI)

➜  dd if=REDFISH_X10_380.bin bs=1 skip=4194304 count=15200256 of=cramfs1
➜  dd if=REDFISH_X10_380.bin bs=1 skip=24117248 count=7376896 of=cramfs2
➜  mkdir mnt1 mnt2
➜  mount -o loop -t cramfs cramfs1 mnt1
➜  mount -o loop -t cramfs cramfs2 mnt2

到这一步。恭喜你获得了 IPMI 系统的所有文件!

<center></center>

步骤 2:反编译

查看前端页面操作接口对应的 HTML/JS 代码是非常容易的:通过浏览器内置的开发者工具(F12)去寻找前端代码,然后再去上面的 IPMI 文件系统中的代码文件寻找对应的后端代码。

如你所见,IPMI调用 /cgi/ipmi.cgi 来坚持 license key 是否合法

<center></center>

以下是从网站上找到的一些信息:

<center></center>

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

<center></center>

接下来,我们需要使用 IDA Pro 打开文件 ipmi.cfg。它存储在IPMI 文件系统中,我们在前面的步骤中提取了它。下面你可以看到处理 license 检查的代码。通过阅读这段代码,您可以看到 license 应该是什么样子的。第一个循环是 hex-decoding 输入, 即文本 1234-00-FF-0000-0000-0000-0000 变成二进制 (12 字节):12 34 00 FF 00 00 00 00 00 00 00 00

<center></center>

license的实际检查在另一个文件 libipmi.so 中完成。它实现了引用的函数oob_format_license_activate:

<center></center>

您可以在这里看到实际引用的 license 密钥算法 - HMAC_SHA1。注意函数调用中的 12 是很重要的,这意味着 96 比特。96比特正好是键的长度,用十六进制表示给最终用户。

有趣的是,有一个函数 oob_format_license_create,它创建license,并且更容易阅读。您可以直接看到对私钥的引用。oob 的意思是 out-of-band,表示OEM,在这里的意思是远程购买的license 密钥。

<center></center>

Supermicro Secret Key:

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

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

在这篇博客文章的开头,解释了如何轻松地使用它来创建自己的超微license

Refer

  1. binwalk Firmware Analysis Tool
  2. Getting a root shell on the IPMI

总结

破解步骤概括一下:

第一步:通过固件解压获取二进制文件,然后通过 binwalk 扫描获取两个 cramfs 文件系统,再通过 dd 得到两个文件,之后通过挂载获取文件系统中的所有文件。

第二步:通过浏览器上请求信息,得到请求的后端代码文件 /cgi/ipmi.cgi,通过IDA Pro 反编译后端代码文件,通过逻辑判断找到算法和secret key

最后感慨一下,twitter上都能学到这么多,太强了!

正文完
 0