15 votes

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

Je change 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 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 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.

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

0 votes

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

20voto

Alex Points 251

Le script Powershell dans ce lien récupère le mot de passe pour moi : Récupération du mot de passe OpenVPN

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

$clés = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$éléments = $clés | ForEach-Object {Get-ItemProperty $_.PsPath}

foreach ($élément in $éléments)
{
  $octetsencryptés=$élément.'auth-data'
  $entropie=$élément.'entropy'
  $entropie=$entropie[0..(($entropie.Longueur)-2)]

  $octetsdécryptés = [System.Security.Cryptography.ProtectedData]::Unprotect(
    $octetsencryptés, 
    $entropie, 
    [System.Security.Cryptography.DataProtectionScope]::CurrentUser)

  Write-Host ([System.Text.Encoding]::Unicode.GetString($octetsdécryptés))
}

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

éditer : sur Windows 10, OpenVPN v11.9, $octetsencryptés=$élément.'key-data'

6 votes

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

0 votes

@leonbloy / Alex a-t-il 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é comme code là-bas, est-ce que quelqu'un peut m'aider à résoudre le problème?

15voto

amb Points 81

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

0voto

```html

Ma version, fonctionne 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

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 votre configuration 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écryptage):

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