Cobalt Strike 的 Beacon 使用介绍以及 Profile 文件修改Beacon内存教程

一、Beacon简介

1.1 Beacon介绍

Beacon 是 Cobalt Strike 运行在目标主机上的 payload,Beacon 在隐蔽信道上为我们提供服务,用于长期控制受感染主机。它的工作方式与Metasploit Framework Payload类似。在实际渗透过程中,我们可以将其嵌入到可执行文件、添加到Word文档或者通过利用主机漏洞来传递 Beacon。

Beacon的功能包括以下几点:

  1. 使用HTTP或DNS检查是否有待执行任务
  2. 可连接到多个C2域名
  3. 能够在分段传输后自动迁移
  4. 与Cobalt Strike紧密集成,通过社工、主机漏洞和会话来传递Beacon

Beacon的中文名为信标,像是在网络中告诉我们:“嘿,我是肉鸡,我在这…”

1.2 Beacon 的工作原理

我们可以通过下图来看Beacon的工作原理:

在这里插入图片描述


Beacon在目标主机上运行之后,会主动向我们提前设置好的 Listener 发送请求信息(叮,您有新的主机已上线)。

在这里插入图片描述


Team Server 控制器接收到请求后会检查是否有待执行的任务,如果有就会将任务下发到Beacon

在这里插入图片描述


Beacon 的工作原理总结:

当我们通过TeamServer生成了beacon文件后,并在靶机上执行该文件,会产生以下行为:

  1. 靶机主动请求生成beacon时所选择的Listener
  2. 攻击者通过TeamServer发现目标机器已上线
  3. 借助TeamServer下发指令给beacon执行(异步或同步)

此处值得一提的是 payloading staging,很多攻击框架都是使用分段的shellcode,以防止shellcode过长,覆盖到了上一函数栈帧的数据,导致引发异常。要说分段shellcode就不得不提stager,stager是一段很精短的代码,它可以连接下载真正的payload并将其注入内存。我们使用stager就可以解决shellcode过长的问题。

在这里插入图片描述


Cobalt Strike中也支持分段payload:

在这里插入图片描述

关于分段payload优势与劣势的问题,本文不予讨论,这就像是选择鸡还是鸡蛋一样,Cobalt Strike的作者最终选择了鸡蛋,所以…在Cobalt Strike 3.5.1后的版本可以通过在 Malleable C2中添加host_stage选项,以限制分段payload。

在Cobalt Strike 4中应该尽可能多的使用unstage,一方面以保证安全性(因为你无法确保stager下载的stage是否受到中间人攻击,除非像MSF一样使用SSL保证安全性)。另一方面如果我们通过层层的代理,在内网进行漫游,这个时候使用分段的payload如果网络传输出现问题,stage没有加载过去,可能就会错失一个Beacon,unstage 的 payload会让人放心不少。

更多关于stage的参考资料:
https://blog.cobaltstrike.com/2016/06/15/what-is-a-stageless-payload-artifact/

1.3 Beacon 的生成模式

Beacon的生成有两种模式

  1. stage (有阶段)
  2. stageless (无阶段)

stage(有阶段):指的是Beacon会分段的加载shellcode(具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行)。
stageless(无阶段):则是在生成时则包含完整的shellcode。

在这里插入图片描述

1.4 Beacon 的通信策略

Beacon有两种通信策略(与团队服务器通信-CS 中以团队服务器作为 C2)

异步式通信 =:异步模式下通信频率低、速度慢,如上图所示:Beacon会主动请求任务列表、然后进入SLEEP状态。
交互式通信 : C2 对 Beacon 实时控制

1.5 Beacon 的分类

根据内置Listener的分类可以将Beacon分为:

  1. HTTP and HTTPS Beacon
  2. DNS Beacon
  3. SMB Beacon

1.5.1 HTTP and HTTPS Beacon 的工作原理

HTTP and HTTPS Beacon非常简单,关键是Beacon通过GET请求来下载任务。

在这里插入图片描述

1.5.2 DNS Beacon 的工作原理

Cobalt Strike使用DNS来完成Beacon check in的工作,如果DNS返回的记录解析为有需要执行的任务,那Beacon会使用HTTP来完成获取任务这一过程。具体原理参看下图:

在这里插入图片描述


需要注意的是:DNS Beacon现在已经有两种方式(第二种方式是使用TXT记录)传输Beacon和task list

1.5.3 SMB Beacon 的工作原理

SMB Beacon需要连接到Parent Beacon使用,所有任务均从parent Beacon接收,并通过parent Beacon返回任务结果。它使用了Windows的命名管道,命名管道是Windows进程间通信机制,允许两者间通信、互相查看和操作对方的文件。Cobalt Strike使用这种方式在进程与进程或主机与主机之间通信,因为基于SMB协议所以被称之为SMB Beacon。

在这里插入图片描述

1.6 Beacon安全性

设想这样一个问题,如果有人劫持了你的通信流量,并可以监听到你的Beacon向Team Server传回的数据,这时会发生什么呢?

在这里插入图片描述


答案是什么都不会发生。
因为Beacon内置了多种安全特性(除了第四条):

  1. Beacon stage 在连接时会验证Team Server
  2. Beacon 的任务请求和任务输出都是被加密的
  3. Beacon 有重放保护机制
  4. Beacon stagers 没有任何安全机制

当你启动Team Server并创建了Beacon Listener时,Team Server就会创建公钥对来保证后续传输过程的安全性。我们以分段传输payload为例,详细讲解一下Cobalt Strike的安全特性。

1. 当stager下载stage时,公钥也会被一起发送:

在这里插入图片描述


2. 当Beacon stage准备check in的时候,第一步就是要发送关于beacon session的元数据(Metadata)元数据中包含了用户、PID、电脑名称、IP地址等等基础信息,同时元数据中也包括了Beacon stage创建的一个随机会话密钥。为了保证安全性,Beacon stage会使用公钥加密元数据(含会话密钥),这意味着只有Team Server才能够解密该数据包。

在这里插入图片描述


3. 当Beacon从Team Server下载任务的时候,团队服务器会使用会话密钥加密这些任务,Beacon stage也会使用会话密钥来解密任务列表。

在这里插入图片描述


4. 同样在返回任务结果的时候,Beacon stage也会使用会话密钥对任务输出加密。

在这里插入图片描述


可以看到Raphael在设计Cobalt Strike的时候已经充分的考虑到了它的安全性问题,所以…师傅放心用吧,wink~

二、Beacon的使用以及内存特征

实验环境:
攻击者: KALI (含有Cobalt Strike ) IP: 192.168.23.128
受害者: Win10 IP: 192.168.23.130

2.1 生成 Beacon 并在win10上运行

在kali中使用 Cobalt Strike 生成一个无阶段的 beacon:beacon.exe

在这里插入图片描述


之后在受害者主机 win10 上运行beacon.exe

在这里插入图片描述


受害者主机 win10 运行beacon.exe 之后,已中招,在攻击者主机KALI 的 Cobalt Strike 上显示192.168.23.130已成功上线

在这里插入图片描述

2.2 分析 Beacon的特征

在受害主机 WIN 10 上使用 Process Hacker 分析 Beacon的特征
打开 Process Hacker 找到运行的Beacon.exe

在这里插入图片描述


单击 选中的beacon.exe,之后弹出beacon.exe(4008)属性框,选择属性框中的**“线程”,可以看到线程起始地址**:beacon.exe+0x14b0

在这里插入图片描述


单击选中的beacon.exe+0x14b0,查看线程 952 的堆栈的调用了SleepEx睡眠****

在这里插入图片描述


特征:内存段是rwx权限
查看 beacon.exe 所有的内存,内存段很少有是rwx权限的,我们直接定位到rwx内存段
之后,右键把内存导出到文件

在这里插入图片描述


在这里插入图片描述


右键用写字板形式打开beacon.exe.bin文件

在这里插入图片描述


可以看到内存里有beacon这个字符串特征

在这里插入图片描述


这里还有个特征:ReflectiveLoader一看就被别人知道了

在这里插入图片描述


在这里插入图片描述


内存特征总结:
1、内存段是rwx权限
2、内存中有 beacon 字符串
3、内存中有 ReflectiveLoader 字符串

2.3 修改 Beacon的特征

使用 Profile 文件修改Beacon内存特征

下载地址:https://github.com/xx0hcd/Malleable-C2-Profiles

在文件中找到如下代码,并按照下图和以下代码进行修改,其中的#号是注释的意思

stage {
    set checksum       "0";
	#设置 beacon Reflective DLL 的编译时间
    #set compile_time   "25 Oct 2016 01:57:23";
	#设置 beacon Reflective DLL 的PE标头中的EntryPoint值
    set entry_point    "170000";
    #set image_size_x86 "6586368";
    #set image_size_x64 "6586368";
	#设置 beacon Reflective DLL 的PE头名字
    #set name	   "WWanMM.dll";
	
	#避免 beacon 所在内存为 rwx
    #set userwx 	   "true";
    #set cleanup	   "true";
    #set sleep_mask	   "true";
    #set stomppe	   "true";
    #set obfuscate	   "true";
	#设置 beacon Reflective DLL 编译器插入的元信息
	#设置 beacon Reflective DLL 编译器插入的元信息
    set rich_header    "\xee\x50\x19\xcf\xaa\x31\x77\x9c\xaa\x31\x77\x9c\xaa\x31\x77\x9c\xa3\x49\xe4\x9c\x84\x31\x77\x9c\x1e\xad\x86\x9c\xae\x31\x77\x9c\x1e\xad\x85\x9c\xa7\x31\x77\x9c\xaa\x31\x76\x9c\x08\x31\x77\x9c\x1e\xad\x98\x9c\xa3\x31\x77\x9c\x1e\xad\x84\x9c\x98\x31\x77\x9c\x1e\xad\x99\x9c\xab\x31\x77\x9c\x1e\xad\x80\x9c\x6d\x31\x77\x9c\x1e\xad\x9a\x9c\xab\x31\x77\x9c\x1e\xad\x87\x9c\xab\x31\x77\x9c\x52\x69\x63\x68\xaa\x31\x77\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
    
	
    #obfuscate beacon before sleep.
	#在睡眠时间对内存进行混淆
    #set sleep_mask "true";
    
    #https://www.cobaltstrike.com/releasenotes.txt -> + Added option to bootstrap Beacon in-memory without walking kernel32 EAT
    #set smartinject "true";
    
    #new 4.2. options
    #allocator options include HeapAlloc, MapViewOfFile, VirtualAlloc, or you can use module stomp.
    #set allocator "HeapAlloc";
    #set magic_mz_x86 "MZRE";
    #set magic_mz_x64 "MZAR";
    #set magic_pe "EA";

#module stomp. Make sure the dll you use is bigger than your payload and test it with post exploit options to make sure everything is working.

    set module_x86 "wwanmm.dll";
    set module_x64 "wwanmm.dll";

#transform allows you to remove, replace, and add strings to beacon's reflective dll stage.
#转换允许您删除、替换和添加字符串到beacon的反射dll阶段。
    transform-x86 {
		#在Beacon Reflective DLL之前插入一个字符串,防止通过dll前几个字节来检测
        prepend "\x90\x90\x90";
		#在Beacon Reflective DLL之中替换一个字符串,防止通过特定的字符串来监测
        strrep "ReflectiveLoader" "t1";		
        strrep "beacon" "test";
		#在Beacon Reflective DLL之后添加一个字符串,防止通过DLL最后几个字节来监测
	append "\x90\x90\x90";
        }

    transform-x64 {
        prepend "\x90\x90\x90";
        strrep "ReflectiveLoader" "t2";
        strrep "beacon" "test";
        append "\x90\x90\x90";
        }

**意思是:**将beacon字符串替换为test,将ReflectiveLoader 字符串替换为 t2

( 也可以是:strrep “beacon.x64.dll” “test”;)

注意: set sleep_mask “true”; #在睡眠时间对内存进行混淆。
默认是开启的,开启情况下,不能提取到内存特征,保存到本地的内存文件都是进行混淆的,如果是验证字符串特征是否修改成功,此处应该注释掉#set sleep_mask “true”;

在这里插入图片描述


我们先注释掉禁用的rwx权限,方便等下快速定位,实战中不要注释

在这里插入图片描述


修改完 template.profile 文件之后,需要使用 c2lint 验证一下 profile 文件是否可用,命令:

chmod 777 c2lint
./c2lint template.profile

返回内容如下图所示,说明 profile 文件可用

在这里插入图片描述


在KALI上,开启的时候加载 profile 文件,命令:

./teamserver 192.168.23.128 123 template.profile

成功加载如下图所示:

在这里插入图片描述


之后按照之前的步骤重新生成一个beacon:beacon-test2.exe,并且放在受害主机WIN10上运行

在这里插入图片描述


按照之前同样的步骤,找到beacon-test2.exe文件具有 RWX 权限的内存段,并保存到本地为:beacon-test2.exe.bin

在这里插入图片描述


在这里插入图片描述


使用写字板打开 beacon-test2.exe.bin 文件,搜索 beacon 、ReflectiveLoader 字符串均为空,搜索test如下图所示,说明内存字符串特征被成功修改。
注意: Profile 文件修改内存还有很多功能,此处不一一演示了,把注销的#的删掉,使其生效即可,其它修改功能就可以使用了

在这里插入图片描述


在这里插入图片描述

2.4 Profile 文件扩展修改HTTP流量特征

Profile 文件修改http流量特征功能默认是开启的,在之前实验基础上使用wireshark抓包即可,抓包之后搜索 http 协议,如下图所示,可以看到HTTP流量特征已经被修改,修改的内容与Profile 文件设置的一致

HTTP请求数据包:

在这里插入图片描述


HTTP响应数据包:

在这里插入图片描述


修改过后的http流量,很难判断与Cobalt Strike有什么关联,就像正常访问的文件流量一样

更多资源:
1、web安全工具、渗透测试工具、免杀工具
2、存在漏洞的网站源码与代码审计+漏洞复现教程、
3、渗透测试学习视频、应急响应学习视频、代码审计学习视频
4、应急响应真实案例复现靶场与应急响应教程
收集整理在知识星球,可加入知识星球进行查看。也可搜索关注微信公众号:W小哥

在这里插入图片描述

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...