Maze勒索软件以前也被称为“ChaCha勒索软件”,于2019年5月29日被Jerome Segura发现。
Maze的最重要特征是,如果受害者不付款,他们将在互联网上发布受害者信息。
从上图可以看出,Maze的攻击已经遍布全球。
Maze的历史
从历史上看,该恶意软件使用不同的技术来获取进入权限,主要是利用漏洞利用工具包,具有弱密码的远程桌面连接或通过电子邮件模拟,或通过不同的代理机构或公司。这些电子邮件带有Word附件,该附件使用宏在系统中运行恶意软件。其中,最常用的漏洞利用工具包是Fallout和Spelevo。Maze的开发者很聪明,增加了防止其反转和静态分析的难度。
技术细节
该恶意软件是32位二进制文件,通常被封装成EXE或DLL文件。本文重点介绍EXE文件。
下表中显示了有关此报告中使用的样本的更多信息:
该恶意软件开始准备一些似乎将内存地址保存在全局变量中的函数,以供以后在动态调用中使用,尽管该软件后来并未真正使用这些函数。无论是恶意软件入口点中存在的残留代码还是误导研究人员的伎俩,都存在争议。
后来,恶意软件输入了一大堆垃圾代码,其中还包括一些用于解密字符串和重要信息的元素,以供日后使用,该恶意软件会使用一些技巧来检测调试器。
其中最重要的是:PEB字段“IsDebuggerPresent”的大量使用。此字段是布尔值字段,如果应用程序在调试器中运行,则从Windows填充为1(True),否则为0(False)。
如果应用程序在调试器中运行,则“ ISDEBUGGERENTENT” PEB字段的使用率很高。如果恶意软件检测到调试器,它将保持无限循环,而不会浪费任何系统资源。
该恶意软件获取了系统中的所有进程,但忽略了第一个进程(Windows中的“空闲进程”,它只是一种让用户知道正在使用的系统资源百分比的工具)。使用每个进程的名称,它会使用自定义算法创建一个自定义名称,以及一个针对硬编码列表进行检查的哈希。如果在此列表中找到哈希,则该过程将终止。
以下就是捕获调试器“ x32dbg”的过程:
它可以终止IDA调试器,x32dbg,OllyDbg和更多进程,以避免动态分析,关闭数据库,办公程序和安全工具。
下面显示了部分进程列表,这些进程可以使用由恶意软件终止的词典列表来破解:
dumpcap.exe -> 0x5fb805c5 excel.exe -> 0x48780528 fiddler.exe -> 0x5e0c05b1 msaccess.exe -> 0x6a9c05ff mysqld-nt.exe -> 0x79ec0661 outlook.exe -> 0x615605dc pipanel.exe -> 0x5fb805c4 procexp64.exe -> 0x78020640 procexp.exe -> 0x606805d4 procmon64.exe -> 0x776e0635 procmon.exe -> 0x600005c9 python.exe -> 0x55ee0597 taskkill.exe -> 0x6c2e0614 visio.exe -> 0x49780539 winword.exe -> 0x60d805d5 x32dbg.exe -> 0x5062053b x64dbg.exe -> 0x50dc0542
上表就是要杀死的进程的名称以及从原始进程名称生成的特殊名称的自定义哈希。
上图就是内核32的导出地址表(EAT)产生的终止过程函数,并通过了哈希名称检查。
恶意软件将通过从模块“ kernel32.dll”的EAT(出口地址表)获得的“ TerminateProcess”函数杀死该进程,以增加混淆,将名称与从大写字母中获取的自定义哈希值进行比较。
该恶意软件以独特的方式调用Windows函数以帮助进行混淆,即使系统中的第一个进程使用函数“ Process32FirstW”。但是,不是直接调用它,而是将函数所需的参数放在堆栈上,后跟带有“推”操作码的内存地址,然后直接跳转到Windows函数。函数结束后,Windows会执行“ ret”操作码,然后获取恶意软件在堆栈内部推送的最后一个内存地址,然后返回该地址并继续执行流程。比如下面的示例:
恶意软件利用的另一个策略(取决于样本)是在使用技巧避免在运行时将调试器附加到它之前,使用函数“ GetProcAddress”来获取函数“ DbgUIRemoteBreakin”。
如上图所示,使用GETPROCADDRESS来获取DBGUIREMOTEBREAK以避免遭受调试攻击。
此处使用的技巧是“ VirtualProtect”,以授予其“ DbgUIRemoteBreakin”函数内存地址写入权限。
获得仅授予1个字节的权限后,恶意软件会使用0xC3值(“ret”的操作码)对该字节进行修补,并再次使用“ VirtualProtect”在相同的地址和字节中还原以前的权限,从而删除写入允许。
这样做是为了避免在运行时附加调试器,这样,当调试器在内部连接到进程时,系统将调用此函数,但是“ret”操作码不是创建线程来启动调试,而是强制函数返回而不创建它。简而言之,它会阻止调试器正确连接,在枚举系统进程之前完成此操作。
该恶意软件使用“ GetUserDefaultUILanguage”函数检查计算机的语言,并将其值保存在堆栈中。
Maze创建一个名为“ Global \ x”的互斥锁,其中x代表每台计算机唯一的特殊值。例如,在下一个屏幕截图中就是这种行为的一个示例。这样做是为了避免同时执行两个或多个执行。
创建互斥量后,恶意软件会调用函数“ GetLastError”来检查两个错误:
1. 0x05 -> ERROR_ACCESS_DENIED,如果恶意软件收到此错误,则意味着该互斥锁已存在于系统中,但由于某种原因,该恶意软件无法访问它。
2. 0xb7 -> ERROR_ALREADY_EXISTS,如果恶意软件收到此错误,则意味着该互斥锁已存在于系统中并且可以访问。
如果发生以上任何一种情况,则该恶意软件将继续执行,但不会加密系统中的任何文件或使用计算机的任何资源。互斥锁值可以根据每个样本或定期更改,以避免它被发现。另外,恶意软件会对照例如语言0x419(俄罗斯联邦的俄语,ru-RU [8])检查以前保存在堆栈中的语言。
检查是在恶意软件所含代码的混杂部分中进行的(以混淆方式进行),下图的示例使用的虚拟机中,使用了西班牙的西班牙语(es-ES);代码0xC0A出现在了屏幕截图:
如果该语言与以下列表中的任何一种匹配,则该恶意软件将清除内存并退出主线程,而不会浪费任何资源或制作任何文件。
0x419 -> ru-RU (Russian from Russian Federation) 0x422 -> uk-UA (Ukranian from Ukraine) 0x423 -> be-BY (Belarusian from Belarus) 0x428 -> tg-Cyrl-TJ (Tajik (Cyrilic from Tajikistan) 0x42B -> hy-AM (Armenian from Armenia) 0x42C -> az-Latn-AZ (Azerbaijani (Latin from Azerbaijan)) 0x437 -> ka-GE (Georgian from Georgia) 0x43F -> kk-KZ (Kazakh from Kazakhastan) 0x440 -> ky-KG (Kyrgyz from Kyrgyzstan) 0x442 -> tk-TM (Turkmen from Turkmenistan) 0x443 -> uz-Latn-UZ (Uzbek (Latin from Uzbekistan)) 0x444 -> tt-RU (Tatar from Russia Federation) 0x818 -> ro-MD (Romanian from Moldova, NOT Romanian from Romania!) 0x819 -> ru-MD (Russian from Moldova) 0x82C -> az-Cyrl-AZ (Azerbaijani (Cyrilic from Azerbaijan)) 0x843 -> uz-Cyrl-UZ (Uzbek (Cyrilic from Uzbekistan)) 0x7C1A -> sr (Serbian) 0x6C1A -> sr-Cyrl (Serbian in Cyrilic) 0x1C1A -> sr-Cyrl-BA (Serbian (Cyrilic from Bosnia and Herzegovina)) 0x281A -> sr-Cyrl-RS (Serbian (Cyrilic from Serbia)) 0x81A -> sr-Latn-CS (Serbian (Latin)) (this language code starts from Windows Vista)
该恶意软件尝试使用带有 “shadowcopy”和“delete”的“wmic.exe”程序删除系统中的卷影。在此之前,该恶意软件通过“GetProcAddress”获得“WoW64DisableWow64FsRedirection”函数,并在默认情况下使用它来避免在64位操作系统中进行重定向,并以动态方式对其进行调用。
恶意软件尝试两次删除卷影副本,一次是在受感染系统中加密文件之前,其次是在加密文件之后。
该执行是通过函数“CreateProcessW”完成的,但是,为了提高混淆程度,可使用以下命令启动恶意软件:
如上图所示,该恶意软件使用的命令的名称默认为Windows中除“Windows”,“system32”和“wbem”以外的其他文件夹。它进入了这些文件夹,但随后使用命令“ ..”迅速退出了它们,这意味着它返回了路径中的上一个文件夹。
例如,在开始时,它进入文件夹“ydw”和“ fdygg”,但随后使用两个以“C:\”开头的“ ..”命令返回Windows安装单元的根目录。随后,它与“ Windows”文件夹连接,并继续相同的行为,最终进入“system32”,在其中调用带有开关的“wmic.exe”程序以删除卷影。这样做是为了使这个调用变得模糊,尽管这种可疑的行为可能仍然导致防病毒程序将其停止,但是这证明恶意软件编码者具有编程技能并且对Windows行为有很好的了解。
重要的是要理解,命令在不存在的文件夹中使用的“路径”是随机的,不需要使用相同数量的文件夹进行混淆。
删除过程之后,恶意软件使用函数“GetProcAddress”获取函数“ Wow64RevertWow64FsRedirection”,并以动态方式对其进行调用,以使系统保持与以前相同的状态。
Maze也会使用函数“WNetOpenEnumW”,“WNetEnumResourceW”,“WNetCloseEnum”和“WNetAddConnection2W”来影响网络资源。
恶意软件使用两种算法来加密文件,ChaCha基于对称的Salsa20算法,并且为了保护起见,使用非对称的RSA算法进行加密。
在每次执行过程中,恶意软件都会创建一个RSA密钥的公共BLOB,该密钥将用于对保存信息的部分进行加密,以解密文件;另外一个带有RSA密钥的私有BLOB,该密钥允许解密使用之前创建的公共RSA blob加密的信息。
导出在运行时生成的RSA公钥BLOB
导出在运行时生成的RSA私钥BLOB
就像其他勒索软件一样,此恶意软件具有嵌入的RSA Public BLOB,它将被导入以保护受害者的RSA私有BLOB。仅恶意软件开发人员具有RSA私有Blob来解密其公共RSA Blob。
导入恶意软件开发者的RSA公共blob
通过使用32位密钥和8字节iv的iv使用函数“ CryptGenRandom”的加密来保护此密钥,以避免内存转储,但是稍后,在使用前需要对其进行解密。
此后,恶意软件会在导入运行时生成的RSA公共BLOB密钥之前,开始对文件进行加密,按单位搜索的过程。之后,它会在根文件夹中创建为此受感染计算机准备的赎金记录,然后开始寻找要加密的文件夹和文件。
赎金票据示例如下所示:
加密文件的过程很容易,恶意软件采取以下步骤:
1. 使用具有属性“ FILE_ATTRIBUTE_ARCHIVE”的“ SetFileAttributesW”函数检查文件是否存在;
2. 通过调用“ Virtual Alloc”作为密钥和iv将文件保留内存;
3. 使用带有标记“ OPEN_EXISTING”的函数“ CreateFileW”打开具有读写权限的文件;
4. 使用函数“ GetFileSizeEx”获取文件大小(这对于管理大文件很重要,“ GetFileSize”不适用于大文件);
5. 使用函数“ CreateFileMappingW”和“ MapViewOfFile”创建文件映射;
6. 使用函数“ CryptGenRandom”生成一个32字节的随机密钥;
7. 使用函数“ CryptGenRandom”生成8个字节的随机iv;
8. 使用“ VirtualAlloc”函数保留264个字节的内存;
9. 为受害者文件生成一个新的随机扩展名,每个文件都有不同的扩展名,但不会丢失原始扩展名。新的附加到旧的之后。例如,“ 1.zip”变为“ 1.zip.gthf”;
10. 使用ChaCha算法和密钥对文件进行加密,并使用在运行时生成的RSA公钥对iv进行加密;
11. 用密钥和iv将此新块写入文件末尾进行解密;
12. 使用函数“MoveFileExW”重命名文件,这样,就不可能使用取证工具来恢复文件,因为它们使用原始磁盘上的相同扇区。该恶意软件不会使用“ DeleteFileW”函数删除文件,而是随后使用加密的数据创建一个新文件。取而代之的是,所有更改都直接在内存中的映射中应用,而无需使用磁盘上的文件指针进行读写,这使处理过程更快。
13. 该文件的映像未映射,并且句柄已关闭。
14. 对新文件重复该过程;
恶意软件避免使用的文件夹列表是:
· Windows主目录
· 游戏类
· Tor浏览器
· 程序数据
· cache2 \ entries
· Low\Content.IE5
· 用户数据\默认\缓存
· 所有用户
· 本地设置
· AppData \ Local
· 程序文件
该恶意软件会忽略以下文件扩展名:
· LNK
· EXE
· SYS
· DLL
该恶意软件还具有不会被加密的文件名列表:
· inf
· ini
· ini
· dat
· db
· bak
· dat.log
· db
· bin
· DECRYPT-FILES.txt
但是,它确实对文件“ntuser.ini”进行了加密,以防止其他勒索软件对其进行加密。它会在每个文件夹中创建赎金记录。
恶意软件完成对所有文件的加密后,会将桌面墙纸更改为该映像:
加密文件后,恶意软件会更改桌面墙纸。该恶意软件试图建立与二进制文件中已加密的IP地址的连接,以发送有关受感染计算机的信息,如下所示:
hxxp://91.218.114.4/nwjknpeevx.action?pw=g1y652l&kyn=21y3vvhh&dvr=5e&us=g25e3582a hxxp://91.218.114.11/forum/siaib.jspx?v=h&xyna=0vip863&eul=xsn3q0 hxxp://91.218.114.26/view/ticket/pigut.jspx?o=664quo0s&fp=ot52 hxxp://91.218.114.25/xrr.jspx?ygad=r35e2cx&e=6as6ta hxxp://91.218.114.4/j.php hxxp://91.218.114.11/payout/view/fa.aspx?y=y&qbx=4&kws=n2&iuy=8k7 hxxp://91.218.114.25/lxh.asp?mtxm=l7&r=836wy5 hxxp://91.218.114.26/signin/ticket/eq.action?x=yk6rr&e=50b&q=327dr5&ofk=065cdp hxxp://91.218.114.31/signin/rnmnnekca.jsp?kdn=6snl5&e=7a50cx4hyp hxxp://91.218.114.31/forum/a.aspx?byx=56&bc=62t0h&u=75w6n6&sot=2v0l761or6 hxxp://91.218.114.32/withdrawal/checkout/l.do?nuny=qj6&sdv=45g2boyf5q&dnr=rh8lk31ed hxxp://91.218.114.77/task/bxfbpx.jspx?nq=cge63 hxxp://91.218.114.38/account/payout/ujwkjhoui.shtml hxxp://91.218.114.37/imrhhjitop.phtml?wto=344dsc84&sp=x&oml=c173s71u&iy=m3u2 hxxp://91.218.114.38/auth/login hxxp://91.218.114.79/logout/hfwdmugdi.php?upaj=mj7g hxxp://91.218.114.38/sepa/juel.php?ars=51qse4p3y&xjaq=r5o4t4dp hxxp://91.218.114.32/fwno.cgi?yd=410&o=y7x5kx371&p=m3361672 hxxp://91.218.114.37/sepa/signout/mjsnm.aspx?r=7o47wri&rtew=uu8764ssy&bri=51gxx6k5&opms=72gy0a hxxp://91.218.114.77/payout/analytics/lrkaaosp.do?y=62h&aq=3jq8k6&v=0svt hxxp://91.218.114.79/create/dpcwk.php?u=28qy0dpmt&qwbh=k&f=g1ub5ei&ek=3ee
重要的是要考虑到恶意软件会伪造POST字符串,以便从可能的字符串列表(例如“ forum”,“ php”,“ view”等)中随机选择来建立连接,从而使检测变得更加困难。如果检测到IP地址来自俄罗斯联邦,但不能证明该恶意软件来自该国家;可能是故意的误导,但是,通过独联体国家的语言检查,这确实是可能的。
使用IP地址而不是域名是为了避免DNS分辨率可以更改或重定向,例如使用Windows中的“主机”文件。这使IP的跟踪更加复杂,并且避免了阻塞。
该恶意软件使用此代理建立连接,但可以在示例之间进行更改:
用于建立与C2C IP地址的连接的代理
从内存转储中,我们可以提取这些连接所使用的IP,以及一个奇怪的字符串,也许这是一种嘲笑经常报告勒索软件的网站管理员的方法。
在使用Wireshark的pcap中,可以很清楚地看到与C2C IP地址的连接:
Maze中有一些有趣的字符串,将来可能需要进一步分析:
解密赎金后的Maze付款网页:
Maze具有聊天功能,可以与运营商联系并接收有关如何获取付款所需的加密货币的信息。
当然,与许多类型的勒索软件一样,提供了免费解密三个提议,并且该服务已被验证可以正常工作:
开关设置
该恶意软件具有一些可在命令行中启动的开关。这些开关可以禁用某些元素或启用日志记录。
这些开关是:
1. –nomutex->此开关可防止检查互斥锁,以便它可以在同一台计算机上运行多个实例。
2. –noshares->使用此开关,恶意软件将不会仅本地计算机来加密网络共享。
3. –path x->其中x是完整路径,在这种情况下,恶意软件将加密从此路径开始的所有文件夹中的所有文件,除非它们是列入黑名单的名称,扩展名或文件夹名称。这对于恶意软件开发人员攻击特殊的路径而不是浪费时间在整台计算机上花费时间很有用,并且使攻击更具针对性。
4. logging->如果启用此开关,则恶意软件将记录其执行的所有步骤。对于调试环境中的恶意软件开发人员或在攻击阶段逐步了解一切正常的有用。具体示例如下:
最新发现的样本
2020年1月,出现了新版本的恶意软件, 该样本是由malwrhunterteam在2020年1月28日发现的。
该样本与以前样本的区别是:
1. 通常以DLL而不是EXE文件的形式出现。它不能在Windows Vista之前的Windows操作系统上运行,因为这会使分析更加困难。
2. 开发人员不是删除卷影,而是使用WMIC和前面提到的路径的特殊技巧来控制影子卷。下图显示了这种用法的一个例子。
恶意软件的每个样本都使用不同的字符串作为PDB发送消息,这样就可以使的样本变得唯一,例如:
C:\somerandomsh**\sh**\obama.pdb C:\kill\yourself\\chinese\idio*.pdb
2020年1月发现的新样本将这些连接到C2或尝试使其连接:
上图就是新样本与C2 IP的连接
如你所见,它们用的是与先前版本的恶意软件相同的IP。
样本的编译日期是从2020年1月24日(带有引起研究人员注意的字符串的第一个版本)到2020年1月28日(具有研究人员回应的版本),这意味着它们是在同一天完成的。对先前版本的回应已在Twitter上发布。
后面的示例中的另一个有趣的事实是,除了说用来编程的语言代码是朝鲜文之外,它连接的IP像以前一样属于俄罗斯联邦,如下面的两个图片所示。
以上样本中使用的语言代码,而不是恶意软件中的。
属于俄罗斯联邦的所有C2域
知道真相是不可能的,但是这可能是试图诱使研究人员误以为该恶意软件实际上来自某个国家/地区的一种技巧。众所周知,恶意软件开发人员经常在潜在受害者的计算机上检查语言,以避开独联体国家,因此我们可以猜测,检查“朝鲜语”语言是一种旨在误导用户的技巧,但无法确定。当然,“朝鲜语”语言可以手动更改,也可以是朝鲜语打包程序,但无法确定。
总结
Maze是由熟练的开发人员创建的勒索软件。它通过禁用反汇编程序和使用伪代码插件,使用了许多技巧使分析变得非常复杂。
这给没有付款的个人和企业带来了很大的问题,因为开发商威胁说如果他们没有收到付款就公开所窃取的信息,而他们的确也这么做了。越来越多的勒索软件已经表现出相同的行为,在今年,甚至在将来,我们还会看到更多的勒索软件。
恶意软件开发人员活跃在Twitter等社交媒体网站上,并且熟悉恶意软件研究人员的工作,他们也知道如何回应研究人员。
缓解措施
1. 我们建议定期备份文件,并使其与网络隔离开来,并安装随时更新的防病毒软件。
2. 应用最新的软件补丁,应避免不需要的远程桌面连接。
3. 避免使用可疑电子邮件,并且不要打开来自不认识的人的附件。电子邮件中的链接也是如此,即使它们来自已知来源,如果你有任何疑问,请与发件人联系。
4. 请禁用Office程序中的宏,除非必须这样做,否则切勿启用它们。
本文翻译自:https://www.mcafee.com/blogs/other-blogs/mcafee-labs/ransomware-maze/#_ftn9如若转载,请注明原文地址: