热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】用户模式下基于异常和内核控制的线程级钩子技术分析

译者:WisFree预估稿费:200RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿简介在这篇文章中,我们将会跟大家介绍我们在研究过程中所发现的一种新型的钩子(Hook)技术

http://p4.qhimg.com/t010d6febb7e8a70b7e.jpg

译者:WisFree

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


简介

在这篇文章中,我们将会跟大家介绍我们在研究过程中所发现的一种新型的钩子(Hook)技术。

Hook技术可以帮助我们了解并控制操作系统中每一部分软件组件的操作行为,使用了钩子技术的部分软件有:应用程序安全解决方案、系统应用工具、编程软件(例如用于拦截、调试和功能扩展的软件)、以及恶意软件(例如rootkit)等等。

钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面设置子进程/线程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,钩子可以在目标窗口处理函数之前对数据进行处理它,因为钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

需要注意的是,本文所要介绍的内容并不涉及提权以及漏洞利用技术。本文所介绍的技术主要用于后渗透场景,即攻击者已经成功获取到目标设备控制权的情况。由于恶意内核代码(rootkit)一般都会尝试在目标系统中实现持久化感染,因此隐藏技术也逐渐开始扮演一种十分重要的角色了。


技术描述

我们给这项技术取名为BoundHook,BoundHook技术可以在用户模式场景中的特殊位置引发异常,然后通过捕捉异常来接管线程的执行。我们可以使用BOUND指令(Intel MPX内存保护扩展的一部分)来实现上述操作,这种指令原本的作用是通过检测指针引用来提升软件的安全性。简而言之,BOUND指令可以检测数组索引的越界情况(可能触发内存崩溃漏洞),如果测试失败则会引起软件中断。(32-bit: nt!KiTrap05, 64-bit: nt!KiBoundFault

你可能会问,为什么不对这两种操作指令进行一下对比呢?因为英特尔的技术人员在设计这种新型指令时故意生成了一个异常,并让操作系统来检查边界测试失败的情况。

http://p8.qhimg.com/t01fd64c890da1e3dc8.png

这种指令的语句如下所示:

BOUND r16, m16&16 – 检测r16(数组索引)是否越界(m16&16指定)

BOUND r32, m32&32 – 检测r32(数组索引)是否越界(m32&32指定)

当边界检查出现错误时,陷阱处理程序(trap handler)将会调用nt!KiHandleBound并执行已注册的边界异常回调程序。

内核模式驱动程序或者运行在内核模式下的shellcode payload可以使用nt!KeRegisterBoundCallback来为边界检测异常注册一个回调程序。需要注意的是,这个函数并不是WDK header“提供”的,而且这里还需要动态加载一个指向该函数的指针。

这种回调程序没有任何的参数,并且会返回一个BOUND_CALLBACK_STATUS(枚举类型),具体如下所示:

http://p4.qhimg.com/t01b211178e5d61d146.jpg

完成了边界异常的注册之后,内核模式代码会得到一个指向用户模式DLL基地址的指针,并计算出需要设置钩子的函数地址。

获取函数地址其实是一件非常简单的事情,而且可以通过多种方式去实现,例如通过解析PE头就可以。需要注意的是,解析一个某个特定进程所加载的图片则需要在进程环境中进行,或者使用特定的API。

当我们的代码计算出了函数地址之后,我们如果可以直接开始向这个地址写入数据就非常好了。但是,由于这部分代码存在于只读/可执行内存之中,我们就没办法做到这一点了。

Windows内存保护的实现主要依赖一下几个因素:

http://p2.qhimg.com/t01f96240896bc6c94e.png

现在我们就有几种选择了。我们可以想办法向这个地址写入数据来触发COW(copy-on-write)保护,或者使用__readcr0()和__writecr0()来修改CR0寄存器。除此之外,我们还可以分配我们的内存描述符列表(MDL)来描述内存页面,并使用按位或(bitwise OR)来调整MDL和MDL_MAPPED_TO_SYSTEM_VA的权限。最后这种方法相对来说更加“隐蔽”一些,因为根据当前PatchGuard实现的设计来看,这种方法是完全不可见的。

首先,我们给大家介绍如何修改CR0寄存器。CR-寄存器的描述如下所示(来源于Intel 64和IA-32软件架构开发人员手册):

”WP写入保护(16位CR0)-当设置时,将阻止高等级进程向只读页面中写入数据;当清空时,将允许高等级进程向只读页面中写入数据。“

下面是CR0寄存器的一个简单的修改样例:

http://p8.qhimg.com/t01f636db54fe72615a.png

如果可以直接向DLL的COW页面写入数据的话,我们就能够对操作系统中每一个使用了这个DLL的进程设置钩子,因为我们已经可以影响cow-origin页面了。

触发边界异常也是比较简单的,比如说,下面的代码将触发一次错误异常:

http://p7.qhimg.com/t01b53d58d9c27e42f0.png

因此,我们负责执行钩子的内核模式代码将能够向目标位置写入一个类似的汇编代码,并成功接管目标线程的执行过程。

比如说,如果我们想要挂钩KERNELBASE!CreateFileW,我们就可以将下面给出的这行操作码注入到该函数的起始位置:

UCHAR opcodes[5]= {0x36, 0x66, 0x62, 0x0C, 0x24};

你可以直接理解为:BOUND CX, DWORD PTR SS : [ESP]。在这种特殊场景下,我们假设CX为0(在真实的使用场景中,我们需要对每一个函数进行测试来决定这个值),而栈顶的值肯定大于0(这只是一个PoC,而并非最终的Exploit)。

现在,当我们将操作码写入进了KERNELBASE!CreateFileW之后,如果用户模式下的线程调用这个函数时,我们内核模式下的回调函数就能够完全接管这个用户模式下的线程了。

如果可以实现的话,那我们的优势就非常大了,比如说:

1.  挂钩的页面仍然是COW,因此反恶意软件解决方案以及研究人员所进行的手动分析将无法发现页面遭到了篡改。

2.  绝大多数反病毒产品不会检测到我们的这种技术,而且这个问题似乎无法解决,因为页面仍然是COW。

3.  用户模式调试器将无法捕捉到这种钩子。普通的内联钩子方法会让已挂钩的程序跳转到其他的用户模式代码,但BoundHook技术可以通过内核边界异常处理器来修改这种执行流程。

4.  绝大多数PatchGuard(PG)保护机制都无法察觉到我们的这种钩子技术。根据目前PG的设计原理,用本文所介绍的MDL方法绕过COW机制是不会被检测到的。对于修改CR0寄存器的方法来说,虽然CR0寄存器是受PG保护的,但PG发现这种修改操作的可能性也非常小,因为修改操作可以在非常短的时间内完成。

PoC-已挂钩的线程调用栈:

http://p9.qhimg.com/t0198abe493b265d724.png

总结

我们知道对于微软而言,BoundHook技术所利用的技术因素并不会被他们认为是一种安全漏洞,因为设备管理员权限已经被攻击者拿到了。在此之前,微软曾从CyberArk(GhostHook技术)那里收到了类似问题的报告,而微软对此的回应如下:

”我们已经对上报的安全问题进行了详细的分析和调查,并且发现这并不是一个真正意义上的安全漏洞,因为这只是一种用于躲避安全检测的技术,但设备此时已经被攻击者入侵了。你们所提交的是一种后渗透技术,而且并不符合我们的漏洞规定,因此我们无法针对该问题发布更新补丁,但我们会在将来的Windows版本中考虑解决这个问题。“

但不管怎么样,我认为我们所设计的这种技术可以给软件安全厂商以及恶意软件开发者提供一种新的思路,也希望微软能够尽快解决这个问题(虽然他们不认为这是一个安全漏洞)。


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
author-avatar
马芷靈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有