[CyberDefenders Write-up] Midnight RDP (恶意RDP到Cobalt Strike信标及域控失陷)
Chicken0248 著
12分钟阅读·2025年12月12日
场景
InfiniTech Solutions 的一名IT员工报告其邮箱账户出现异常活动。经调查,该员工的工作凭证在最近的数据泄露中被曝光。该员工曾使用工作邮箱注册第三方平台,导致凭证泄露。威胁攻击者利用这些凭证登录该员工的公司邮箱,并向组织内其他员工发送钓鱼邮件。
您的任务是通过分析日志、确定攻击范围、识别是否有用户与钓鱼邮件交互,并揭示钓鱼活动对网络的影响。
类别:威胁狩猎
工具:ELK、Splunk
实验链接:cyberdefenders.org/blueteam-ct…
背景
关于 Midnight Blizzard (APT29) 的一些背景知识,本实验即受其启发。该攻击者利用RDP配置文件(.rdp)进行鱼叉式钓鱼攻击,目标是超过100个组织中的数千名用户,诱使他们打开.rdp文件,该文件会建立回连到攻击者控制的RDP服务器的连接。
这个RDP配置文件的特别之处在于,它可以用于在两个连接的客户端之间映射资源,这意味着攻击者可以将恶意负载放入启动文件夹,等待下次启动以获取目标机器的初始访问权限,甚至可以窃取受害用户的凭证。
带着这个知识开始实验,应该很容易识别出入侵点。
参考:www.picussecurity.com/resource/bl…
本实验中,我们可以部署Splunk或Elastic SIEM,我通常选择Splunk。根据“数据摘要”可以看到有4台主机,但实际上只有3个端点,“ip-10–10–3–192”主机是从MAIL01端点摄入的syslog,我们可以用它来找出初始访问信息(比如攻击者的可疑邮箱地址)。
初始访问
Q1: 哪个邮箱账户被入侵并用于发起攻击?
根据我们对Midnight RDP初始访问技术(使用.rdp文件进行恶意RDP攻击)的了解,我从任何用户和任何主机的下载文件夹中的文件创建事件开始,寻找可疑的.rdp文件。可以看到在2024-11-21 20:45,用户“rnichols”在主机“IT01”上确实下载了“cloud zerotrust compliance.rdp”文件。
查询:
Sysmon EventCode=11 file_path="*Downloads*" | sort UtcTime | table UtcTime,Image,file_path,user,host
Zone.Identifier 的内容确认该文件确实是从组织的webmail下载的,因此我们找出该用户的邮箱账户。
查询:
EventCode=15 user=rnichols host=IT01 file_path="*Downloads*"| sort UtcTime | table UtcTime,Image,file_path,user,host,Contents,SHA256
通过在查询中使用用户名,我们现在可以看到syslog,其中显示可疑邮件是从 twhite@infinitechsolutions.xyz 发送给 rnichols@infinitechsolutions.xyz(受害者),邮件的主题表明“twhite”用户的邮箱首先被入侵,然后被用来向“rnichols”用户发送恶意RDP配置文件,这导致了后续对IT01主机的恶意RDP访问。
查询:
host="ip-10-10-3-192" rnichols | sort _time
答案:twhite@infinitechsolutions.xyz
Q2: 识别出被入侵账户后,攻击者向组织内的其他员工发送了钓鱼邮件。这些员工的名字是什么,按时间顺序排序并用逗号分隔?
我们可以使用之前找到的邮件主题与被入侵邮箱一起查询,找出有多少封邮件被发送给其他员工。可以看到相同的邮件被发送给了4名不同的员工,只有1人上当。
查询:
host="ip-10-10-3-192" "twhite@infinitechsolutions.xyz" "Zero Trust Compliance Verification" | sort _time
答案:rnichols,llopez,gbaker,ahall
Q3: 从被入侵账户发送的恶意附件名称是什么?
答案:cloud zerotrust compliance.rdp
执行
Q1: 分析用户交互后,哪个员工下载并执行了恶意附件?
通过查询IT01主机上来自下载了RDP配置文件的用户的进程创建事件,可以看到该用户确实打开了这个RDP文件。
查询:
Sysmon EventCode=1 host=IT01 user=rnichols | sort UtcTime | table UtcTime,CommandLine,ParentCommandLine,user,SHA256
与攻击者服务器建立RDP连接后,RDP配置文件可用于设置对受害者主机的资源映射。大约在20:48,一个可疑文件在受害者的启动文件夹下被执行,并被手动执行。
然后在20:55,攻击者开始了他们的操作,这意味着RDP配置文件确实被用来映射资源文件,并将反向shell/C2信标放入用户的启动文件夹。
我们也可以通过文件创建事件来确认这一点,可以看到 mstsc.exe(微软终端服务客户端进程)在启动文件夹中创建了该文件。
查询:
Sysmon EventCode=11 file_path="*Startup*" | sort UtcTime | table UtcTime,Image,file_path,user,host
答案:rnichols
Q2: 在DC机器上,攻击者在内存中执行了一个DLL信标。这个恶意DLL文件的SHA-256哈希的前10个字节是什么?
在域控制器上查询任何可疑行为。有趣的是,在事件时间范围内域控制器上没有sysmon事件,也没有Event ID 4688,因此我需要查看其他日志,如PowerShell脚本块日志和PowerShell日志。
从PowerShell脚本块日志中,可以看到Cobalt Strike信标通过PowerShell部署在域控制器的内存中,因此我们需要将其解码以获取原始文件。
查询:
host=DC01 EventCode=4104 | sort SystemTime | table SystemTime,UserID,ScriptBlockText
使用以下查询合并这些脚本块,然后复制base64 blob进行解码和异或操作。
查询:
host=DC01 EventCode=4104 ScriptBlockId="405ceb5e-aafd-4479-8857-e5b1fb3ebf70" | sort MessageNumber | table ScriptBlockText
获取DLL文件有两种方法:第一种是使用CyberChef将其解码回去,然后用35进行异或,现在应该得到MZ头,指示PE32可执行文件,准备计算文件哈希。
本题答案只想要前10个字节,根据问题,2个字符为1个字节,因此可以使用“Take bytes”获取前10个字节(20个字符)。
为了确认这一点,我们可以获取完整的哈希并在VirusTotal上搜索,结果显示它确实是Cobalt Strike。
答案:0ee6bc20a7f855d881cc
持久化
Q1: 恶意连接建立后,一个文件被放到系统上。这个被放下的文件叫什么名字?
正如我们已经发现的,当RDP连接建立时,RDP配置文件自动将 ztssvc.exe 文件放入启动文件夹。
答案:ztssvc.exe
Q2: 为了维持长期访问,攻击者在受害机器上建立了一个计划任务。这个任务的名字是什么?
在获得IT02主机的访问权限后,攻击者首先运行 whoami /groups 命令查看当前用户是否属于任何有趣的组,然后读取Windows UAC注册表设置,接着放下并使用UACMe Akagi工具绕过UAC,这意味着该用户属于本地管理员组。
凭借高完整性访问令牌,攻击者创建了一个新的计划任务用于持久化,名称为“Amazon Zero Trust Agent”,以SYSTEM身份在登录时执行 C:\Windows\System32\Amazon ZeroTrust Compl.exe。
答案:AmazonZeroTrustAgent
Q3: 作为持久化策略的一部分,攻击者创建了一个新用户账户。这个未经授权的账户叫什么名字?
创建计划任务后,攻击者创建了新用户“Adminstrator”,模仿IT02机器上实际的内置“Administrator”账户,并将此用户添加到Administrators组和Remote Desktop Users组以便进行RDP连接。
我们还可以看到,在放下其他信标并通过计划任务建立持久化后,攻击者删除了“rnichols”和“jgreen”启动文件夹中的所有文件,实质上是移除了旧信标以使用新信标。
答案:Adminstrator
Q4: 为了便于远程访问,攻击者修改了远程桌面设置。控制是否允许远程桌面协议(RDP)连接的注册表项名称是什么?
在创建后门用户之前,攻击者检查了 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections 注册表项,以确定系统上是否允许远程桌面协议(RDP)连接。
答案:fDenyTSConnections
Q5: 进一步探测显示在DC上创建了一个新用户账户。这个账户叫什么名字?
在域控制器上有三条通过PowerShell Event ID 400记录的可疑PowerShell命令运行。
我们可以看到攻击者向IT02上的本地管理员添加了一个新用户(伪装账户),并将这两个用户添加到“Domain Admins”组。
答案:rniclos
提权
Q1: 调查提权技术,攻击者利用的特权COM接口的CLSID的最后6个字节是什么?
在执行UACMe时,攻击者指定了方法43来执行第一个信标,可以看到 dllhost.exe 以COM接口 {D2E7041B-2927-42FB-8E9F-7CE93B6DC937} 执行,以绕过UAC并获得提升的shell。
根据Elastic,我们发现的确实正确:使用此方法绕过时,dllhost.exe 在优先监控列表中,涉及的COM接口为 {3E5FC7F9-9A51-4367-9063-A120244FBEC7} 或 {D2E7041B-2927-42FB-8E9F-7CE93B6DC937}。
答案:7CE93B6DC937
Q2: 为了提权,攻击者在系统上放下了另一个文件。这个文件的名字是什么?
答案:akagi64.exe
防御规避
Q1: 攻击者试图修改系统行为以削弱安全设置。控制管理员用户用户账户控制(UAC)提示设置的注册表项名称是什么?
正如已经发现的,在获得IT02主机的访问权限后,攻击者查询了 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin 注册表项,以获取 ConsentPromptBehaviorAdmin 值,该值控制Windows在需要提升权限时如何提示管理员。
答案:ConsentPromptBehaviorAdmin
Q2: 为了避免检测,攻击者将信标移动到了一个受保护的系统目录。这个被重新定位的恶意文件叫什么名字?
正如我们已经发现的,攻击者放下了一个新信标,并设置了计划任务以在登录时以SYSTEM身份执行它,然后删除了旧信标。
答案:AmazonZeroTrustCompl.exe
发现
Q1: 确定攻击者在受害机器上的第一步操作,用于收集系统信息的第一条命令是什么?
答案:whoami/groups
横向移动
Q1: 攻击者使用了什么工具横向移动到DC?
新信标执行后,攻击者执行了多个PowerShell编码命令。
解码后,显示了一系列用于横向移动的命令:
- 第一条命令将目标IP(10.10.10.55)添加到本地机器的TrustedHosts列表,允许WinRM连接。
- 第二条命令验证域控制器主机名(DC01.ad.infinitechsolutions.xyz)通过DNS正确解析。
- 第三条命令将主机名添加到TrustedHosts,确保使用主机名的远程连接被允许。
所有这些操作允许攻击者通过WinRM连接到域控制器,并最终如PowerShell脚本块日志中所见部署内存信标。
答案:Winrm
命令与控制
Q1: 追溯攻击者的活动,恶意邮件最初是从哪个IP地址发送的?
通过查看被入侵邮箱在发送邮件之前的登录事件,它显示了用于登录的IP地址。
查询:
host="ip-10-10-3-192" "twhite@infinitechsolutions.xyz" | sort _time
答案:3.78.253.99
Q2: 恶意附件执行后,它建立了一个到外部服务器的连接。恶意附件通信的具体端点是什么?
我们可以查询IT02主机的所有网络连接(TCP)事件,并重点关注 mstsc.exe 进程建立的连接,可以看到用于RDP连接的攻击者IP地址。
查询:
Sysmon EventCode=3 host=IT01 user=rnichols | sort UtcTime | stats count by Image,dest_ip,dest_port
答案:3.78.253.99:3389
Q3: 分析显示被放下的文件充当Cobalt Strike信标。此信标与之通信的命令与控制(C&C)服务器端点是什么?
第一个信标是放在启动文件夹中的 ztssvc.exe,它连接到 3.78.244.11 的8080端口,与第二个信标相同。
答案:3.78.244.11:8080
Q4: 检查DLL的配置,与‘C2Server’键关联的哪个值指示信标的通信?
在VirusTotal的行为选项卡上,可以看到与C2服务器及其信标端点关联的内存模式URL。
答案:3.78.244.11,/dot.gif
原文发表于 chickenloner.github.io CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9XWnhAP6q5FfiGb63VkvyGKCRkvJEisc+SrMyQe8eQ0f49+++MPmaCBvFImhXAljuGVvDCEyZI5v5MyYwvTzHicD07zks0oa3QVUOwwC5NUyiWeYJF3kzslLuYafMiEE4esszJBUa6ZN46/0SqVlapy