频道栏目
首页 > 资讯 > 系统安全 > 正文

Kronos恶意软件研究(part 1)

17-09-06        来源:[db:作者]  
收藏   我要投稿

2014年6月,一个用户名为VinnyK的人用俄语在某暗盘网站上初次售卖Kronos歹意软件:

咱们发明Kronos 歹意软件经由进程各类收集进击包流传,比方Sundown(概况点击这里)。停止今朝,该歹意软件仍旧在猖狂的流传,一个月前咱们还捕捉了经由进程Rig EK流传的一些最新的样本。

如今,Kronos常常用于下载其余歹意软件。Proofpoint文章中描写了收集进击者若何应用Kronos作为下载器停止收集进击运动。

阐发样本

2014年捕捉到的样本:

01901882c4c01625fd2eeecdd7e6745a 初次察看到的Kronos样本(感激Kevin Beaumont)

f085395253a40ce8ca077228c2322010 从Lexsi文章中获得到的样本

a81ba5f3c22e80c25763fe428c52c758 Kronos(终极有用载荷)

6c64c708ebe14c9675813bf38bc071cf injlib-client.dll(Kronos模块)

样本#1(2016年)

2452089b4a9d889f94843430a35fa34f (加壳的)

9818958e65a0a71e29a2f5e7ffa650ca Kronos(终极有用载荷)

样本#2(2017年)

de9ab737905e09b69b28dc0999d08894 - 加壳的

4f5006835669d72c6ce121e66b3034d7 加载器(第二阶段)

b8986fe9e40f613804aee29b34896707 Kronos(终极有用载荷)

cb7e33e5ede49301e7cd9218addd5c29 - DLL模块

行动阐发

运转后,Kronos歹意软件主动装置在一个新的文件夹中(%APPDATA%/Microsoft/[machine-specific GUID]),以下图所示:

歹意软件支撑开机自启动,该功效是经由进程注册表中一个简略的Run键来实现的,以下图所示:

在开端履行阶段,歹意软件会改动Firefox的配置文件,应用上面的内容笼罩user.js文件中的内容:

user_pref(“network.cookie.cookieBehavior”,0);

user_pref(“privacy.clearOnShutdown.cookies”,false);

user_pref(“security.warn_viewing_mixed”,false);

user_pref(“security.warn_viewing_mixed.show_once”,false);

user_pref(“security.warn_submit_insecure”,false);

user_pref(“security.warn_submit_insecure.show_once”,false);

user_pref(“app.update.auto”,false);

user_pref(“browser.safebrowsing.enabled”,false);

user_pref(“network.http.spdy.enabled”,false);

user_pref(“network.http.spdy.enabled.v3”,false);

user_pref(“network.http.spdy.enabled.v3-1”,false);

user_pref(“network.http.spdy.allow-push”,false);

user_pref(“network.http.spdy.coalesce-hostnames”,false);

user_pref(“network.http.spdy.enabled.deps”,false);

user_pref(“network.http.spdy.enabled.http2”,false);

user_pref(“network.http.spdy.enabled.http2draft”,false);

user_pref(“network.http.spdy.enforce-tls-profile”,false);

user_pref(“security.csp.enable”,false);

这个新的设置可以或许使歹意软件更好地节制浏览器的行动并低落平安设置。而后,歹意软件主动注入到svchost进程当中,并从那里继承运转。值得留意的是,Kronos安排了一个简略的用户级rootkit,它将被沾染的进程从监督对象中暗藏起来。因此,运转主模块的进程不能被监督到。但是,该rootkit没有以异常可靠的办法实现,并且暗藏后果并欠好。一旦发明受沾染机械上装置了浏览器,Kronos歹意软件便会将其模块注入到浏览器进程当中,并将注入的模块与运转在svchost进程内中的主模块树立衔接。应用监督对象(比方ProcessExplorer)检查由特定进程树立的TCP衔接,咱们可以或许看到浏览器与受沾染的svchost进程成对呈现:

银行木马常常应用这个技能来盗取浏览器中的数据。注入到浏览器中的歹意软件经由进程hook API函数来盗取数据。以后,将盗取到的数据发送到其余模块停止阐发处置,并将处置的成果发送给C&C服务器。

收集通讯

从样本数据中找到以下两个C&C服务器的地点:

http://springalove.at:80/noix/connect.php

http://springahate.at:80/noix/connect.php

在阐发的进程当中咱们发明,这两个个C&C服务器都曾经无奈拜访,然则咱们仍旧可以或许发明这个歹意软件家属的典范特性。

起首,歹意软件发送长度为74字节的标识:

而后发送一大块数据:

经由进程阐发这两个哀求,咱们发明歹意软件作者应用带有随机字符的XOR操纵对哀求做了混杂处置。下图是标识字段颠末XOR解码后的模样:

咱们发明歹意软件收回的一切哀求都因此固定的数据头开端,该数据头中包括了被沾染机械的GUID。

对于解密Kronos通讯的详细研讨曾经在这里停止了描写。

风趣的字符串

像大多数歹意软件同样,Kronos歹意软件应用了各类加壳和加密对象。阐发第一层数据以后后,咱们得到了歹意软件的payload。咱们可以或许经由进程典范的字符串轻松辨认Kronos:

该歹意软件中有更多典范的字符串可以或许用来标识它:

这些字符串是一些哈希值,用于静态加载特定导入模块中的函数。歹意软件作者应用这类办法来混杂应用的API函数,并经由进程这类办法暗藏其对象的真正用意。该歹意软件不应用显式称号来加载函数,它经由进程罗列特定DLL中的一切导入,盘算其称号的hash值,假如hash与硬编码值婚配,则加载该函数。只管这类做法很罕见,但Kronos的实行其实不“高超”。大多数歹意软件以DWORD情势的hash存储,而Kronos将它们存储为字符串。

在Kronos的晚期样本中,咱们可以或许找到调试标记的门路,该调试标记信息提醒构建代码的机械上的目次布局。以下门路是从一个Kronos的样本(01901882c4c01625fd2eeecdd7e6745a)中提取的:

C:\Users\Root\Desktop\kronos\VJF1\Binaries\Release\VJF.1.pdb

PDB门路也可以或许从属于2014年Kronos刊行版的DLL(6c64c708ebe14c9675813bf38bc071cf)中找到:

C:\Users\Root\Downloads\Kronos2\VJF1\Bot\injlib\bin\injlib-client-Release\injlib-client.pdb

injlib-client.dll这个模块是注入到浏览器中的部门模块代码。在较新版本的Kronos中,可以或许找到类似的DLL,然则PDB门路被删除。

注入svchost

Kronos的重要模块被注入到svchost进程(从2014年开端注入到explorer进程当中)。歹意软件经由进程履行以下步调来实现这类注入:

1. 创立挂起的svchost进程

2. 将其部门代码映照到本身的地点空间中

3. 增加本身的代码并改动进口点,以便重定向履行本身的代码

4. 规复挂起的进程,让注入的代码履行

经由进程上面的图,咱们可以或许看到被沾染的svchost进程的内存散布情况(在晚期版本中,歹意代码被注入到浏览器中),歹意软件被增加到一个新的、虚构的PE节中-在给定的示例中,映照地点为0x70000:

上图便是改动svchost进程进口点后的成果,咱们可以或许看到,履行被重定向到PE文件节内的地点中去了:

注入的PE文件如今以分歧的函数开端履行:

歹意软件的原始进口点地点为RVA 0x12F22:

假如歹意软件在检测到在VM或调试器的情况下运转,样本则会在注入后不久瓦解。

从新的进口点运转样本

歹意软件的重要操纵在注入模块外部启动,下图所示为样本的新进口点:

重要功效是卖力加载导入歹意软件所需的模块,而后履行导入的各个功效。

从上图可以或许看出,函数的第一块代码重如果卖力填写注入模块的导入表。假如咱们想要从新的进口点运转样本,而不是在样本注入后,咱们必要存眷上面一些工作:起首,装载器应当在注入的可履行文件中添补一些变量,比方module_base变量。由于其余函数必要应用这些变量,假如不包括有用值,歹意软件样本在运转时会瓦解。别的,导入表中(除.rdata节)添补的函数必要设置为可写,这是由于完备的PE文件以RWX拜访权限映照到内存中,因此歹意软件样本在注入以后也必要被设置为可写入。

实在,从主函数的下一个代码块也可以或许胜利运转Kronos样本,在这类情况下Windows加载法式会主动添补导入表,而不必要咱们手动的去履行添补操纵。

上面咱们来看一看歹意软件是若何绕过平安检测的。

进攻技能

歹意软件经由进程屡次检测运转情况来安排进攻。这些反省是异常尺度的,比方搜刮黑名单的进程,模块等。特定的一系列反省从下图中的一个函数挪用开端,并将成果存储在一个变量中:

假如检测到调试器或许是VM,则该变量被付与非零值,并且歹意软件会瓦解和中止阐发。

固然歹意软件是一个32位的PE文件,但在32位或64位系统上会有分歧的履行门路,因此歹意软件起首归去探测目标系统的指纹信息并设置一个标记位用来标识目标系统的系统架构:

DWORD is_system64_bit()

{

DWORD flag = 0;

__asm {

xor eax, eax

mov ax, cs

shr eax, 5

mov flag, eax

};

return flag;

}

假如检测到调试器或许是VM,则表现架构的标记位会被重置:

这便是为何一旦履行门路参数被设置,样本就会在下一步瓦解的缘故原由。比方,假如样本安排在64位机械上,可以或许应用FS:[0xC0]指定的地点来履行系统挪用。但假如歹意软件在32位盘算机上运转,FS:[0xC0]唆使的值将为NULL,因此假如挪用它将会招致样本瓦解。

在检测到VM或许调试器以后,样本不会立刻加入,这在一定程度上加大了阐发职员找出瓦解的缘故原由的难度,这也恰是这类中止阐发办法的高超的地方。

应用原始系统挪用

如前一段所述,Kronos应用原生系统挪用。Syscall基本上意味着容许从用户情势挪用内核实现的一些功效接口。应用法式平日经由进程系统DLL导出的API(可以或许在EvilSocket的博客上找到的详细阐明)来应用它们。由于监督对象可以或许轻松的检测到这些系统DLL导出这些API挪用,因此一些歹意软件在实现上只是偷偷读取DLL中的系统挪用号,并且经由进程它本身的代码来挪用它们,这个技能曾经被Floki bot应用了。

咱们来看看它是若安在Kronos中实现的。起首,它从系统DLL中获得系统挪用号。如前所述,函数经由进程其称号的哈希值来标识(Lexsi申报中有详细的论述)。

比方:

B6F6X4A8R5D3A7C6 - > NtQuerySystemInformation

系统挪用号存储在变量中,并应用一个常数做了XOR混杂。下图中的代码片断卖力从DLL中提取原始系统挪用:

为了进一步应用它们,对付每个应用过的系统挪用法式,Kronos应用恰当数目的参数来实现本身的包装函数,以下图所示:

EAX寄存器包括系统挪用号,在给定的例子中,它代表以下函数:

00000105 - > NtQuerySystemInformation

同样平常情况下,由于与进程注入相干的函数平日会触发警报,因此Kronos应用原始系统挪用来挪用它们,经由进程这类办法挪用的函数以下所示:

NtAllocateVirtualMemory

NtCreateFile

NtCreateSection

NtGetContextThread

NtOpenProcess

NtProtectVirtualMemory

NtQueryInformationProcess

NtQuerySystemInformation

NtResumeThread

NtSetContextThread

NtSetValueKey

它与暗盘中的那篇帖子中提到的“ 木马应用未被检测到的注入办法 ”(起源)内容相婚配。

Rootkit和hooking引擎

Kronos 歹意软件供给的另一个功效是用户级rootkit,它经由进程 hook进程的API使得平安检测对象无奈留意到它的存在。它的hook是经由进程一个特制的shellcode块来实现的,这些块被植入每个可拜访的运转进程当中,详细操纵流程以下所示:起首,Kronos准备要植入的shellcode块,并填写一切必要的数据,其中包括要应用的函数地点和歹意软件装置进程当中产生的必要暗藏的分外数据;而后,它会搜刮正在运转的进程,并尽可以或许地至此谁人注入操纵。风趣的是,explorer.exe和chrome.exe被跳过了:

shellcode被安排在受沾染进程的新线程中:

上面可以或许看到被沾染进程内存中的shellocode:

运转时,它将会对受沾染进程的地点空间中的以下函数履行hook操纵:

ZwCreateFile

NtOpenFile

ZwQueryDirectoryFile

NtEnumerateValueKey

RtlGetNativeSystemInformation

NtSetValueKey

ZwDeleteValueKey

ZwQueryValueKey

NtOpenProcess

Kronos上面的实现与MalwareTech在2015年1月的博客上描写的一个hook引擎类似。经由进程对Kronos hook引擎的阐发,咱们发明Kronos的这一部门确切起源于MalwareTech的设法主意。但是,事实证明,这类技巧早就呈现了(即在这里,//感激 @xorsthings的链接)。

在履行hooking操纵时代很有可以或许会碰到并发的成绩,由于假如对一个函数正在履行改动操纵的同时另一个线程也必要挪用这个函数,那末就会招致应用法式将瓦解。因此为了防止这类情况,最佳经由进程单个汇编指令来履行hook操纵。MalwareTech引擎中应用 lock cmpxch8b指令来实现这个目标,类似的实现可以或许在Kronos中找到。

经由进程阐发咱们发明Kronos歹意软件应用的hooking函数必要两个参数:要hook的函数地点和用作署理的函数地点,下图所示的是植入的shellcode中的一个代码片断,在该代码片断中hooking函数被挪用:

起首,hooking函数在被进击函数的代码中搜刮适合的地位以用来履行hook操纵:

以上代码功效的实现可以或许在github上找到:

https://github.com/MalwareTech/BasicHook/blob/master/BasicHook/hook.cpp#L103

而后,歹意软件履行hook操纵:

咱们发明,MalwareTech github上的代码实现和上述履行的hook操纵险些雷同:

https://github.com/MalwareTech/BasicHook/blob/master/BasicHook/hook.cpp#L77

下图所示的是Kronos歹意软件对ZwResumeThread函数履行hook操纵的一个例子,从图中咱们可以或许看到,lock cmpxch8b指令确切被用来改动函数开端的代码:

Hook操纵实现后,每当受沾染的进程挪用被hook的函数时,履即将重定向到歹意模块中的署理代码:

Kronos应用的hook机制全体看起来加倍繁杂,由于Kronos歹意软件应用的是一个shellcode而不是一个PE文件,在实现上难度就曾经很高了,歹意软件作者必需本身填写一切的函数地点。并且,Kronos的作者在猜测实际场景可以或许碰着的成绩上也表现出更多的履历。比方,他分外留意反省代码能否没有被其余木马或监控对象hook:

进击浏览器

Kronos歹意软件将一个额定的模块(injlib-client.dll)注入到浏览器,上面咱们可以或许看到一个注入到Firefox地点空间的一个DLL的例子:

歹意软件在后期注入的shellcode的赞助下启动注入模块:

经由进程阐发咱们可以或许发明,歹意软件对被进击浏览器导入的一些函数履行了hook操纵,以便经由进程它们的一切数据都可以或许被Kronos模块截获到,而后将被挂钩 API抓取的数据发送到主模块,主模块在阐发和处置以后将数据申报给C&C服务器。

论断

整体来讲,Kronos的应用技能注解,该作者在制造歹意软件方面具备丰硕的履历。歹意软件的实现上代码是完备混杂的,并且还必要认识操纵系统的一些底层操纵技能。作者不只应用了风趣的技能,并且还以适合的逻辑和办法将它们衔接起来,因此咱们感到,Kronos歹意软件是由一个履历丰硕的开辟职员开辟的。

相关TAG标签
上一篇:利用Python完成DGA域名检测
下一篇:Kronos恶意软件研究(part 2)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站