首页
社区
课程
招聘
[翻译]逆向分析Bandios/Colony木马
2018-5-26 13:43 3358

[翻译]逆向分析Bandios/Colony木马

2018-5-26 13:43
3358

SHA256:59c662a5207c6806046205348b22ee45da3f685fe022556716dbbd6643e61834

 

你可以在沙盒网站ANY.RUN获取该样本

 

 

ANY.RUN沙盒中我们可以看到, 样本程序使用参数-install创建了一个子进程, 子进程则在%SYSTEM_DIRECTORY%目录下生成了多个文件.

 

 

但如果我们在hybrid analysis平台运行该样本我们却几乎无法得到任何信息, 并且程序只会反复递归执行不会停下.

 


那我们来深入探索一下看看其中到底发生了什么.

 

注意: 我在分析完后将一些函数重命名了

 

在获取必要权限后, 程序会检查是否有-install参数, 如果没有, 程序就会执行copy_tmp_with_install_arg函数跟collect_encrypt_send函数, 否则继续执行iaStorE_and_files函数

 

 

在函数copy_tmp_with_install_arg里, 它将自身复制到%TEMP%目录下并带参数-install继续执行

 

 

有趣的是, 使用CreateProcess函数我们有两种方式来运行程序: CreateProcess(exePath, nullptr, ...);CreateProcess(nullptr, exePath, ...);. 如果我们通过第一种方法来运行程序, 我们得到的命令行字符串会带有双引号, 第二种则不带.

 

 

该样本使用第二种方式调用CreateProcess, 并在进程开始时检查没有引号的参数, 在正常环境下这是可行的, 但是在hybrid analysis沙盒中却没法正常工作. 最可能的原因是hybrid analysis在某种程度上钩取了CreateProcess并在检查完参数后, 修改了某些东西后将参数传递给更底层的函数去, 因此在最后我们得到了不同的命令行字符串, 也就是这个字符串导致了样本的反复递归执行

 

我们也可以使用这种简单的技术来绕过hybrid analysis沙盒(当然any.run除外).

 

 

这也是为什么hybrid analysis失效的原因, 让我们回来继续分析样本.

 

2018.4.17更新: 该绕过hybrid analysis的方法现已被修复

 

在带参数(-install)执行子进程后, 它会调用collect_encrypt_send函数并开始收集系统信息

 

获取windows版本信息:

 

 

收集系统已安装的浏览器信息:

 

 

注意: 就算没有安装Chrome浏览器, Windows 10版本的注册表中也含有 HKEY_CURRENT_USER\Software\Google\Chrome 键, 因此这个方法并不可靠

 

通过检查HKEY_LOCAL_MACHINE\\SOFTWARE\\%AV_NAME%键来收集系统已安装的杀毒软件信息:

 

 

获取网卡的MAC地址和系统语言:

 

 

它将收集到的信息传递给machine_info_AES_base64函数, 并对信息进行AES加密和base64编码(以下将详解这一部分的过程):

 

 

在函数machine_info_AES_base64内它调用CoCreateGuid来生成8字节的随机数据并加上另一个8字节硬编码值1Q2a3k79:

 

 

样本使用advapi32.dllMD5函数来计算上述的16字节长字符串的md5哈希值(在8_rand_bytes_8_hard_coded函数中)

 

 

随后, 它使用哈希值作为密钥, 使用AES算法对系统信息进行加密, 并使用base64编码已加密内容.

 

 

注意: IDA Pro插件IDAScope可以极大地帮助我们检测样本中使用了哪些加密算法.

 

程序随后将已加密并编码过的数据发送给iostream.system.band/dump/io/time.php:

 

 

 

首部的8个字节是通过调用CoCreateGuid函数生成的. 我们可以编写简单的解密代码来解密流量内容.

 

def decrypt_traffic(content):
    key = content[:8] + b"1Q2a3k79"
    key = hashlib.md5(key).digest()
    base64_encoded = content[8:]
    encrypted_content = base64.b64decode(base64_encoded)
    IV = 16 * b'\x00'
    mode = AES.MODE_CBC
    decryptor = AES.new(key, mode, IV)
    dec_content = decryptor.decrypt(encrypted_content)

    print(dec_content)

发送完系统信息后, 父进程终止, 但带参数-install的子进程会继续执行, 在本例中它是继续执行iaStorE_and_files函数

 

在调用GetNativeSystemInfo函数后, 它会根据SYSTEM_INFO.dwOemId域来解压出对应的32位或64位可执行文件.

 

 

检查完系统架构后, 它继续调用write_spoolsr_and_MSdat函数, 在该函数内它使用0xDD作为密钥, 从byte_443870(在64位系统情况下)位置开始解密出PE文件, 生成0x40字节的随机数据添加到解密文件末尾, 解密后的文件保存为%SYS_DIR%\\spoolsr.exe, 而之前的加密文件存为%SYS_DIR%\\MS.dat

 

 

 

类似地, 函数KeyHook_usp20_n_dats解压, 解密并生成了如下文件: KeyHook64.dll, KH.dat, usp20.dllUP.dat:

 

 

 

KeyHook64.dllKH.dat解密得到, spoolsr.exe则是由MS.dat, usp20.dllUP.dat解密得到.

 

随后, 它继续从资源中解压出样本数据(在64位系统是0x110位置, 32位系统是0x108位置). 这些数据看上去也都是已加密或已压缩的数据:

 

 

它随后以提取出的数据和数据长度做参数调用decompress_函数, IDAscope告诉我们该函数使用了zlib算法的相关常量.

 

 

 

看上去这像是一个驱动文件, 保存至C:\Windows\System32\drivers目录下, 文件名为iaStorE.sys:

 

 

在64位系统中, 它简单地将驱动名填入注册表键\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\DumpFilters, 将该驱动作为崩溃转储过滤器安装. 在下次重启后, crashdmp.sys将会载入该过滤器驱动到转储栈里, 更多有关转储过滤器驱动的信息请点击这里:

 

 

在32位系统中, 它会以创建名为iaStorE服务的方式来安装该驱动

 

 

在解压完文件和安装完驱动后, 该样本退出执行.

 

所有的相关文件都经过签名, 包括驱动文件. 证书虽然已被其发行机构撤销, 但在Windows上这并不是什么大问题.

 

 

感谢你花时间阅读. 你也可以在Reddit上跟大家一起讨论

 

原文链接:Reversing Bandios/Colony Malware
翻译: 看雪翻译小组 Vancir
校对: 看雪翻译小组 一壶葱茜


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-5-26 13:43 被Vancir编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回