15 votes

Récupérer le mot de passe enregistré OpenVPN

Je suis en train de changer l'ordinateur portable d'un utilisateur et ils ont enregistré leur nom d'utilisateur et leur mot de passe dans l'interface graphique OpenVPN. Naturellement, ils ne connaissent pas leur mot de passe car ils les ont saisis il y a un certain temps et ont cliqué sur "enregistrer le mot de passe". Existe-t-il un moyen de récupérer ces détails afin que je puisse les migrer vers le nouvel ordinateur portable sans avoir à réinitialiser le compte VPN (ce qui serait beaucoup plus difficile que nécessaire !).

Les deux ordinateurs portables sont sous Windows 10.

J'ai copié les fichiers .ovpn, p12 et .key mais l'interface graphique demande toujours le nom d'utilisateur et le mot de passe. Il n'y a pas de fichier texte de mot de passe dans le répertoire de configuration (sous OpenVPN dans Program Files).

J'ai également cherché dans le registre mais je n'ai pas trouvé les informations là-bas.

EDIT : Pour être clair, je n'ai pas réellement besoin de "récupérer" le mot de passe. S'il est crypté dans une clé de registre par exemple, c'est bien, je pourrais exporter la clé depuis l'ancien ordinateur portable et l'importer sur le nouveau. Je dois trouver un moyen de copier les détails de l'ordinateur portable 1 à l'ordinateur portable 2.

0 votes

Étant donné que les mots-clés sont protégés à l'aide de services de sécurité du système, je doute que la copie du texte crypté fonctionne. Est-ce que cela a fonctionné dans votre cas?

20voto

Alex Points 251

Le script Powershell dans ce lien obtient le mot de passe pour moi : Récupération de mot de passe OpenVPN

Les noms des registres sur mon ordinateur sont un peu différents; ma version:

$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}

foreach ($item in $items)
{
  $encryptedbytes=$item.'auth-data'
  $entropy=$item.'entropy'
  $entropy=$entropy[0..(($entropy.Length)-2)]

  $decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
    $encryptedBytes, 
    $entropy, 
    [System.Security.Cryptography.DataProtectionScope]::CurrentUser)

  Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
}

Vous devrez peut-être également exécuter Add-Type -AssemblyName System.Security dans Powershell pour que ça fonctionne.

edit: sur windows 10, OpenVPN v11.9, $encryptedbytes=$item.'key-data'

6 votes

A fonctionné pour moi en changeant 'key-data' en 'auth-data'

0 votes

@leonbloy / Alex est-ce que quelqu'un a vu ma question ici stackoverflow.com/q/70934162/365107 ? Comment puis-je obtenir le nom d'utilisateur OpenVPN de la même manière, j'ai également mis ce que j'ai essayé en tant que code là-bas, est-ce que quelqu'un peut m'aider à résoudre le problème ?

15voto

amb Points 81

Selon le code source de l'OpenVPN GUI, les mots de passe enregistrés sont stockés dans le registre sous HKCU\Software\OpenVPN-GUI\configs.

0voto

Ma version, fonctionnant sur Windows 10/11 x64, pas de droits d'administrateur après l'exécution

*set-executionpolicy remotesigned*

*Add-Type -AssemblyName System.Security*

#openvpn-password-recovery.ps1

$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}

foreach ($item in $items)
{

  Write-Host ($item.'PSChildName')
  $username=$encryptedbytes=$item.'username'
  Write-Host ([System.Text.Encoding]::Unicode.GetString($username))

  $encryptedbytes=$item.'auth-data'
  $entropy=$item.'entropy'
  $entropy=$entropy[0..(($entropy.Length)-2)]

  $decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
    $encryptedBytes, 
    $entropy, 
    [System.Security.Cryptography.DataProtectionScope]::CurrentUser)

  Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
  Write-Host (' ')

}

0voto

Philip Allgaier Points 193

Ajout à la réponse d'Alex :

Vous pouvez également facilement extraire le nom d'utilisateur si nécessaire en ajoutant les deux lignes suivantes :

$username=$encryptedbytes=$item.'username'
Write-Host ([System.Text.Encoding]::Unicode.GetString($username))

Notez également qu'en fonction de la configuration de votre PowerShell, vous pourriez avoir besoin d'exécuter les deux commandes suivantes avant que le script puisse fonctionner (pour autoriser les scripts et activer les types de sécurité nécessaires pour le processus de déchiffrement) :

set-executionpolicy remotesigned 
Add-Type -AssemblyName System.Security

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X