VPNs Site-to-Site em algumas situações são estabelecidas na correria ou com documentação deficiente e uma das informações principais que é a Pre-Shared-Key, muitas vezes é perdida com o tempo. Nesse artigo vamos abordar como colher essa informação via API.

 

Para buscarmos essa informação, utilizaremos um API Token, que é a nossa identificação que apresentaremos ao firewall para então ele permitir (ou não) colhermos a informação desejada.

 

O artigo abaixo demonstra como criar o nosso Token:

 

https://docs.fortinet.com/document/forticonverter/7.0.1/online-help/866905/connect-fortigate-device-via-api-token

 

Assim que temos o nosso Token, podemos seguir com a criação do nosso script.

 

Em nosso exemplo temos um firewall (192.168.88.192), estabelecendo túneis com 3 diferentes peers:

 

New Microsoft Visio Drawing.jpg

O código pronto, pode ser colhido no seguinte caminho:

 

https://github.com/ikky-ba/restore-psk-fortigate/blob/main/main.py

 

Para evitar a execução de algo em seu ambiente sem total entendimento, segue uma breve descrição do que cada linha do código faz (a documentação também está inclusa no arquivo):

 

# Importar modulos

 

## Importar modulo requests

import requests
## Importar modulo urllib

import urllib3

## Desabilitar alertas de certificados não confiáveis
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

## Importar modulo json
import json

 

# Inicializacao de variaveis e dicionarios

## Inicialização do dicionário 'keys', utilizaremos ele para armazenar o resultado bruto recebido pelo firewall

keys = {}


## Inicialização do dicionário 'tunnel_info' que utilizaremos para armazenar apenas os dados que queremos (IP e PSK)

tunnel_info = {}

 

##  Inicialização da variável 'count_tunnel' é ela que usaremos para garantir que buscaremos a informação de todos os túneis, independente da quantidade
count_tunnel = 0

 

# Criação da funcao 'retrieve_keys', note que ela espera um valor para ser inicializada, no caso é o IP do firewall que buscaremos a informação

 

def retrieve_keys(ip):

 

## Definição da varíavel 'url', note que ela está juntando 'https://' com o IP que fornecemos a função
    url = 'https://' + ip

##  Definição da chamada que faremos ao firewall. Usuários que fazem uso de vdom, coloquem o VDOM no final, logo após o '='
    command = '//api/v2/cmdb/vpn.ipsec/phase1-interface?plain-text-password=1?vdom='

##  Definição de como nos autenticaremos com o destino, no nosso caso, estamos usando um Token API
    headers = {'Authorization': 'Bearer ' + 'SEU_TOKEN_API_VAI_AQUI'
}

##  Busca dos dados no firewall utilizando os valores anteriores
    r = requests.get(url + command, headers=headers, verify=False)
##  Retornar os dados em formato de texto 

    return(r.text)
   

##  Chamada da função 'retrieve_keys) utilizando como destino o IP do firewall
keys = json.loads(retrieve_keys('O_IP_DO_SEU_FIREWALL_VAI_AQUI'))

 

##  Contar a quantidade de túneis o firewall possui

number_of_tunnels = (len(keys['results']))

 

##  Manter em loop a execução da tarefa enquanto não navegarmos em todos os túneis

while count_tunnel < number_of_tunnels:

##  Adicionar as informações que estamos buscando (IP e PSK) ao dicionário que iniciamos anteriormente 'tunnel_info'
    tunnel_info[(keys['results'][count_tunnel]['remote-gw'])] =    (keys['results'][count_tunnel]['psksecret'])

##  Adicionar '1' a variável 'count_tunnel'
    count_tunnel = count_tunnel + 1

 

# Printar no console o resultado


print(tunnel_info)

 

 

Ao rodarmos o script (fornecendo as informações necessárias, como Token e IP), é esperado que receba o seguinte output:

 

Untitled.png

Como podemos ver, temos como o resultado o IP do peer remoto e a PSK, o script poderia seguir e salvar isso em um txt, ou por exemplo, fazer interface com um sistema interno e inserir essa informação de forma automática sempre que ele detectar que um novo túnel foi criado, ou que teve a chave alterada, as possibilidades são muitas. Além das informações que colhemos, poderíamos ter buscado mais dados, como nome do túnel, quais são as fase2 configuradas, criptografia, etc...