
CyberDefenders Write-up Midnight RDP (恶意RDP到Cobalt Strike信标及域控失陷)
Chicken0248 著 12分钟阅读·4天前
InfiniTech Solutions公司的一名IT员工报告其邮箱账号存在异常活动。经调查发现,该员工的工作凭证在一次最近的数据泄露事件中被泄露。该员工曾使用其工作邮箱注册第三方平台,导致凭证暴露。威胁攻击者利用这些凭证登录该员工的企业邮箱,并向组织内的其他员工发送钓鱼邮件。
你的任务是通过分析日志、确定攻击范围、识别是否有用户与钓鱼邮件交互,并揭示钓鱼活动对网络的影响。
威胁狩猎
ELK, Splunk
https://cyberdefenders.org/blueteam-ctf-challenges/midnight-rdp/
关于午夜暴风雪(APT29)的背景知识,该组织是本实验室的灵感来源。该威胁行为者在针对超过100个组织的数千名用户的鱼叉式钓鱼活动中,利用RDP配置文件(.rdp)诱导用户打开,从而建立回连到攻击者控制的RDP服务器的连接。
这个RDP配置文件的有趣之处在于,它可以用于映射两个连接客户端之间的资源,这意味着攻击者可以将恶意负载投递到启动文件夹,等待下次启动以获取目标机器的初始访问权限,甚至可以窃取受害用户的凭证。
带着这个知识开始实验室,识别入口点应该相当容易。
在本实验室中,我们可以部署Splunk或Elastic SIEM,我通常使用Splunk。根据“数据摘要”,我们可以看到有4台主机,但实际上只有3个端点,其中“ip-10-10-3-192”主机是从MAIL01端点收集的syslog,我们可以用它来发现初始访问(如攻击者的可疑邮件地址)。
根据我们已经了解的关于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
我们可以使用之前找到的邮件主题以及被入侵邮箱的查询条件,找出有多少封邮件被发送给其他员工。可以看到相同的邮件被发送给了4个不同的员工,只有1个中招。
查询语句:
host="ip-10-10-3-192" "twhite@infinitechsolutions.xyz" "Zero Trust Compliance Verification" | sort _time
答案:rnichols,llopez,gbaker,ahall
答案:cloud zerotrust compliance.rdp
通过查询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
这个问题的顺序有点奇怪,因为我更喜欢链式/时间线分析(从头到尾理解发生的事情)而不是这种狩猎方法。但我们直接查询域控制器上的任何可疑行为。
有趣的是,在事件时间范围内域控制器上没有sysmon事件,也没有Event ID 4688。所以我需要寻找其他日志,如PowerShell脚本块日志和PowerShell日志。
从PowerShell脚本块日志中,我们可以看到通过PowerShell在域控制器的内存中部署了cobalt strike信标。
查询语句:
host=DC01 EventCode=4104 | sort SystemTime | table SystemTime,UserID,ScriptBlockText
我们可以使用以下查询合并这些脚本块,然后复制base64 blob进行解码和xor。
查询语句:
host=DC01 EventCode=4104 ScriptBlockId="405ceb5e-aafd-4479-8857-e5b1fb3ebf70" | sort MessageNumber | table ScriptBlockText
有两种方法获取dll文件。第一种是使用CyberChef将其解码,然后用35进行xor,然后应该得到MZ头,表明PE32可执行文件,准备计算文件哈希。
该问题的答案只需要前10个字节。根据这个问题,2个字符等于1个字节,所以我们可以使用"Take bytes"来获取前10个字节(20个字符),然后得到答案。
为了确认,我们可以获取完整哈希并在VirusTotal上搜索,结果显示它确实是cobalt strike。
答案:0ee6bc20a7f855d881cc
正如我们已经发现的,当RDP连接建立时,RDP配置文件自动将ztssvc.exe文件投递到启动文件夹。
答案:ztssvc.exe
在获得IT02主机的访问权限后,威胁行为者首先运行whoami /groups命令查看当前用户是否属于任何有趣的组。接下来的操作是读取注册表中的Windows UAC设置,然后投递并使用UACMe Akagi工具绕过UAC,这意味着该用户属于本地管理员组。
凭借高完整性访问令牌,威胁行为者创建了一个新的计划任务用于持久化,名称为"Amazon Zero Trust Agent",在登录时以SYSTEM权限执行C:\Windows\System32\Amazon ZeroTrust Compl.exe。
答案:AmazonZeroTrustAgent
创建计划任务后,威胁行为者创建了新用户"Adminstrator",模仿IT02机器上实际的内置"Administrator"账户,并将此用户添加到Administrators组和Remote Desktop Users组以便RDP连接。
我们还可以看到,在投递了其他信标并通过计划任务建立持久化后,威胁行为者删除了"rnichols"和"jgreen"用户的启动文件夹中的所有文件,实质上是移除了旧信标以使用新信标。
答案:Adminstrator
在创建后门用户之前,威胁行为者检查了HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections注册表项,以确定系统上是否允许远程桌面协议(RDP)连接。
答案:fDenyTSConnections
在域控制器上有三条可疑的PowerShell命令通过PowerShell Event ID 400记录。
查询语句:
host=DC01 EventCode=400 | sort SystemTime
我们可以看到威胁行为者向IT02的本地管理员添加了一个相似用户,并将两个用户都添加到"Domain Admins"组。
答案:rniclos
在执行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
答案:akagi64.exe
正如已经发现的,在获得IT02主机的访问权限后,威胁行为者查询了HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin注册表项,以获取ConsentPromptBehaviorAdmin值,该值控制Windows在需要提权时如何提示管理员。
答案:ConsentPromptBehaviorAdmin
正如我们已经发现的,威胁行为者投递了新的信标并设置了计划任务,在登录时以SYSTEM权限执行它,然后删除旧信标。
答案:AmazonZeroTrustCompl.exe
答案:whoami /groups
在新信标执行后,威胁行为者执行了多条PowerShell编码命令。
查询语句:
Sysmon EventCode=1 host=IT01 (CommandLine="*ZeroTrust*" OR ParentCommandLine="*ZeroTrust*") | sort UtcTime | table UtcTime,CommandLine,ParentCommandLine,user,SHA256
解码后,揭示了一系列用于横向移动的命令:
所有这些都允许威胁行为者通过WinRM连接到域控制器,并最终部署内存中信标,如PowerShell脚本块日志所见。
答案:Winrm
通过查看发送邮件前被入侵邮箱的登录事件,可以看到登录使用的IP地址。
查询语句:
host="ip-10-10-3-192" "twhite@infinitechsolutions.xyz" | sort _time
答案:3.78.253.99
我们可以查询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
第一个信标是投递到启动文件夹的ztssvc.exe,连接到3.78.244.11的8080端口,与第二个信标相同。
答案:3.78.244.11:8080
在VirusTotal的行为选项卡上,可以看到与C2服务器及其信标端点关联的内存模式URL。
答案:3.78.244.11,/dot.gif
原文发表于 https://chickenloner.github.io
CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9XWnhAP6q5FfiGb63VkvyGKCRkvJEisc+SrMyQe8eQ0f49+++MPmaCBvFImhXAljuGVvDCEyZI5v5MyYwvTzHicD07zks0oa3QVUOwwC5NUyiWeYJF3kzslLuYafMiEE4esszJBUa6ZN46/0SqVlapy
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。