Vpn

將兩個 Watchguard 防火牆的 VPN 合併為一個防火牆

  • December 26, 2019

我有兩個不同的 Watchguard XTM 515 防火牆。每個都有自己的一組 VPN 在其中創建。

現在我只需要使用一個防火牆來處理兩者的 VPN。但問題是我不知道 VPN 的 PSK(我加入我的工作後繼承了那些防火牆)。要求客戶更改 PSK 對我來說不是一個選擇。

現在我知道當我導出防火牆的配置(XML 文件)時,它包括所有 VPN 的 PSK。這就是將該配置恢復到另一個防火牆的原因。但我不知道如何獲得這些 PSK。我用純文字編輯器檢查配置 XML 文件,似乎它們是加密的(這並不奇怪)。但它們必須使用靜態密鑰加密,因為此配置可以上傳到任何防火牆。只是我不知道解密方案和密鑰。

現在我的目標當然不是破解 Watchguard XML 配置文件的加密。我需要做的就是將兩個防火牆合併為一個。我考慮過手動合併從兩個防火牆導出的 XML 配置文件的部分,但這似乎是一項艱鉅的任務。

請您幫忙推荐一種將兩個不同 Watchguard 防火牆的 VPN 合併為一個的方法嗎?

沒錯,它們是用靜態密鑰加密的,方案是AES Key Wrap 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

我不認為發布這是一個安全問題 - 任何可以獲取防火牆配置文件的攻擊者都已經通過了安全性,在防火牆或管理工作站上。配置不包含設備管理登錄憑據。在不權衡許多其他問題的情況下,他們無法做太多其他事情來加密配置文件中的內容。阻止密碼出現在純文字搜尋和索引中確實是一個實用層。

引用自:https://serverfault.com/questions/790339