Introducción a PowerShell
Qué es PowerShell?
PowerShell es la robusta plataforma de automatización y scripting ideada por Microsoft. Su diseño une la versatilidad de un lenguaje de programación con la eficacia de un entorno de comandos, facultando a los usuarios para administrar infraestructuras, mecanizar labores recurrentes y manipular elementos del sistema a través de código.
Características principales
Basado en objetos: A diferencia de otros intérpretes como Bash (que trabajan con texto plano), PowerShell trabaja con objetos de .NET, lo que permite manejar datos de forma más precisa y profesional.
Cmdlets: Las instrucciones en PowerShell se llaman cmdlets, y siguen una estructura
Verbo-Sustantivo
, por ejemplo:Get-Process
→ Obtiene los procesos en ejecución.Start-Service
→ Inicia un servicio.Set-Date
→ Establece la fecha del sistema.
Modelo extensible: Posibilidad de importar módulos (
Import-Module
) para ampliar las funcionalidades con cmdlets personalizados.Remoting: Permite la ejecución de comandos o scripts en máquinas remotas con
Invoke-Command
,Enter-PSSession
, etc.Uso en Red Team:
Muchos marcos de ataque (como
PowerView
,PowerSploit
oEmpire
) están escritos en PowerShell.Su potencia y flexibilidad la convierten en una herramienta ideal para movimientos laterales, ejecución de payloads, reconocimiento y persistencia.
Componentes principales
Nos centraremos principalmente en los dos siguientes componentes:
Scripts
Un script de PowerShell es un archivo de texto plano con extensión .ps1
que contiene una o más líneas de comandos escritas en el lenguaje PowerShell. Su propósito principal es automatizar tareas repetitivas o complejas, permitiendo que se ejecuten de forma secuencial sin intervención del usuario.
Esto convierte a los scripts en herramientas potentes tanto para administradores de sistemas como para los profesionales de la seguridad ofensiva.
Existen diferentes formas de ejecutar un script PowerShell, aparte de otras más avanzadas, pero nos centraremos en las dos siguientes:
Ejecución desde un terminal (o invocando directamente el script):
Sintaxis:
$ruta_del_script\\MiScript.ps1
(o./MiScript.ps1
si estás en el mismo directorio).Ámbito: Cuando ejecutas un script de esta manera, se crea un nuevo ámbito secundario (child scope) para ese script. Esto significa que:
Variables: Las variables definidas en
MiScript.ps1
son locales a ese script y desaparecen cuando el script termina. No son accesibles desde la sesión de la terminal que lo llamó o desde un script padre.Funciones: Las funciones definidas en
MiScript.ps1
también son locales a ese script y no están disponibles en el ámbito padre.
Cambios de directorio: Si el script cambia el directorio de trabajo actual (
Set-Location
), ese cambio solo afecta el ámbito del script. Una vez que el script termina, la sesión de la terminal vuelve a su directorio de trabajo original.Uso típico: Se utiliza cuando el script es una unidad independiente que realiza una tarea específica y no necesitas que sus variables o funciones persistan en la sesión actual. Es como ejecutar un programa ejecutable independiente.
Ejemplo de ejecución:
ScriptPrueba.ps1
$MiVariable = "Hola desde el script"
Write-Host $MiVariable
Terminal:
PS C:\> .\ScriptPrueba.ps1
Hola desde el script
PS C:\> $MiVariable
# No se muestra nada, la variable no existe en este ámbito.
Dot Sourcing (Fuente de puntos):
Sintaxis:
. $ruta_del_script\\MiScript.ps1
(observa el punto y el espacio al principio).Ámbito: Cuando "dot sourceas" un script, los comandos del script se ejecutan en el ámbito actual (parent scope) de la sesión de PowerShell o del script que lo llama. Esto significa que:
Variables: Las variables definidas en el script son añadidas o modificadas en el ámbito actual y permanecen disponibles después de que el script termina.
Funciones: Las funciones definidas en el script son cargadas en el ámbito actual y pueden ser llamadas directamente desde la sesión o desde el script que realizó el dot sourcing.
Cambios de directorio: Si el script cambia el directorio de trabajo actual (
Set-Location
), ese cambio persiste en el ámbito actual de la sesión o del script que lo llamó.
Uso típico: Se utiliza cuando quieres cargar funciones, variables o configuraciones de un script en tu sesión actual o en otro script, para reutilizar ese código o datos.
Ejemplo de ejecución:
MisFunciones.ps1
function Saludar {
param ($Nombre)
Write-Host "Hola, $Nombre!"
}
$VersionScript = "1.0"
Terminal:
PS C:\> . .\MisFunciones.ps1
PS C:\> Saludar -Nombre "Mundo"
Hola, Mundo!
PS C:\> $VersionScript
1.0
En resumen, la clave de la diferencia radica en el ámbito de ejecución:
Ejecución normal: El script se ejecuta en un ámbito secundario aislado.
Dot Sourcing: El script se ejecuta en el ámbito actual, lo que hace que sus elementos (variables, funciones, etc.) estén disponibles en ese ámbito.
Módulos
Un módulo PowerShell es una unidad autocontenida y reutilizable de funcionalidad. Es una forma de organizar y encapsular comandos (cmdlets), funciones, variables, alias, proveedores e incluso otros scripts relacionados con un propósito común. Piensa en ellos como bibliotecas de código.
Tipos de Módulos PowerShell
Aunque hay varios, los más comunes son:
Módulos de Script (
.psm1
): Son los más simples y comunes. Básicamente, son archivos de script PowerShell (.ps1
) con una extensión.psm1
que contienen funciones, variables, etc. Puedes añadir un manifiesto de módulo (.psd1
) para controlar aún más las exportaciones, requisitos, etc.Módulos Binarios (
.dll
): Son módulos compilados escritos en lenguajes como C# que ofrecen un rendimiento superior y acceso a APIs de .NET directamente.Módulos de Manifiesto (
.psd1
): Un archivo de manifiesto es un archivo de datos que describe un módulo y sus contenidos. No contienen código, sino metadatos sobre el módulo, qué archivos contiene, qué funciones exporta, etc. A menudo se utilizan junto con módulos de script para una mejor gestión.
Ejecución de Módulos:
Instalación de un módulo:
Install-Module -Name NombreModulo
Importar un módulo:
Import-Modulo C:\PruebaModulo\ActiveDirectory.psd1
Listar todos los comandos de un módulo:
Get-Command -Module <NombreModulo>
PowerShell en entornos de Active Directory (AD)
PowerShell es una herramienta indispensable para la administración de Active Directory (AD), y su importancia radica en la capacidad que ofrece para automatizar, gestionar y auditar de forma eficiente los entornos de AD, desde los más pequeños hasta las infraestructuras empresariales más complejas. Antes de PowerShell, la administración de AD dependía en gran medida de las herramientas gráficas (GUI) o de scripts más complejos en otros lenguajes.
PowerShell está intrínsecamente diseñado para integrarse con tecnologías de gestión de Microsoft como ADSI, WMI o AD Module. De hecho, gran parte de la potencia de PowerShell para la administración de sistemas Windows proviene de esta capacidad de interactuar fácilmente con estas interfaces subyacentes.
ADSI (Active Directory Service Interfaces)
Consisten en un conjunto de componentes COM que facilitan la interacción programática con servicios de directorio, destacando su uso con Active Directory. Esta tecnología permite a los usuarios consultar, modificar y administrar elementos dentro del directorio sin la necesidad de instalar módulos adicionales. En PowerShell, ADSI resulta útil para tareas de bajo peso, particularmente en sistemas donde el módulo específico de Active Directory no está presente.
WMI (Windows Management Instrumentation)
Se presenta como una infraestructura de administración en entornos Windows, cuya función es permitir el acceso a un amplio espectro de datos relativos tanto al sistema operativo como a la red, incluyendo elementos de Active Directory. A través de PowerShell, WMI se convierte en una herramienta clave para interrogar y alterar de forma remota configuraciones del sistema o datos contenidos en el directorio.
Modulo Active Directory (AD Module)
El módulo de Active Directory es una parte esencial de PowerShell que ofrece una colección de comandos predefinidos (conocidos como cmdlets) para una gestión fluida y eficiente de AD. Simplifica drásticamente tareas que de otro modo serían complicadas, como buscar usuarios específicos (Get-ADUser
) o añadir miembros a grupos (Add-ADGroupMember
).
Lo realmente potente de este módulo es su estrecha conexión con la estructura interna de Active Directory, garantizando que todo funcione a la perfección y sea fácil de usar.
Seguridad en PowerShell
En el ámbito de la ciberseguridad, PowerShell es una herramienta de doble filo. Por un lado, es increíblemente potente para la administración de sistemas; por otro, su flexibilidad la convierte en un objetivo frecuente para atacantes. Es por ello que contar con mecanismos de detección eficaces es fundamental para monitorizar, analizar y mitigar posibles abusos en entornos empresariales.
Detallaremos los principales tipos de mecanismos que deberíamos conocer:
Transcripción a Nivel de Sistema (System-wide Transcription)
Imagina tener un registro detallado de cada acción que ocurre en tu sistema relacionada con PowerShell. Eso es precisamente lo que ofrece la Transcripción a Nivel de Sistema. Esta característica permite grabar toda la entrada y salida de scripts, comandos y actividades de PowerShell en todo el sistema.
¿Qué registra? Absolutamente todo: acciones de usuario, contenido de scripts ejecutados y mensajes de error. Es una auditoría exhaustiva que te proporciona una visibilidad sin precedentes. Se habilita a través de políticas de grupo y almacena los registros en ubicaciones de archivo específicas, lo que facilita su posterior análisis forense.
Registro de Bloques de Script (Script Block Logging)
Mientras que la transcripción graba todo, el Registro de Bloques de Script se centra en el "corazón" de la ejecución: el contenido de los bloques de script de PowerShell ejecutados. Esto es crucial porque proporciona visibilidad sobre actividades PowerShell tanto legítimas como maliciosas.
Lo más impresionante de esta característica es su capacidad para detectar y registrar incluso scripts generados dinámicamente o aquellos que han sido ofuscados para evadir la detección. Los registros se almacenan convenientemente en el Registro de Eventos de Windows, específicamente en el registro "PowerShell Operational".
Interfaz de Análisis Antimalware (AMSI)
La Interfaz de Análisis Antimalware (AMSI) es tu primera línea de defensa en tiempo real. Esta interfaz se integra directamente con tu software antivirus para escanear scripts y comandos de PowerShell mientras se ejecutan.
¿Por qué es tan importante? Porque AMSI puede detectar y bloquear actividades maliciosas incluso si los atacantes utilizan técnicas de ofuscación o payloads codificados para intentar pasar desapercibidos. Gracias a su amplia adopción, AMSI se ha convertido en un pilar fundamental para mejorar la seguridad a nivel de script.
Modo de Lenguaje Restringido (Constrained Language Mode - CLM)
El Modo de Lenguaje Restringido (CLM) es una medida preventiva que limita drásticamente las capacidades de PowerShell para reducir las superficies de ataque. Al habilitar CLM, restringes los comandos y características disponibles, lo que dificulta enormemente que los atacantes abusen de PowerShell.
Este modo limita el acceso a clases .NET, objetos COM y otras funcionalidades avanzadas de scripting que a menudo son explotadas en ataques. CLM se aplica automáticamente a scripts no confiables o cuando se integra con herramientas de seguridad robustas como AppLocker y WDAC (Windows Defender Application Control).
Integración con AppLocker y WDAC (Device Guard)
La combinación de CLM con AppLocker y Windows Defender Application Control (WDAC) crea una fortaleza impenetrable. Estas herramientas trabajan de la mano para hacer cumplir políticas estrictas que determinan qué scripts y ejecutables pueden ejecutarse en tu sistema.
Al integrar estas soluciones, no solo limitas PowerShell, sino que también añades una capa de seguridad adicional que previene la ejecución no autorizada o maliciosa de cualquier elemento. Juntos, CLM, AppLocker y WDAC forman una estrategia de defensa en profundidad contra las amenazas basadas en PowerShell.
Última actualización