跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

轰炸利用分析


风尘剑心

推荐的帖子

0x00 前言

2016年10月,网络安全公司EnSilo的研究团队公开了一种支持所有Windows系统的代码注入方法,并将其命名为AtomBombing。据说这种方法可以绕过大部分安全软件,使用的系统缺陷很难修复。

因此,本文将根据开源代码和材料、学习原理、测试功能,分析使用思路,总结防御方法。

学习材料:

https://blog . en silo . com/atom bombling-brand-new-code-injection-for-windows

作者塔尔利伯曼

概念验证:

https://github.com/BreakingMalwareResearch/atom-bombing/

0x01 简介

本文将介绍以下内容:

原子弹轰炸实施方法

关键技术

防御思维

0x02 基础知识

1、Atom Table

是系统定义的表,存储字符串和相应的标识符。

应用程序将一个字符串放入一个Atom表中,接收一个16位的整数(字)作为标识符(称为Atom),可以访问字符串内容,实现进程间的数据交换。

分类:

(1)全局原子表

所有应用程序都可用。

当进程将一个字符串保存到全局原子表中时,系统会在系统中生成一个唯一的原子来标记该字符串。系统中的所有进程都可以通过这个atom (index)得到这个字符串,从而实现进程间的数据交换。

(2)局部原子表

只有当前程序可用,相当于定义了一个全局变量。如果程序多次使用该变量,只需要一次内存操作就可以使用本地原子表。

参考资料:

https://msdn.microsoft.com/en-us/library/ms649053

常用API:

添加全局原子:

ATOM WINAPI GlobalAddAtom(_ In _ LPCTSTR lpString);

删除全局原子:

ATOM WINAPI GlobalDeleteAtom(_ In _ ATOM nAtom);

查找对应于指定字符串的全局原子:

ATOM WINAPI GlobalFindAtom(_ In _ LPCTSTR lpString);

获取atom对应的字符串:

UINT WINAPI GlobalGetAtomName(

原子命名,

_Out_ LPTSTR lpBuffer,

_In_ int nSize

);

注:

使用示例可以参考以下连接:

https://github . com/sinmx/windows 2k/blob/661d 000d 50637 ed 6 fab 2329 d30e 31775046588 a9/private/windows/base/client/tatom . c

2、APC注入

APC的全称是异步过程调用,即异步过程调用。

APC注入原理:

当线程处于警戒状态时,将检查APC队列,如果APC队列被插入到函数指针中,将执行该函数。

APC注入细节:

(1)当线程调用SleepEx、SignalObjectAndWait、MsgWaitForMultipleObjectsEx、WaitForMultipleObjectsEx或WaitForSingleObjectEx的函数时,会切换到alertable状态。

注:

警报状态可以指:

https://msdn . Microsoft . com/en-us/library/windows/desktop/aa 363772(v=vs . 85)。aspx

(2)当线程进入alert状态时,会循环检查线程中的APC队列。如果APC队列中有一个函数指针,它将调用这个函数。

(3)使用QueueUserAPC函数将函数指针Loadlibrary()插入APC队列加载DLL。

(4)注射成功后,警戒状态结束,程序继续运行,可能导致程序不稳定,导致程序崩溃。

(5)如果没有删除APC队列,同样的功能不能重复注入。

(6)使用APC注入时,目标进程中至少需要有一个线程处于警戒状态或者可以进入警戒状态,否则无法实现APC注入。

注:

大部分系统进程满足条件,支持APC注入。

可用的APC进样代码:

https://github.com/3gstudent/Inject-dll-by-APC

3、shellcode

在漏洞利用中,外壳代码是指输入到易受攻击程序中的代码。

它相当于一个二进制代码框架,最终将程序的进程跳转到有效载荷。

4、payload

主要功能代码(下载执行、弹壳、创建新用户等常见的。)包含在外壳代码中。

0x03 实现方法

1、将任意数据写入目标进程地址空间中的任意位置(Write-What-Where)

通过读写atom将外壳代码传递给目标进程

进程本身通过GlobalAddAtom将shellcode添加到全局Atom表中,目标进程调用GlobalGetAtomName从全局Atom表中获取shellcode。

所以接下来的关键是如何让目标进程调用GlobalGetAtomName。

Tal Liberman的思路是通过APC注入让目标进程调用GlobalGetAtomName。

但是,这里有一个问题。QueueUserAPC函数只能向目标进程传入一个参数,而GlobalGetAtomName需要三个参数。

于是Tal Liberman调试了QueueUserAPC函数,发现可以通过NtQueueApcThread函数传递三个参数。

问题解决了。

2、执行shellcode

目标进程调用GlobalGetAtomName从全局Atom表中获取shellcode后,执行前需要保存shellcode。

第一种实现方法:找一段RWX内存存储,执行。

不会,现在的系统保护机制很难找到这样的内存空间。

第二种实现方法:调用VirtualAllocEx分配一个内存。

常规方法

注:

其他常见的方法,比如通过VirtualProtect将shellcode的memory属性设置为可读可写可执行,然后跳转到shellcode继续执行,这里就不太有效了,因为需要考虑使用QueueUserAPC函数传入参数的问题。

所以Tal Liberman尝试了第三种方法:找一段RW内存写数据,构造ROP链实现shellcode。

找一个RW内存并不难。Tal Liberman选择了KERNELBASE数据段之后未使用的空间。

ROP链实现以下功能:

请求RWX内存

将外壳代码从RW内存复制到RWX进行存储

执行

注:

Tal Liberman在ROP链的构建上提供了自己的思路,尽可能的简化ROP链,优化思路值得借鉴。

3、恢复执行

注入后需要恢复目标进程的执行,使用未发布的函数ZwContinue。

0x04 实际测试

测试系统:Win7 x86

安装python,安装pefile(easy_install pefile)

生成AtomBombingShellcode.h、AtomBombingShellcode.h和AtomBombingShellcode.h

注:

AtomBombingShellcode.h由\ AtomBombingShellcode \ scripts \ post _ link . py生成,具体参数可以在atombombingshellcode项目的后期生成事件中查看,如下图所示。

2-1.png

启动chrome.exe,执行AtomBombing.exe,成功注入,如下图所示。

2-2.png

2-3.png

补充:

Windows 8.1更新3和Windows 10增加了新的保护机制CFG(控制流防护)。请参考以下链接绕过CFG:

https://blog.ensilo.com/atombombing-cfg-protected-processes

0x05 利用分析

根据公开信息和实际测试,AtomBombing可以理解为APC注入的升级版:使用Atom表来传输shell代码,使用NtQueueApcThread来实现APC注入。shellcode通过构造ROP链实现申请内存、写有效载荷(弹出计算器)和执行的功能。

Atom支持所有Windows平台,短期内不会取消这个功能,也没有修复,所以一定程度上可以理解为没有修复AtomBombing的补丁。

但要实现AtomBombing的利用,需要综合考虑若干问题(如获取alert状态下的线程、通过NtQueueApcThread传入参数、寻找RX内存、构造ROP链等。),而且利用门槛高。

不适用于所有进程(目标进程中至少有一个线程处于警报状态或可以进入警报状态)

可以绕过部分杀毒软件,但不能绕过所有杀毒软件(使用NtQueueApcThread进行注入)。

0x06 检测防御

AtomBombing理解为APC注射的升级版,参考APC注射的防御方法。攻击者首先需要获得系统的执行权限,找到符合条件的进程。

检测:

监视NtQueueApcThread函数的调用

0x07 小结

本文介绍了原子弹爆炸的实现思路和关键技术。经过实际测试,得出最终结论,AtomBombing是一种新的DLL注入方式,可以理解为APC注入的升级版:使用Atom表传递shellcode,通过NtQueueApcThread实现APC注入,shellcode通过构造ROP链实现申请内存、写净荷(弹出计算器)和执行的功能。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...