如何利用 DLL hijack 轻松绕过AMSI?

  1. 云栖社区>
  2. 嘶吼>
  3. 博客>
  4. 正文

如何利用 DLL hijack 轻松绕过AMSI?

玄学酱 2017-09-25 15:40:00 浏览839
展开阅读全文
本文讲的是如何利用 DLL hijack 轻松绕过AMSI?最近在做一些关于Windows 10中新的反恶意软件扫描接口技术内部机制的研究,我发现PowerShell 5中存着在DLL劫持漏洞。我之所以做这些研究是因为我们Red Team所使用的一些PowerShell攻击脚本——p0wnedShell被安装在Windows 10的 Windows Defender查杀了——“禁止从内存中运行”,所以我想知道是否可以绕过这中查杀技术。

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

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

如何利用 DLL hijack 轻松绕过AMSI?

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

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

如何利用 DLL hijack 轻松绕过AMSI?

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

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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

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

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

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

从cmd启动PowerShell:

如何利用 DLL hijack 轻松绕过AMSI?

UAC 提示:

如何利用 DLL hijack 轻松绕过AMSI?

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

如何利用 DLL hijack 轻松绕过AMSI?

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




原文发布时间为:2017年2月10日
本文作者:丝绸之路
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接

网友评论

登录后评论
0/500
评论
玄学酱
+ 关注
所属云栖号: 嘶吼