WannaCry分析

样本情况

  • 样本名称:WannaCry
  • 大小:3,514,368 bytes
  • MD5:84C82835A5D21BBCF75A61706D8AB549

查壳

PEiD

使用PEiD观察到WannaCry使用VC++编写

image-20230423103933500

Exeinfo

使用Exeinfo观察到WannaCry未加壳

image-20230423104132051

基础分析

基础静态分析

查看字符串

首先检索字符串,发现WannaCry采用了Windows的加解密函数,并且字符串中出现了RSA与AES的字样。可能用到这些加密算法,并且还有通过cmd执行的命令。

image-20230423104716511

使用PEiD识别加密算法

PEiD自带了许多插件,其中Krypto ANALyzer是一种加密货币分析工具

image-20230423105155291

使用KANAL分析出下面几种算法

  • ADLER32:校验和而算法,用于数据完整性检验
  • CRC32:是一种循环冗余校验码,用于数据完整性校验和错误检测
  • CryptDecrypt:是一组Windows API函数,用于加密和解密数据。可以在加密的数据块上执行解密操作,并将结果存储在相同的缓冲区中。
  • CryptEncrypt:是一组Windows API函数,用于加密和解密数据。可以在未加密的数据块上执行加密操作,并将结果存储在相同的缓冲区中。
  • RIJNDAEL:是一种块密码算法
  • ZIP2与ZLIB:是压缩算法

image-20230423105520546

查看导入表

可以看到wannacry没有输出表的信息,只有输入表的信息

image-20230423112726434

输入表中可以观察到引用了

  • KERNEL32.dll:是一个Windows操作系统中非常重要的系统动态链接库文件,它包含了大量的系统核心函数,文件读写以及进程控制等函数
  • USER32.dll:是Windows操作系统中的一个动态链接库文件,包含了许多用户界面相关的函数。
  • ADVAPI32.dll:是Windows操作系统中的一个动态链接库文件,包含了许多安全和系统管理相关的函数。例如控制注册表等函数
  • MSVCRT.dll:是Microsoft Visual C++运行时库中的一个动态链接库文件,包含了许多与C和C++语言相关的函数。

image-20230423113302137

KERNEL32.dll

发现大量的文件操作函数

image-20230423113913211

资源读写函数

image-20230423114016416

USER32.dll

只有一个宽字节写的函数

image-20230423114122423

ADVAPI32.dll

含有注册表操作的函数,说明Wannacry会修改注册表

image-20230423114232814

MSVCRT.dll

一些C/C++相关函数

image-20230423114430098

使用Resource Hacker查看资源

Wannacry中存在三个资源,分别为XIA、Version Info以及Manifest

image-20230423114712265

XIA

XIA中存在一个PK头,即压缩包资源

image-20230423114839859

压缩包里有许多文件以及可执行文件,可能是用于感染的

image-20230423135848538

基础动态分析

Process Monitor

使用Process Monitor分析进程树,发现wannacry会生成创建五个进程,四个自定义进程,以及一个cmd.exe用于执行系统命令

image-20230423141255646

Reshot

使用Reshot观察注册表被修改的情况,添加了新的键,并且键名为WanaCrypt0r

image-20230423150919111

值为”wd”=”C:\Users\pwn\Desktop\勒索软件样本(13个)附解压密码\勒索软件样本(1)\Wannacry”

image-20230423151016310

文件监控

使用火绒剑进行文件监控,创建了脚本文件,应该是配合上述的cmd.exe执行相应的操作

image-20230423151852243

释放了许多可执行文件

image-20230423152203525

深入分析

WannaCry

WannaCry用于做勒索的前期准备,不是具体的勒索行为,改程序的各函数功能入下图。

WannaCry

TaskStart.dll

TaskStart.dll宏观操作如下图,其中加密行为在sub_100057c0函数

TaskStart.dll

sub_100057c0

接下来就详细分析具体的勒索行为

首先初使用CryptAcquireContextA函数始化加密的上下文环境

image-20230426152830554

使用CryptImportKey函数导入攻击者的密钥,该密钥为公钥

image-20230426154704615

使用CryptGenKey导入密钥句柄,并且规定加密的方式为RSA

image-20230426154806314

使用CryptExportKey函数,在本机导出公钥

image-20230426154955134

使用CryptExportKey函数在本机导出私钥,并且攻击者使用自己的公钥,将本地生成的私钥进行加密

image-20230426155559715

这里总的来说,就是攻击者会在受害者机器上利用API生成公私钥对,用于后续加密文件。但是为了防止用户自己将文件解密,因此攻击者会使用自己手上的公钥,将在本地生成的密钥给加密,这样只有利用攻击者手上的私钥才能进行解密。如下图所示

加密流程.drawio

程序会利用SHGetFolderPathW函数获取桌面的路径,因此该程序会优先加密桌面的文件

image-20230426160604608

利用FindNextFileW函数遍历桌面的文件

image-20230426160734804

程序会对文件后缀进行匹配,遇到.exe和.dll文件会选择跳过不加密

image-20230426160844204

将所有符合条件的文件都存放到内存中,完成后续的加密以及修改后缀名的行为

image-20230426161232814

将每个文件的后缀名新增.WNCRY的后缀

image-20230426161615557

Wannacry并不是在原始文件上进行修改的,而是会新建一个文件,将加密后的数据填充到里面,该文件的名称就是原有的名称加上.WNCRY

image-20230426161818801

在加密之前会使用CryptGenRandom函数生成一个随机数

image-20230426162009133

利用CryptEncrypt函数,使用刚刚在本地生成的公钥,将该随机数进行加密

image-20230426162201093

利用上面生成的随机数进行AES加密,并且加密后立刻将生成的随机数清空

image-20230426162413519

那么加密的操作就比较简单了,就是不断读取原始的文件数据,经过AES加密,加密的密钥是刚刚生成的随机数,然后将加密后的结果写入刚刚新建的文件中。

image-20230426163215954

在完成加密后,WannaCry还会对原始文件进行加密,加密的操作与上述流程一致

image-20230426163550255

在加密完桌面程序后,则是加密其他路径的文件,完成全磁盘的加密,所有加密操作都如上述一致,并且最后会把原始文件进行删除

总结

加密流程

首先攻击者会准备一个RSA的公钥,接着会在被攻击的主机上生成一对公钥与私钥,本地生成的私钥会被攻击者的公钥进行RSA加密,然后攻击者会生成一组随机值,接着读取原文件的数据,将随机值作为AES的密钥,将原始文件的数据进行AES加密,并将加密后的数据写入到*.wnry文件中。并且为了防止原始文件被获取,WannaCry会将原始文件也加密,接着将原始文件删除。

因此程序的加密流程是

  • 读取原始文件的数据流
  • 将数据流进行AES加密
  • 将加密后的数据流写入到其他文件
  • 并将原始文件删除

加密使用的API

用于读写文件

  • CreateFileW

  • WriteFile

  • ReadFile

用于加密文件

  • CryptAcquireContextA
  • CryptImportKey
  • CryptGenKey
  • CryptEncrypt
  • CryptDestroyKey
  • CryptGenRandom

WannaCry分析
https://h0pe-ay.github.io/wannacry/
作者
hope
发布于
2024年3月8日
许可协议