保护 powershell 脚本不被在 Windows 中打开、编辑或修改

保护 powershell 脚本不被在 Windows 中打开、编辑或修改

我有以下 powershell myscript.ps1,我用它来请求用户名和密码,并根据它来将文件复制到某个目标。我想让它myscript.ps1受到保护,这样就没有人可以编辑它并看到用户名和密码,我找到了解决方案这里它将 powershell 脚本转换为.exe文件。当我最初使用 powershell 运行脚本时,会出现以下凭据表单,允许我输入用户名和密码。但是在生成 .exe 并运行它之后,凭据表单不再出现,而是出现控制台,显示“凭据:”,我不知道为什么?我希望在运行 exe 时仍显示凭据表单。有什么想法吗?

$credentials = Get-Credential
if ($credentials.Username -eq "user1" -And $credentials.GetNetworkCredential().password -eq "pass1") 
{ Copy-Item "test1.pdf" "\test\test1.pdf"; } 
else 
{ Copy-Item "test2.pdf" "\test\test2.pdf"; }

通过powershell运行脚本时的输出: 在此处输入图片描述

运行生成的exe文件时输出:

在此处输入图片描述

答案1

在源代码中保密密码

首先,我将尝试回答您的直接问题:

我想让这个 myscript.ps1 受到保护,这样就没有人可以编辑它并查看用户名和密码

我猜你并不真正关心人们是否真的编辑/更改了脚本,而只是想保证密码的安全。正如 Ben 所说,将其转换为 exe 文件实际上并不能起到多大作用,因为你仍然将密码嵌入其中。

你真正想要的是密码哈希,这是一个单向函数,可将密码转换为可嵌入的哈希值。仅给出哈希值,攻击者无法逆转该过程,但您可以通过对输入的密码进行哈希处理并将其与正确密码的已知哈希值进行比较来验证密码尝试。

例如伪代码:

$authorisedHash = 'thehashedpassword';
$password = (Get-Credential).Password;
if ((Get-Hash $password) -eq $authorisedHash)
{
    echo 'Password correct';
}

您存储以供稍后比较的$authorisedHash预先计算的结果(伪代码)在哪里。Get-Hash

理想情况下,你应该使用具有较高工作因子的算法(例如 Bcrypt 或 PBKDF2)(即减慢速度)因此暴力攻击(通过尝试所有可能的密码进行猜测)需要很长时间才能实现。

通过这种方法,您唯一需要的字符串店铺在您的代码中是您碰巧使用的任何“ ”(伪代码)函数的原始输出Get-Hash,这使得从源代码中获取原始密码变得非常困难(甚至不可能)。


使用密码保护文件

然而,虽然这可以保密密码,但实际上并没有提供任何安全优势。正如 Ben 所说,没有什么可以阻止用户手动运行Copy-Item,甚至只是使用 Windows 资源管理器自己复制文件。

对于这种安全性,您需要使用 Windows 的访问控制列表和一个实际上在其他地方进行身份验证的单独用户帐户(例如通过 Windows OS 登录/运行方式命令)。您需要外部服务或帐户来执行复制,因为您需要确保用户无权直接访问绕过脚本。

如果这对你来说不可能(例如因为你将文件与脚本一起分发,但你不是机器的管理员),那么你应该做的是加密文件。通过使用密码加密文件,可以确保文件在没有密码的情况下是无用的(因此复制文件也是无用的,因为在解密之前文件是不可读的)。

现在,这可以通过 PowerShell 完成,但还有其他更简单的方法。一种简单的通用方法是将文件存储在加密存档中,例如 ZIP 1、RAR、7z 等,用户必须提供密码才能提取。或者,PDF 本身包含支持加密,需要密码才可以读取。


1请注意,Windows XP 到 7(可能还有 8 和 10)中内置的 ZIP 加密支持不支持 AES。它仅支持不安全的传统 ZIP 加密。因此,您需要第三方工具或自解压存档 (exe) 来提取文件。

答案2

如果用户可以执行脚本,他们就可以读取其内容。(只有知道脚本的内容才能执行脚本,否则您将不知道要运行什么。)因此,不可能让用户同时能够使用您的脚本而无法从中读取密码。您可以将密码作为加密哈希,但如果该脚本以普通用户身份运行,则用户可以直接绕过该脚本并复制test1.pdf到目的地,而无需运行您的脚本。

相反,你应该对目标文件/文件夹应用文件访问控制,以要求特权操作以经过身份验证的用户身份运行。然后,你可以提供用户提供的凭据作为Start-Job-Credential参数。

答案3

我认为这是不可能的,因为我也在寻找相同的解决方案。当然,将您的 powershell 脚本转换为可执行文件可能会阻止裸用户直接访问您的代码,但是,就像 Bob 所说的那样,它增加了复杂性,但不会阻止用户反汇编可执行文件以获取密码。从安全方面来看,在白名单计算机上运行未经批准的可执行文件将导致记录事件并转发到 SIEM。一些组织默认通过 GPO 禁用 powershell 脚本,所以我认为我们可以欣赏这种自由。

现在尝试提出建设性的意见,我有两个想法。

1.我在想,也许我们可以使用 DAC 保护文件,这样只有创建者所有者、管理员和系统才具有 RWX 权限,而其他用户则无权访问。该文件夹还可以配置为不从其父级继承权限。

  1. 我们使用 RSA 加密整个脚本的内容并生成一个私钥。只有身份验证脚本才会以纯文本形式出现,我们必须提供私钥才能让 powershell 解密并运行。这也可能是一个危险信号,因为 EDR 和管理员无法扫描或解密您加密的内容。根据脚本的长度,除非选择有效的算法,否则解密可能会很慢。

答案4

地点似乎可以保护 powershell 脚本不被编辑/修改。

我在 Windows 10 机器上测试了几个 .ps1 脚本。以下是我的发现:

  1. 能够执行受保护的脚本
  2. 如果检测到未经授权的更改,受保护的脚本将中止执行

虽然这个网站确实可以防止修改,但有一个相对普遍的共识认为,任何实体在野外编写的任何“受保护”代码都可能被黑客入侵。需要记住的是。我还没有尝试破解我提交的测试脚本(除了尝试修改它们)。

相关内容