15 votes

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

Je suis en train de changer l'ordinateur portable d'un utilisateur et ils ont enregistré leur nom d'utilisateur et mot de passe dans l'interface graphique OpenVPN. Naturellement, ils ne se souviennent pas de leur mot de passe car ils les ont entrés il y a un certain temps et ont cliqué sur "enregistrer le mot de passe". Y a-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 cela ne devrait l'être!).

Les deux ordinateurs portables fonctionnent 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.

ÉDITER : Pour être clair, je n'ai pas besoin de "récupérer" le mot de passe. S'il est chiffré dans une clé de registre par exemple, c'est bien, je pourrais exporter la clé du vieux portable et l'importer sur le nouveau. J'ai besoin de trouver un moyen de copier les détails du portable 1 au portable 2.

0 votes

Puisque les mots-clés sont protégés à l'aide de services de sécurité système, je doute que copier-coller l'enregistrement crypté fonctionne. Est-ce que ça a marché dans votre cas?

20voto

Alex Points 251

Le script Powershell dans ce lien obtient le mot de passe pour moi : OpenVPN Password Recovery

Les noms de registre 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 cela fonctionne.

éditer: 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 OpenVPN GUI, les mots de passe sauvegardés sont stockés dans le registre sous HKCU\Software\OpenVPN-GUI\configs.

0voto

Ma version, fonctionnant sur Windows 10/11 x64, sans 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

Adding to the answer from Alex:

You can also easily extract the username as well if required by adding the following two lines:

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

Also note that depending on your PowerShell config, you might need to run the following two commands first before the script can work (to allow scripts and enable the security types needed for the decryption process):

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