PowerShell: l’oggetto PSCredential

L’oggetto PSCredential di PowerShell è un modo comodo per registrare le credenziali e utilizzarle in diverse parti di uno script.

Questo è un modo relativamente sicuro per registrare login e password. Molta enfasi su relativamente.

Per creare in maniera interattiva un’istanza dell’oggetto PSCredential si usa il cmdlet Get-Credential in questo modo:

Senza parametri, Get-Credential chiede le credenziali all’utente e le ritorna sotto forma di istanza di PSCredential. L’istanza contiene molte proprietà, tra cui, naturalmente, login e password.

Dal momento che quelle credenziali possono essere utilizzate come parametri dai cmdlet più diversi per autenticare l’accesso, è ragionevole presupporre che la password sia registrata con un metodo di cifratura reversibile.

Iniziamo ad analizzare l’oggetto:

PS C:\Siamo Geek> $c | gm

 TypeName: System.Management.Automation.PSCredential

Name                 MemberType Definition
----                 ---------- ----------
Equals               Method     bool Equals(System.Object obj)
GetHashCode          Method     int GetHashCode()
GetNetworkCredential Method     System.Net.NetworkCredential GetNetworkCredential()
GetObjectData        Method     void GetObjectData(System.Runtime.Serialization.Seri...
GetType              Method     type GetType()
ToString             Method     string ToString()
Password             Property   securestring Password {get;}
UserName             Property   string UserName {get;}

Vediamo le proprietà UserName e Password. La prima contiene il nome utente in chiaro:

PS C:\Siamo Geek> $c.UserName
Siamo Geek

mentre la seconda è un’istanza di SecureString

PS C:\Siamo Geek> $c.Password
System.Security.SecureString

Andiamo quindi a ficcare il naso lì dentro:

PS C:\Siamo Geek> $c.Password | gm

 TypeName: System.Security.SecureString

Name         MemberType Definition
----         ---------- ----------
AppendChar   Method     void AppendChar(char c)
Clear        Method     void Clear()
Copy         Method     securestring Copy()
Dispose      Method     void Dispose(), void IDisposable.Dispose()
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
InsertAt     Method     void InsertAt(int index, char c)
IsReadOnly   Method     bool IsReadOnly()
MakeReadOnly Method     void MakeReadOnly()
RemoveAt     Method     void RemoveAt(int index)
SetAt        Method     void SetAt(int index, char c)
ToString     Method     string ToString()
Length       Property   int Length {get;}

Salta subito all’occhio che la proprietà della lunghezza della password è in chiaro:

PS C:\Siamo Geek> $c.Password.Length
15

Se tentiamo di eseguire il metodo ToString() non andiamo lontano:

PS C:\Siamo Geek> $c.Password.ToString()
System.Security.SecureString

Alla fine si tratta solamente di scoprire qual è il metodo giusto:

PS C:\Siamo Geek> $c.GetNetworkCredential().Password
Segretissima!!!

Se PSCredential è un modo molto comodo per portarsi in giro delle credenziali, non dovete assumere che lo script PowerShell che state eseguendo non possa decodificare la password che avete appena inserito e farne un uso arbitrario. (via SANS)

Autore: Luigi Rosa

Consulente IT, sviluppatore, SysAdmin, cazzaro, e, ovviamente, geek.

Spazio per un commento