martes, 9 de julio de 2013

Crear credenciales ofuscadas en un script de PowerShell

Hola,

Esto se puede considerar una segunda parte del script anterior. En este caso se van a generar unas credenciales ofuscadas, o lo que es lo mismo, unas credenciales ilegibles, pero que si controlas un poco se podría revertir el proceso para revelar el contenido (yo no soy capaz). Es muy práctico si tienes que dejar scripts para que lo ejecuten otros y no quieres que puedan editar el código y ver las credenciales en texto plano. Por ejemplo, para que un departamento de helpdesk pueda ver cierta información que le dejemos disponible en el powershell, pero que no queremos que conozcan las credenciales del usuario con derechos de admin.

Vamos al lío. El script lleva dos partes. La primera genera el código que debemos pegar en en el script y la segunda es un ejemplo que he creado con unas contraseña super segura para ver si alguien es capaz de sacarla

GENERAR EL CÓDIGO
------------------------
Al ejecutar el script te preguntará el usuario y la contraseña. Al introducirlos te genera un fichero llamado OFUSCADO.PS1 y te abre el ISE con el código para hacer directamente el copy/paste sobre el script.

# Ubicación donde se guardará el fichero con los datos ofuscados
$path = 'c:\temp\Ofuscado.ps1'
New-Item -ItemType File $path -Force -ErrorAction SilentlyContinue
$user = Read-Host 'Escribe el nombre de usuario'
$pwd = Read-Host 'Escribe la contraseña' -AsSecureString
$key = 1..32 | ForEach-Object { Get-Random -Maximum 256 }
$pwdencrypted = $pwd | ConvertFrom-SecureString -Key $key

$private:ofs = ' ' ('$password = "{0}"' -f $pwdencrypted) | Out-File $path
('$key = "{0}"' -f "$key") | Out-File $path -Append

'$passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" "))' |
Out-File $path -Append
('$cred = New-Object system.Management.Automation.PSCredential("{0}", $passwordSecure)' -f $user) |
Out-File $path -Append
'$cred' | Out-File $path -Append

ise $path

EJEMPLO DE CÓDIGO -------------------------
En este ejemplo simplemente se conecta a un Filer. Es simplemente para ver dónde se podría pegar el código generado anteriormente y qué aspecto tendría.

$Controller="MiFiler001.lab.local"
########################################################################################################################
$password = "76492d1116743f0423413b16050a5345MgB8AEwAKwA4AGwATQBXAC8AOQBZAGEAYwBjAG4AZgBJAGsATwB0AGYAOQBFAFEAPQA9AHwAZAA5AGQANwA4ADQAZAAzADQAYgA3AGUANwA4AGMANQA5ADAAZQA3AGYAMQBhADkAZgBmADUAZgA1AGQAOABmAGMAMQBkADEAYQAwAGMANAA0ADYAMQBmADAAYgAyADkAZABmADkANgBkAGMAZABmAGEANQA2AGUAOQA3ADIAYQA=" $key = "105 145 37 32 163 64 245 82 109 74 48 173 214 181 126 204 158 112 230 15 57 124 104 138 207 57 162 140 7 171 186 223" $passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" ")) $cred = New-Object system.Management.Automation.PSCredential("root", $passwordSecure) ########################################################################################################################
Import-module DataONTAP
Connect-NaController $Controller -Credential $cred | Out-Null

En el ejemplo se puede ver que la contraseña es completamente ilegible y que el usuario que he empleado para generarlo ha sido 'root'. Por cierto, si alguien consigue descubrir la contraseña que escriba un post indicando los pasos seguidos para conseguirlo. Como pista os diré que es una palabra anglosajona que significa 'contraseña', seguida de un número binario de una sola cifra y que no es '0'

1 comentario:

Anónimo dijo...

puede haber un problema en el codigo ?

En línea: 9 Carácter: 20
+ $private:ofs = ' ' ('$password = "{0}"' -f $pwdencrypted) | Out-File ...
+ ~
Token '(' inesperado en la expresión o la instrucción.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken