Skip to content

红队视角下木马架构整理

字数
2669 字
阅读时间
10 分钟
更新日期
2/1/2021

红队视角下的后门

来自 https://www.freebuf.com/news/259752.html

  1. dll劫持执行恶意代码
  2. 9层环境检测,判断环境上下文安全,是否继续执行
  3. 检查通过,使用DGA算法生成的域名发送DNS上线通知,检查DNS解析结果是否满足自身运行要求
  4. DNS上线通知成果,使用两种User-Agent和三种代理模式,与C2服务器建立HTTP控制通道
  5. 前期后门不需要处理很多指令,只需要能够下载自定义Payload,例如Cobalt Strike beacon,进行下一步操作

代码执行

无论是红队后渗透还是真实APT攻击,第一步要在受害者的机器上运行起来控制程序(agent/implant/artifact)。Windows系统上的代码执行的方法有很多,也可以从多种角度进行分类和总结。这里作者将之分为以下三类:

(1)BYOB: Bring Your Own Binary,就是把后门、工具、武器编译成exe文件,上传到目标主机上并运行。这也是最直接的执行方式。缺点是需要不断的编译和上传、要处理杀软和EDR的静态检测等等。

(2)LotL: Living off the Land,可以理解为就地取材,利用Windows系统和应用程序来加载执行恶意代码,典型的案例就是利用powershell的攻击。这种方式利用白名单程序来加载,会有一定规避检查的优点,但会产生明显的父子进程关系和进程参数,容易被猎捕。

(3)BYOL: Bring Your Own Land,这也是FireEye提出的一种方法,在使用前两种方法建立了基本的代码执行能力后,在内存中加载并运行Windows的PE文件、.NET assembly文件。优点是跳过了静态文件查杀,不会明显产生进程间调用关系和进程调用参数,缺点是需要自己开发内存加载执行的代码,很多常规的命令需要自己重新实现。

值得关注的

代码使用自定义hash算法,常量字符串都进行hash处理,避免敏感字符串在传输流量和本地文件扫描时发现。实际使用的地方有9处,下图是进程名检测部分:

img

环境检测

9层检测机制,都通过时,再执行上线。

  1. 通过hash判断加载的恶意dll进程名称
  2. 写入时间比当前时间至少提前12~14天,潜伏半个月执行
  3. 硬编码检测命名通道,避免多进程重复执行
  4. 检查当前设备所在域,域名中不能包含哈希值校验的黑名单patternHashes中的一些字符串;域名不能匹配到正则表达式“(?i)([^a-z]|^)(test)([^a-z]|$)”,该表达示主要用来检查当前域名是不是测试用的域名;”(?i)(solarwinds)”,猜测该表达式主要用来检测是否处于sloarwinds公司办公环境
  5. 检查第一个非回环网卡,不在IP黑名单中
  6. 检测进程Hash黑名单(包含137个进程),确保当前环境中没有安全相关软件和服务程序,如Windbg,Autoruns,Wireshark,并尝试关闭服务名单中服务
  7. 检测当前环境是否存在13个安全软件的驱动程序
  8. 主机解析 api.solarwinds.com 为指令ip地址(供应链攻击隐藏)

值得关注的

红队技术传统技术往往高度关注进程列表检测、驱动列表检测的技巧

对于杀软和安全软件的检测,我们通常使用taskllist /v和tasklist /svc来检查进程和服务,可以认为这是一种手工判断+LotL的方法。这里推荐两款自动化的检测脚本和工具,大家可以根据自己的需求进行改造,结合内存加载实现BYOL的方式来检查安全软件。

(1)ProcessColor.cna,一款Cobalt Strike的插件脚本,可以帮助我们标记出常见的安全软件、监控软件、分析软件。

img

(2)Seatbelt的InterestingProcesses命令,C#开发的多功能信息搜集工具,可单独使用,可结合其他程序实现内存加载。

img

img

2.1.2 驱动检测

既然进程和服务都检测了,那么检测这些驱动有什么意义吗?

img

在常规的情况下,检查进程和服务名称就可以了解当前系统的安全软件运行情况,但是一些高级系统管理员会修改进程和服务的名称,我们就没办法判断了。Sunburst后门在环境检测中还检查了系统驱动,这些驱动大部分都是杀软和EDR产品使用的。这一点是值得红队人员借鉴的,下面以sysmon为例进行说明。

img

img

img

C2通道

对于红队来说,最常规的出网协议是HTTP[S]和DNS协议,但是大多数情况是手动判断目标的网络环境后来选择C2通信的方式。虽然能够修改和自定义C2通信协议,无疑是规避流量检测的好方法,但是相对的成本会比较高,需要同时兼顾客户端和服务端,还需要保证通信质量。简易的做法是利用后渗透框架自身的配置来修改C2流量特征,比如Cobalt Strike、Empire、Covenant等工具都支持Malleable C2 profile的配置。

监测蓝队是否分析自己implant

将制定DNS域名以常量字符串形式嵌入implant,生成独一无二的DNS域名,只要收到这个DNS查询请求,说明我们的行动已经被发现。

同理,可监测web

尽可能展现正常的数据

img

回复正常的数据,客户端从正常数据中提取需要的数据

以下是黑客C2服务器对远端受害主机控制命令的类型和功能:

命令详细描述
空闲0
退出1结束当前进程
设置延迟时间2设置主事件循环执行的延迟时间
收集系统信息3解析本地系统信息,包括主机名、用户名、操作系统版本、MAC地址、IP地址、DHCP配置和域信息
上传系统信息4向指定的URL发送HTTP请求,并把系统信息以特殊格式发送到C2服务器
启动新任务5根据文件路径和参数启动新进程
枚举进程信息6获取进程列表,并根据参数决定是否获取父进程ID、用户名、域名
结束任务7根据PID结束指定进程
枚举文件信息8根据文件路径枚举文件和目录
写入文件9根据文件路径和Base64编码字符串,将Base64解密字符串的内容以追加模式写入文件,写入后延迟1-2秒
判断文件是否存在10判断文件路径是否存在
删除文件11根据文件路径删除文件
获取文件哈希12获取文件的MD5哈希信息
读注册表值13读取注册表值
设置注册表值14设置注册表值
删除注册表值15删除注册表值
获取注册表子项和值16获取注册表路径下的子项和值名称的列表
重启17尝试使系统重启

高度迷惑性的DGA算法

如果样本通过上述阶段,则样本将在while循环中通过DGA算法开始生成域。样本会延迟域生成之间的随机间隔;此时间间隔可以是1到3分钟,30到120分钟或在错误条件下最长420到540分钟(9小时)范围内的任意随机值。

总共用四种方法来生成url,分别为GetCurrentString,GetPreviousString,GetNextStringEx和GetNextString函数。

img

其中GetCurrentString/GetPreviousString可以认为是第一阶段DGA,包含可以完整解析的域名,GetNextStringEx/GetNextString可以认为是第二阶段DGA,包含了有效的服务器时间戳等信息。

img不管哪种生成方式,在OrionImprovementBusinessLayer.GetOrCreateUserID中,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography的 MachineGuid值和第一个网络适配器的物理地址MAC组成了UID,并通过计算UID的MD5哈希,再用ComputeHash类的方法将 MD5 哈希值作为16字节的数组返回,异或之后最终输出64位哈希值这样得到目标GUID。GUID通过CreateSecureString函数进行加密,CreateSecureString函数中使用了CryptoHelper.Base64Encode算法加密。所以整个加密过程全是CryptoHelper.Base64Encode函数和CryptoHelper.Base64Decode函数实现的,研究的重点就是CryptoHelper.Base64Encode函数和CryptoHelper.Base64Decode函数 。然而这两个函数都并不是名称表示的常见的Base64编解码函数。

img

img

img

一、前15个字节是GUID被加密过后的编码0fn7oe4cegrf933

二、中间一个字节是通过CreatString生成的“c”

三、后面的mudofi75f4tjvh则是AD域被编码后的字符串。

因为这里十六个字节过后有“00”开头的标志,所以可以断定应该调用OrionImprovementBusinessLayer.CryptoHelper.Base64Decode对应的解码算法。解码后可以得到域名称:WASHO。

img

img

总结整理

loader -> 加载更多模块

  • loader

    • 明文字符串都用算法加密
    • 功能尽可能简单,使用模块化手段加载
    • 可选加入反av 反沙箱功能,检测调试退出
  • 模块

    • 压缩代码数据
    • 加密代码数据
    • shellcode化
  • 服务端

    • dns,http探查反跟踪
  • 通过动物名字下达指令

image-20210111150403483

中间服务器

client 到 server端可以通过中间服务器中转,中间服务器中转正常流量,对于client流量中转到另外地方

长时间C2 短时间C2

长时间C2 用于长时间控制,12小时控制一次

短时间C2用于对目标频繁交互

第三方服务C2

google twitter email

撰写

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。

聚光灯样式

调整聚光灯的样式。

置于底部
在当前鼠标悬停的元素下方添加一个纯色背景以突出显示当前鼠标悬停的位置。
置于侧边
在当前鼠标悬停的元素旁边添加一条固定的纯色线以突出显示当前鼠标悬停的位置。