原文地址: 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
地址,做SHA1
,SECRET KEY
为85 44 E3 B4 7E CA 58 F9 58 30 43 F8
。
下面会介绍几种破解方法,但都基于以上的算法和SECRET KEY。
方法1
大家可以进入https://cryptii.com/,最左边选择Bytes
,填写IPMI
的MAC
地址,中间选择HMAC
,然后填写上述的SECRET KEY
,算法选择SHA-1
,license
的结果就会在最右边出现!!!
这种方式生成的license
在supermicro
2013~2018
期间的主板上测试都成功了,说明supermicro
内部没有改变算法,并且一直用的同样的SECRET KEY
。填写6
组key
来激活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
- binwalk Firmware Analysis Tool
- Getting a root shell on the IPMI
总结
破解步骤概括一下:
第一步:通过固件解压获取二进制文件,然后通过binwalk
扫描获取两个cramfs
文件系统,再通过dd
得到两个文件,之后通过挂载获取文件系统中的所有文件。
第二步:通过浏览器上请求信息,得到请求的后端代码文件/cgi/ipmi.cgi
,通过IDA Pro
反编译后端代码文件,通过逻辑判断找到算法和secret key
。
最后感慨一下,twitter
上都能学到这么多,太强了!