Cobalt Strike Beacon 初探

news2024/11/17 2:45:19

背景

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

另外,我也想问一下我自己,Cobalt Strike 里面最基本的 payload - beacon,你了解清楚了吗?

所以今天,我就花点时间给自己解惑,同时也提出更多问题往后深入。

接下来先对 Beacon 做下逆向,看一下 HTTP Beacon 大致上都做了什么。

Beacon

创建一个基于 HTTP Listener 的 64位 beacon。

在这里插入图片描述

看一下文件格式,64位 PE 文件。

在这里插入图片描述

看到 PE 头。

xxd beacon.exe | less -S

在这里插入图片描述

这一段 bOb 很有意思,可以用作 Signature Detection 吗?

在这里插入图片描述

strings 一下看到了使用了哪些方法。

在这里插入图片描述

使用了哪些 dll。

在这里插入图片描述

在 IDA 里具体看一下。

创建命名管道

拖到 IDA。
在这里插入图片描述

从进度条长度来看,HTTP beacon 的复杂度并不高(也有可能是我什么都不懂,错的离谱)。
在这里插入图片描述

逆向的能力不是很强,所以先随便看看。

我的思路是能不能找到相关 API,如 VirtualAlloc,CreateThread 之类的字符串,或者是参数的字符串也行。所以我就一个一个点开看了一下。

运气比较好的是,在第四个 entry 就找到了。

如图,StartupInfoCreateProcessA API 的参数。

CreateProcessA 方法原型。

BOOL CreateProcessA(
  LPCSTR                lpApplicationName,
  LPSTR                 lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL                  bInheritHandles,
  DWORD                 dwCreationFlags,
  LPVOID                lpEnvironment,
  LPCSTR                lpCurrentDirectory,
  LPSTARTUPINFOA        lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

找到了 StartupInfo,就意味着找到了 CreateProcess

在这里插入图片描述

接着往下看,不一会儿看到了 GetProcAddress API。

在这里插入图片描述

调用之后检查 eax 返回值,如果是 0 表示成功,跳到 loc_4012A1

接着一个一个翻看左边的方法名列表。

sub_401795 找到了 CreateThread 方法。看到了默认的 pipe name

拼接完成之后,应该是 \\.\pipe\MSSE-XX-server

在这里插入图片描述
其中 xx 是一个数字跟 ecx 中的数值 (0x26AA -> 9898)做除法运算(实际是取模),最后取了 EDX 中的余数作为 xx 的值。

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

这里创建了一个线程并执行。看一下到底启动了一个什么样的线程。跟进 sub_401685,那里是执行代码的起始地址。

在这里插入图片描述

再跟进 sub_4015D0

在这里插入图片描述
所以,上面的 CreateThread 方法,是创建一个命名管道,用来写入和读取数据,命令执行的结果应该就是通过管道来获取的。第一步完成,HTTP Beacon 首先创建了一个命名管道,管道名称就是上面看到的

\\.\pipe\MSSE-XX-server

继续跟进代码,看下一步做了什么操作。

连接命名管道

创建完了命名管道(如果创建成功),紧接着就是执行 ConnectNamedPipe 连接该命名管道。
在这里插入图片描述

这里开始网管道里面写数据。

在这里插入图片描述

写数据有了,读取在哪里呢?

继续往下找,可以看到这里调用了 CreateFileA API。

在这里插入图片描述

这里 dwCreateionDisposition 设置为 0x3

查看官方文档,这个设置是会打开一个已经存在的文件或者设备。

在这里插入图片描述

猜想这里是用 CreateFileA 打开了已经创建好的管道。

然后通过 ReadFile API 读取数据。

在这里插入图片描述

唯一可以说明这里打开的文件就是之前创建的管道的指标,就是这个 Buffer (lpFileName) 参数。

在这里插入图片描述
双击点进去,可以看到他指向了 sub_4015D0

在这里插入图片描述
sub_4015D0 正是创建命名管道的方法。

在这里插入图片描述

进一步可以判定,这个 Buffer 就是管道名,ReadFile 就是读取了该管道的数据。

Beacon HTTP 请求?

接下来,我想找到诸如 IP 地址,端口,从而找到 HTTP 请求的代码。

结果通过 IP 地址找不到。

在这里插入图片描述

返回去看 strings 命令的输出,确实没有看到跟 HTTP 或者 Socket 连接相关的方法或者是 DLL。
在这里插入图片描述

在这里插入图片描述

而如果看一下 msfvenom 生成的 payload。

msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=127.0.0.1 LPORT=443 -f exe -o msf.exe

strings msf.exe

可以很清楚看到诸如 WSADuplicateSocketAWinHTTPConnect 等方法,也看到了 WS2_32.dll

在这里插入图片描述

有点疑惑。

拖到 windows 机器上用 WinDBG 看一下。

在这里插入图片描述

看来 strings 不能列出运行期间会加载的 dll。

在 WindDBG 里面看到了 winhttp.dllWS2_32.dll

在这里插入图片描述

选择 WS2_32.dllrecv API 上打个断点试一下。

bp ws2_32!recv

在这里插入图片描述

发送一条命令看一下能不能触发断点。

在这里插入图片描述

断点触发了。其实每隔5秒就会触发断点,因为 beacon 会 checkin,就算没有命令可以执行,C2 Server 也会发送相应的 response。

在这里插入图片描述

sleep 没有输出。再执行一个 whoami 看一下怎么发送命令结果的。

在这里插入图片描述

再次触发断点。单步执行。

今天告一段落,找时间继续。还要验证一下上面所说的读取数据的 CreateFileA 方法。

总结

这篇文章对 Beacon 做了一些比较简单的分析。开个头先,之后还会不断深入。

KEEP CALM AND HACK AWAY!

参考链接

  • https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/windows-x64-calling-convention-stack-frame
  • https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
  • https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
  • https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread
  • https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpconnect
  • https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaduplicatesocketa
  • https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
  • https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsastringtoaddressw
  • https://decoded.avast.io/threatintel/decoding-cobalt-strike-understanding-payloads/
  • https://docs.oracle.com/cd/E19455-01/806-3773/6jct9o0am/index.html#:~:text=div%20executes%20unsigned%20division.,AH%2C%20Dx%2C%20or%20EDX.

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

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

相关文章

Springboot+Netty实现基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-应用订阅端(北向应用)

之前实现了使用SpringbootNetty基于天翼物联网平台CTWing(AIOT)终端TCP协议(透传模式)-设备终端(南向设备),模拟设备发送的数据给到了AIOT平台,那么在第三方应用也需要去订阅AIOT平台的数据,以及对设备进行下发指令(消…

FastGithub的下载和使用

前言 github访问很不稳定,时断时续,有时候根本打不开! 下载 方式一:官方地址下载(有及时更新) FastGithub1.1.7下载、FastGithub2.1.4_windows、FastGithub2.1.4_Linux、 更多 方式二:本地上传…

[编程语言][C++][Qt]单独添加UI文件

单独添加UI文件问题描述解决方案1. 添加UI文件2. 与对应的界面类进行关联3. 修改UI文件4. 设置界面类读取UI文件总结问题描述 不知什么原因,Qt Creator并不是很完美很智能。当先写好界面类的头文件和源代码文件后,我们再添加用于可视化界面设计的UI文件…

美国顶级在线教育平台泄露22TB数据

©网络研究院 事件发生时,属于美国“三大”教育出版商之一的麦格劳希尔教育(McGraw Hill) 的两个配置错误的 AWS S3 存储桶在没有任何安全认证的情况下暴露在外。 vpnMentor 的网络安全研究人员发现了几个配置错误的 Amazon Web Services (AWS) S3 存储桶&…

RV1126笔记二十一:车辆颜色识别

若该文为原创文章,转载请注明原文出处。 一、介绍 在学习RV1126的过程中,测试了yolov5可以实现物体检测,物体目标识别等功能,Rock-X也自带了车牌识别功能,具体可以了解下正点原子的资料,里面有详细的介绍,这里介绍一个如何识别车辆颜色。只是提供一个思路,效果不是很…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 4.5 工作模式总结

RabbitMQ 【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.4 Topic 通配符模式4.4.1 模式说明4.4.2 代码编写4.4.3 小结4.5 工作模式总结第一天 基础 4 RabbitMQ 的工作模式 4.4 Topic 通配符模式 …

人工智能期末复习:人工神经网络(详细笔记和练习题)

文章目录1.概述2.基本单元-神经元3.激活函数3.1.阶跃函数3.2.Sigmoid函数3.3.TanH函数3.4.ReLU函数3.5.Softplus函数4.多层前馈神经网络5.损失函数5.1.均方误差5.2.交叉熵6.调参方法6.1.梯度下降法1.概述 神经网络定义:神经网络是具有适应性的简单单元组成的广泛并…

vue3 ant design vue——修改table表格的默认样式(css样式穿透)(一)调整table表格每行(row)行高过高问题

vue3 antd项目实战——修改ant design vue table组件的默认样式(调整每行行高)知识调用场景复现实际操作解决a-table表格padding过宽知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vue组件库引入】css样式穿透(…

基于 Traefik 的 ForwardAuth 配置

前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易。 Traefik 可以与现有的多种基础设施组件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地…

【移动安全】—apk反编译基础及静态分析

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

逛逛JVM的“后花园“: 让我来戏弄戏弄字节吧

开篇瞎哔哔 这篇文章不打算放在任何一个系列里面,纯粹是个人对这方面比较感兴趣才写的,在日常的工作中,也不会用到关于这块的知识,但是,我希望如果有小伙伴和我一样,想对字节码杠一杠的,那么这…

Python pandas库|任凭弱水三千,我只取一瓢饮(5)

上一篇链接: Python pandas库|任凭弱水三千,我只取一瓢饮(4)_Hann Yang的博客-CSDN博客 S~W: Function46~56 Types[Function][45:] [set_eng_float_format, show_versions, test, timedelta_range, to_…

BUUCTF Misc [ACTF新生赛2020]NTFS数据流 john-in-the-middle [ACTF新生赛2020]swp 喵喵喵

目录 [ACTF新生赛2020]NTFS数据流 john-in-the-middle [ACTF新生赛2020]swp 喵喵喵 [ACTF新生赛2020]NTFS数据流 下载文件 得到500个txt文件,提示了NTFS流隐写,所以使用NtfsStreamsEditor2查看 得到flag flag{AAAds_nntfs_ffunn?} jo…

mybatis-plus代码生成器AutoGenerator

文章目录前言一、给指定的模块生成代码1.1 创建maven模块1.2 导入依赖1.3 代码生成类1.4 测试二、给指定的项目生成代码2.1 创建maven项目2.2 导入依赖2.3 代码生成类2.4 测试三、步骤区别前言 AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以…

一文弄懂 React 生命周期

1. 类组件生命周期原理 React 中有两个核心阶段: 1.调和 (render) 阶段遍历 Fiber 树,通过 diff 算法找出变化的部分,如果是组件则会执行其 render 函数进行更新2.commit 阶段根据调和的结果去创建或修改真实 DOM 节点生命周期是贯穿在一个…

C++ Primer 课后习题详解 | 2.1.1 算术类型

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

Python pandas库|任凭弱水三千,我只取一瓢饮(6)

上一篇链接: Python pandas库|任凭弱水三千,我只取一瓢饮(5)_Hann Yang的博客-CSDN博客 DataFrame 类方法(211个,其中包含18个子类、2个子模块) >>> import pandas as p…

Python pandas库|任凭弱水三千,我只取一瓢饮(1)

对Python的 pandas 库所有的内置元类、函数、子模块等全部浏览一遍,然后挑选一些重点学习一下。我安装的库版本号为1.3.5,如下: >>> import pandas as pd >>> pd.__version__ 1.3.5 >>> print(pd.__doc__)pandas…

Google Earth Engine APP(GEE)——再地图上加载各种选择器

本次我们尝试将GEE UI中的小组件进行加载,让其设定在特定的面板上,并且加载到地图上,先看一下我们最终成型的效果, 文中代码所使用到的函数: ui.Select(items, placeholder, value, onChange, disabled, style) 带有回调的可打印选择菜单。 参数: 项目(列表<对象…

day29【代码随想录】回溯之组合总和、组合总和||

文章目录前言一、组合总和&#xff08;力扣39&#xff09;剪枝优化二、组合总和II&#xff08;力扣40&#xff09;前言 1、组合总和 2、组合总和|| 一、组合总和&#xff08;力扣39&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0…