使用 PowerShell 进行暴力密码破解(示例脚本)

我最近使用 PowerShell 构建了一个应用程序,用于根据可选择的标准生成强随机密码。 在编写了基于 GUI 的密码生成器之后,我开始思考是否可以使用 PowerShell 来执行相反的操作 – 破解密码。

当我思考这个想法时,我考虑了考虑到可用的不同密码的多样性,我应该尝试破解哪种类型的密码。 最终,我决定使用一个受密码保护的文件碰碰运气,而我长期以来因忘记密码而被锁定。

这个修改后的脚本可以被认为是一个DIY渗透测试工具,为暴力破解密码提供了基本结构。 我没有公开发布一个可以在不修改密码的情况下破解密码的工具。

用于暴力破解密码的 PowerShell 脚本

话虽如此,这是我的脚本:

函数测试密码 { Param(
[String]$Password ) $ErrorOccurred=$False Try{ # 在此处插入代码以尝试使用当前密码 } Catch{ $ErrorOccurred = $True Return $ErrorOccurred } Return $ErrorOccurred } $UpperCase=@('A','B', 'C'、'D'、'E'、'F'、'G'、'H'、'I'、'J'、'K'、'L'、'M'、'N'、'O ','P','Q','R','S','T','U','V','W','X','Y','Z') $LowerCase=@ ('a','b','c','d','e','f','g','h','i','j','k','l',' m'、'n'、'o'、'p'、'q'、'r'、's'、t'、'u'、'v'、'w'、'x'、'y' ,'z') $Numbers=@('1','2','3','4','5','6','7','8','9','0') $Symbols=@('!','@','$','?','<','>','*','&') $Charset = @() ForEach-Object { $UpperCase | } ForEach-Object { $Charset += $_ } $LowerCase | ForEach-Object { $Charset += $_ } $LowerCase | ForEach-Object ForEach-Object { $Charset += $_ } $Numbers | ForEach-Object { $Charset += $_ } $Numbers | ForEach-Object ForEach-Object { $Charset += $_ } $Symbols | ForEach-Object { $Charset += $_ } $Symbols | ForEach-Object ForEach-Object { $Charset += $_ } } $MaxDepth = 8 $combinations = @(“”) for ($deep = 1; $deep -le $MaxDepth; $deep++) { $newCombinations = @() foreach ( $combinations 中的 $combination) { foreach ($Charset 中的 $char) { $newCombination = $combination + $char Write-Host $newCombination $Password = $NewCombination $ErrorOccurred = 测试密码 -Password $Password If ($ErrorOccurred -eq $False){ Write-Host “找到密码:” $Password Exit } If ($ErrorOccurred -eq $True){ Write-Host “找不到密码:” $Password } $newCombinations += $newCombination } } $combinations = $新组合 }

PowerShell 脚本的工作原理

让我们看看这个脚本是如何工作的。

1. 脚本主体首先定义几个字符集,包括$UpperCase、$LowerCase、$Numbers 和$Symbols。 这些集确定密码猜测尝试中将使用的字符。 这些代码行直接从我的 GUI 密码生成器脚本复制,但可以根据需要进行调整以包含其他字符。

2. 接下来,一段代码创建一个名为 $Charset 的数组。 我将 $UpperCase、$LowerCase、$Numbers 和 $Symbols 中定义的每个字符添加到 $CharSet 数组中。 这样,单个数组就包含了密码猜测尝试中使用的所有可能的字符。

3. 接下来,一行代码将 $MaxDepth 设置为 8。$MaxDepth 变量定义最大密码长度。 目前,当 $MaxDepth 设置为 8 时,脚本将尝试猜测长度最多为 8 个字符的密码。 您可以更改此数字来调整最大密码长度。

4. 随后的代码行使用 For 语句和几个 ForEach 语句来循环遍历所有可能的密码。 当前密码猜测存储在名为 $NewCombination 的变量中,而 $Password 变量也存储当前密码猜测。

5. 定义 $Password 变量后,您会注意到一行:

$ErrorOccurred = 测试密码 – 密码 $密码

这行代码将当前密码猜测传递给名为 Test-Password 的函数。 该函数返回一个名为 $ErrorOccurred 的变量,该变量将被分配 $True 或 $False 值。

功能本身比较简单。 它最初将 $ErrorOccurred 设置为 $False。 顺便说一句,如果您只想看到脚本在屏幕上循环显示所有可能的密码组合而不实际破解密码,则可以将 $ErrorOccurred 的初始值更改为 $True。 您可以在图 1 中看到修改后脚本的作用。

图1

图 1. 如果将 $False 更改为 $True,就会发生这种情况。

6. 设置 $ErrorOccurred 后,您将注意到一条 Try 语句。 您可以在此处插入代码以尝试提交当前密码猜测以查看其是否有效。 这里的做法是,如果密码猜测失败(因为密码不正确),PowerShell将返回错误。 这会触发 Catch 部分执行,在返回脚本主体之前将 $ErrorOccurred 设置为 $True。 否则,如果没有发生错误,则假定密码正确,将 $ErrorOccurred 保留为 $False。

在继续之前,我将再给您一个有关如何使该脚本作为实际的暴力破解工具的提示。 为了使脚本按预期工作,我必须将 -ErrorAction Stop 附加到将密码猜测提交到我想要破解的文件的代码行的末尾。 此添加可确保 Catch 部分中的代码正在执行。

7. PowerShell 返回到脚本主体后,将进行一个简单的检查以查看 $ErrorOccurred 是否设置为 $True 或 $False。 如果 $ErrorOccurred 为 true,则当前密码猜测被拒绝,意味着密码不正确。 相反,如果 ErrorOccurred 为 false,则密码被接受,意味着密码正确。 此时,脚本应显示新密码并终止。

值得注意的是,当我实际使用这个脚本来破解密码时,Exit命令并没有终止该脚本。 这意味着我必须删除“未找到密码”行,以便我可以看到最终接受的密码。 然而,我认为这种异常现象更多地与被破解的密码类型和所采取的方法有关,而不是脚本本身的问题。

关于作者

布莱恩·波西爆头Brien Posey 是畅销书技术作家、演讲家和 21 届 Microsoft MVP。 除了目前从事的 IT 工作外,Posey 还接受了商业宇航员候选人的培训,准备执行从太空研究极地中层云的任务。

1713341341
2024-04-17 07:14:28
#使用 #PowerShell #进行暴力密码破解示例脚本

Leave a Reply

Your email address will not be published. Required fields are marked *

近期新闻​

编辑精选​