导语:最近在做一些关于Windows 10中新的反恶意软件扫描接口技术内部机制的研究,我发现PowerShell 5中存着在DLL劫持漏洞。
最近在做一些关于Windows 10中新的反恶意软件扫描接口技术内部机制的研究,我发现PowerShell 5中存着在DLL劫持漏洞。我之所以做这些研究是因为我们Red Team所使用的一些PowerShell攻击脚本——p0wnedShell被安装在Windows 10的 Windows Defender查杀了——“禁止从内存中运行”,所以我想知道是否可以绕过这中查杀技术。
从Microsoft的技术博客中,我们可以看到下面的图表,详细的说明了这种技术是如何对PowerShell / VBScript此类脚本进行hook的。
在Process Monitor 中添加一个amsi.dll的路径过滤器后,运行p0wnedShell,我发现它会首先尝试在其当前路径中查找并加载amsi.dll。如果在当前路径中没有找到dll文件,就会从System32路径中加载dll。这种情况就给了我们一些机会;)。
打开IDA载入amsi.dll,查看WinAPI函数和DLL导出表,发现有DllMain的入口点,所以我认为我可以尝试利用C语言编写一个简单的DLL并使用 MessageBox函数来做演示。
伪造的amsi.dll 源码如下图:
正如你在下面的截图中所看到的;在启用Windows Defender的Windows 10上运行p0wnedShell时,Amsi /Defender会把那些从内存中加载的带有攻击性的PowerShell脚本阻止运行。
现在把已经编译好的用作劫持的dll文件放在C:\p0wnedShell 文件夹中,当再次运行 p0wnedShell时,奇迹就发生了,Awwwww!
在弹出的MessageBox点击OK之后,我们可以看到所有进攻脚本都运行了,现在没有任何问题。
当在Process Explorer中搜索Amsi.dll(查找DLL或Handle)时,我注意到dll已经被卸载了,然而在p0wnedShell进程中正常加载了。
接下来,我想尝试PowerShell.exe本身是否也存在DLL劫持的问题,把 PowerShell.exe复制到C:\ p0wnedShell文件夹中,运行Process Monitor并添加一个C:\ p0wnedShell的路径过滤器。
正如你在下图中所看到的,PowerShell尝试从当前路径加载一些dll文件。
不出我所料,PowerShell.exe的确也从当前路径中加载了伪造的dll文件。
所以,PowerShell也存在着DLL劫持漏洞。
接下来我尝试了很多dll,urlmon.dll也可以成功进行劫持。
因此,通过这些研究发现,我们就可以得出结论,PowerShell 5存在着dll劫持漏洞,我们可以控制代码执行并将PowerShell.exe复制到可写的位置执行。
有了以上这些了解,我们现在就可以使用PowerShell在Windows 10系统中运行自定义的代码,如后门,键盘记录器,恶意软件等等。 例如,我创建了一个如下图所示的Amsi.dll,并将它和PowerShell.exe一起复制到包含在%path%环境变量的文件夹中。
现在,当系统管理员从cmd运行PowerShell.exe,并在UAC提示上单击“是”时,会添加一个新的管理员用户到系统本地管理员组中。
把制作好的劫持dll文件和PowerShell.exe 一起复制到包含在%Path%环境变量的文件夹中:
从cmd启动PowerShell:
UAC 提示:
点“Yes”之后,新的管理员用户就添加到系统了:
POC:
在最新版本的p0wnedShell中,我已经添加了绕过Amsi的劫持dll文件,是通过从内存将伪造的Amsi.dl写入到当前工作目录的(使用BinaryWriter方法)。这个DLL由p0wnedShell进程加载并立即退出,因此基本上不会影响Amsi的正常运行。
https://github.com/Cn33liz/p0wnedShell
p0shKiller基本上是一个在最坏的情况下来演示本文所讲的PowerShell/Amsi dll劫持漏洞的工具。需要管理员权限运行(虽然可以绕过UAC),所以该工具效果有限。
https://github.com/Cn33liz/p0shKiller
当前状态:
*于2016年3月28日报告给Microsoft MSRC
*从Microsoft的角度来看,AMSI/AntiVirus并不是传统的安全边界,并且由于此类DLL劫持漏洞不会导致远程代码执行或特权提升,因此他们无法发布正式公告。然而,他们肯定有兴趣进一步探索如何去改进他们的反恶意软件产品,所以我期望会在未来的版本中得到修复。