Azure串行控制台攻击与防御实战指南(第一部分)

本文深入探讨Azure串行控制台的安全风险,详细分析攻击者如何利用该功能绕过安全限制执行命令、转储进程内存,并提供完整的日志监控方案和KQL查询用于威胁狩猎。

Azure串行控制台攻击与防御 - 第一部分

MSRC, Microsoft威胁狩猎, 安全研究与防御

作者:Malla Reddy Donapati, Subhash Popuri, Nutan Vishwakarma
发布日期:2023年8月10日
阅读时间:12分钟

是否遇到过虚拟机崩溃的情况?Azure串行控制台是直接连接虚拟机并进行调试的绝佳方式。Azure串行控制台是一项对所有人免费开放的功能。虽然该功能的主要目的是帮助用户调试机器,但存在多种滥用该功能并泄露敏感信息的有趣方式。让我们深入探索该功能,研究各种利用方法以及检测攻击活动的技术。

目录

什么是Azure串行控制台?

Azure串行控制台连接到虚拟机(VM)或虚拟机规模集(VMSS)实例的"ttyS0"或"COM1"串行端口,提供独立于网络或操作系统状态的访问。这是一个基于文本的控制台,适用于Azure上的VM和VMSS,通常在除Azure中国云之外的所有Azure区域公开可用,并在Azure政府版中处于公开预览状态。

访问Azure串行控制台的先决条件:

  • 必须为VM启用启动诊断(可在创建VM时启用)
  • 具有至少"虚拟机参与者角色"的身份
  • 攻击者能够访问https://portal.azure.com
  • VM/VMSS的凭据(对于某些攻击场景,此条件不需要)

为什么Azure串行控制台是攻击者的理想目标?

Azure串行控制台非常有利于规避安全功能,这正是它成为攻击者理想目标的原因。

想象一个场景:您的虚拟机已锁定RDP/SSH或其他访问已被禁用/限制。这通常是许多生产级设置的典型情况,其中身份验证被锁定到特定IP或子网。Azure串行控制台不受NSG限制的约束,可以帮助攻击者获取机器的CLI访问权限。

Microsoft Defender for Cloud提供即时访问(JIT),这是一项出色的功能,允许管理员仅在需要时、在需要的端口上、在需要的时间内启用访问。对于启用JIT的VM,Azure串行控制台仍可用于连接VM,而无需通过JIT请求访问。

启用用户操作跟踪日志

有多种流式传输和分析日志的方法,但为了本博客的目的,我们将创建一个日志分析工作区并将日志流式传输到创建的工作区。这将使我们能够在无需拥有日志记录解决方案的情况下分析活动。但是,这将根据您的设置而有所不同。如果您的设置具有SIEM,则架构、查询语言可能不同。

创建日志分析工作区

步骤1: 转到Azure门户上的日志分析工作区创建,选择适当的订阅、资源组和名称。请注意,Azure Monitor有两种SKU。有关Azure日志分析的定价详细信息,请查看此处

启用Azure活动日志监控

步骤1: 转到活动日志,单击"导出活动日志"。

步骤2: 单击"添加诊断设置",选择"管理"和"安全"类别。单击"发送到日志分析工作区",并选择在此处创建的日志分析工作区。

启用Windows事件日志监控

请注意,根据您当前的设置,这可能不是必需的。如果您的云计算工作负载已经通过Microsoft Sentinel或其他安全监控解决方案(如SIEM)进行监控,请随时跳过此步骤。

步骤1: 使用此指南安装Sysmon。

步骤2: 下载并配置Azure Monitor。转到代理,下载Windows代理64位或32位。按照屏幕上的说明安装代理。安装完成后,继续下一步。

步骤3: 创建数据收集规则。转到创建向导,填写名称、资源组和位置。按照以下视频中的说明完成日志配置。

使用以下XPath备份"Sysmon"日志:

1
2
3
4
5
<QueryList>
    <Query Id="0" Path="Microsoft-Windows-Sysmon/Operational">
        <Select Path="Microsoft-Windows-Sysmon/Operational">*</Select>
    </Query>
</QueryList>

步骤4: 使用以下KQL查询验证Azure活动日志和Windows事件日志是否正确接收。转到您为测试创建的VM,并检查左侧导航栏中的日志部分。

检查Azure活动日志:

1
2
3
AzureActivity
| summarize count() by OperationNameValue
| count

检查Windows事件日志:

1
2
Event
| count

如果输出大于0,则表示您已成功配置日志记录。

利用Azure串行控制台功能的不同技术

请注意,以下内容仅限于Windows操作系统的可能性。

命令执行

Azure串行控制台的主要功能是启用命令执行。假设攻击者拥有VM的凭据,攻击者可以在VM上以root/admin权限执行命令。这不提供GUI访问权限,但CLI访问权限可用于执行命令、维持持久性并在网络中横向移动。要使用Azure串行控制台在VM上执行命令,可以遵循以下步骤:

  1. 转到左侧导航栏中的串行控制台选项,一旦提示加载,输入cmd以创建命令提示符通道。
  2. 输入ch -sn Cmd0001切换到通道的上下文,按ENTER,然后输入凭据以登录到VM的CLI。

也可以使用Az CLI完成相同的操作。命令az serial-console connect -n <VM_Name> -g <ResourceGroup_Name>可用于通过Az CLI连接。了解更多。

使用Azure串行控制台跟踪用户活动

假设您已遵循所有步骤(安装Sysmon、配置Windows事件日志记录),以下KQL查询可用于跟踪使用Azure串行控制台执行的活动。查询的逻辑是收集Windows事件ID:4624中LogonProcess为sacsess.exe的所有登录ID,并识别其SubjectLogonId属于上一步中收集的登录ID列表的进程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let PIDs = Event
| where EventID == 4624
| extend LoginProcessName = replace_string(extract(@"Process Name:[\t]+[\w|\\|:|.]+",0,RenderedDescription),"Process Name:","")
| where LoginProcessName has "sacsess.exe"
| extend LogonID = replace_string(extract(@"TargetLogonId.>[\w|\d]+",0,EventData),'TargetLogonId">',"")
| distinct LogonID;
Event
| where Source == "Microsoft-Windows-Sysmon" and EventID == 1
| extend LogonID = replace_string(extract(@"LogonId.>[\w|\d]+",0,EventData),'LogonId">',"")
| where LogonID in (PIDs)

使用Azure活动日志,我们可以跟踪攻击者执行的连接尝试:

1
2
3
AzureActivity
| where OperationNameValue =~ "MICROSOFT.SERIALCONSOLE/SERIALPORTS/CONNECT/ACTION"
| where ActivityStatusValue =~ "Success"

转储特定进程

Azure串行控制台启用的一种最有趣的攻击向量是在无需任何身份验证的情况下转储进程。以下是实现此目标的步骤:

  1. 使用t命令列出所有进程。一旦识别出要转储的进程并确定其PID。
  2. 使用上一步中识别的PID,并使用命令procdump <PID> <LOCATION_OF_THE_FILE>。在以下示例中,我们正在转储LSASS.exe的进程内存。

跟踪使用Azure串行控制台执行的转储活动

对于使用此过程创建的进程转储,可以使用以下查询:

1
2
3
Event
| where EventID == 11
| where RenderedDescription has "lsass.dmp"

该查询在与文件创建相关的事件日志中搜索文件lsass.dmp的创建(由Sysmon生成的事件ID:11)。

进一步分析表明,转储文件由svchost.exe创建[文件创建进程的命令行:C:\Windows\system32\svchost.exe -k netsvcs -p],其父进程为services.exe,祖父进程为wininit.exe。这很有趣,因为没有迹象表明此活动是使用串行控制台执行的。

此活动目前由Microsoft Defender for Endpoint检测。有关如何检测和防止LSASS转储的进一步指导记录在此处

在Defender for Endpoint中看到的进程树证据如下:

可以使用以下Yara规则检测lsass转储的创建:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
rule creation_of_dmp {
    meta:
        author = "Subhash P <@pbssubhash>"
        filetype = "DUMP File"
        date = "1/1/2023"
        version = "1.0"
    strings:
        $md = { 4d 44 4d 50 }
        $a1 = "SeDebugPrivilege" fullword wide 
        $a2 = "\\pipe\\lsass" fullword wide
        $a3 = "lsasspirpc" fullword wide
    condition:
        ($md at 0) and all of ($a*)
}

枚举和其他功能

Azure串行控制台在未经身份验证的SAC控制台模式下提供一些其他功能。请注意,以下是SAC可用的命令(除procdump外)的详尽列表:

命令 简短描述 安全影响
ch 通道管理命令
cmd 创建命令提示符通道 在VM上执行命令
d 转储当前内核日志 帮助攻击者执行侦察
f 切换详细或简略的tlist信息 帮助攻击者执行侦察
i 列出所有IP网络号及其IP地址并设置IP信息 帮助攻击者执行侦察
id 显示计算机标识信息 帮助攻击者执行侦察
k 终止给定进程 帮助攻击者导致拒绝服务
l 将进程优先级降低到最低可能 帮助攻击者降低服务性能
lock 锁定对命令提示符通道的访问 帮助攻击者导致拒绝服务
m 将进程的内存使用限制为 帮助攻击者降低服务性能
p 切换分页显示
r 将进程优先级提高一级
s 显示当前时间和日期(使用24小时制)
s mm/dd/yyyy hh:mm 设置当前时间和日期(使用24小时制) 帮助攻击者导致拒绝服务
t 显示任务列表 帮助攻击者执行侦察
restart 立即重启系统 帮助攻击者导致拒绝服务
shutdown 立即关闭系统 帮助攻击者导致拒绝服务
crashdump 使系统崩溃。必须启用崩溃转储 帮助攻击者导致拒绝服务
livedump [-u] [-h] 创建实时内核转储。可选参数将包括用户空间(-u)和管理程序(-h)内存在转储中 从转储中泄露秘密

跟踪攻击者执行的活动

攻击者使用Azure串行控制台执行的操作(在命令行通道内和其他情况下)可以使用启动诊断日志进行跟踪。它们可以在左侧导航栏的帮助部分中查看。它们无法导出或流式传输到外部位置。

日志本身使攻击者能够提取命令

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计