Osiris中使用的Process Doppelgänging和Process Hollowing技术

加载法度榜样创建一个新事务,在该事务中创建一个新文件

仿照合法进程平日是恶意软件作者最爱好应用的技巧,由于这可以容许他们运行恶意模块而不被杀毒软件察觉多么多年来,各类各样的技巧层出不穷,他们也加倍靠近了这个目标这个话题也被钻研者和逆向工程师所津津乐道,由于其对付Windows API的应用也异常有创意

Process Doppelgänging是一种仿照进程的新技巧,该技巧于去年Black Hat会议公开,在此之后,一个叫SynAck的打单软件被发明使用这种技巧实现恶意目的,只管Process Doppelgänging在野并不常见,我们近来照样在Osiris银行木马(Kronos的新版本)中发清楚明了一些类似特性仔细阐发后,我们发明原始的技巧已经被进一步定制化了

实际上,恶意软件作者已将ProcessDoppelgänging和Process Hollowing中的技巧结合应用,并选择两种技巧的最佳部分来创建更强大年夜的组合在这篇文章中,我们仔细钻研了若何在受害机械上支配Osiris,这要归功于一个有趣的Loader

概览

Osiris按三个步骤加载,如下图所示:

第一阶段加载器应用了ProcessDoppelgänging技巧然后因为第二阶段的加载器,Osiris被分发

加载额外的NTDLL

运行时,初始dropper会创建一个新的进程wermgr.exe

查看注入器的进程空间中所加载的模块,我们可以看到NTDLL的一个副本:

这是一种众所周知的技巧,一些恶意软件作者应用这种技巧来避免被监控并暗藏他们所调用的API当我们仔细钻研额外NTDLL调用了哪些函数时,发明更多有趣的细节它调用了几个与NTFS事务相关的API很轻易猜到,这里采纳了依附于这种机制的Process Doppelgänging技巧

NTDLL是一个特殊的初级DLL基础上,它只是系统调用的封装它与系统中的其他DLL没有任何依附关系因为这个缘故原由,它可以方便地加载其他的系统DLL(如Kernel32)在很大年夜程度上依附于从NTDLL导出的函数这便是为什么许多用户区的监视对象hook并拦截NTDLL导出的函数:反省正在调用的函数,并监视是否存在任何可疑活动

恶意软件作者显然知道这一点,以是无意偶尔,为了绕过这种机制,他们从磁盘加载新的且未hook的NTDLL副本有几种措施可以实现这一点我们来看看Osiris的作者是若何做到的

经由过程内存映射,我们看到NTDLL副本作为image加载,与其他DLL一样这种类型的映射是常见的由LoadLibrary函数加载DLL,或者NTDLL的初级版本LdrLoadDll的映射不过NTDLL默认加载到每个可履行文件中,并且官方API无法再次加载相同的DLL

平日,恶意软件作者都邑手动映射副本,但这会供给不合的映射类型,并和正常加载的DLL中不一样在这里,作者想出一个办理措施:他们应用以下函数将文件作为一个部分加载:

ntdll.NtCreateFile – 打开ntdll.dll文件

ntdll.NtCreateSection – 在文件外创建一个section

ntdll.ZwMapViewOfSection – 将此部分映射到进程地址空间

这种做法很智慧,由于DLL被映射为一个image,以是它看起来像因此范例的要领加载的

该DLL被进一步应用,以使注入载荷行径加倍隐蔽,拥有NTDLL的新副本,以是从那里应用的功能没有被平安产品所发明

与Process Doppelgänging和Process Hollowing的对照

Loader将载荷注入新进程的要领与Process Dopplegänging显示出一些紧张的相似之处然则,假如我们仔细阐发它,也可以看到与去年Black Hat所提出的存在不合之处不合点更像Process Hollowing

经典的Process Doppelgänging:

Process Hollowing:

Osiris Loader:

创建一个新进程

Osiris loader起开创建它将要注入的进程该历程由Kernel32:CreateProcessInternalW中的函数创建:

新进程(wermgr.exe)是在原始文件的挂起状态下创建的它让我们想起了Process Hollowing,这是一种更古老的进程仿照技巧在Process Dopplegänging算法中,创建新流程的步骤必要很长,并应用不合的,未记录的API:NtCreateProcessEx:

[1] [2] [3]下一页

这种差异很紧张,由于在Process Doppelgänging中,新进程不是从原始文件创建的,而是从特殊缓冲区(section)创建的section应该是在早期创建,应用在NTFS事务中创建的“弗成见”文件在Osiris loader中,这个部分也会呈现,但顺序是倒置的,让我们不知是否可以将它们视为相同的算法

创建进程后,相同的image(wermgr.exe)将映射到loader的高低文中,就像之前应用NTDLL一样

后来证实,loader会修补远程进程wermgr.exe的本地副本将用于网络有关补丁的信息

NTFS事务的应用

现在简要先容一下NTFS事务这种机制平日在数据库运行时应用,它们也以类似的要领存在于NTFS文件系统中NTFS事务将一系列操作封装到一个单元中在事务内部创建文件时,提交事务之前任何人都无法造访它Process Doppelgänging应用它们来创建弗成见的文件

在阐发的案例中,对NTFS事务的应用完全类似我们只能发明所用API的细微区别 最初的应用了来自Kernel32的CreateTransaction和CreateFileTransacted实现

首先,调用来自NTDLL的函数ZwCreateTransaction然后作者并没有应用CreateFileTransacted,而是经由过程RtlSetCurrentTransaction和ZwCreateFile打开事务处置惩罚文件(创建的文件是%TEMP%\\Liebert.bmp)然后,dropper将新内容写入文件类似地,其也会应用ZwWriteFile的RtlSetCurrentTransaction

可以看到缓冲区包孕新的PE文件:即第二阶段的载荷平日,对付此技巧,文件仅在事务中可见,并且不能由其他进程(如杀毒软件)打开

事务中的文件创建后,会用于创建特殊款式的缓存,即section完成这些动作的函数都只能经由过程初级APIZwCreateSection/NtCreateSection调用

创建该部分后,不再必要该文件事务被回滚(经由过程ZwRollbackTransaction),并且对文件的变动不会保存在磁盘上是以,上述部分与Process Doppelgänging的类比部分相同经由过程应用从NTDLL的自定义副本调用的初级别函数,dropper的作者使其加倍隐蔽

从一个section到一个进程

此时,Osiris dropper创建了两个完全不相关的元素:

一个进程(此时包孕映射的,合法的可履行文件wermgr.exe)

一个section(从事务创建)并包孕恶意载荷

假如这是范例的Process Doppelgänging,那么这种环境永世不会发生,我们会根据带有映射载荷的部分直接创建进程那么问题呈现了,dropper的作者是为什么在这一点上将元素合并在一路的呢?

假如我们跟踪履行,就可以看到在回滚事务之后调用以下函数(款式:RVA;function):

4b1e6;ntdll_1.ZwQuerySection

4b22b;ntdll.NtClose

4b239;ntdll.NtClose

4aab8;ntdll_1.ZwMapViewOfSection

4af27;ntdll_1.ZwProtectVirtualMemory

4af5b;ntdll_1.ZwWriteVirtualMemory

4af8a;ntdll_1.ZwProtectVirtualMemory

4b01c;ntdll_1.ZwWriteVirtualMemory

4b03a;ntdll_1.ZwResumeThread

是以,看起来新创建的部分只是作为附加模块映射到新进程中将载荷写入内存并设置需要的补丁(例如进口点的重定向)后,将规复该进程:

重定向履行的要领类似于Process Hollowing的变种远程进程的PEB已打补丁,新模块已作为一部分被添加(因为这个缘故原由,当进程规复时,导入将自动加载)

然则,进口点重定向仅由初始模块的进口点地址处的补丁完成单个跳转即重定向到注入模块的进口点:

假如修补进口点掉败,那么加载法度榜样会应用包孕第二个进口点重定向变种,措施是在线程高低文中设置新地址(ZwGetThreadContext – > ZwSetThreadContext),这是Process Hollowing中应用的经典技巧:

第二阶段Loader

下一层(8d58c731f61afe74e9f450cc1c7987be)还不是核心部分,然则loader的下一阶段其仅仅引入一个DLL,Kernel32

加载终极payload的要领与寻常无异,Osiris核心代码慢慢解包,然后与相关依附一路加载到Loader进程新分配的内存区域中

上一页[1] [2] [3]下一页

自注入后,Loader会跳转到payload的进口点:

利用法度榜样的进口点与标头中保存的进口点不合是以,假如我们转储载荷并考试测验互相依附地运行,会无法履行相同的代码这是一种用于误导钻研职员的有趣技巧

这是标头中设置的进口点RVA 0×26840:

该调用使利用法度榜样进入无限就寝轮回:

恶意软件履行的开始的真实的进口点在0×25386,只有loader知道进口点地址

第二阶段与Kronos Loader

应用暗藏进口点的类似技术被原始Kronos(2a550956263a22991c34f076f3160b49)应用在Kronos的案例中,终极的载荷被注入svchost经由过程修补svchost中的进口点将履行重定向到内核:

在这个案例中,载荷的进口点是RVA 0x13B90,而载荷标头(d8425578fc2d84513f1f22d3d518e3c3)中保存的进口点地址是0×15002

Kronos进口点的代码与Osiris显示出相似之处 然而并不完全相同:

总结

第一阶段Loader受到Process Dopplegänging的强烈启迪,并以异常专业的要领实施,恶意软件作者应用相对较新的技巧并与其他技巧相结合,分发者常常应用第三方加密法度榜样来打包恶意软件;第二阶段与载荷慎密耦合,在这里我们可以很肯定地说这一层是与核心一路筹备的

上一页[1] [2] [3]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包