Saltar al contenido
Lectura12 minPreview

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ónEjecutableDónde está
Windows PowerShell 5.1powershell.exeIncluida en Windows 10, Windows 11 y Windows Server 2016 en adelante. Ya no recibe funciones nuevas, solo correcciones
PowerShell 7pwsh.exeSe 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ñoHito
2002Jeffrey Snover, ingeniero de Microsoft, publica el Monad Manifesto, que propone una consola basada en objetos
2006Sale PowerShell 1.0, el nuevo nombre de Monad, como descarga para Windows XP, Server 2003 y Vista
2009PowerShell 2.0 viene integrado en Windows 7 y Server 2008 R2, con la administración remota
2012PowerShell 3.0 llega con Windows 8 y Server 2012
2016La versión 5.1 acompaña a Windows 10 y Server 2016. Microsoft publica PowerShell como código abierto y multiplataforma
2020Sale 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

ConceptoQué significa
CmdletComando nativo de PowerShell con forma verbo-sustantivo, como Get-Process
ObjetoUnidad de datos que devuelve un cmdlet, con propiedades y métodos
PropiedadUn dato del objeto, como Name o Status
PipelineLa barra vertical que pasa objetos completos de un cmdlet al siguiente
ParámetroOpción de un cmdlet que empieza con guion, como -Name o -Recurse
AliasNombre corto de un cmdlet, como ls o dir para Get-ChildItem
MóduloPaquete de cmdlets que se carga con Import-Module
ScriptArchivo .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: String es 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 resultado

Estos tres cmdlets, Get-Help, Get-Command y Get-Member, son su mapa. Los estudiará a fondo en las dos lecciones siguientes.