首页
社区
课程
招聘
[原创]解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口
发表于: 2020-8-1 21:35 6571

[原创]解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口

2020-8-1 21:35
6571

Bios由于需要保证运行时的透明性,它只向提供该BIOS的OEM厂商开放部分接口。用户只能通过OEM提供的App/Driver读取和设置OEM Bios。另外,OEM也保留WMI接口用于设置BIOS,同样,WMI接口也对用户透明。虽然OEM企图瞒天过海,但并不意味着我们无法获取WMI接口。本文基于ThinkPad T460P提出一种获得WMI接口的方式。另外,据了解,WMI接口可能存在安全风险,所以,这可能给渗透测试者提供了新的利用BIOS方式。

    Bios\Windows通过WMI相互通信需要借助MOF(经过编译后为BMF)文件,MOF描述了BIOS导出的WMI接口名字。按Windows Instrumentation: WMI and ACPI的描述,MOF可能存在于2处:

a.由HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WmiAcpi的MofImagePath指定;不过我在ThinkPad和某OEM的机器上没有找到这样的设定,所以这种方式不做讨论。

b.作为Buffer资源,将MOF资源嵌入到ACPI命名空间下;ThinkPad和某OEM都是用这种方式实现,当然这也是本文的切入点。

读到这,你可能想到用RW获得这个ACPI对象,但是联想好像特意做了驱动,不让用户读取ACPI相关内存,如下图:

但是历史规律告诉我们:真正的隔壁老王是堵不住!虽然Windows下看不到ACPI,但是,我可以U盘进入Ubuntu用pm-tools系列工具获得需要的ACPI对象:

下图是经过上述步骤,得到的ThinkPad 460P的ACPI源码文件(ASL source code):


如《Windows Instrumentation: WMI and ACPI》所述,BIOS在ASL source code中需要向WMI mapper声明设备:PNP0c14和_WDG对象。另外,OEM厂商或者IBV会在声明_WDG对象时,顺带声明嵌入式MOF对象。ACPI spec没有规定嵌入式MOF对象的名字,所以各家OEM会有不同的对象名。但是这并不是问题,它是有迹可循的:

a.嵌入式MOF对象位于_WDG对象附近,并且具有形如"Name (WQxy, Buffer()){..."的ACPI对象定义(其含义为:定义一个包含MOF资源的Buffer,并将该Buffer命名为WQxy。前缀WQ代表这是WMI查询接口,xy是2个16进制数值,用于标识WMI查询接口);

b.最重要的,该ACPI对象定义中包含了大量的16进制Byte,并且开头4Byte是一个魔术字:"FOMB",如下:


找到MOF对象后,离获得BIOS提供的WMI接口还有一步之遥。但是在获得WMI接口之前,我需要交代一下MOF描述文件生成MOF资源的过程。

上面是一个MOF描述文件,它经过mofcomp编译后,会生成二进制MOF资源文件。OEM厂商提取MOF资源文件中的字节流,嵌入到ACPI命名对象中。另外,DDK工具集中还提供wmimofck工具,该工具以MOF资源文件为输入,生成MOF所描述的WMI接口的测试脚本。下面两行命令将依次生成bmf文件(即MOF资源文件)和vbs接口测试脚本:


图中demowmi.vbs脚本中高亮处就是BIOS通过MOF导出的WMI接口。通过这段插曲,我想说只要有(没有?那就伪造!)MOF资源文件,就有机会解析出其中的WMI接口。另外,通过前文讲解,我们了解到ACPI表中包含MOF资源文件,所以剩下的事就是生成MOF资源文件和WMI测试脚本。剩下的篇幅我来谈谈怎么生成MOF资源文件。

1.将MOF资源中的字节流转换到二进制文件中。我们看到的是保存在ASL source code中的字符串,需要进过一系列转换才能被wmimofck当做MOF资源文件读取,转换过程其实和编写shellcode相似。

a.用notepad++对字符串进行文本处理(如按住Alt选取要删除的列),左图是ASL source code,右图是转换后的Opcode:

---->


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//