高级bootkit-tophet

上传人:自*** 文档编号:80225563 上传时间:2019-02-19 格式:DOC 页数:21 大小:1.29MB
返回 下载 相关 举报
高级bootkit-tophet_第1页
第1页 / 共21页
高级bootkit-tophet_第2页
第2页 / 共21页
高级bootkit-tophet_第3页
第3页 / 共21页
高级bootkit-tophet_第4页
第4页 / 共21页
高级bootkit-tophet_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《高级bootkit-tophet》由会员分享,可在线阅读,更多相关《高级bootkit-tophet(21页珍藏版)》请在金锄头文库上搜索。

1、高级Bootkit :Tophet.a摘要: 本文揭示了一种新型的Bootkit技术:Tophet,以及其第一代范本Tophet.a使用的一些新颖的技术。Tophet.a并非病毒或木马,只用来演示高级的启动、穿透与隐身技术。 Bootkit是更高级的Rootkit,该概念最早于2005年被eEye Digital公司在他们的“BootRoot项目中提及,该项目通过感染MBR(磁盘主引记录)的方式,实现绕过内核检查和启动隐身。可以认为,所有在开机时比Windows内核更早加载,实现内核劫持的技术,都可以称之为Bootkit,例如后来的BIOS Rootkit , VBootkit,SMM Roo

2、tkit等。 在现在MBRBoot SectorNt OS Loader这些众所周之的位置都被HIPS监视软件、检查软件严防死守,而BIOS, SMM, ROM firmware 之类的启动位置又存在被锁定或通用性不够好的时候,如何简单、通用,又有效地进行Windows内核启动劫持呢?Tophet.a使用了一种新的方式:NtBootdd.sys。 同时,Tophet.a揭示了一些磁盘级的穿透、隐藏技术,可以穿透目前所有防御软件,进行安装,同时在目前任何Rootkit文件检测技术下隐身。关键字:Bootkit 内核劫持 磁盘穿透与隐藏第一章:启动 最早的Bootkit使用MBR(主引导记录)感染

3、或Boot Sector(启动引导扇区)感染手段来实现早于Windows内核启动,一般考虑MBR或BootSector中的代码负荷有限,会在感染代码中,挂钩Windows内核,再进一步实现具体功能,常用手段是挂钩INT 0x13中断,干涉nt os loader对内核文件的读取, 实现 Windows内核挂钩。 现在看来,这种手段不免过于原始,对MBR / BootSector这些关键位置,只要严格防御或者定时检查,即使Bootkit在系统启动获得控制权后对MBR或BootSector扇区的感染进行隐藏,也难逃使用低级磁盘读写的检查恢复方式。 感染ntldr和os loader的方式,存在和上

4、面的感染方式同样的问题。 至于BIOS Rootkit , SMM Rootkit , VBootkit,由于其过于依赖硬件,除了有通用性的难题,再则硬件厂商也开始逐步注意安全问题,BIOS和SMM的写入锁定,启动时抢占VM root等方式,也限制了这类Rootkit的应用。 如何不感染系统关键文件、位置和硬件,来实现内核劫持呢? boot.ini是一个很好的突破点。 boot.ini中的很多选项都可以用来实现内核劫持,例如启动条目的/KERNEL,/HAL参数可以用来进行内核文件的替换和劫持,这已经是众所周之的了。另外,DEBUG选项和VGA选项都可以用来做劫持或辅助劫持 Vista操作系统

5、已不再使用boot.ini这个文件作为启动配置,其启动配置保存于SystemPartitionbootbcd这个HIVE文件中,而这个HIVE的注册表项中的GUID即是相关的启动选项,与以往的boot.ini并没有本质上的区别,本文将不为Vista操作系统做特别讨论,下面的相关细节都以Windows XP 操作系统为准。 比起简单的/KERNEL参数替换内核,这里tophet.a用的是更为隐蔽的方式。 我们知道,Windows NT的启动过程简单来说是这样的: BIOS进行上电引导自检等操作后,将控制权交给主引导记录(MBR)的引导代码,引导代码读取硬盘分区表(DPT)后,找到引导分区,并将控

6、制权移交启动扇区(Boot Sector)的启动代码,启动代码使用其自带的只读FAT32或NTFS的代码,读出其根目录下的NTLDR文件,并将控制权交给NTLDR中的代码,NTLDR首先将系统切换到保护模式,并开启分页机制,然后控制权被交给NTLDR体内的OSLoader.exe,OSLoader读入boot.ini文件,根据配置的启动条目显示启动菜单,等待用户选择(如果只有一个启动项 , 则直接启动那个启动项, 不显示启动菜单),用户选择指定的启动项目后,便会引导相应的项目。 下面是一个普通的boot.ini中的一条启动项:multi(0)disk(0)rdisk(0)partition(1

7、)WINDOWS=Microsoft Windows XP Professional /noexecute=optin /fastdetect boot.ini中启动项是符合ARC(Advanced RISC Computing)命名规范的。 请注意前面的multi(0),Windows有三种语法:multi , scsi 和signature。当引导卷所在的磁盘控制器支持BIOS的 INT 0x13中断读写磁盘时,就会使用multi语法,这也是绝大部分系统上使用的语法。而scsi语法则是当磁盘控制器不支持INT 0x13指令时使用的,此时,NTLDR在确定了引导项后,会从根目录加载一个名为N

8、tBootdd.sys的文件,将其绑定到OSLoader上,OSLoader中包含的只读NTFS/FAT32代码会使用该驱动来读写磁盘,实现Windows内核文件(ntoskrnl.exe)、硬件抽象层文件(hal.dll)和BOOT驱动文件的加载。 那么,我们只需要将boot.ini中当前系统的启动条目中的multi语法改为scsi语法,系统就会在进行内核加载前,加载我们放置在根目录下的NtBootdd.sys文件了。 这里介绍一个小技巧:如何知道当前系统是由boot.ini中的哪个启动条目引导的呢?在WindowsXP及以后的操作系统中很简单,注册表的HKEY_LOCAL_MACHINES

9、YSTEMCurrentControlSetControl键下的SystemBootDevice键值就保存着当前系统引导的启动项目的内容,用该键值的内容同boot.ini的条目对比,不难发现引导当前的系统的启动条目。 在Windows 2000操作系统上则稍微复杂点,该系统上并没有这么一个键值,但HKEY_LOCAL_MACHINESystemSetup键下有个名为SystemPartition的键值,该值指明了当前启动卷的设备名,例如:DeviceHarddiskVolumeX“(X为磁盘分区号),而在系统对象目录的ArcName目录下保存了这些磁盘设备名对应的ARC名,形如multi(0)

10、disk(X)rdisk(Y),这些Arc名实际是一些符号链接(Symbolic Link),在对象目录中匹配取得启动卷的设备名对应的ARC名,再在Boot.ini中匹配ARC名,即可确定当前的启动条目。 言规正传,OSLoader在读入boot.ini到其数据段的一块缓存并确定了启动条目后,首先会检查该条目的前5个字符是不是:scsi(,如果是,就会调用名为AEInitializeIo()的函数,该函数会调用BlLoadImage函数加载根目录下的NtBootdd.sys 到内存中,然后使用BlAllocateDataTableEntry函数为该模块分配一个名为NTBOOTDD.SYS的Da

11、taTableEntry(该表类似于Windows内核使用的PsLoadedModuleList,是OSLoader用来管理加载模块使用的,在引导Windows内核过程中,会被复制到PsLoadedModuleList 中)。 接着它会扫描OSLoader的引入表,将NtBootdd.sys所引出的ScsiPort读写函数绑定到OSLoader的引入表中,然后会调用 NtBootdd.sys的入口点,以便NtBootdd.sys完成自己的初始化工作,如果初始化返回成功,则继续进行名为HardDiskInitialize的函数,让以后的磁盘读写操作都通过NtBootdd.sys来实现,若返回失败

12、,则结束AEInitializeIo函数,继续正常的引导过程。 那么我们用来劫持的NtBootdd.sys要完成的工作就是:1. 不导出任何函数,这样就不会影响OSLoader的引入表2. 在初始化函数中完成相关的钩子例程及处理例程,然后返回失败,让系统仍然使用INT 0x13来读写磁盘3. 需要注意的是,我们需要在初始化例程中将ntldr中已读入的boot.ini进行修改,将scsi语法重新改回multi语法,否则在后面的引导过程中ntldr会认为我们使用了错误的引导语法,导致系统无法启动。读入的boot.ini是保存在OSLoader的数据段的一个全局变量中的,我们扫描整个OSLoader

13、镜像,即可找到需要修改的数据。4. 为了劫持内核,Tophet.a进行了这样的工作:因为调用 NtBootdd.sys的初始化例程的函数是AEInitializeIo,那么我们在初始化例程中通过堆栈就可以轻松找到该函数 call DriverEntry的下一条指令位置,然后我们从这条指令向上搜索,就可以准确稳定地找到BlLoadImage函数的地址,OSLoader正是通过这个函数来加载包括Windows内核文件、HAL和boot驱动的模块的,我们挂钩该函数,就可以准确地知道Windows内核文件加载的瞬间,并对其内存镜像进行修改和劫持。下面是Tophet.a的NtBootdd.sys的Dri

14、verEntry函数NTSTATUS_declspec(naked) DriverEntry(ULONGxx , ULONGxx1)_asm/将esp保存,接下来的domywork函数会根据该值找到堆栈中call DriverEntry的下一条指令,并搜索、挂钩BlLoadImagemovSavedEsp , esppush eaxpushebx/NTLDR 会将osloader.exe重定位到它的PE头的ImageBase域指示的地址/因此我们从0x400000开始搜索/这个地址可以根据osloader的ImageBase不同改变(安装时自修改)mov eax , 0x400000 /搜索范

15、围0x80000字节movebx , 0x7FFFALoopFind:/寻找 字符串scsicmp dword ptreax + ebx , 0x69736373jnzNotCatch/寻找 字符串(cmpword ptreax + ebx + 4 , 0x2828/osloader.exe会读入boot.ini并将其放到自己的全局变量中jnzNotCatch/将其改为multi,否则系统将无法正常启动movdword ptreax + ebx , 0x746c756dmovbyte ptreax + ebx + 4 , 0x69jmpFindmultiNotCatch:dec ebxtestebx , ebxjnzLoopFind/无法找到,重启系统 moval , 0xfeout0x64 , alFindmulti:calldomywork/实现钩子例程popebxpopeaxmoveax ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号