逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

admin 2025年3月26日14:50:33评论10 views字数 2081阅读6分56秒阅读模式

part1

点击上方蓝字关注我们

将二进制空间安全设为"星标⭐️"

第一时间收到文章更新

首先来看一段恶意Python脚本:
逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

如果不是前面有shellcode变量名, 单纯看这一堆UUID, 估计很少有人能将这些UUID和恶意代码联系起来。

首先了解一下UUID: 

UUID(通用唯一标识符)是一种128位的值,常用于软件系统中,用以提供几乎可以保证唯一性的引用。它通常以字符串形式表示,由十六进制数字组成,并被划分为五个部分。由于其结构和生成方式(基于时间戳或随机数),UUID发生冲突的可能性极低,因此非常适合在分布式系统中用于标识对象或记录,尤其是在缺乏中心化唯一性管理机制的场景下。

而该恶意脚本, 主要利用了微软提供的一个API函数:UuidFromStringA(), 该函数可以将UUID 字符串转换为二进制格式。

因此,上面的一堆UUID, 一旦解码为原始字节, 就会以shellcode的身份注入到内存中执行。

利用这种技术的恶意软件逃避追杀的概率极高, VT评分仅为:2/61。

上面的UUID数组可以通过以下代码注入到内存中执行:

for i in shellcode:    io = ctypes.windll.Rpcrt4.UuidFromStringA(i, rwxpage1)    rwxpage1 += 16

这段代码解出来是一个CobaltStrike HTTP x86 shellcode, 连接地址: hxxp://182.61.60.141:6666/tFl6。

下面看一下完整的恶意Python脚本:

逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

下面来分析一下这种编码方式的原理。

分析要用到一款工具, 工具地址: https://github.com/DidierStevens/DidierStevensSuite/blob/master/re-search.py

使用re-search.py选择GUID:

逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

接着利用另一款工具来解码十六进制数据, 需要使用选项-H 来忽略所有非十六进制字符。

Hex-to-bin.py工具地址:https://github.com/DidierStevens/DidierStevensSuite/blob/master/hex-to-bin.py

结果如下图:

逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

注意,那些类似于用户代理字符串的文本被混淆了。这是因为GUID被编码为二进制数据的方式所导致。

比如以下这个GUID:

{00112233-4455-6677-8899-AABBCCDDEEFF}
当GUID被编码为二进制数据时,前三部分按小端序编码,最后两部分按大端序编码。最终得到如下字节序列:
33 22 11 00 55 44 77 66 88 99 AA BB CC DD EE FF

接下来将使用translate.py 来复现这种编码。

translate.py工具地址:https://github.com/DidierStevens/DidierStevensSuite/blob/master/translate.py

而在原始的恶意Python脚本中,是通过ctypes.windll.Rpcrt4.UuidFromStringA函数来完成的。

首先,使用Python列表推导式将字节流按16字节(GUID的长度)进行分割:

逃避查杀概率极高! 一堆UUID凑一起就是恶意代码
然后,通过改变前三部分的顺序重写GUID:
data[i:i+4][::-1] + data[i+4:i+6][::-1] + data[i+6:i+8][::-1] ([::-1]是 Python 中用于反转序列的表达式)
逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

这里要用到一个脚本来分析shellcode,脚本地址:https://github.com/DidierStevens/DidierStevensSuite/blob/master/1768.py

分析结果如下图:

逃避查杀概率极高! 一堆UUID凑一起就是恶意代码
可以看到shellcode中包含的C2服务器IP地址、端口号和URL路径。但是看不到许可证ID。
CobaltStrike 在合法购买时会分配一个唯一的许可证编号(LicenseID), 这个编号在生成 shellcodepayloadBeacon 等时会被自动嵌入其中(包括 shellcode 和通信流量里),就像是给每个 payload 打上了一个“用户指纹”或“水印”。
这是因为解码后的数据包含尾部的空字节:
逃避查杀概率极高! 一堆UUID凑一起就是恶意代码
这两个尾部的空字节是GUID编码的结果:每个GUID为16字节,因此解码后的数据长度是16的倍数,而shellcode的长度不是16的倍数。如果去掉这两个尾部的空字节,1768.py 就会检测到许可证ID:
逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

针对这个license-id, 说明一下:

  • 高级攻击者会对 shellcode做 patch,专门修改或清除 license-id 。

  • 有些攻击者用工具自动抹除或伪造 license-id,防止真实身份泄露。

  • 修改软件容易破坏 shellcode 功能,操作不当会导致失效。

  • 高级国家级APT组织几乎不会用正版CS,而是使用盗版并彻底去标识, 或者 直接开发自研 C2 框架,避免被追踪。

例如, APT29 使用自己的 “C2Matrix”,几乎不会碰 CS。

原文始发于微信公众号(二进制空间安全):逃避查杀概率极高! 一堆UUID凑一起就是恶意代码

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月26日14:50:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逃避查杀概率极高! 一堆UUID凑一起就是恶意代码https://cn-sec.com/archives/3881083.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息