应用白名单是一个很强大的技术,可以保护我们电脑免受未知的恶意软件的侵害,但它从来没有被真正地使用。其中一个主要原因是很难配置和维护,另一个则是有相当多的绕过技术,因此它无法很好的阻止那些被确定的攻击者。今天我们就来看看windows内置的AppLocker技术,它免费提供了一些基本功能。
配置
首先你需要启用相应的服务让AppLocker运行。
Computer Configuration →Policies → Windows Settings → System Services
把Application Identity服务设置为自动:
然后去应用程序控制策略配置。
其实有两种类型的白名单是可以用的——以前的微软限制策略和新的AppLocker。
可执行文件 MSI安装文件 脚本 动态链接库文件(dll)
路径——很简单,必须从文件夹执行允许或拒绝。 文件的哈希值——要基于文件哈希来允许或拒绝。这个不是很有用,因为它需要计算哈希文件本身,你也不能就不依靠文件本身而停止这个MD5哈希。 发行商——需要基于数字证书发行来允许或拒绝执行。
你也可以在规则里添加额外的,比如你可以创建一个规则除了cmd.exe以外允许所有东西都放在C:/ Windows里。
用法
基本上AppLocker有两个方法——要么只允许白名单要么你允许除了黑名单上的所有。
白名单:
黑名单:
附加信息源是使用AppLocker最有效的。即使你不想使用AppLocker,你也可以配置并在监视模式下使用。这样,你就会得到在系统上执行的每个可执行文件、动态链接库和脚本的信息:
哈希隐藏在XML版本的日志里。不过,AppLocker使用SHA256 Authenticode而不是EXE and DLL的哈希文件,这对我们来说没什么用。你无法在VirusTotal或其他地方看到。
分块
如果你想分块,你需要记住:
你必须要注意如果你在规则里让发行商=微软就意味着Sysinternals之类的工具也同时启用了。 你在使用路径的时候需要对该文件夹的访问权限进行监视。如果任何人都可以写入你所信任的文件夹,AppLocker就会因为没有任何意义而被绕过了。 如果你试图给临时文件夹里的执行分块,AppLocker确实能按要求做到。但是它也会为你的用户打破很多东西,所以你需要先测试一下。你还需要把那些从AppData文件运行的软件列个白名单出来——比如Dropbox和Chrome。还有,别忘了给C:/temp, C:/ProgramData、回收站和其它几个可写的文件夹分块。就我个人而言,我觉得要找出所有需要从TEMP运行的软件工作量很大,不过你可以尝试一下。 本地管理员和AppLocker不能混起来用。如果你的用户有管理员权限,那么他们可以自己绕过任何你所设置的限制添加规则覆盖AppLocker的。
AppLocker的局限性
AppLocker无法控制内存中正在运行的。
它不能控制Office宏 它不能控制HTML应用程序
默认规则没有你想象的那样安全。一般情况下确实会认为用户无法写入Windows文件夹,但是有一些文件夹是允许用户写入从而轻松绕过默认规则。用这个 脚本 或Sysinternals的accesschk检查系统 – accesschk.exe -d -w paranoid C:/Windows/*
脚本不是严格控制的,所以如果解释器允许运行,你可以复制粘贴文本文件的命令并以这种方式运行脚本。我在三台不同的机器上做了测试,Windows 7的系统由于某种原因PowerShell脚本并没有在默认设置下分区,还不知道为什么。不过Windows 8.1能够如期运行。
绕过 AppLocker
还有不少AppLocker绕过导致AppLocker失效:
如果你有本地管理员权限,你可以添加一个本地规则允许所有的东西都可以执行。这就会重写所有基于域的策略。
你可以随便使用可写权限,随便将可执行文件移动到C:/Windows的某个地方。这都可以绕过所有的限制与默认规则。
你可以使用HTML应用程序(HTA)。这里有个关于使用PowerShell的HTA例:
你可以使用rundll32执行各种在 这里 提到的操作系统功能。甚至你还可以通过rundll32调用javascript代码并执行任意代码。臭名昭著的Poweliks恶意软件使用的就是这个方法,而且我记得最早看到是一个著名的APT团队把这个使用在自己的恶意软件。不过可惜的是它不能被分区。
你可以直接使用解释器(用于PowerShell和VBS的相同策略):
内存有效负载不会受到影响,所以如果没有保存到硬盘上就不会受到AppLocker的影响。于是,利用一些可信的进程或使用反射注入技术就可以做到绕过。
除非你有严格的DLL AppLocker规则,否则你就可以DLL劫持信任的应用程序。
还有一些需要特定的.NET应用程序的绕过,这里就不详写了。
缓解旁路绕过
一些绕过可以通过正确的配置来改善:
撤销Windows文件夹和Program Files里用户的可写权限或者把所有用户可写文件添加到Exceptions里。
给mshta.exe分块,可以终止HTML应用程序的执行。
如果你和你的用户都不使用任何需要用到powershell.exe,CMD.EXE,Cscript.exe的脚本,给它们分块也会起到作用,但如果需要,就不要这样做,因为可能会破坏到登录脚本或一些自动化的功能。注意一下,PowerShell可以通过任何网络应用程序直接调用,所以也给PowerShell的dll分块(C:/Program Files (x86)/Reference。 Assemblies/Microsoft/WindowsPowerShell/3.0/System.Management.Automation.dll)或给未知的可执行文件和powershell.exe分块。
虽然rundll32不能被分块,但如果你启用了命令行日志记录,你就可以很轻松地捕获,然后在JavaScript上注意rundll32.exe。不过我不清楚那些合法的行为会不会通过rundll32调用JavaScript。
*参考来源: dfir ,FB小编江湖小吓编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)