У меня два разных межсетевых экрана Watchguard XTM 515. В каждом из них создан собственный набор VPN.
Теперь мне нужно использовать только один брандмауэр для обработки VPN обоих. Но проблема в том, что я не знаю PSK VPN (я унаследовал этот брандмауэр после того, как присоединился к моей работе). Просить клиентов изменить PSK - не вариант для меня.
Сейчас я делать Знайте, что когда я экспортирую конфигурацию (файл XML) брандмауэра, он включает в себя PSK всех VPN. Это причина того, что восстановление этой конфигурации на другом брандмауэре работает. Но я не знаю, как получить эти PSK. Я проверяю XML-файлы конфигурации с помощью текстового редактора, и кажется, что они зашифрованы (неудивительно). Но они должны быть зашифрованы с использованием статического ключа, так как эту конфигурацию можно загрузить в любой брандмауэр. Просто я не знаю схему расшифровки и ключ.
Моя цель - не взламывать шифрование файлов конфигурации Watchguard XML. Все, что мне нужно сделать, это объединить два межсетевых экрана в один. Я думал о ручном слиянии разделов файлов конфигурации XML, экспортированных из обоих брандмауэров, но это кажется сложной задачей.
Не могли бы вы помочь, предложив метод объединения VPN двух разных межсетевых экранов Watchguard в один?
Помимо ответа, отправленного @TessellatingHeckler, существует еще один нетехнический способ передачи VPN от одного охранника к другому. В итоге я использовал этот метод, и он отлично сработал.
old.xml
. new.xml
.old.xml
. Перезаписать строку PSK VPN в new.xml
.new.xml
вернуться к новому брандмауэру.Идея в том, что мы не Интересует, в чем ценность PSK. Мы просто хотим его перенести. Так почему бы просто не перенести зашифрованное значение? Поскольку шифрование одинаково во всех топках, мы можем просто перенести зашифрованный PSK.
Вы правы, они зашифрованы статическим ключом, а схема такая Алгоритм переноса ключей 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
Я не думаю, что публикация этого сообщения является проблемой безопасности - любой злоумышленник, который может получить файл конфигурации брандмауэра, уже прошел защиту, на брандмауэре или на рабочей станции управления. Конфигурация не содержит учетных данных для входа в систему управления устройством. И они мало что могли бы сделать для шифрования вещей в конфигурационном файле без решения множества других проблем. Это действительно прагматичный уровень, чтобы пароли не отображались в текстовых поисках и индексах.
Сбросьте парольную фразу на шлюзах на обоих концах одновременно и запишите новую парольную фразу. Примените эту новую кодовую фразу к новой конфигурации и сохраните в топке.