Cobalt Strike DNS Beacon使用

news2024/11/27 2:33:53
  • 0. 前言

  • 1. 实验运行流程

  • 2. 环境搭建

    • 2.1.1 安装虚拟机软件VMware……大家应该都有装吧,这里就不教了

    • 2.1.2 Windows 10虚拟机(受害机)

    • 2.1.3 Ubuntu虚拟机(攻击机)

    • 2.1 安装虚拟机

    • 2.2 安装Java

    • 2.3 安装Docker

    • 2.4 安装Golang

  • 3. 实操

    • 3.1 运行CS服务端

    • 3.2 运行CS客户端

    • 3.3 运行Golang程序(DNS代理)

    • 3.4 生成木马

    • 3.5 动态更新DNS代理

0. 前言

  • 大家好,我是掌控安全-念旧,今天教大家使用Cobalt Strike建立DNS隧道

    • 需要隐蔽性

    • 需要绕过限制性网络(例如防火墙)

    • 不需要很快的响应速度

    • 响应速度慢(假设,你执行一个whoami,几分钟后才会响应回显结果,这可能会使人抓狂),和打游戏的时候 网太卡是一个道理

    • 一种“偷渡”技术,隐蔽性好,在受害主机上不会开放任何端口,可以规避防火墙,并在具有限制性出口控制的网络中建立C2通道

    • DNS隧道的优点

    • DNS隧道的缺点

    • DNS隧道的适用场景

1. 实验运行流程

  1. Windows 10受害机运行木马,发送DNS请求

  2. Ubuntu使用Go语音编写的程序,启动DNS服务器,用于接收DNS请求,并将不同CS生成的payload转发到相应的Docker容器当中

  3. 最后,Docker容器中的Cobalt Strike接收到DNS请求,就会和木马建立连接,控制Windows 10机器,也就是我们俗称的“上线”

  • 我画了一个大概的架构图,感觉有点丑,见谅(我没有VIP,所以有水印,原谅我)

    图片

2. 环境搭建

  • 本次实验采用 虚拟机+Docker+Golang的形式,不需要云服务器之类的东西

  • 需要用到的一些东西我都放到文章末尾的附件里面了,可以自行下载

    • 用于搭建DNS代理,将Ubuntu上的DNS请求转发到Docker中的CS

    • 搭建在Ubuntu中,运行Cobalt Strike服务端,也就是teamserver,用于模拟不同的teamserver服务器

    • Ubuntu,作为攻击机,运行Cobalt Strike客户端,用于管理teamserver、生成木马等操作

    • Windows 10,作为受害机

    • 虚拟机

    • Docker

    • Golang

  • 你不需要学习Docker或Golang,只需要安装虚拟机、运行命令、会使用鼠标即可

2.1 安装虚拟机

2.1.1 安装虚拟机软件VMware……大家应该都有装吧,这里就不教了

图片

2.1.2 Windows 10虚拟机(受害机)

  • 提示:如果你的电脑配置较低,带不动2台虚拟机,你可以使用物理机 作为受害机,就不需要额外再装一台虚拟机

  • Win10的镜像可以到:https://msdn.itellyou.cn/ 进行下载,使用的是迅雷,下载贼快,不用受某盘vip的气

  • 你也可以选择其他版本的Win10,或者使用Win7也可以,不一定要下载我图片中的

图片

图片

  • 镜像下载完成之后,创建Win10虚拟机即可(大家应该都会吧……吧)

    • 配置建议高一点,不然会很卡,我这里分配了3G内存、2个CPU、网络为VMnet8

图片

  • 进入Win10之后,先把自带的杀毒软件Windoes Defender关闭

    • 杀软会把我们的木马给杀掉

    • 由于免杀不在文章的范畴内,所以我这里不做免杀(可以自行尝试)

图片


 

图片


 

图片

图片

2.1.3 Ubuntu虚拟机(攻击机)

  • Ubuntu的镜像可以到:http://old-releases.ubuntu.com/releases/20.04/ 进行下载,不一定要20.04版本的,其它版本的也可以

图片

  • 和Win10一样,也可以用迅雷下载,嘎嘎快,这里直接给出下载链接,粘贴进去即可:http://old-releases.ubuntu.com/releases/20.04/ubuntu-20.04.4-desktop-amd64.iso

图片

  • 进入Ubuntu之后,打开命令行,运行apt安装vim,方便之后操作(可能会提示权限不够,可以使用命令sudo -i提升为root用户)

     
      
    1. apt -y install vim

图片


 

图片

图片

2.2 安装Java

  • 由于Cobalt Strike依赖Java,所以我们要在Ubuntu上配置Java环境

  1. cd进入/usr/local/目录

  2. 运行wget命令,下载jdk8压缩包

  3. 解压,并将目录名修改为jdk8,方便操作

  4. 修改/etc/profile配置文件,为jdk配置环境变量

 
  1. cd /usr/local/

  2. wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz

  3. tar -xvf jdk-8u202-linux-x64.tar.gz

  4. mv jdk1.8.0_202 jdk8

  5. vim /etc/profile

  6. export JAVA_HOME=/usr/local/jdk8/bin:/usr/local/jdk8/lib:/usr/local/jdk8/jre/bin

  7. export PATH=$PATH:$JAVA_HOME

图片


 

图片

图片

  • 使用source命令刷新配置文件

  • 运行java,检查是否安装成功

     
      
    1. source /etc/profile

    2. java -version

图片

2.3 安装Docker

  • 运行apt安装curl,运行curl安装Docker(可能有点慢,需要耐心等待)

 
  1. apt -y install curl

  2. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

图片

图片

  • 安装完成后,运行命令检查是否安装成功

     

    图片

    1. docker -v

2.4 安装Golang

  1. 进入/usr/local/目录

  2. 使用wget命令进行下载

  3. 解压Golang压缩包

  4. 修改/etc/profile,配置Golang环境变量(在配置Java的基础上添加:/usr/local/go/bin即可)

  5. 刷新配置文件,运行go,检查是否成功

 
  1. cd /usr/local/

  2. wget https://golang.google.cn/dl/go1.19.3.linux-amd64.tar.gz

  3. tar -xvf go1.19.3.linux-amd64.tar.gz

  4. vim /etc/profile

  5. export PATH=$PATH:$JAVA_HOME:/usr/local/go/bin

  6. source /etc/profile

  7. go version

图片


 

图片


 

图片

图片

  • 另外,由于Golang默认使用国外的源,导致下载一些模块的时候会非常慢

  • 修改/etc/profile,修改源,改为国内代理

 
  1. vim /etc/profile

  2. export GO111MODULE=on

  3. export GOPROXY=https://goproxy.cn

  4. source /etc/profile

图片

3. 实操

3.1 运行CS服务端

  • 我已经将cs打包成了docker镜像(Cobalt Strike4.4 + openjdk8)

  • 请移步文章末尾的附件进行下载

  1. 将docker镜像复制到Ubuntu虚拟机当中

    图片

  2. 导入docker镜像,并查看是否导入成功(需要root权限)

     

    图片

    1. docker load < cs4.4.tar

    2. docker images

  3. 使用刚刚导入的镜像,运行2个cs容器

    • run,运行一个容器

    • —rm,在退出容器之后,自动清理这个容器

    • —it,给容器一个shell终端,使我们可以和容器进行交互

    • —name,给容器取一个名字 叫cs1

    • -p,映射Ubuntu的2021端口 —> 容器的80端口(该端口用于CS的DNS监听器,DNS使用的是udp协议,而docker默认映射tcp,所以要指定udp协议)

    • -p,映射Ubuntu的50051端口 —> 容器的50050端口

    • cs:open,使用的镜像名称

       

      图片

    1. docker run --rm -it --name cs1 -p 2021:80/udp -p 50051:50050 cs:open

    2. docker run --rm -it --name cs2 -p 2022:80/udp -p 50052:50050 cs:open

  4. 在2个cs容器当中,进入/usr/local/cs4/目录

    • 运行teamserver,监听ip为192.168.80.133,密码为123456

    • 注意,这里的ip是指Ubuntu的ip地址,而不是容器的ip地址

 
  1. cd /usr/local/cs4/

  2. ./teamserver 192.168.80.133 123456

图片

  • 查看Ubuntu端口状态,可以看到2021、2022、50051和50052端口

    图片

  • 此时端口状态就如同:

    图片

3.2 运行CS客户端

  • 在文章末尾附件进行下载,cs4.4版本的压缩包(不知道有没有后门,建议在虚拟机里面运行)

  1. 在物理机上解压cs4.4的压缩包,复制到Ubuntu当中

    图片

  2. Ubuntu在cs4.4目录中打开命令行界面,运行start.sh启动客户端

    图片

  3. 连接50051端口的CS(容器cs1)

    • 用户名@ip(用户名随意填写)

    • Host:填Ubuntu的ip

    • 端口

    • 用户名(随意填写)

    • 密码是在运行teamserver的时候设置的,我这里是123456
       

      图片

      图片

  4. 点击左上角的新建连接,连接50052端口的CS(容器cs2)
     

    图片

    图片

  5. 连接成功后,你可以点击选项卡,在两个CS之间进行切换

    图片

  6. 选择test1,新建一个监听器

    • 类型为DNS

    • 域名为zkaq1.com(可以自定义)

    • ip为Ubuntu的ip地址,为192.168.80.133
       

      图片


       

      图片


       

      图片

      图片

  7. 选择test2,新建一个监听器

    • 类型为DNS

    • 域名为zkaq2.com(也可以自定义,但是要和test1不同,不能重复)

    • ip也是192.168.80.133
       

      图片

      图片

3.3 运行Golang程序(DNS代理)

  • 在文章末尾附件进行下载,dns_proxy.go

  1. 将dns_proxy.go复制到Ubuntu当中

    图片

  2. 进入文件所在目录,运行go mod init zkaq初始化当前目录

  3. 运行go get,获取所需要的第三方包

     

    图片

    1. go mod init zkaq

    2. go get github.com/miekg/dns

  4. 创建proxy.config文件,这是程序的配置文件

    • 将zkaq1.com的所有请求,转发到Ubuntu本地的2021端口,由于Docker端口映射的缘故,该请求最终会被转发到容器cs1的80端口

    • 将zkaq2.com的所有请求,转发到Ubuntu本地的2022端口,由于Docker端口映射的缘故,该请求最终会被转发到容器cs2的80端口

       

      图片

    1. zkaq1.com,127.0.0.1:2021

    2. zkaq2.com,127.0.0.1:2022

  5. 在运行Go程序之前,由于Ubuntu自带一个dns服务,会占用53端口,所以要提前将其关闭,把53端口空闲出来

     

    图片


     

    图片


     

    图片


     

    图片

    图片

    1. systemctl stop systemd-resolved

    2. systemctl disable systemd-resolved

    3. vim /etc/systemd/resolved.conf

    4. ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  6. 运行Go程序

     

    图片

    1. go run dns_proxy.go

  7. 在Win10受害机上,ping一下Ubuntu测试网络连通性

  8. 使用nslookup,指定dns服务器为Ubuntu,查询2个域名,如果查询成功,说明Go运行的DNS代理正常

图片

图片

  • 在Ubuntu中可以看到DNS查询记录,说明DNS运行正常

  • 如果你的CS和DNS一切正常,但是就是查询不到DNS记录,请查看你的docker容器,2021:80和2022:80端口是否映射为udp协议(步骤3.1的第3步)

    图片

3.4 生成木马

  • 现在可以生成恶意程序,然后放到受害机里面去执行

  1. 生成cs1的.exe恶意程序
     

    图片


     

    图片


     

    图片

    图片

  2. 生成cs2的.exe恶意程序
     

    图片


     

    图片

    图片

  3. 将2个恶意程序复制到受害机,然后分别双击运行

    • 记得把杀毒软件都退了,因为这里没有做免杀

    • 防火墙可以不用理

      图片

  • 小技巧:如果你无法在虚拟机和物理机之间复制文件,可以使用python3在当前目录启动一个http服务器,然后进行下载

     

    图片

    图片

    1. python3 -m http.server --bind 192.168.80.133 2222

4. 运行这2个程序之后,可以在CS中看到已经有记录了,右键这2条记录,选择Session -> Sleep,修改为1
 

图片


 

图片


 

图片

图片

5. 等待一段时间,当你看到Go程序中的输出 在2个域名之间反复横跳的时候,就说明成功了,在CS中可以看到主机已经上线
 

图片

图片

6. 尝试远程执行系统命令
 

图片

图片

7. 虽然能够执行命令,但是前面说过,DNS隧道响应速度比较慢,我这里执行whoami并获得回显结果仅需要1-2秒,但是执行一个net user花费了3-5分钟,是真的慢……所以在实战中,如果没什么特殊情况或要求,尽量不要使用DNS隧道,网卡会把你气死

图片

  • 在受害机上查找2个进程的端口号,你会发现根本没有,因为DNS隧道在受害机上面不需要监听端口,因此隐蔽性会比较好。再给.exe文件改个常见的名称,例如svchost.exe之类的,就真的很隐蔽了

    图片

3.5 动态更新DNS代理

  • 如果你想修改配置文件proxy.config,往其中添加一条代理,那你添加完以后就必须重启dns_proxy.go程序,也就是重启DNS代理服务器。重启DNS会中断现有连接,严重的话还可能会丢失记录(丢失这台主机的shell)

  • dns_proxy.go程序实现了动态加载配置文件的功能,可以让你在程序运行的同时修改配置,并自动加载新的配置,而不用重新启动(什么?你说我好厉害,写出了那么nb的程序?那当然…不是我写的啦,我这个菜鸡不配)

  1. 运行一个新的容器cs3,启动teamserver,使用客户端进行连接

    图片

  2. 新建监听器,这次监听zkaq3.com

    图片

  3. 修改配置文件proxy.config,添加zkaq3.com的记录
     

    图片

    图片

  4. 运行命令nslookup查询zkaq3.com,提示查询不到

    图片

  5. 查询dns_proxy.go进程的PID号,使用kill -10命令通知进程,使其刷新配置。运行kill之后,你会在go程序的输出当中看到 已经重新加载了配置
     

    图片

    图片

  6. 这时候再次使用nslookup查询zkaq3.com,已经能够查询到记录,成功

    图片

  申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

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

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

相关文章

通过管理系统进行升级怎么选?

现在通过系统来做办公效率提升的又很多&#xff0c;但怎么选&#xff0c;确实很关键。 我们是在去年年初的时候进行企业系统化的。当时刚摘下口罩&#xff0c;领导也是意识到团队办公的不便&#xff0c;数据管理的混乱&#xff0c;业务流转的低效等原因&#xff0c;开始寻找各…

数据结构——链表专题3

文章目录 一、判断链表是否有环二、返回入环的第一个节点三、随机链表的复制 一、判断链表是否有环 原题链接&#xff1a;判断链表是否有环 这道题可以使用快慢指针&#xff0c;fast一次走两步&#xff0c;slow一次走一步&#xff0c;如果有环&#xff0c;它们在环里面必定会…

SAP-ABAP-视图

1、什么是视图&#xff1f; 当需要查询多个表中的某些字段的数据时&#xff0c;就可以使用视图。视图不影响数据库中的数据&#xff0c;仅作为查询手段或工具。 2、视图类型&#xff1a; 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-计算机与组成原理

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐⭐ &#x1f3b6;&#xff08;1) 考点6&#xff0c;流水线 考点&#xff1a;流水线相关的计算 可…

《QT实用小工具·六十》Qt 多列时间轴控件

1、概述 源码放在文章末尾 Qt 多列时间轴控件。 可与多段字符串格式自由转换&#xff0c;也可手动添加列表项。 专门用来以时间轴作为事件线发展顺序的故事大纲。 特点 时间背包功能&#xff1a;记录所有物品或属性发生的变化&#xff0c;随时回溯 时间可输入任意内容&…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC&#xff08;系统级芯片&#xff09;处理器&#xff0c;适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU&#xff0c;集成了GPU、MCU、NPU、VPU等多种计算核心&#xff0c;并具有丰富的外…

我的256天之创作纪念日

目录 时光 数据的一些变化 开心的事 憧憬 时光 自上次CSDN的消息推送&#xff0c;又一个128天过去了&#xff0c;整天的工作和生活都在忙忙碌碌中度过&#xff0c;每到能静下来片刻&#xff0c;都倍感珍惜。因为一些原因&#xff0c;能够陪伴家人的时间越来越少&#xff…

【LLM 论文】OpenAI 基于对比学习微调 LLM 得到嵌入模型

论文&#xff1a;Text and Code Embeddings by Contrastive Pre-Training ⭐⭐⭐⭐ OpenAI 一、论文速读 这篇论文基于大型生成式 LLM 通过对比学习来微调得到一个高质量的 text 和 code 的 embedding 模型。 训练数据的格式&#xff1a;是一堆 ( x i , y i ) (x_i, y_i) (x…

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能&#xff0c;并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发&#xff0c;所以在Windows系统上选用Nginx作为负载均衡&#xff0c;需要考虑并发情况。 若并发需求低于 300&#xff0c;部署集群仅以…

Spring的基本应用

概述&#xff1a;Spring是由Rod Johnson组织开发的一个分层的java SE/EE一站式的轻量级开源框架&#xff0c;以IOC(控制反转)和AOP&#xff08;面向切面&#xff09;为核心&#xff0c;的开发模式。 注&#xff1a;喜欢的朋友可以关注公众号“JAVA学习课堂”系统学习相关技术&a…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引&#xff0c;是通过分词策略&#xff0c;形成了词和文章的映射关系表&#xff0c;这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤&#xff1a; 心跳检测&#xff1a; 每个节点…

【消息队列】MQ介绍

MQ MQ&#xff08;MessageQueue&#xff09;&#xff0c;中文是消息队列&#xff0c;就是存放消息的队列&#xff0c;也是下面提到的事件驱动架构中的Broker 同步调用的优点&#xff1a; 时效性强&#xff0c;可以立即得到结果 同步调用的问题&#xff1a; 耦合度高性能和吞吐…

基于 llama2 的提示词工程案例2

优化大型语言模型&#xff08;LLMs&#xff09; 优化大型语言模型&#xff08;LLMs&#xff09;中的提示词&#xff08;prompts&#xff09;是提高模型性能和输出相关性的重要手段。以下是一些优化提示词的方向&#xff1a; 明确性&#xff1a;确保提示词清晰明确&#xff0c;…

【Java 刷题记录】前缀和

前缀和 25. 一维前缀和 示例1&#xff1a; 输入&#xff1a; 3 2 1 2 4 1 2 2 3输出&#xff1a; 3 6import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(S…

【强化学习】公平性Actor-Critic算法

Bringing Fairness to Actor-Critic Reinforcement Learning for Network Utility Optimization 阅读笔记 Problem FormulationLearning AlgorithmLearning with Multiplicative-Adjusted RewardsSolving Fairness Utility Optimization Evaluations 在网络优化问题中&#xff…

PyGame 文字显示问题及解决方法

在 Pygame 中显示文字时可能会遇到一些问题&#xff0c;例如文字显示不清晰、字体不正确或者文字位置不准确等。以下是一些常见的问题及其解决方法&#xff0c;具体情况可以看看情况。 1、问题背景 一位用户在使用 PyGame 库进行游戏开发时&#xff0c;遇到了一个问题&#xf…

[AI OpenAI-doc] 迁移指南 Beta

我们已经改变了助手 API 在 beta 的 v1 版本和 v2 版本之间工具和文件的工作方式。今天&#xff0c;通过 API&#xff0c;两个 beta 版本仍然可以访问&#xff0c;但我们建议尽快迁移到我们 API 的最新版本。我们将在 2024 年底之前废弃 beta 的 v1 版本。 如果您今天不使用助手…

套管外径测量仪 多尺寸型号 规格全可定制

套管&#xff08;bushing&#xff09;是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管&#xff0c;后者称为穿墙套管。套管通常用在建筑地下室&#xff0c;是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

SpringBoot中HandlerInterceptor拦截器的构建详细教程

作用范围&#xff1a;拦截器主要作用于Spring MVC的DispatcherServlet处理流程中&#xff0c;针对进入Controller层的请求进行拦截处理。它基于Java的反射机制&#xff0c;通过AOP&#xff08;面向切面编程&#xff09;的思想实现&#xff0c;因此它能够访问Spring容器中的Bean…