安全客点评
作者真是细心,从netsh的add参数发现可以载入任意DLL执行,唯一的限制仅仅是需要在注册表的HKLMSOFTWAREMicrosoftNetsh具有写权限。并且通过计划任务运行netsh实现持久化的话,默认情况下使用AutoRuns是看不到的。已经有其他研究人员公布了可以持久化利用的POC代码 https://github.com/outflankbv/NetshHelperBeacon,有兴趣的同学可以学习下。
写在前面的话
最近我一直都在思考一个问题,我想知道怎么样才能通过“受信任”的方法来在目标系统中执行恶意代码。我喜欢站在攻击者的角度来思考,如果我是攻击者,我会怎么做呢?毫无疑问,第一个浮现在各位脑海中的肯定是PowerShell了,它的确是系统管理员和黑客们心中的“挚爱”。反病毒软件并不会在意你的PowerShell准备干嘛,Virustotal也不会认为你的PowerShell脚本有什么问题。在这篇文章中,我并不打算跟大家讲解关于PowerShell的攻击方法,因为如果我要讲的话,我今晚就可以不用回家了。
你要时刻谨记:管理员能使用的资源,攻击者同样可以使用。毕竟,当某人成功入侵了你的网络系统之后,你没有任何方法来区分出某一操作到底是由合法用户完成的, 还是由入侵者完成的,真的一点办法都没有。很多工具都有可能会泄漏你的系统信息,“Ipconfig”看起来是一个无害的命令,但是这个命令将会给攻击者提供很多有价值的信息。除了这个命令之外,还有无数的命令将有可能威胁到系统的安全。
实际上,Windows操作系统中自带的一些命令和工具对于黑客而言是非常有价值的,因为攻击者不仅可以直接使用这些现成的工具来入侵你的网络,而且还可以避免被安全防护系统检测到。为此,我给大家提供了一份包含有系统本地命令的列表,这些命令都是攻击者在此前的一些网络攻击事件中曾经使用过的命令。[点我获取]
最令人感到沮丧的是,这份列表中的绝大多数命令基本上都是我们经常会用到的,而且这些都是合法命令。你不可能直接将ipconfig.exe直接丢到黑名单中,因为你的用户肯定会因此而恼羞成怒。这些命令其实并不是可以用来识别攻击活动的入侵指标,但是在某些特殊的环境下,我们也可以通过这些命令来识别攻击活动。
言归正传
好了,让我们回到正题。在此之前,我一直在研究Windows防火墙命令行工具-netsh(NetShell)到底能为攻击者做什么。当我在查阅上面这份列表的时候,我发现了一个非常有意思的参数:“add”。
“add”参数有什么用?我们可以添加什么?
安装一个DLL?我不会是眼花了吧?
实践出真知,于是我找出了一个用来运行calc.exe(计算器)的DLL来进行测试。我觉得系统应该不会直接运行它,因为这根本说不通啊。
结果如上图所示,系统果然没有直接运行这个DLL。那么问题来了,InitHelperDLL是什么呢?中文问百度,英文问Google,于是我便打开Google搜索了一下。
根据微软公司的描述:InitHelperDLL是一个由NetShell调用的函数,该函数负责执行helper的初始化加载。关于InitHelperDLL的详细内容请参阅微软公司的官方文档[点我访问]。
好的,那么helper又是什么呢?
NetShell的helper其实就是一种可以提供context功能的DLL文件。额外的helper可以扩展NetShell的功能,因为helper还可以提供负责处理网络任务的管理脚本。通常情况下,Helper可以为网络服务、实用工具、或者协议提供配置支持和监控支持。关于NetShell Helper的详细内容请参阅微软公司的官方文档[点我访问]。
走到这里,我决定要向Casey Smith(@subTee)求助了,Casey所擅长的就是使用一些“特殊”的方法来在Windows系统中执行各种命令。他在自己博客的一篇文章中对这一主题进行了非常详细的讲解,感兴趣的同学可以查阅一下[点我阅读]。我当时问他是否听说过这种攻击技术,他说他从未听说过。但是几分钟之后,他就弄出了一个可以运行的PoC实例。
那么,接下来我们应该做什么呢?思考片刻之后,我打算通过“delete helper <PATH>”命令来 “逆向分析”一下我刚才所做的事情。于是我重新打开了一个命令行窗口,然后删除掉刚才的这个条目。结果如下图所示:
没错,我们的DLL又被执行了,原来这是一种持久化的操作。于是,我又回头仔细查阅了关于NetShell Helper的相关章节,我又发现了下面这段内容。
Helper是一种DLL文件,它可以实现一个NetShell context(NetShell上下文)以及零个或多个subcontext(子上下文),这些DLL文件都是通过Windows的系统注册表来实现注册的。详细内容请参阅微软的官方文档[点我查看]。
通过系统的注册表!系统的注册表!注册表!重要的事情说三遍!现在越来越有意思了,让我们打开注册表,然后搜索一下我刚才提交的那个DLL文件。
我在注册表的“HKLMSOFTWAREMicrosoftNetsh”键中发现了关于这个DLL的条目。所有其他的DLL文件都在System文件夹中,但是你的恶意DLL并不需要满足这一要求,我们可以直接运行任何来源的DLL。我建议各位可以将恶意DLL文件放置在一个任何用户都可以直接访问到的存储位置,例如System文件夹或者AppData文件夹中,但是在存放DLL的这个过程中你还是需要使用管理员权限才行。如果你没有管理员权限,那么你至少也要获取注册表条目的写入权限。
这里唯一需要注意的是,如果想要保证DLL能够顺利执行,那么netsh.exe必须先运行起来。系统启动之后,默认情况下Netsh并不会自动运行,但是你可以使用计划任务来完成这项操作。除此之外,你也可以通过系统服务或Powershell脚本来实现。
用户无法在系统的“自动运行”视图中查看到netsh.exe的计划任务。
如果你想要查看netsh的计划任务,那么就需要勾选掉“隐藏Windows条目”这个选项。你也可以从下图中看到,VirusTotal并没有检测到任何异常。
我知道目前有很多的VPN客户端程序因为各种各样的原因需要经常去使用netsh。通常情况下,他们运行在SYSTEM环境中。所以根据目标系统的运行环境,我们也许根本都不用去强迫netsh运行。这就是为什么黑客在攻击之前往往需要侦查目标环境的原因了,这是一个非常重要的步骤。这样你就可以避免走很多的弯路,并且节省下大量的时间。
从防御端来看,如果你正在使用Sysmon(一款系统监视软件,我强烈建议广大用户使用这款软件)来对系统的运行进程进行实时监控的话,你就可以查看到netsh.exe的所有子进程了。
如何检测并阻止这类攻击?
1. 很明显,我们可以扫描“HKLMSOFTWAREMicrosoftNetsh”注册表键中的新条目,这是最简单的一种方法。
2. 你的团队应该监控注册表的状态,任何通过CMD、Powershell、或者WMI来修改注册表的操作都应该被记录下来。虽然这种情况经常会发生,而且这很有可能需要花费大量的时间。但是如果能够发现异常活动的话,这点投入还是值得的。
3. 用户也可以使用DLL白名单,微软的Applocker可以允许用户配置DLL文件的执行策略。
总结
我的这一发现到底有多么重要?我自己也不太清楚。但是,这确实是攻击者可以利用的一种攻击方法。请记住,处于防御端的人必须要想办法检测并阻止所有可能的攻击手段,而攻击者在攻击的过程中只需要使用一种方法即可。所以信息安全攻防从来就不是一个公平的游戏。
发表评论
您还未登录,请先登录。
登录