Powershell : extraction des mots de passe BitLocker

Comme j’en avais parlé il y a presque un an déjà dans ce billet, il est possible de configurer BitLocker pour qu’il stocke les mots de passe des volumes chiffrés dans l’ActiveDirectory, en lien avec l’objet Ordinateur correspondant.

BitLocker stocke dans l’ActiveDirectory un objet de type msFVE-RecoveryInformation ; l’objet Ordinateur est donc le père. On peut retrouver toutes les informations en ouvrant un ADSI Edit et en allant sur l’objet Ordinateur :

Les différents mots de passe ont pour canonical name une concaténation de leur date de création et de différentes propriétés.

Dans les propriétés de l’objet, on retrouve donc l’attribut msFVE-RecoveryPassword que je vais récupérer dans le script Powershell ci-dessous ; ce script génère la liste de tous les objets Ordinateur et leurs objets msFVE-RecoveryInformation associés pour ensuite écrire le contenu dans un fichier CSV. Ainsi, ce script permet de réaliser une copie de sauvegarde des mots de passe et de ce qui est nécessaire pour déverrouiller les disques chiffrés des stations jointes au domaine. Naturellement, on prendra soin de bien protéger ce fichier et son accès. Le script est téléchargeable dans une version commentée à la fin de l’article.

Requires -RunAsAdministrator
 Add-Type -AssemblyName System.Windows.Forms
 $fileExpl = New-Object System.Windows.Forms.SaveFileDialog
 $fileExpl.ValidateNames = $true
 $fileExpl.CreatePrompt = $false
 $fileExpl.OverwritePrompt = $true
 $fileExpl.RestoreDirectory = $false
 $fileExpl.InitialDirectory = "$env:userprofile"
 Write-Host "WARNING : This script will extract from your ActiveDirectory all the BitLocker recovery keys and passwords. This is CRITICAL DATA as you would not want unauthorized users to be able to unlock the protected drives. Please ensure the exported data is stored somewhere safe." -Foreground "Red"
 Write-Host "Please press ENTER to start."
 Read-Host
 $global:tempfile = "$env:temp\temp-bl.csv"
 if(Test-Path $tempfile){ Remove-Item $tempfile }
 $dump = "ComputerName,DistinguishedName,msFVE-RecoveryPassword"
 Add-Content -Value $dump -path $tempfile
 $complist = Get-AdComputer -Filter *
 foreach($comp in $complist){
     $BLInfo = Get-AdObject -Filter 'objectClass -eq "msFVE-RecoveryInformation"' -SearchBase $comp.DistinguishedName -Properties 'msFVE-RecoveryPassword'
     foreach($BL in $BLInfo){
         $dn =$BL.DistinguishedName
         $dump = $comp.Name+","+"'"+$dn+"'"+","+$BL.'msFVE-RecoveryPassword'
         Add-Content -Value $dump -Path $tempfile
     }
 }
 $fileExpl.DefaultExt = "csv"
 $fileExpl.Filter = "Comma-separated values file (.csv)|.csv"
 $fileExpl.Title = "Export data to CSV file"
 $fileExpl.Filename = ""
 $fileExpl.ShowDialog() | out-null
 if ($fileExpl.Filename -ne "") {
     Copy-Item $global:tempfile -Destination $fileExpl.Filename
     if ($?){ Remove-Item $global:tempfile ; Write-Host "Data exported to"$fileExpl.Filename }
     else { Write-Host "Couldn't save the CSV file to the specified location." ; Remove-Item $global:tempfile }
 }
 else { Remove-Item $global:tempfile ; Write-Host "Data export aborted." }

Ce fichier CSV peut ensuite être importé dans Excel par exemple, en le convertissant :