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)
Lascia un commento