逆向工程Supermicro IPMI(2018)

2021-06-17 01:19:09

SuperMicro通过IPMI对BIOS更新执行了一个供应商锁定,即使它们在此处免费发布更新文件。唯一的自由替代方案是时间旅行到1995年,并从DOS磁盘启动以提供更新。所有其他选项(包括SuperMicro Server Manager)都需要许可证。

他们发布了BIOS更新以解决幽灵和熔点漏洞,但实际上几乎不可能进行更新。即使你提出了建议的方式,从互联网上购买一个授权的Supermicro经销商人员的关键,也是艰难且耗时的消耗。我被引用25欧元,估计了2周的交货时间。

您购买全新产品,它有一个已知的漏洞,您应该支付更新?!这根本是不可接受的。作为我的设备的所有者,我将自由更新。因此,我花了一晚逆向工程这个东西来弄清楚许可证密钥算法。 TL; DR这里是生成这些许可证密钥的算法:

MAC-SHA1-96(输入:BMC的MAC地址,秘密键:85 44 E3 B4 7E CA 58 F9 58 30 43 F8)

任何人都可以通过键入左侧(选择字节)IPMI(BMC)的MAC地址,在HMAC(SELECT BYTES)上的MAC地址上创建许可证密钥。在中间HMAC和SHA-1中选择秘密密钥和右侧的许可证密钥将出现!

这是通过2013 - 2018年的Supermicro Mainboard成功测试的。它似乎没有改变算法并使用相同的“秘密”。前6组进入这里:

更新1/14/2019:Twitter用户@astraleureka发布了此代码Perl代码,它正在生成许可证密钥:

#!/ usr / bin / perluse strict;使用digest :: hmac_sha1' hmac_sha1&#39 ;; my $ key =" \ x85 \ x44 \ xe3 \ xb4 \ x7e \ xca \ x58 \ xf9 \ x58 \ x30 \ x43 \ xf8&#34 ;; my $ mac = shift || die' args:mac-addr(即00:25:90:cd:26:da)&#39 ;; my $ data =加入&#39 ;, map {crh hex $ _}拆分':',$ mac;我的$ raw = hmac_sha1($ data,$ key); printf"%02lx%02lx-%02lx%02lx-%02lx% 02lx%02lx%02lx-%02lx%02lx \ n",(map {ord $ _} split'' $原始);

回声-n' bmc-mac' | XXD -R -P | OPENSSL DGST -SHA1 -MAC HMAC -MACOPT HEXKEY:8544E3B47ECA58F9583043F8 | awk' {打印$ 2}' |削减-C 1-24

更新2019/15/2019:Twitter用户@zanejchua提供了链接https://crypti.com/pipes/qizmda,这使得更容易生成代码。

#!/ bin / bashread -p" ipmi mac:" macaddrocho -n $ macaddr | XXD -R -P | OPENSSL DGST -SHA1 -MAC HMAC -MACOPT HEXKEY:8544E3B47ECA58F9583043F8 | awk' {打印$ 2}' |切割-c 1-24 | SED' s /./& amp; - / 4; s /./& amp; - / 9; s /./& amp; - / 14; s /./& amp; - / 19; s /./& amp ; - / 24;'

IPMI是服务器的远程管理机制,嵌入在芯片中,该芯片与操作系统可访问的典型资源分开。即使它关闭,它也允许远程管理服务器。当您的服务器没有响应时,它真的很有用,并且您不想要或无法在身体上进行故障排除。您甚至可以通过IPMI安装OS,启动服务器&甚至进入BIOS。感谢HTML5 Supermicro从那些旧的Java小程序交换(Java中的任何人都应该被禁止到远的远程岛屿; Java应该在火中死亡,它很慢,并且有9999漏洞,并在甲骨文之上追逐。即使它是开源的,您也是商标和专利巨魔的原因)。

Supermicro在其网站上免费提供IPMI更新文件。您需要选择主板并下载IPMI更新文件。在其他文件中,它将包含1个大型固件Blob,在这种情况下,“Redfish_x10_366.bin”。

十六进制描述------------------------------------------------- ------------------------------------ ,1086 Files0x1400000 Uimage标题,标题大小:64字节,标题CRC:0x8290B85A,创建:2017-06-09 12:33:02,图像尺寸:1537474字节,数据地址:0x40008000,入口点:0x40008000,AA328F72,OS: Linux,CPU:ARM,图像类型:OS内核图像,压缩类型:GZIP,图像名称:" 21400000" 0x1400040 GZIP压缩数据,最大压缩,有原始文件名:" linux.bin&# 34;从UNIX,最后修改:2017-06-09 12:01:110x1700000克拉姆斯文件系统,小endian,大小:7507968,版本2,Sorted_dirs,CRC 0x19806bff,Edition 0,2973块,407块

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

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

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

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

响应是XML,如果无效,如果有效,如果有效(则它们不使用JSON的奇怪):

接下来,我们需要使用IDA Pro并打开存储在IPMI文件系统上的文件“IPMI.CGI”,并在上一步中提取。下面可以看到处理许可证检查的代码。通过阅读此代码,您可以看到许可证应该是如何看起来的。第一环是十六进制解码输入,即文本键“1234-00FF-0000-0000-0000”变为二进制(12字节)12 34 00 FF 00 00 00 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处理更新。 HSDC私钥:39 CB 2A 1A 3D 74 8F F1 DE E4 6B 87 OOB私钥:85 44 E3 B4 7E 58 F9 58 30 43 F8 在此博客帖子的开头,它可以解释如何轻松使用此功能以创建自己的SuperMicro许可证密钥。