我有两个不同的 Watchguard XTM 515 防火墙。每个防火墙都创建了自己的 VPN 集。
现在我只需要使用一个防火墙来处理两个 VPN。但问题是我不知道 VPN 的 PSK(我加入工作后继承了这些防火墙)。要求客户更改 PSK 对我来说不是一个选择。
现在我做我知道当我导出防火墙的配置(XML 文件)时,它包含所有 VPN 的 PSK。这就是将该配置恢复到另一个防火墙的原因。但我不知道如何获取这些 PSK。我用纯文本编辑器检查配置 XML 文件,似乎它们是加密的(这并不奇怪)。但它们必须使用静态密钥加密,因为此配置可以上传到任何防火墙。只是我不知道解密方案和密钥。
现在我的目标当然不是破解 Watchguard XML 配置文件的加密。我需要做的就是将两个防火墙合并为一个。我考虑过手动合并从两个防火墙导出的 XML 配置文件部分,但这似乎是一项艰巨的任务。
请您帮忙建议一种将两个不同的 Watchguard 防火墙的 VPN 合并为一个的方法?
答案1
你是对的,它们是用静态密钥加密的,方案是AES 密钥包装算法 (RFC 3394).并且你可以解密它们。
我拿了这个公共领域 C# 库,将其精简为仅解密函数并将其移植到 PowerShell,因此它适合 StackOverflow 答案并且不需要编译或二进制文件。
它并不漂亮,没有错误检查或任何东西,但它似乎有效:
<#
.Synopsis
Decrypts a Watchguard encrypted BOVPN pre-shared-key
.EXAMPLE
Decrypt-WatchguardPsk -EncryptedPsk '0E611DC31F2AEBB4A6E69F2641E1E83D762F514F3636E1EFA86B9BDECFEFADFB'
#>
function Decrypt-WatchguardPsk
{
[CmdletBinding()]
[Alias()]
[OutputType([int])]
Param([Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)]$EncryptedPsk)
Process
{
function Group-ByCount ($ByteArray, $n) { #BigArray -> Arrays of n items
$NumGroups=$ByteArray.Count/$n
$Output= @()
0..($NumGroups-1) | ForEach-Object { $Output += @(, [byte[]]$ByteArray[($_*$n)..(($_*$n)+$n-1)]) }
$Output
}
$KeyEncryptionKey = [byte[]] @(29, 3, 245, 130, 135, 152, 43, 199, 1, 34, 115, 148, 228, 152, 222, 35)
$EncryptedPsk = $EncryptedPsk -replace '\s|(</*psk>)|\+' # trim xml line. Here so you can do: sls '<psk>' *.xml | % Line | Decrypt-WatchguardPsk
[byte[]] $Arrby = $EncryptedPsk -split "(?<=\G\w{2})(?=\w{2})" |% { [Convert]::ToByte($_, 16) } #HexTo[byte[]]
$C = Group-ByCount $Arrby 8 #Byte array to groups of 8 bytes (AES blocks)
# 1) AES Key Wrap - Initialize variables
$A = $C[0]
$R = @($C[1..($C.Count-1)])
$Blockn = $R.Count
# 2) Calculate intermediate values
for ($j = 5; $j -ge 0; $j--) {
for ($i = $Blockn - 1; $i -ge 0; $i--) {
$t = $Blockn * $j + $i + 1 # add 1 because i is zero-based
#64 bit XOR
$A2 = $A.Clone()
[Array]::Reverse($A2)
$A2 = [BitConverter]::GetBytes([BitConverter]::ToInt64($A2, 0) -bxor $t)
[Array]::Reverse($A2)
$A = $A2
# Decrypt block
$Alg = New-Object -type System.Security.Cryptography.RijndaelManaged
$Alg.Padding = [System.Security.Cryptography.PaddingMode]::None
$Alg.Mode = [System.Security.Cryptography.CipherMode]::ECB
$Alg.Key = $KeyEncryptionKey
$ms = New-Object System.IO.MemoryStream
$xf = $Alg.CreateDecryptor()
$cs = New-Object System.Security.Cryptography.CryptoStream -ArgumentList @($ms, $xf, [System.Security.Cryptography.CryptoStreamMode]::Write)
$AConcatRi = $A + $R[$i] + (New-Object 'byte[]' (16 - $A.Count - $R[$i].Count))
$cs.Write($AConcatRi, 0, $Alg.BlockSize / 8)
$B = Group-ByCount $ms.ToArray() 8
$A = $B[0] #MSB(B)
$R[$i] = $B[1] #LSB(B) 64 least significant bits of a 128
}
}
-join ($R | % { [System.Text.Encoding]::ASCII.GetString($_) })
}
}
例如
PS C:\> Decrypt-WatchguardPsk -EncryptedPsk '8B4B449A6D4253232C4CFC48E311B7B9DF360D5F4EAB310CAD9D7B92B4CD3CA6340841671FA9187E6AB5F4604D5E2B9319EC890A826B96EF47163B83F2294289109F8336441879416A230C26E0AEEBDC332798F54F482250'
Testing with dummy text lorem ipsum dolor sit amet, consectetur adipiscing elit
我不认为发布此信息存在安全问题 - 任何能够获取防火墙配置文件的攻击者都已经突破了防火墙或管理工作站的安全措施。该配置不包含设备管理登录凭据。而且,他们没有太多其他方法可以加密配置文件中的内容,而只需付出很多其他代价即可。这确实是一个实用的层,可以阻止密码出现在纯文本搜索和索引中。
答案2
除了 @TessellatingHeckler 发布的答案外,还有另一种非技术性方法可以将 VPN 从一个值班警卫转移到另一个值班警卫。我最终使用了这种方法,效果非常好。
- 从旧防火墙导出配置。请妥善保存文件。我们称之为
old.xml
。 - 在新防火墙上使用相同的配置创建 VPN。显然您不知道 PSK,因此请在框中输入任何内容。
- 从新防火墙导出配置。我们称之为
new.xml
。 - 复制您要从中迁移的 VPN 的加密 PSK 字符串
old.xml
。 覆盖 中的 VPN PSK 字符串new.xml
。 - 将背面应用
new.xml
到新的防火墙。
我们的想法是不是我们对 PSK 的值感兴趣。我们只想迁移它。那么为什么不直接迁移加密值呢?由于每个 Firebox 中的加密都相同,因此我们可以直接迁移加密的 PSK。
答案3
同时重置两端网关上的密码,并记录新密码。将新密码应用到新配置并保存到 Firebox。