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