Clop是一类相对较新的勒索软件,于今年2月出现在公众视野中,Clop背后团队的主要目标是加密企业的文件,收到赎金后再发送解密器。目前Clop仍处于快速发展阶段。
本文将对clop勒索软件的技术细节做分析,并分享其背后的运作信息。在过去的几个月里我们观察到的变体中,Clop的创作者使用了一些我们以前从未见过的创新技术。
鉴于Clop有许多变种,在本文中,我们只将重点放在它的主要版本及少部分变种上。
Clop第一版
第一版Clop中签署了以下证书:
图1.程序签名,以避免AV检测
对恶意二进制文件签名后,有一定几率通过安全解决方案的检测。但在我们观察到该版本的几天后,此证书就被撤销了,转而在另一版本出现了一个新证书:
图2.新版本中的证书
我们总结了使用新证书进行签名的Clop勒索软件样本:
Clop会避免在某些环境下运行,且能自行终止。
首先是使用函数“GetKeyboardLayout”将受害计算机的键盘与硬编码值进行比较。此函数能在Clop调用函数时返回用户键盘输入布局。
通过检查布局是否大于值0x0437(格鲁吉亚语),俄语(0x0419)和阿塞拜疆语(0x082C),GetKeyboardLayout函数决定返回值是1还是0,如果时属于俄罗斯或其他独联体国家,则返回1,在其他情况下返回0。
图3.检查键盘布局
如果函数返回0,则转到恶意软件的正常流程,否则它将使用函数“GetDC”获取整个屏幕的设备上下文。
另一个条件来自函数“GetTextCharset”,它返回系统中使用的字体,如果没有0xCC (RUSSIAN_CHARSET)值,该函数将返回系统中使用的字体。如果使用的是此字符集,恶意软件将从磁盘中删除自身并使用“TerminateProcess”终止自身,但如果不是,它将进行双重检查,此举是为了绕过多系统语言的用户,即那些有安装俄语但没有在机器中使用的用户。
图4.检查文本字符集并与俄语字符集进行比较
但是,原本应该将勒索软件从磁盘中删除的代码中却包含错误。它将直接调用系统提示符,而不会等待恶意软件完成执行。这意味着虽然命令的执行是正确的,但是由于恶意软件仍在运行,因此不会从磁盘中删除。发生这种情况是因为作者没有使用“timeout”命令。
图5.删除恶意软件自身
恶意软件的下一操作是创建一个启动所有进程的新线程。使用此线程的句柄,它将等待无限长的时间来完成“WaitForSingleObject”函数,之后返回到winMain函数并退出。
该线程的第一个操作是在与恶意软件相同的文件夹中创建名为“Favorite”的文件,稍后使用“GetLastError”检查最近一个错误,如果为0,调用函数“Sleep”等待5秒。
稍后线程使用句柄0对函数“EraseTape”进行虚拟调用,此举可能是为了干扰模拟器,因为句柄在硬编码操作码中被置于0。
再之后用一个无效名调用“DefineDosDeviceA”函数,会返回另一个错误。这些操作将循环666000次。
图6.通过循环来干扰分析
下一步是搜索某些杀毒产品的进程,这些产品如下所示:
· SBAMTray.exe(Vipre防病毒产品)
· SBPIMSvc.exe(Sunbelt AntiMalware防病毒产品)
· SBAMSvc.exe(GFI AntiMalware防病毒产品)
· VipreAAPSvc.exe(Vipre防病毒产品)
· WRSA.exe(WebRoot防病毒产品)
如果发现有上述产品的进程,将使用“Sleep”等待5秒后再等待5秒,“Sleep”之后再继续正常运行。如果未检测到这些进程,它将访问自己的资源并使用名称“OFFNESTOP1”提取。资源已加密在“.bat”文件中。
图7.访问第一个加密的资源
解密是一个简单的XOR操作,字节来自以下字符串:
“Po39NHfwik237690t34nkjhgbClopfdewquitr362DSRdqpnmbvzjkhgFD231ed76tgfvFAHGVSDqhjwgdyucvsbCdigr1326dvsaghjvehjGJHGHVdbas”。
下一步操作是使用“CreateFileA”函数,将此批处理文件写入恶意软件所在的同一文件夹中。创建的文件名为“clearsystems-11-11.bat”。该文件稍后以“ShellExecuteA”启动,等待5秒钟完成,并删除带有“DeleteFileA”函数的文件。
很明显,作者不是经验丰富的程序员,因为他们使用.bat文件用于接下来的操作:
· 使用vssadmin删除阴影卷(“vssadmin Delete Shadows / all / quiet”)。
· 调整所有单位的阴影存储大小,从C到H单位的字母(硬编码字母),以避免再次生成阴影卷。
· 使用bcedit程序禁用计算机引导中的恢复选项,并设置为忽略引导中警告用户的故障。
· 所有这些操作都可以在恶意软件代码本身中执行,不需要外部文件来检测和删除。
图8.用于禁用阴影卷和更高安全性的BAT文件
下一步操作是创建一个名为hardcoded“Fany-Fany-6-6-6”的互斥锁,然后调用函数“WaitForSingleObject”,并使用0检查结果。如果值为0,则意味着互斥对象是为恶意软件的这个实例创建的,但如果是另一个值,则意味着互斥对象是由另一个实例或“疫苗”生成的。
在此之后,它将生成2个线程,一个用于搜索进程,另一个用于在其可以访问的网络共享中加密文件。
第一个线程枚举系统的所有进程,以大写形式创建进程的名称,并使用名称计算哈希值,将其与大的哈希列表进行比较。该哈希算法是自定义算法。恶意软件中通常会试图隐藏他们正在寻找的进程。如果找到其中一个,将在打开后用“TerminateProcess”函数终止,并使用“OpenProcess”函数限制此项操作的权限。
该恶意软件包含61个硬编码的程序哈希,如“STEAM.EXE”,数据库程序,办公程序等。
下面是前38个哈希表和相关的进程名。这38个我们在其他的勒索软件家族,如GandCrab、Cerber等中也常常见到。
第一个线程无限循环运行,每次迭代30分钟,使用“Sleep”函数等待。
图9.线程杀死解锁文件的关键进程
第二个线程的任务是,枚举所有网络共享并加密文件(前提是可以访问)。
执行此任务使用了模块“MPR.DLL”的典型API函数:
· WNetOpenEnumW
· WNetEnumResourceW
· WNetCloseEnum
该线程使用“GlobalAlloc”函数创建内存储备,以保存“MPR”函数的信息。
发现的每个网络共享,第二个线程都会将其枚举出;而至于每个文件夹,它将进入该文件夹并搜索更多子文件夹和文件。这么做的首先步骤是检查针对硬编码哈希列表找到的文件夹/文件的名称,使用的算法与检测要关闭的进程的算法相同。
以下是27个哈希中,其中12个的名称:
如果符合,线程将检查文件是不是文件夹,方法是将文件名称与一列硬编码的名称和扩展名进行比较,这些名称和扩展名是纯文本而不是散列格式的:
· ClopReadMe.txt
· ntldr
· NTDLR
· boot.ini
· BOOT.INI
· ntuser.ini
· NTUSER.INI
· AUTOEXEC.BAT
· autoexec.bat
· .Clop
· NTDETECT.COM
· ntdetect.com
· .dll
· .DLL
· .exe
· .EXE
· .sys
· .SYS
· .ocx
· .OCX
· .LNK
· .lnk
· desktop.ini
· autorun.inf
· ntuser.dat
· iconcache.db
· bootsect.bak
· ntuser.dat.log
· thumbs.db
· DESKTOP.INI
· AUTORUN.INF
· NTUSER.DAT
· ICONCACHE.DB
· BOOTSECT.BAK
· NTUSER.DATA.LOG
· THUMBS.DB
这个检查是通过一个自定义函数完成的,该函数会跟上表中每一项对照。这就是为什么有大小写两种写法,而不是使用函数“lstrcmpiA”,以避免此函数中使用的某些钩子影响文件;对扩展名的检查还有个好处是使加密过程更快。
当然,恶意软件还会检查文件是否有勒索通知的名称,以及加密文件中的扩展名。与其他勒索软件家族相比,这些黑名单将有助于系统在加密过程中避免崩溃。
图10.检查文件名和扩展名
这种行为在勒索软件中是正常的,但之前根据文件/文件夹名称对硬编码哈希进行的检查很奇怪,因为稍后我们可以在上图中看到,下一次检查是针对纯文本字符串的。
检查完成后,恶意软件将创建一个新的线程,该线程的结构中包含一个硬编码的密钥块、文件的名称和文件存在的路径。在这个线程中,第一个操作是删除错误模式,将“SetErrorMode”设置为1,以避免在崩溃时向用户显示错误对话框。稍后,它将从作为参数传递给线程的结构体中准备文件的路径,并使用函数“SetFileAttributesW”将文件的属性更改为ARCHIVE,但是恶意软件不会检查此操作是否能够成功执行。
稍后将生成一个随机的AES密钥,并使用此密钥加密文件的每个字节,接下来将在文件的末尾加上标记“Clop ^ _”。在标记之后,它将把用于加密文件的密钥加密到已经硬编码恶意软件的主RSA密钥,以保护它免受第三方免费解密器的攻击。
恶意软件可以使用两个不同的公共RSA密钥:在公共blob中使用crypto api导出,或者使用恶意软件中嵌入的base64。恶意软件只有在无法创建crypto上下文或加密api函数有问题时才会使用第二种。
恶意软件在使用crypto函数时不支持Windows XP,因为Windows XP中使用的CSP有另一个名称,但从Windows Vista开始的其他操作系统中,则可以更改调试器中的名称以获取上下文,并将生成一个RSA公共blob。
与其他勒索软件系列的另一个区别是,Clop只会加密物理连接/嵌入式磁盘(类型3,固定或可移动(类型2))的磁盘,忽略REMOTE类型(4))。
图11.加密文件中的文件标记和加密密钥
加密后,文件将尝试在同一文件夹中打开赎金票据,如果赎金票据存在,它将继续而不会覆盖它以节省时间,但如果不存在,它将访问恶意软件中的一个称为“OFFNESTOP”的资源。使用与第一个资源相同的XOR操作来加密此资源:.bat文件在解密后在文件夹中写入赎金通知。
图12.从加密资源创建赎金票据
以下是该恶意软件第一版赎金票据的示例:
图13.恶意软件第一版的赎金通知示例
在此之后,Clop对下一个文件使用相同的流程,但不使用基于哈希的名称检查。
第二版恶意软件
与第一版相比,2月底发现的第二版会有一些变化。此版本的哈希是:“ed7db8c2256b2d5f36b3d9c349a6ed0b”。
第一个更改是对代码纯文本中的字符串进行一些更改,使“EraseTape”调用和“FindAtomW”调用的执行速度更慢。
第二个更改是二进制文件中加密的资源的名称,第一个资源是用于删除影子卷并删除机器引导中的保护第二个批处理文件,此资源的前一个名称是“RC_HTML1”。
图14.批处理文件的新资源名
但是,解密此资源的算法是相同的,只是它们更改了作为字节密钥的大字符串。现在字符串是:“JLKHFVIjewhyur3ikjfldskfkl23j3iuhdnfklqhrjjio2ljkeosfjh7823763647823hrfuweg56t7r6t73824y78Clop”。重要的是要记住,这个字符串在二进制文件中仍然是纯文本形式,但是由于它已经更改,所以不能用于Yara规则。对于资源的名称和资源的哈希值也是一样的,因为bat在某些情况下每一行都在变化,它能有更多的代码来停止安全产品和数据库产品的服务。
下一个更改是互斥锁名称,在这个版本中是“HappyLife ^ _-”,因此,基于互斥体名称制造疫苗可能会很复杂,因为它可以在每个新样本中很容易地更改。
下一个更改是恶意软件的硬编码公钥,与前一个版本不同。
另一个更改是创建的文件;第一个版本创建名为“favorite”的文件,而这个版本创建名为“Comone”的文件。
但是,文件的加密算法和加密文件中的标记是相同的。
另一个区别在于赎金票据现在更清晰,文本中有一些变化,现在有3封电子邮件联系勒索软件开发商,而不是1封。
快速更迭
Clop的创作者可以快速更迭来影响安全团队的跟踪。代码在很大程度上是保持不变的,但对字符串的更改会更难以正确检测或分类。Clop在字符串和资源名称方面变化非常快,这使得检测恶意软件更加复杂。
传播范围
我们在以下国家/地区检测到Clop过:
· 瑞士
· 大不列颠
· 比利时
· 美国
· 荷兰人
· 克罗地亚
· 波多黎各
· 德国
· 土耳其
· 俄国
· 丹麦
· 墨西哥
· 加拿大
· 多明尼加共和国
疫苗
使用自定义哈希算法检查文件或文件夹名称的函数可能会对恶意软件的执行造成问题,由于算法和散列都是基于32位的,并且只使用大写字母,所以很容易产生冲突,因为我们知道目标散列和算法它本身不能作为疫苗使用,但如果最关键的文件位于冲突文件夹名称中,它可以有效地防止恶意软件。
图15.哈希冲突
截图中,“BOOT”才是哈希的正确名称,其他都冲撞了。
Clop每个版本都有很多变化,所以要避免使用互斥锁等制作疫苗。
结论
Clop勒索软件的一些特点表明,企业才是它的目标,而不是普通用户。它的作者展示了一些创造性的技术解决方案,以检测受害者的语言设置和安装的程序。另一方面,当涉及到在勒索软件中编写某些功能时,也有一些不完美的设定。即使不完美,但不幸的是当前仍有许多此类糟糕的恶意软件在大行其道、牟取暴利。
Clop还在不断发展中,即使不知道未来会有什么新的变化,McAfee ATR也将密切关注。