专栏首页FreeBuf如何绕过PowerShell访问限制并实现PowerShell代码执行

如何绕过PowerShell访问限制并实现PowerShell代码执行

如果你是一名专业的渗透测试人员,那你可能真的离不开PowerShell,但是如果目标系统中的某个策略组织我们访问PowerShel.exe,那我们该怎么办呢?没错,这个问题经常会困扰我们,而且网上也有很多的应对方法。

在这篇文章中,我将跟大家介绍一种快速且狡猾的绕过技术,这项技术需要利用C#编译代码来执行我们的PowerShell脚本。

首先,我们为什么不适用powershell.exe来执行我们的.ps1脚本呢?因为PowerShell脚本跟C#一样,它们两个对于.NET框架而言,都只是“前端”方面的东西,它们的本质都只是一种编程语言。不过在C#中,我们需要对程序代码进行编译才可以使用和执行,即编译型语言,这是它和PowerShell这种解释型脚本语言有很大区别。

鉴于PowerShell.exe只是.NET程序集“system.management.automation”的解释器,因此它应该可以在C程序中与这个对象进行交互并执行.ps1脚本。

下面给出的就是实例代码:

using System.Collections.ObjectModel; 
using System.Management.Automation; 
using System.Management.Automation.Runspaces; 
using System.IO;
using System;
using System.Text;
namespace PSLess
{
 class PSLess
 {
   static void Main(string[] args)
      {
     if(args.Length ==0)
         Environment.Exit(1);
     string script=LoadScript(args[0]);
     string s=RunScript(script);
     Console.WriteLine(s);
     Console.ReadKey();
   }
 private static string LoadScript(string filename) 
    { 
   string buffer ="";
   try {
    buffer = File.ReadAllText(filename);
    }
   catch (Exception e) 
   { 
     Console.WriteLine(e.Message);
     Environment.Exit(2);
    }
  return buffer;
 }
 private static string RunScript(string script) 
    { 
    Runspace MyRunspace = RunspaceFactory.CreateRunspace();
    MyRunspace.Open();
    Pipeline MyPipeline = MyRunspace.CreatePipeline(); 
    MyPipeline.Commands.AddScript(script);
    MyPipeline.Commands.Add("Out-String");
    Collection<PSObject> outputs = MyPipeline.Invoke();
    MyRunspace.Close();
   StringBuilder sb = new StringBuilder(); 
   foreach (PSObject pobject in outputs) 
   { 
       sb.AppendLine(pobject.ToString()); 
   }
    return sb.ToString(); 
  }
 }
}

其中的RunScript()方法会创建一个“runspace”对象,我们可以将其视作是PowerShell运行时的一个独立实例。接下来,我们需要将脚本添加到新创建的pipeline中,并对通信信道进行排序,最后通过Invoke()方法执行我们的脚本命令。

最终的结果将会被追加到我们的字符串生成器中,然后作为字符串发回给调用函数,以便显示在控制台的输出结果中。这也就是为什么我们要在命令中添加“Out-String”的原因。

怎么样,整个过程很简单吧?

接下来,我们需要对代码进行编译并完成代码测试。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
/reference:
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\system.management.automation.dll 
/out:c:\setup\powerless.exe c:\scripts\powersless.cs

请记住,具体的执行路径需要取决于目标系统中所安装的框架版本。除此之外,别忘了添加对“system.management.automation.dll”程序集的引用。

如果一切正常的话,我们就已经完成了代码的编译。接下来,创建一个简单地测试脚本:

test.ps1:
echo "Hello from powershell-less"
echo "PID: $pid"

然后运行该脚本:

没错,我们成功了!我们成功地在不直接使用powershell.exe的情况下调用并执行了我们的脚本代码。

实际上,这是一个非常简单的脚本,如果加上用户输入等处理机制的话,就会变得比较麻烦和复杂了,但对于大多数需要涉及到PowerShell的渗透活动来说,这应该已经够了吧。当然了,广大研究人员也可以根据自己的需要来修改脚本代码,以实现自己的需求。

*参考来源:decoder,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf),作者:Alpha_h4ck

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Powershell最佳安全实践

    ? 写在前面的话 其实很早之前,攻击者就已经开始使用合法工具来渗透目标网络并实现横向攻击了。理由很简单:使用合法工具可以降低被检测到的几率,而且进过授权的工具...

    FB客服
  • 传播恶意软件最有效帮手:超95%的PowerShell脚本都是恶意脚本

    对很多IT专业人士来说,Powershell的确是Windows系统中一个相当强大的工具,而且微软也有意将PowerShell作为Windows系统的默认命令行...

    FB客服
  • 如何利用日志来监控和限制PowerShell攻击活动

    写在前面的话 近期,我一直在我客户的网络环境中分析PowerShell攻击,根据我的分析以及研究结果,我发现了几种方法来帮助研究人员检测潜在的PowerShel...

    FB客服
  • 以太坊开发实战(第四部分:代币及ERC标准)

    从开发人员的角度来看,以太坊的代币只是智能合约。若以饮品作比喻,那么这个令牌就可以是咖啡,并且所有人都可以根据他们的喜好进行定制。

    lixiao
  • vue中点击屏幕其他区域关闭自定义div弹出框

    Daotin
  • 从撸串说起,中国地域消费差异

    我们使用 银联智惠信息服务(上海)有限公司 提供的2016年线下城市消费力大数据,对中国的地域差异进行了一个小小的研究。

    华章科技
  • Dirichlet过程混合模型

    本博客文章是Dirichlet流程混合模型聚类系列的第四部分。在以前的文章中,我们讨论了有限Dirichlet混合模型,并且把它们的模型的极限用于无限k个集群,...

    人工智能资讯小编
  • PayPal支付缺陷造成谎称支付额度漏洞

    近日,白帽子Jan Kechel发现了PayPal存在谎称支付额度的漏洞,并证明这可能会并被利用来进行诈骗。 Jan Kechel给出的Demo:http://...

    FB客服
  • 第十五章 Python多进程与多线程

    multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器。避免了GIL(全局解释锁)对资源的影响。

    用户2398817
  • Java-匿名子类(匿名内部类)

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Fisherman渔夫

扫码关注云+社区

领取腾讯云代金券