Anatova勒索病毒分析

文章目录

    • 简介
    • 主要流程
      • 动态加载DLL获取函数地址
      • 创建互斥体
      • 判断用户名
      • 检测系统语言是否支持
      • 生成密钥对
      • 遍历并加密文件
    • 加密分析
    • 分析总结
    • 参考

简介

2019年爆出在国外发现的一款新型勒索病毒。

文件名:Anatova.exe

md5:2A0DA563F5B88C4D630AEFBCD212A35E

主要流程

int __cdecl main(int argc, const char **argv, const char **envp)
{
  // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
 
...
  inited = InitSystemLibFunctions_40568B();     // 病毒初始化操作,获取一系列后面使用的函数地址
  if ( inited )
  {
    hEvent = Kenel32_CreateEventW_4083D8(0i64, 0i64, 0i64, &unk_40941E);
    if ( hEvent )
    {
      Kernel32_WaitForSingleObject_4083E0(hEvent, 0x2710i64);// 这里等待目的是为了?
      Kernel32_CloseHandle_408368(hEvent);
    }
    Kenel32_SetErrorMode_408370(0x8007i64);
    hMutex = Kernel32_CreateMutexA_408378(0i64, 1i64, off_408000);
    if ( !hMutex || (Error = Kernel32_GetLastError_408380(), Error != 0xB7) && Error != 5 )
    {
      inited = InitSystemCryptLibFunctions_406210();// 初始化系统加密库,获取和加密相关的函数地址
      if ( inited )
      {
        inited = InitSystemCryptLibCode_40660F();// 获取系统加密编码库
        if ( inited )
        {
          if ( (unsigned __int8)sub_40676C() )  // 取shell32!ShellExcuteW地址
          {
            inited = AmIWhiteListUser_40690A(); // 检查本地用户名是否在白名单中
            if ( !inited )
            {
              inited = LocalUILanguageIsSupported_406AA2();// 检查本地系统的语言是否受支持
              if ( !inited )
              {
                if ( byte_408230 )              // 样本中该处值恒为0,猜测是用作以后版本的扩展
                  sub_406BCF();                 // 加载其他模块,以后版本可能会重新执行该分支代码
                sub_40208B(1);
                inited = ExportKey_402D19();    // 导出公钥
                if ( inited )
                {
                  inited = ImportKey_402717();  // 解密并导入公钥
                  if ( inited )
                  {
                    EncryptAllFile_405588();    // 加密所有文件
                    ...
                  }
                  ...
                }
              }
            }
          }
        }
      }
    }
    Clear_401C10();
...
  return 0;
}

Anatova勒索病毒分析_第1张图片

动态加载DLL获取函数地址

Anatova勒索病毒分析_第2张图片

解密字符串,然后动态加载DLL,调用GetProcAddress取得函数地址。病毒常用手法,以对抗导入表检测;字符串加密,以对抗静态分析。

创建互斥体

病毒会创建一个互斥体,保证只有一个病毒实体执行加密。

Anatova勒索病毒分析_第3张图片

判断用户名

Anatova勒索病毒分析_第4张图片

用户名也是加密的,解密后得到以下名单:

LaVirulera
tester
Tester
analyst
Analyst
lab
Lab
Malware
malware

如果本机用户名在名单中,勒索病毒则不会加密系统文件,而是退出程序。可能是为了检查当前环境是否为沙箱或者分析人员的分析测试主机。

检测系统语言是否支持

Anatova勒索病毒分析_第5张图片

如果系统使用的是这些语言中的一种,则病毒也不会加密系统文件,而是退出程序。使用这些语言的国家有叙利亚、埃及、摩洛哥、伊拉克和印度。

生成密钥对

勒索病毒选择了Microsoft Enhanced Cryptographic Provider v1.0这个加密提供服务生成高强度的RSA公钥和私钥

Anatova勒索病毒分析_第6张图片

后续勒索病毒随机生成RandomKey和RandomIv,对GlobalPrivateKey私钥进行加密。再解密攻击者预先设置的公钥CipherPubKey,用此公钥加密RandomKey和RandomIv,然后拼接RandomKey+RandomIv+加密后的GlobalPrivateKey得到最终展示在ReadMe文件里的秘钥。
Anatova勒索病毒分析_第7张图片

遍历并加密文件

递归遍历所有驱动器目录下的文件,包括网络共享目录。自动过滤一些系统目录,避免加密导致系统异常。

跳过的目录有

\Program Files
\Program Files (x86)
\Windows
\ProgramData
\Tor Browser
\Local Settings
\IETldCache
\Boot
\All Users
C:\$Recycle.Bin\*

加密前还会过滤一些文件后缀,以下后缀的文件不会被加密

.ani
.bat
.cab
.cmd
.cpl
.cur
.diagcab
.diagpkg
.dll
.drv
.exe

打开文件,读取文件数据,最大大小为0x100000字节,也就是1GB。判断文件加密标志,防止重复加密。

Anatova勒索病毒分析_第8张图片

随机生成32字节Key和8字节Iv,用Key和Iv调用自定义的加密函数加密文件数据,然后用之前生成的GlobalPubKey公钥加密Key和Iv,随后将密文Key和Iv放在密文数据后一同写到文件。

Anatova勒索病毒分析_第9张图片

Anatova勒索病毒分析_第10张图片

加密分析

在这里插入图片描述

Anatova勒索病毒分析_第11张图片

Anatova勒索病毒分析_第12张图片

最后根据算法特征可以推测是Sala20加密算法。这是一个流密码,也是对称加密算法。由于算法核心是单字节异或,所以加密解密共用一套算法。

分析总结

  • 病毒使用的是单线程加密。大体加密步骤:打开文件 =》读取文件 =》随机生成Key+Iv =》Sala20加密文件 =》加密Key和Iv =》复写文件 =》关闭文件句柄。
  • 勒索病毒生成Key和Iv使用的是系统函数CryptGenRandom。
  • Key固定长度为32字节,Iv固定长度为8字节。
  • 勒索病毒使用系统函数CryptEncrypt加密Key和Iv。
  • 秘钥管理:在每个加密文件尾部写入加密该文件使用的秘钥,这里记为EncKey。EncKey在写入加密文件前就被公钥PubKey加密过了,RandomPubKey和RandomPrivateKey都是勒索病毒随机生成的。勒索病毒使用的是非对称加密算法,本样本用的是RSA算法。然后勒索病毒随机生成32字节的Key和32字节的Iv作为Sala20算法的秘钥对RandomPrivateKey加密,接着用攻击者预先设定的公钥PubKey加密Key和Iv。最后将加密后的Key、Iv和RandomPrivateKey拼接成ShowKey并写入ReadMe文件,受害者交付赎金的时候需要把ShowKey给到攻击者。
  • 解密流程:攻击者拿到ShowKey,并用自己的私钥解密重新获得原始的Key和Iv。利用Key和Iv通过Sala20算法解密RandomPrivateKey,得到原始的私钥RandomPrivateKey。再拿原始的RandomPrivateKey去解密每个加密文件中的EncKey,用解密后的EncKey就能解密文件数据了。

参考

https://www.freebuf.com/articles/network/195091.html

你可能感兴趣的:(病毒分析,密码学,总结,网络安全)