科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道Windows远程内核漏洞注入(5)

Windows远程内核漏洞注入(5)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

I386体系支持4种访问权限,也就是通常所说的特权级别。Windows NT 使用了其中的两个权限,使得NT操作系统可以在不完全支持这四种特权级别的体系中运行。
  • 评论
  • 分享微博
  • 分享邮件

  我们把NonPagedPool作为参数传递给ExAllocatePool,然后把shell code拷贝到non-paged区域,再简单的执行一个JMP指令来到这个内存区域。现在所有的代码都可以安全的执行而不会再受到影响。

  当注入驱动程序时,我们必须意识到当前的IRQL。IRQL是一个指定内核程序当前的硬件优先级,很多内核程序为了能成功执行会请求IRQL的PASSIVE (0) 。如果运行在DISPATCH (2)级(用于程序调度和延迟过程调用) ,必须把IRQL下降到PASSIVE. 这只是一件简单的事情,只需要调用HAL的导出函数KeLowerIrql并且把0(PASSIVE)做为参数。

  现在我们需要把用户域代码绑定到进程,就必须先得到EPROCESS结构的指针,每一个进程都有一个对应的EPROCESS结构。关于这篇文章所有结构的更多信息都可以在WinDbg中通过dump结构体取得(例如: dt NT!_EPROCESS)。我们将要使用的函数需要EPROCESS的偏移地址,如果可以得到指向所有EPROCESS结构的指针,那么可以通过遍历所有结构来得到当前的所有活动进程。

  一般情况下,可以通过调用PsGetCurrentProcess来得到第一个EPROCESS结构。不幸的是,当注入一个远程驱动程序的时候,我们可能注入到一个处于“等待”状态的进程中,这个“等待”进程不会返回一个有效进程控制块。我用PsLookupProcessByProcessId来替换,并且把“system”进程的PID作为参数。在Windows XP中这个值为4,而在Windows 2000中这个值为8。

  lea ebp, [edi-4]

  push ebp

  push 04

  call dword ptr _pslookupprocessbyprocessid ;取得系统EPROCESS

  mov eax, [ebp] ; 取得系统EPROCESS结构指针

  

  取得了第一个EPROCESS结构,现在我们就可以访问当前所有活动进程。虽然我选择把代码注入LSASS地址空间,但所有正在运行的系统进程都是合适的目标。为了访问LSASS,采用循环方式枚举EPROCESS+ActiveProcessLinks所指向的每一个入口地址并且与LSASS模块名相比较。

  mov cl, EP_ActiveProcessLinks ; offset to ActiveProcessLinks

  add eax, ecx ; get address of EPROCESS+ActiveProcessLinks

  @eproc_loop:

  mov eax, [eax] ; get next EPROCESS struct

  mov cl, EP_ModuleName

  cmp dword ptr [eax+ecx], "sasl" ; is it LSASS?

  jnz @eproc_loop

  一旦定位LSASS进程,就可以通过减去ActiveProcessLinks偏移值,从而得到LSASS与第一个EPROCESS结构的偏移值。

  下一步就是把shell code拷贝到目标内存空间。起先我打算把代码存放在PEB;以前,PEB总是被映射到0x7ffdf000,但在XP SP2中PEB的映射地址是随机的。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章