Qué es PowerShell: historia, ediciones y por qué importa
Antes de escribir el primer cmdlet conviene saber qué es exactamente PowerShell, por qué Microsoft lo creó cuando ya existía CMD y por qué hoy aparece en casi todos los informes de incidentes en Windows, tanto del lado del defensor como del atacante.
Qué es PowerShell
PowerShell es una consola de comandos y un lenguaje de scripts construidos sobre .NET, la plataforma de programación de Microsoft. Esa base tiene una consecuencia que lo cambia todo: los comandos no devuelven texto, devuelven objetos de .NET, con propiedades (datos) y métodos (acciones). Un proceso no es una línea de texto con columnas, sino un objeto con Name, Id, Path y StartTime.
Hay dos ediciones que conviven en Windows:
| Edición | Ejecutable | Dónde está |
|---|---|---|
| Windows PowerShell 5.1 | powershell.exe | Incluida en Windows 10, Windows 11 y Windows Server 2016 en adelante. Ya no recibe funciones nuevas, solo correcciones |
| PowerShell 7 | pwsh.exe | Se instala aparte. Es de código abierto y corre en Windows, Linux y macOS |
Todo el curso funciona en la 5.1, porque es la que encontrará en cualquier equipo de una empresa durante una investigación. Cuando haya una diferencia importante con la 7, se lo indicaremos.
Breve historia
| Año | Hito |
|---|---|
| 2002 | Jeffrey Snover, ingeniero de Microsoft, publica el Monad Manifesto, que propone una consola basada en objetos |
| 2006 | Sale PowerShell 1.0, el nuevo nombre de Monad, como descarga para Windows XP, Server 2003 y Vista |
| 2009 | PowerShell 2.0 viene integrado en Windows 7 y Server 2008 R2, con la administración remota |
| 2012 | PowerShell 3.0 llega con Windows 8 y Server 2012 |
| 2016 | La versión 5.1 acompaña a Windows 10 y Server 2016. Microsoft publica PowerShell como código abierto y multiplataforma |
| 2020 | Sale PowerShell 7.0, sucesor de PowerShell Core 6 |
La idea de fondo era resolver un problema de los administradores: en CMD, cada herramienta imprimía texto con su propio formato y había que recortarlo a mano. Con objetos, la salida de un comando se convierte directamente en la entrada del siguiente.
Para un defensor, la historia importa por un detalle: la versión 5 añadió el registro de bloques de script, que guarda el código ejecutado. La 2.0 no lo tiene, y por eso los atacantes intentan usarla cuando sigue instalada. Lo verá en el módulo 3.
Por qué importa en ciberseguridad
- Está en todas partes. Un analista puede hacer triaje de un equipo sin instalar herramientas, algo valioso en medio de un incidente.
- Llega a todo. Procesos, servicios, registro de Windows, red, usuarios, registros de eventos y WMI se consultan desde la misma consola.
- Lo usan los atacantes. Al ser un binario legítimo y firmado por Microsoft, es una de las técnicas más registradas en MITRE ATT&CK (T1059.001). Quien no sabe leer PowerShell no entiende la mitad de los incidentes en Windows.
- Automatiza. Lo que hoy revisa a mano en un equipo, mañana lo ejecuta en cien con un script.
Roles como analista de SOC, respuesta a incidentes, threat hunting, administración de Active Directory y auditoría lo usan a diario.
Dónde se usa
- Equipos de escritorio y servidores Windows, incluido Server Core, que no tiene interfaz gráfica.
- Active Directory y Microsoft Entra ID, la administración de identidades de Microsoft.
- Microsoft 365 y Exchange Online, a través de módulos específicos.
- Azure, con el módulo Az y Azure Cloud Shell.
- Herramientas de respuesta a incidentes y EDR, que ejecutan scripts de recolección en los equipos.
- Linux y macOS, con PowerShell 7.
Conceptos clave
| Concepto | Qué significa |
|---|---|
| Cmdlet | Comando nativo de PowerShell con forma verbo-sustantivo, como Get-Process |
| Objeto | Unidad de datos que devuelve un cmdlet, con propiedades y métodos |
| Propiedad | Un dato del objeto, como Name o Status |
| Pipeline | La barra vertical que pasa objetos completos de un cmdlet al siguiente |
| Parámetro | Opción de un cmdlet que empieza con guion, como -Name o -Recurse |
| Alias | Nombre corto de un cmdlet, como ls o dir para Get-ChildItem |
| Módulo | Paquete de cmdlets que se carga con Import-Module |
| Script | Archivo .ps1 con instrucciones de PowerShell |
Cómo leer una sintaxis
Get-Help muestra la sintaxis de cada cmdlet con una notación fija. Así se ve la de Get-Service, recortada:
Get-Service [[-Name] <String[]>] [-DependentServices] [-Exclude <String[]>] [<CommonParameters>]- Lo que está entre corchetes es opcional.
- El tipo de dato aparece entre signos de menor y mayor:
Stringes texto;String[]significa que acepta varios valores separados por comas. - Si el nombre del parámetro está entre corchetes, como
[-Name], puede omitirlo y escribir solo el valor:Get-Service WinDefend. - Un parámetro sin tipo, como
-DependentServices, es un interruptor: se activa con solo escribirlo.
En las fichas de este curso usaremos la misma idea con una convención más simple: corchetes para lo opcional y MAYÚSCULAS para lo que usted reemplaza, por ejemplo Get-Service [-Name] NOMBRE.
Cómo pedir ayuda
PS C:\> Get-Help Get-Service # resumen y sintaxis
PS C:\> Get-Help Get-Service -Examples # solo ejemplos
PS C:\> Get-Command *Service* # buscar cmdlets por nombre
PS C:\> Get-Service | Get-Member # ver qué propiedades tiene el resultadoEstos tres cmdlets, Get-Help, Get-Command y Get-Member, son su mapa. Los estudiará a fondo en las dos lecciones siguientes.