某C2鸡肋漏洞分析:你的CS安全吗?

news2024/10/4 23:49:26

CobaltStrike是一个知名的红队命令与控制框架,采用Beacon <-> TeamServer <-> Client架构。TeamServer存在受限路径穿越写文件与反序列化漏洞,可以被认证后客户端恶意利用。Client存在反序列化漏洞,可以被RogueCS攻击。

山寨威胁建模

由于这个软件的特殊性,我们需要想想什么才是漏洞:

  1. 直接攻击TeamServer暴露的服务

  2. 通过Beacon攻击TeamServer

  3. 通过Client攻击TeamServer

  4. 通过TeamServer攻击Client

  • TeamServer控制Beacon是功能,任何所谓TeamServer攻击Beacon的操作都不能算漏洞

可以看出TeamServer是核心,先从它下手。

历史漏洞

  • in-the-wild

利用TeamServer从Beacon下载文件时,会将Beacon可控数据中的IP字段作为目录的特点,实现路径穿越写计划任务RCE。

  • CVE-2021-36798

利用TeamServer从Beacon加载截图和键盘记录时,会根据Beacon可控数据中的字节大小申请内存的特点,实现内存耗尽DoS。

  • CVE-2022-23317

猜测是为了兼容proxy的功能(路径为http://开头),没有对URL路径做严谨的校验。动态调试可以看出这会绕过profile相关配置,直接拿到公钥等数据:

图片

虚假的DoS

BeaconC2.process_beacon_data中存在一处利用条件比较苛刻的DoS。

...
int var4 = var3.readInt();
...
if (var4 > var3.available()) {
    return false;
}
...
byte[] var5 = new byte[var4];

受限路径穿越

图片

用来防止路径穿越的核心是CommonUtils.SafeFile方法,判断解析前后的路径是否还以限定前缀开头。这其实可以让我们向上穿越一级并得到前缀开头的文件对象:

图片

  •  CVE-2022-23457就是另一个例子

ManageUser.process为例,Client可以通过Host File功能上传文件到TeamServer并映射至Web服务,这会先发出一个armitage.upload进行预处理,随后由armitage.append上传文件数据。

图片

这里Client与TeamServer基于序列化通过socket通信,SafeFile的二参var1.arg(0)客户端可控,在UploadFile.result拼接上前缀就可以实现受限路径穿越写文件。然而这并没有什么卵用

this.conn.call("armitage.append", CommonUtils.args(this.file.getName()
|
V
this.conn.call("armitage.append", CommonUtils.args("../uploads"+this.file.getName()

图片

想到zip解压释放软链接那种套路,File确实可以透过软链接写入指向文件中,但这里似乎没法实现直接将用于路径穿越的软链接本身存进去。

反序列化

图片

反序列化核心是TeamSocket.readObject方法,实际使用的ObjectInputStream.readUnshared。它在ManageUser.run中被PostAuthentication.clientAuthenticated通过多线程拉起。

图片

client来自SecureServerSocket.acceptAndAuthenticate中接收的客户端数据,预检密码使用readUnsignedByte读入,在密码比对正确时会进入上述反序列化流程。

图片

在客户端Connect.dialogAction发起连接时可以向TeamServer传输序列化对象,如果服务端存在gadgets环境就可被恶意利用。

this.tqueue.call("aggressor.authenticate", CommonUtils.args(var3, var6, Aggressor.VERSION), this);
|
V
Object payload = getObject() // URLDNS, 7u21, ...
this.tqueue.call("aggressor.authenticate", CommonUtils.args(var3, var6, payload), this)
  • 看代码流程感觉作者是考虑到了的,所以将反序列化放到了认证后

随后ManageUser.process会将登录成功/失败的消息序列化写回客户端,我们可以把SecureServerSocket.authenticate改为任何密码都校验成功(欺骗客户端通过密码预检),再写回恶意序列化对象(成为RogueCS),如果客户端存在gadgets环境就可被利用。

...
if (!this.authenticated && "aggressor.authenticate".equals(var1.getCall()) && var1.size() == 3) {
...
    Object payload = getObject() // URLDNS, 7u21, ...
    this.client.writeObject(var1.reply(payload))
...

利用条件

Client攻击TeamServer的话,需要知道服务端的密码(比如通过泄漏/反制得到HOME目录下.aggressor.prop配置文件),而通过TeamServer则可以攻击任何前来连接的Client。

危害大小取决于运行环境中gadgets的能力,我目前还没在CS内置的lib中找到有实质危害的gadgets。对于原生JRE环境而言,可以通过DeserializationBomb造成CPU型DoS:

Set<Object> root = new HashSet<>();
Set<Object> s1 = root;
Set<Object> s2 = new HashSet<>();
for (int i = 0; i < 100; i++) {
    Set<Object> t1 = new HashSet<>();
    Set<Object> t2 = new HashSet<>();
    t1.add("foo"); // make it not equal to t2
    s1.add(t1);
    s1.add(t2);
    s2.add(t1);
    s2.add(t2);
    s1 = t1;
    s2 = t2;
}

图片

这个与之前OpenSSL的DoS效果类似,多核环境只会影响单核。相关上下文大都是局部变量,也不太可能通过反序列化造成内存型DoS。所以一般也就能打个DNS自嗨,但如果以前调试漏洞在jre/lib/ext之类的目录引入过危险依赖,或者有大聪明用了7u21就会导致RCE:

图片

CS内置了commons-iosleep等jar包,找到链也不是完全没有可能,或者找到一种可控方式从当前目录加载类,就能结合受限路径穿越变成RCE。万一山鸡变凤凰了呢(doge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

注册美区(US)IOS AppleId

根据这个操作&#xff1a; 【2024年】五分钟注册美区AppleID&#xff0c;手把手教&#xff0c;稳定且耐用&#xff01; - 知乎 (zhihu.com) 其中需要注意&#xff1a;付款方式&账单地址 的时候需要按照以下操作 总结&#xff1a; 1、通用-语言地区设置为us美国英语 2、…

eNSP学习——配置通过FTP进行文件操作

原理概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是在TCP/IP网络和Internet上最早使用的协议之一&#xff0c;在TCP/IP协议族中属于应用层协议&#xff0c;是文件传输的Internet标准。主要功能是向用户提供本地和远程主机…

[windows]win11任务管理器性能中N卡GPU看不到cuda进程Copy选项找不到cuda选项

正常情况下Copy里面有cuda选项&#xff0c;如图 对于不懂技术的人来说&#xff0c;有个误区&#xff0c;就是上图没有显示cuda选项就一定是cuda不能用吗&#xff1f;显然不是&#xff0c;这个选项只是方便在资源管理器展示cuda使用情况。如果在windows11你设置了一些东西则可能…

【LeetCode每日一题】2765. 最长交替子数组

2024-1-23 文章目录 [2765. 最长交替子数组](https://leetcode.cn/problems/longest-alternating-subarray/)思路&#xff1a; 2765. 最长交替子数组 思路&#xff1a; 计算给定数组中的最大交替子数组的长度。交替子数组是指相邻元素差值符号交替的子数组。代码通过两层循环遍…

为什么RISC-V的指令结构如此的奇怪

为什么RISC-V的指令结构如此的奇怪 RISC-V 有六种不同的指令集&#xff0c;如下图分别为 R-type / I-type / S-type / B-type / U-type / J-type 但是为什么像B-type的指令不将立即数的顺序排成类似于 imm[12:1] 而是要搞成像上图中分开的样子呢&#xff1f; 刚开始学习 RISC-…

Neos的渗透测试靶机练习——DarkHole-2

DarkHole-2 一、实验环境二、开始渗透1. 搜集信息2. git文件泄露3. SQL注入4. 提权 三、总结 一、实验环境 虚拟机软件&#xff1a;VirtualBox 攻击机&#xff1a;kali linux&#xff08;网卡初始为仅主机模式&#xff0c;要有安全意识&#xff09; 靶机&#xff1a;DarkHole-…

【数据结构】 顺序栈的基本操作 (C语言版)

目录 一、顺序栈 1、顺序栈的定义&#xff1a; 2、顺序栈的优缺点 二、顺序栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、顺序栈的初始化 4、顺序栈的入栈 5、顺序栈的出栈 6、取栈顶元素 7、栈的遍历输出 8、顺序栈的判空 9、顺…

记一次Flink通过Kafka写入MySQL的过程

一、前言 总体思路&#xff1a;source -->transform -->sink ,即从source获取相应的数据来源&#xff0c;然后进行数据转换&#xff0c;将数据从比较乱的格式&#xff0c;转换成我们需要的格式&#xff0c;转换处理后&#xff0c;然后进行sink功能&#xff0c;也就是将数…

Linux:vim的相关知识

目录 vim 是一个较为常见的编译文件的命令操作。 三种模式的区分的作用如下&#xff1a; 命令模式&#xff1a; 插入模式&#xff1a; 进入插入模式的标志&#xff1a;左下角有INSERT 底行模式&#xff1a; 命令模式的常见命令&#xff1a; 底行模式常见命令&#xff1…

解析找不到msvcr110.dll,无法继续支持此代码的多种修复方法

当你在运行某些应用程序或游戏时&#xff0c;可能会遇到"找不到msvcr110.dll无法继续执行"的错误信息&#xff0c;这通常表明系统中缺少某个重要文件。为了解决这个问题&#xff0c;让我们先探讨为什么会发生这种情况。只要了解了&#xff0c;我们才能用更多的方法去…

JAVA 学习 面试(六)数据类型与方法

数据类型 基本数据类型 为什么float3.4报错 3.4 默认是浮点double类型的&#xff0c;如果赋值给float是向下转型&#xff0c;会出现精度缺失&#xff0c;&#xff0c;需要强制转换 Switch支持的数据类型&#xff1f; byte、short、int、char 、 enum 、 String 基本类型与包…

Git的merge和rebase你真的了解吗?

1. 前言 在我们的日常开发中&#xff0c;Git扮演着重要的角色&#xff0c;负责管理代码的版本。分支管理在开发过程中具有显著的影响。通常情况下&#xff0c;我们有生产、预发、测试和开发这几种分支。根据项目的不同阶段&#xff0c;我们会将代码提交到相应的版本上。标准的…

OpenGL ES 实现图像腐蚀、膨胀、边缘检测

前文我们详细讲了图像锐化的基本原理,本文再介绍一下图像基本处理之腐蚀、膨胀和边缘检测,它们在图像处理和计算机视觉领域有着广泛的应用。 图像腐蚀(Image Erosion):用于缩小或消除图像中物体的边界。主要用于去除图像中的小细节、噪声或不规则物体。 实现图像腐蚀的片…

【Android 10】 BatteryController

学习了一下电池的相关模式&#xff0c;也就是它的观察者模式&#xff0c;先附上图 图应该挺清晰的&#xff0c;BatteryControllerImpl就是被观察者&#xff0c;BatteryControllerImpl重写了CallbackController的两个方法用于添加或移除观察者。 void addCallback(T listener);…

编码下的雪景:如何用HTML和JS让雪花在屏幕上舞动

这段时间&#xff0c;全国各地都加入了下雪的队伍当中&#xff0c;看着窗外漫天飞雪&#xff0c;想着我的网站上面也来一场雪吧。正琢磨着如何实现&#xff0c;网上突然蹦出来一段下雪的代码&#xff0c;这不正是我要的么&#xff1f;先来看看效果吧。 效果一 效果二 效果三 要…

7.Feign远程调用

2.Feign远程调用 先来看我们以前利用RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; •代码可读性差&#xff0c;编程体验不统一 •参数复杂URL难以维护 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenF…

Modbus通信无法正确接收应答的问题处理

问题现象&#xff1a; 现场反馈&#xff0c;modbus网关无法正确读取就地设备的温度信息。使用PC连接就地设备可以正常读取。 问题调查&#xff1a; 拿到末端设备后&#xff0c;故障现象可重复&#xff0c;不过使用PC的USB转485适配器也无法正常读取数据。 如下图&#xff1…

不要为了学习而学习

经常有朋友问我&#xff1a; 老师&#xff0c;从您这里学了很多方法&#xff0c;也一直想要改变自己&#xff0c;但总是没办法坚持下去&#xff0c;怎么办&#xff1f; 这个问题&#xff0c;我也很无奈啊。毕竟我也没办法飞到你身边&#xff0c;手把手把每一步都教给你。&…

万字长文详解Java线程池面试题

王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠 加入 Java 人的提桶跑路群&#xff1a;共同富裕的Java人 今天是《面霸的自我修养》第 6 篇文章&#xff0c;我们一起来看看面试中会问到哪些关于线程池的问题吧。数据来源&#xff1a; 大部分来自于各机构&#xff08;J…

编程入门:五个你必须知道的编程常识

常识1&#xff1a;编程不仅仅是写代码 当我们谈论编程时&#xff0c;大多数人首先想到的是写代码。这是正确的&#xff0c;但并不完整。编程不仅仅是写代码&#xff0c;而是解决问题的一种方式。编程是一种工具&#xff0c;我们使用它来创建能够解决特定问题的产品和服务。 比…