2つの異なるWatchguardXTM515ファイアウォールがあります。それぞれに独自のVPNセットが作成されています。
今、私は両方のVPNを処理するために1つのファイアウォールだけを使用する必要があります。しかし、問題はVPNのPSKがわからないことです(仕事に参加した後、それらのファイアウォールを継承しました)。お客様にPSKの変更を依頼することは、私にとって選択肢ではありません。
これで、ファイアウォールの構成(XMLファイル)をエクスポートすると、すべてのVPNのPSKが含まれることがわかりましたdo。これが、その構成を別のファイアウォールに復元することが機能する理由です。しかし、私はそれらのPSKを手に入れる方法がわかりません。プレーンテキストエディタで構成XMLファイルを確認しましたが、暗号化されているようです(ここでは驚くことではありません)。ただし、この構成はanyファイアウォールにアップロードできるため、静的キーを使用して暗号化する必要があります。復号化スキームとキーがわからないだけです。
今の私の目的は、WatchguardXML構成ファイルの暗号化を破らないことです。私がする必要があるのは、2つのファイアウォールを1つにマージすることだけです。両方のファイアウォールからエクスポートされたXML構成ファイルのセクションを手動でマージすることを考えましたが、それは困難な作業のようです。
2つの異なる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
これを投稿することはセキュリティの問題ではないと思います。ファイアウォールの構成ファイルを取得できる攻撃者は、ファイアウォールまたは管理ワークステーションですでにセキュリティを超えています。構成には、デバイス管理のログイン資格情報が含まれていません。そして、代わりに他の多くの懸念をトレードオフすることなく、構成ファイル内のものを暗号化するために彼らができることは他にあまりありません。プレーンテキストの検索やインデックスにパスワードが表示されないようにするのは、実際には実用的なレイヤーです。
@TessellatingHecklerによって投稿された回答とは別に、VPNをあるウォッチガードから別のウォッチガードに転送するための非技術的な方法がもう1つあります。私はこの方法を使うことになり、それは魅力のように機能しました。
old.xml
と呼びましょう。new.xml
と呼びましょう。old.xml
からコピーします。 new.xml
のVPNのPSK文字列を上書きします。new.xml
を新しいファイアウォールに適用し直します。アイデアは、PSKの値が何であるかに関心があるということですnot。移行したいだけです。では、暗号化された値を移行しないのはなぜですか?暗号化はすべてのファイアボックスで同じであるため、暗号化されたPSKを移行するだけで済みます。
両端のゲートウェイのパスフレーズを同時にリセットし、新しいパスフレーズを記録します。その新しいパスフレーズを新しい構成に適用し、ファイアボックスに保存します。