一、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~

二、 HTTP and HTTPS 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有什么关联,就像正常访问的文件流量一样

三、 SMB Beacon的使用

前提条件:
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 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。

四、 DNS Beacon的使用

这里就不演示了,也很简单
参考链接:https://www.cnblogs.com/lalalaxiaoyuren/p/14117945.html

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

  1. linux系统sudoers文件夹权限777以及/etc/profile文件修改后无法进入系统问题

    有位博友在我的另外一篇文章中留言,关于修改/etc文件夹权限为777导致/etc/sudoers文件夹权限修改为777后无法使用 "sudo"指令,关于这个问题打算与误操作/etc ...

  2. linux etc profile生效,让/etc/profile文件修改后立即生效

    满意答案 姗姗860411 2016.09.02 采纳率:53%    等级:10 已帮助:1968人 让/etc/profile文件修改后立即生效方法1: www.dnjsb.com 让/etc/p ...

  3. Cobalt Strike|Beacon原理浅析

    Hello大家好哇,我是你们可爱的lmn小姐姐,今天我们来研究一下Beacon的一些基础知识,如果有师傅没有看过这个系列之前的文章,可以点击下方图片阅读. Cobalt Strike 作为一种后渗透工 ...

  4. 1、Cobalt Strike介绍与安装

    一.Cobalt Strike 使用 1.介绍 Cobalt Strike是一款超级好用的渗透测试工具,拥有多种协议主机上线方式,集成了提权,凭据导出,端口转发,socks代理,office攻击,文件 ...

  5. cobalt strike 的基础使用

    cobalt strike 的基础使用 本次实验环境靶场来自于暗月(moonsec)师傅,文中内容全由个人理解编制,若有错处,大佬勿喷,个人学艺不精:本文中提到的任何技术都源自于靶场练习,仅供学习参考 ...

  6. DAY41:Cobalt Strike 工具使用

    DAY41:Cobalt Strike 工具使用 1.Cobalt Strike 概述 ​ Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器. ​ 自 3.0 以后已 ...

  7. # Cobalt Strike: 使用进程内存解密流量-Part 3

    博客系列:Cobalt Strike:流量解密 Cobalt Strike:使用已知的私钥解密流量-Part 1 Cobalt Strike: 使用已知的私钥解密流量 - Part 2 Cobalt ...

  8. linux中etc目录下没有source,Linux /etc/profile文件详解及修改后如何立即生效(使用source命令)...

    Linux /etc/profile文件的改变会涉及到系统的环境,也就是有关Linux环境变量的东西,学习Linux要了解Linux profile文件的相关原理,这里对则以文件进行具体分析.这里修改 ...

  9. cobalt strike profile

    cobalt strike 配置解读 此处以最新版 jquery-c2.4.3.profile文件解析 适应Cobalt Strike 4.3 版本 其他版本会有标注 cobalt strike 4. ...

  10. Cobalt Strike Beacon 初探

    背景 RTO I 的课程结束了,Cobalt Strike 算是会用了.然后继上一篇文章之后,我还没有机会用 Cobalt Strike Beacon 做一下 Windows Defender Byp ...

最新文章

  1. 最强无监督行人重识别方法 Cluster Contrast ReID
  2. mysql_result()函数的简单使用
  3. python3读取excel方法封装_Python读取Excel的方法封装
  4. why we see different http status code like 404, 500. where are they handled
  5. 使用 Spring Cloud 实现微服务系统
  6. 王凯1987计算机系,计算机科学与技术系王凯:付出总有回报
  7. WinCE流设备驱动简介及GPIO驱动的实现
  8. java await signal_【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析...
  9. @keyframes关键帧动画(animation)
  10. vue项目中通过图片url下载图片
  11. 软考中级软件设计师该怎么备考
  12. 主站SOEM函数详解--SDO读写函数
  13. 京东联盟API接口-单页市场-提高商品转化率-京东高级API接口
  14. 深度操作系统20.6发布!
  15. 裁员潮下的打工人,怎么把手里的饭碗端稳?
  16. CMD查看Win10注册码
  17. 高速公路二维码定位报警系统
  18. 程序员学历不好是硬伤?苹果公司 50% 员工没大学学历
  19. w11 php 环境变量
  20. 什么是交叉检验(K-fold cross-validation)

热门文章

  1. Setting语言与输入法列表客制化
  2. 2019年日历 打印 备注_2010年日历:可打印的日历和墙纸
  3. vue中设置外部链接
  4. WindowsCMD配置代理
  5. 神武3 服务器维护公告,《神武3》手游本周更新后的调整内容抢先知
  6. python描述数据维度的含义_NumPy中的维度(dimension)、轴(axis)、秩(rank)的含义
  7. 移动硬盘数据错误循环冗余检查,要怎么恢复资料
  8. linux设置display参数,Linux DISPLAY 变量设置
  9. 终端服务器安全层在协议流中检测到错误,智能卡远程登录AD域环境下win7/2008,返回STATUS_LOGON_TYPE_NOT_GRANTED错误...
  10. QT之Button插入图片