将两个Watchguard防火墙的VPN合并到一个防火墙中

我有两个不同的WatchGuard XTM 515防火墙。 每个都有它自己的一组VPN。

现在我只需要使用一个防火墙来处理这两个VPN。 但问题是我不知道VPN的PSK(我join我的工作后inheritance了这些防火墙)。 要求客户改变PSK不是我的select。

现在我知道,当我输出防火墙的configuration(XML文件)时,它包含了所有VPN的PSK。 这就是将该configuration恢复到另一个防火墙的原因。 但是我不知道如何去掌握那些PSK。 我用纯文本编辑器检查configurationXML文件,似乎他们被encryption(这里没有意外)。 但是它们必须使用静态密钥进行encryption,因为此configuration可以上传到任何防火墙。 只是我不知道解密scheme和密钥。

现在我的目标当然不是​​打破Watchguard XMLconfiguration文件的encryption。 我需要做的就是将两个防火墙合并为一个。 我想过手动合并从两个防火墙导出的XMLconfiguration文件的部分,但它似乎是一个艰巨的任务。

请你可以帮助build议一种将两个不同的Watchguard防火墙的VPN合并成一个方法吗?

你是对的,它们是用一个静态密钥encryption的,这个scheme是AES密钥包装algorithm(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 

我不认为发布这是一个安全问题 – 任何可以获得防火墙configuration文件的攻击者已经超过了安全,防火墙或pipe理工作站。 该configuration不包含设备pipe理login凭证。 而且没有其他办法可以encryptionconfiguration文件中的东西,而不用交换许多其他问题。 这是一个真实的层面,可以阻止纯文本search和索引中显示的密码。

除了@TessellatingHeckler发布的答案之外,还有另一种非技术方式将VPN从一个警卫转移到另一个警卫。 我结束了使用这种方法,它的工作就像一个魅力。

  • 从旧的防火墙导出configuration。 保持文件安全。 让我们把它old.xml
  • 在新防火墙上configuration相同的VPN。 显然你不知道PSK,所以在盒子里input任何东西。
  • 从新的防火墙导出configuration。 让我们称之为new.xml
  • 将正在尝试从old.xml迁移的VPN的encryptionPSKstring复制。 在new.xml覆盖VPN的PSKstring。
  • new.xml应用到新的防火墙。

这个想法是我们对PSK的价值感兴趣。 我们只是想迁移它。 那么为什么不移动encryption值呢? 由于每个火箱的encryption都是一样的,所以我们可以迁移encryption的PSK。