Mesclar VPNs de dois firewalls de Watchguard em um firewall

1

Eu tenho dois firewalls diferentes do Watchguard XTM 515. Cada um tem seu próprio conjunto de VPNs criados neles.

Agora preciso usar apenas um firewall para lidar com as VPNs de ambos. Mas o problema é que eu não conheço o PSK das VPNs (eu herdei o firewall depois de entrar no meu trabalho). Pedir aos clientes para mudarem o PSK não é uma opção para mim.

Agora eu sei que quando exporto a configuração (arquivo XML) do firewall, ele inclui os PSKs de todas as VPNs. Essa é a razão pela qual restaurar essa configuração para outro firewall funciona. Mas eu não sei como se apossar desses PSKs. Eu verifico os arquivos XML de configuração com o editor de texto simples e parece que eles estão criptografados (não é surpresa aqui). Mas eles devem ser criptografados usando uma chave estática, pois essa configuração pode ser carregada em qualquer firewall . É só que eu não conheço o esquema de descriptografia e a chave.

Agora, meu objetivo não é quebrar a criptografia dos arquivos de configuração XML do Watchguard. Tudo o que preciso fazer é mesclar dois firewalls em um. Pensei em mesclar manualmente as seções dos arquivos de configuração XML exportados de ambos os firewalls, mas parece uma tarefa difícil.

Por favor, você pode ajudar a sugerir um método para mesclar VPNs de dois firewalls diferentes do Watchguard em um?

    
por Hemant 17.07.2016 / 21:26

2 respostas

2

Você tem razão, eles são criptografados com uma chave estática e o esquema é Algoritmo de quebra de chave AES (RFC 3394) . E você pode descriptografá-los.

Eu peguei esta biblioteca C # de domínio público , limpei-a até as funções de decriptografia e a transformei no PowerShell, ele caberia em uma resposta do StackOverflow e não precisaria de compilações ou binários.

Não é bonito, não tem verificação de erros nem nada, mas parece funcionar:

<#
.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($_) })
    }
}

por exemplo,

PS C:\> Decrypt-WatchguardPsk -EncryptedPsk '8B4B449A6D4253232C4CFC48E311B7B9DF360D5F4EAB310CAD9D7B92B4CD3CA6340841671FA9187E6AB5F4604D5E2B9319EC890A826B96EF47163B83F2294289109F8336441879416A230C26E0AEEBDC332798F54F482250'
Testing with dummy text lorem ipsum dolor sit amet, consectetur adipiscing elit

Não acho que postar isso seja um problema de segurança - qualquer invasor que consiga obter o arquivo de configuração do firewall já passou pela segurança, no firewall ou em uma estação de trabalho de gerenciamento. A configuração não contém credenciais de login de gerenciamento de dispositivos. E não há muito mais que eles poderiam fazer para criptografar coisas em um arquivo de configuração sem trocar muitas outras preocupações. É realmente uma camada pragmática para impedir que as senhas sejam exibidas em pesquisas e índices de texto simples.

    
por 01.04.2017 / 13:39
2

Além da resposta postada pelo @TessellatingHeckler, há outra maneira não técnica de transferir uma VPN de um guarda para outro. Acabei usando esse método e funcionou como um encanto.

  • Exporte a configuração do firewall antigo. Mantenha o arquivo seguro. Vamos chamá-lo de old.xml .
  • Faça a VPN com a mesma configuração no novo firewall. Obviamente você não conhece o PSK, então digite qualquer coisa na caixa.
  • Exporte a configuração do novo firewall. Vamos chamá-lo de new.xml .
  • Copie a string PSK criptografada da VPN que você está tentando migrar de old.xml . Sobrescreva a string PSK da VPN em new.xml .
  • Aplique o new.xml de volta ao novo firewall.

A ideia é que não estamos interessados no valor do PSK. Nós só queremos migrar. Então, por que não apenas migrar o valor criptografado? Como a criptografia é a mesma em todas as fornalhas, podemos apenas migrar o PSK criptografado.

    
por 04.04.2017 / 11:45