导语:​最近在做一些关于Windows 10中新的反恶意软件扫描接口技术内部机制的研究,我发现PowerShell 5中存着在DLL劫持漏洞。

最近在做一些关于Windows 10中新的反恶意软件扫描接口技术内部机制的研究,我发现PowerShell 5中存着在DLL劫持漏洞。我之所以做这些研究是因为我们Red Team所使用的一些PowerShell攻击脚本——p0wnedShell被安装在Windows 10的 Windows Defender查杀了——“禁止从内存中运行”,所以我想知道是否可以绕过这中查杀技术。

Microsoft的技术博客中,我们可以看到下面的图表,详细的说明了这种技术是如何对PowerShell / VBScript此类脚本进行hook的。

1.png

在Process Monitor 中添加一个amsi.dll的路径过滤器后,运行p0wnedShell,我发现它会首先尝试在其当前路径中查找并加载amsi.dll。如果在当前路径中没有找到dll文件,就会从System32路径中加载dll。这种情况就给了我们一些机会;)。

11.jpg

打开IDA载入amsi.dll,查看WinAPI函数和DLL导出表,发现有DllMain的入口点,所以我认为我可以尝试利用C语言编写一个简单的DLL并使用 MessageBox函数来做演示。

111.png

伪造的amsi.dll 源码如下图:

2.png

正如你在下面的截图中所看到的;在启用Windows Defender的Windows 10上运行p0wnedShell时,Amsi /Defender会把那些从内存中加载的带有攻击性的PowerShell脚本阻止运行。

22.png

现在把已经编译好的用作劫持的dll文件放在C:\p0wnedShell 文件夹中,当再次运行 p0wnedShell时,奇迹就发生了,Awwwww!

222.png

在弹出的MessageBox点击OK之后,我们可以看到所有进攻脚本都运行了,现在没有任何问题。

当在Process Explorer中搜索Amsi.dll(查找DLL或Handle)时,我注意到dll已经被卸载了,然而在p0wnedShell进程中正常加载了。

1.png

接下来,我想尝试PowerShell.exe本身是否也存在DLL劫持的问题,把 PowerShell.exe复制到C:\ p0wnedShell文件夹中,运行Process Monitor并添加一个C:\ p0wnedShell的路径过滤器。

正如你在下图中所看到的,PowerShell尝试从当前路径加载一些dll文件。

11.png

不出我所料,PowerShell.exe的确也从当前路径中加载了伪造的dll文件。

所以,PowerShell也存在着DLL劫持漏洞。

111.png

接下来我尝试了很多dll,urlmon.dll也可以成功进行劫持。

1111.png

因此,通过这些研究发现,我们就可以得出结论,PowerShell 5存在着dll劫持漏洞,我们可以控制代码执行并将PowerShell.exe复制到可写的位置执行。

有了以上这些了解,我们现在就可以使用PowerShell在Windows 10系统中运行自定义的代码,如后门,键盘记录器,恶意软件等等。 例如,我创建了一个如下图所示的Amsi.dll,并将它和PowerShell.exe一起复制到包含在%path%环境变量的文件夹中。

现在,当系统管理员从cmd运行PowerShell.exe,并在UAC提示上单击“是”时,会添加一个新的管理员用户到系统本地管理员组中。

2.png

把制作好的劫持dll文件和PowerShell.exe 一起复制到包含在%Path%环境变量的文件夹中:

22.png

从cmd启动PowerShell:

222.png

UAC 提示:

2222.png

点“Yes”之后,新的管理员用户就添加到系统了:

3.png

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劫持漏洞不会导致远程代码执行或特权提升,因此他们无法发布正式公告。然而,他们肯定有兴趣进一步探索如何去改进他们的反恶意软件产品,所以我期望会在未来的版本中得到修复。

源链接

Hacking more

...