Supermicro IPMI license 反向破解

原文地址: 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的结果就会在最右边出现!!!

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

方法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如下图:

然后将该文件上传至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系统的所有文件!

步骤2:反编译

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

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

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

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

接下来,我们需要使用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

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

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

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

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上都能学到这么多,太强了!

你可能感兴趣的:(license,破解)