1.前情提要
继上篇分析了关于Babyk加密器在Windows环境的行为特征,本篇是针对NAS系统的相关分析。
2.总体行为:
3.密钥下发(Builder.exe)
这里可以通过VS生成了Builder.exe来实现对其Builder过程进行分析,可以看到主要是对这部分文件的处理与释放
文件释放列表及作用:
无法复制加载中的内容
流程图:
逻辑分析:
1 读取参数,第一个参数是文件夹路径,第二个是指定密钥文件
2 根据参数1的文件路径,来和kp.curve25519与ks.curve25519进行拼接,用于后续存储密钥
3 利用随机数函数CryptGenRandom来产生一个私钥,再利用该私钥配合curve25519算法生成一个公钥
4 或者看是否存在第三个参数,有指定私钥的文件,利用该文件内的私钥配合curve25519算法生成一个公钥
5 将私钥和外部的note.txt勒索信写入到加密器中,将私钥写入到解密器中
6 将生成的私钥和公钥写入到kp.curve25519和ks.curve25519文件中
4.密钥产生程序
4.1 逆向分析(keygen.exe)
整体流程就是调用随机数函数SystemFunction036,产生了32位的随机数
其中systemFunction036是cryptbase.dll中的函数
之后就是经过了Curve25519算法的密钥生成,得出了一个公钥和一个私钥
5.NAS
5.1 目录结构
存在一个build.bat批处理文件和main.go代码文件
5.2 单独构建脚本(build.bat)
build.bat:
@echo off
set GOOS=linux
set GOARCH=386
go build -o e_nas_x86.out
set GOOS=linux
set GOARCH=arm
go build -o e_nas_arm.out
pause
该脚本会生成两个版本的文件,一个是linux下intel架构的程序,另外一个是linux下arm架构的程序。
5.3 加密器分析(e_nas_x86)
5.3.1 整体流程
5.3.2 逆向分析
首先获取勒索信的长度,并将其赋值到note_content,用于后续勒索信的写入。
5.3.2.1 读取参数
判断是否存在输入参数,如果有就对其进行遍历,如果没有那就打印帮助说明e_nas_x86.out /path/to/be/encrypted
,意味着参数1是需要指定加密路径。
遍历文件,对文件进行过滤加密,不是文件就继续递归
5.3.2.2 路径过滤
目录的判断是有遇到过滤目录的话,就会选择跳过,不做加密操作,最后遍历完后,会写入勒索信。
5.3.2.3 过滤目录
/proc
/boot
/sys
/run
/dev
/etc
/home/httpd
.system/thumbnail
.system/opt
.config
.qpkg
/mnt/ext/opt
5.3.2.4 过滤文件
.babyk
README_babyk.txt
如果是文件,会判断是否是加密后缀的文件(.babyk),或者是否是勒索信(README_babyk.txt),如果都不是,会调用main_main_func1_gowrap1函数进行加密流程,否则就跳过。
5.3.2.5 文件加密
main_main_func1_gowrap1函数
这里的话,主要就是调用main_encrypto_file进行加密实现
5.3.2.6 加密核心(main_encrypto_file函数)
基本的流程和windows差不多,一个是在生成IV和Key的过程换成了sha256,其次就是最后的流加密算法换成了Chacha20。
生成加密私钥和公钥,并结合黑客的公钥生成共享密钥,最后将文件名称修改为加密文件名称。
利用共享密钥生成IV和KEY
对文件进行加密,然后将加密当前文件生成的公钥和加密标志“choung dong looks like hot dog!”写入到文件末尾,
这里会对文件的大小进行计算,来选择合适大小的加密大小。
计算方法:根据需要加密文件的大小来进行判断,如果大于0x1400000,就属于大文件,对其进行分块进行循环加密,一个块大小为0xA00000,如果小于等于0x1400000,并且大于0x400000,那就一次只加密0x400000大小的文件内容,如果小于0x400000,文件大小就是加密大小,全加密。
5.3.2.7 加密后缀
5.4 总结
该架构的设计因为加密的系统是NAS文件存储系统,并未进行多余的服务关闭等功能,只是做了简单的目录过滤,然后就开始了加密,加密完毕后写入公钥和加密标志并且会对每个目录下写入勒索信。