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对象:

#acpidump > acpi.out ; dump所有的ACPI表,生成ASCII文件
#acpixtract -a acpi.out ; 将acpidump输出的ASCII文件转化为二进制.dat文件(文件中包含AML机器码)
#iasl -d *.dat ;反编译.dat文件(AML),生成.dsl文件(文件中包含可读的ASL源码)

下图是进过上述步骤,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,如下:

            Name (WQBA, Buffer (0x089D){/* 0000 */  0x46, 0x4F, 0x4D, 0x42, 0x01, 0x00, 0x00, 0x00,  // FOMB....

现在离获得BIOS提供的WMI接口还有一步之遥,在继续之前,需要交代一下MOF描述文件生成MOF资源的过程。

#摘自:[原创]BIOS知识点滴Follow Bini系列之---WMI ACPI, 作者:bini
#http://www.ufoit.com/thread-420-1-1.html
#demowmi.mof[WMI,
Dynamic,
Provider("WmiProv"),
Locale("MS\\0x409"),
Description("Events"),
guid("{39142400-C6A3-40fa-BADB-8A2652834100}")
]
class DemoWMIData
{[key, read]string InstanceName;[read] boolean Active;[WmiDataId(1),read, write,Description("description")] uint32 Data;
};

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

mofcomp -B:demowmi.bmf demowmi.mof
wmimofck -tdemowmi.vbs demowmi.bmf

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:

 --> 

b.为Opcode定义字符串数组,并生成可执行程序:

unsigned char arry[] = {"\x46\x4F\x4D\x42\x01\x00\x00\x00\
\x28\x05\x00\x00\xAE\x18\x00\x00\
\x44\x53\x00\x01\x1A\x7D\xDA\x54\
...
\x40\x2C\x27\x88\x80\xFC\xFF\x07"};unsigned char arryEnd[] = {"\xaa\x55\xaa\x55"};int main()
{printf("%s", arry);return 0;
}

c.IDA加载生成的可执行程序,搜索并导出数组arry:

选中arry后,Edit--Export data--勾选raw bytes--Export,导出后的文件即可作为MOF资源文件。

有了bmf文件,我们就可以用wmimofck生成vbs脚本,最后来看下ThinkPad T460P的WMI接口:

On Error Resume NextSet fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("lenvon.log", True)
Set Service = GetObject("winmgmts:{impersonationLevel=impersonate}!root/wmi")
Rem Lenovo_PreloadLanguage - Preload Language
Set enumSet = Service.InstancesOf ("Lenovo_PreloadLanguage")
a.WriteLine("Lenovo_PreloadLanguage")
for each instance in enumSeta.WriteLine("    InstanceName=" & instance.InstanceName)a.WriteLine("        instance.CurrentSetting=" & instance.CurrentSetting)
next 'instanceRem Lenovo_SetPreloadLanguage - Set Preload Language
Set enumSet = Service.InstancesOf ("Lenovo_SetPreloadLanguage")
a.WriteLine("Lenovo_SetPreloadLanguage")
for each instance in enumSeta.WriteLine("    InstanceName=" & instance.InstanceName)
next 'instanceRem Lenovo_PlatformSetting - Platform Setting
Set enumSet = Service.InstancesOf ("Lenovo_PlatformSetting")
a.WriteLine("Lenovo_PlatformSetting")
for each instance in enumSeta.WriteLine("    InstanceName=" & instance.InstanceName)a.WriteLine("        instance.CurrentSetting=" & instance.CurrentSetting)
next 'instanceRem Lenovo_SetPlatformSetting - Set Platform Setting
Set enumSet = Service.InstancesOf ("Lenovo_SetPlatformSetting")
a.WriteLine("Lenovo_SetPlatformSetting")
for each instance in enumSeta.WriteLine("    InstanceName=" & instance.InstanceName)
next 'instancea.Close
Wscript.Echo "lenvon Test Completed, see lenvon.log for details"

我们可以以管理员运行WMICodeCreator.exe,来验证和执行这些WMI接口:Namespace选择root\WMI,Classes可以选择Lenovo_PlatformSetting\Lenovo_SetPlatformSetting等。

参考:

1.BIOS知识点滴Follow Bini系列之---WMI ACPI

2.Windows Instrumentation: WMI and ACPI

解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口相关推荐

  1. VMware ESXi 7.0 U3k Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    ESXi 7 U3 标准版集成 Intel 网卡.USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最 ...

  2. VMware ESXi 8.0b Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

    VMware ESXi 8.0b Unlocker & OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0 集成驱动版,在个人电脑上运行 ...

  3. VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    ESXi 7 U3 标准版集成 Intel 网卡.USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最 ...

  4. VMware ESXi 7.0 U3l Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    ESXi 7 U3 标准版集成 Intel 网卡.USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最 ...

  5. VMware ESXi 8.0 Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    发布 ESXi 8.0 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:VMware ESXi 8.0 Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集 ...

  6. VMware ESXi 6.7 U3 Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

    ESXi-6.7.0-20221004001 Build 20497097 请访问原文链接:https://sysin.org/blog/vmware-esxi-6-sysin/,查看最新版.原创作品 ...

  7. VMware ESXi 7.0 U3i macOS Unlocker OEM BIOS (标准版和厂商定制版)

    提供标准版和 Dell (戴尔).HPE (慧与).Lenovo (联想).Inspur (浪潮).Cisco (思科) 定制版镜像 请访问原文链接:VMware ESXi 7.0 U3 macOS ...

  8. VMware ESXi 8.0U1a Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    VMware ESXi 8.0 Update 1a Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U1 集成驱动版,在个人电脑上 ...

  9. VMware ESXi 8.0U1 Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

    发布 ESXi 8.0U1 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u1-sysin/,查看最新版.原创作 ...

最新文章

  1. 金额阿拉伯数字转换为中文大写
  2. 基于转移学习的图像识别
  3. c语言ascii图形输出,C语言实例10——有关ASCII图形的输出
  4. 使用.Net Core CLI命令dotnet new创建自定义模板
  5. 什么是真正的高清,你知道吗?
  6. LeetCode 492. 构造矩形
  7. Lua语言模型 与 Redis应用
  8. 【AD】如何删除AD20右下角Title
  9. C++编写Windows服务程序
  10. Hexo 搭建个人博客指南
  11. jsp嵌入vlc视频回放_【知识】如何用监控进行视频直播?一文了解清楚
  12. 在谷歌云盘训练YOLOV5模型
  13. 用友NC总账辅助余额表与应收应付模块余额表对账技巧
  14. 照片放大后怎么变清晰?
  15. 卖桃者说(1)有效学习
  16. 拉格朗日对偶性(Lagrange duality)
  17. 洛谷 P2123 皇后游戏(贪心)
  18. mac使用my-mind思维导图
  19. 咬文嚼字的有趣例子_十个你可能没听过的成语,藏着十个有趣的故事
  20. Win7 64位中MinGW和MSYS的安装

热门文章

  1. JSON Schema 简介
  2. 2021年全球身份验证服务行业调研及趋势分析报告
  3. 电路设计中的VDD、VCC、VSS
  4. activemq 限制访问ip、修改web访问密码、队列连接密码
  5. 各种软件版本号的含义
  6. 使用unix的time命令进行简单的计时
  7. PX4的软件仿真(SITL)中关于MODE: Unsupported FCU [ WARN]的问题
  8. BIOS从快速入门到入门2------解决问题
  9. 一款全能型商业智能BI软件能做什么?
  10. android 平板 吃鸡,安卓平板哪个吃鸡好 | 手游网游页游攻略大全