乐于分享
好东西不私藏

伪装成钉钉安装包程序样本分析

伪装成钉钉安装包程序样本分析
在吉宙实验室例行威胁样本追踪过程中,发现一个名为 dingtalk_downloader 的待研判文件,将其上传至吉星云诱捕分析平台(https://decoymini.com)进行检测,检测结果如下:

基本信息

从样本文件名看出为钉钉下载器,大小为 85.4MB,对于下载器来说,这个大小就非常可疑了,官方下载器大小为 3MB 左右
使用 DIE 查看基本信息
程序为 32 位,使用了 Setup Factory 9.0 版本打的包

解 包

解包后的文件
从解包出来的文件来看,1.exe 和 2.exe 非常可疑,查看内容数据,这两个文件并非标准的 PE 文件

除这两个文件外,以下 3 个文件都没有带有效签名

  • vcdrom.exe

  • stdlog.dll

  • syslay.dll

那首先哪个文件先执行,这需要查看 irsetup.dat 数据

使用 Setup Factory 打包过的程序会先启动 irsetup.exe,irsetup.exe 会读取 irsetup.dat 数据,On Post Install 为安装后执行

vcdrom.exe

vcdrom.exe 是一个 32 位 GUI 程序,查看导入表,发现会加载 stdlog.dll 和 syslay.dll,接着对 stdlog.dll 和 syslay.dll 导出表进行检查,发现 stdlog.dll 存在 "异常"

存在多个同名导出函数,sub_10002030 可疑,在内部,发现 1.exe 和 2.exe 字符串注释

入口处

读取两文件内容

获取内容后便开始解密,解密方式为将 2.exe 内容进行 sha256 哈希,再用此哈希派生出密钥,最终对 1.exe 进行 AES 解密,模式为 CBC,IV 为 0,解出来的是一段 PE 数据

以下脚本还原解密过程

import hashlibfrom Crypto.Cipher import AESdef read_file(filepath):    with open(filepath, 'rb') as f:        data = f.read()    return datadef main():    encrypted_file = "1.exe"    key_file = "2.exe"    output_file = "decrypted_output.bin"    encrypted_data = read_file(encrypted_file)    key_material = read_file(key_file)    key = hashlib.sha256(key_material).digest()    cipher_cbc = AES.new(key, AES.MODE_CBC, iv=b'\x00'*16)    decrypted_data = cipher_cbc.decrypt(encrypted_data)    with open(output_file, 'wb') as f:        f.write(decrypted_data)if __name__ == "__main__":    main()

最后手动进行加载 (PE 结构解析、导入表处理、重定位修复),最后跳转到入口处执行

解密后的程序

在对解密后的程序二进制数据检查时,发现一段数据以之前分析的样本 (白鲨倒计时) 有着高度相似性

在这猜测此伪装成钉钉安装包程序和之前利用白鲨倒计时程序伪装成百度网盘安装包应该出自同一人或同一组织之手。该程序开始运行后会去检查是否在调试,如果是则退出程序

接着去找 payload 的位置

然后跳到此运行 payload,解密出 C2 (13.229.17[.]168)

最后与 C2 通信,首次连接发送 "ABCDE",但目标已失活

这部分与之前一样,故在此就不再详细展开,有兴趣的可以前去查看。

 白鲨倒计时程序伪装成百度网盘样本分析

总 结

该样本系伪装成钉钉下载器的恶意程序,其文件体积显著异常。解包后发现,vcdrom.exe 进程加载了未携带有效数字签名的 stdlog.dll 动态链接库,进而读取样本包内包含的 1.exe 与 2.exe 两个文件。其中,2.exe 的内容经 SHA256 哈希计算后派生为 AES 密钥,用于对 1.exe 执行解密操作 (AES-CBC 模式,IV 为零向量),成功还原出一段完整的 PE 可执行载荷。经代码比对,该载荷与之前的白鲨倒计时恶意程序高度同源。载荷运行后,将解密获取远控服务器地址 13.229.17[.]168,并向该地址发起连接请求获取下阶段载荷。从手法上看,加载 payload 阶段相比之前做了些许升级。

IoCs

哈希:

  • a0bb5285ea980785ff1f7338d339f77d

C2:

  • 13.229.17[.]168