Meterpreter Scripts: Generando nuestro propio screenshot (Parte II)

En el artículo anterior hablamos de como preparar la generación de un script de Meterpreter, investigando las funciones que proporciona la API de éste, a través del uso del IRB. En el artículo de hoy transformamos los métodos utilizados en el IRB anteriormente, en un script de Meterpreter. A continuación se expone el código escrito, para su posterior análisis:

La primera parte del script comprueba que si la plataforma en la que se ejecuta el Meterpreter no es Windows no se ejecutará y provocará la finalización del script. En caso de encontrarse en un equipo con Windows la ejecución seguirá su curso, creando un objeto Arguments. Arguments se corresponde con los parámetros que podrá recibir el script, y su descripción. La clase Arguments recibe un listado de clave-valor, donde clave es el valor del parámetro, en nuestro caso "-h" y "-i", y su valor asociado es un array con dos elementos. En el caso de "-h" el array está compuesto de false y "Help Menú", dónde el primero indica si el parámetro representado llevará asociado un valor o no, y el segundo es la descripción del parámetro. Por último se declara una variable idle con valor false, más adelante se verá su uso.

if client.platform !~ /win32|win64/print_error "No es una plataforma Windows"raise Rex::Script::Completedendopts = Rex::Parser::Arguments.new("-h" => [false, "Help menu"],"-i" => [false, "Muestra el tiempo de inactividad"])idle = false

La variable opts dispone de un método parse, con el que parseamos la entrada del script de ruby. La variable args que se pasa al método parse, son los argumentos de entrada que el usuario introduce cuando desde Meterpreter es ejecutado. Por ejemplo, run myScreen -i, en la variable args se albergará la línea de entrada dónde se encuentra -i. Si el usuario ejecuta el parámetro -i, se cambiará el estado de la variable idle a true, para que después, una vez terminado el parseo de la entrada del script se ejecuten las acciones necesarias.

opts.parse(args) { |opt, idx, val|case optwhen "-h"print_line "Help Menu"print_line(opts.usage)raise Rex::Script::Completedwhen "-i"idle = trueend}#obtenemos el screenshotscreen = client.ui.screenshot

Una vez finalizado el parseo de la entrada del script, se almacena en la variable screen una captura de pantalla del equipo remoto. En la variable f, se crea un nuevo archivo en modo escritura, archivo binario. En este archivo se vuelca la variable screen, y por último se cierra el fichero. Por último se comprueba si la variable idle se encuentra en estado true, el cual solo sería cambiado si el usuario introduce el parámetro -i en la ejecución del script. En este caso, se mostrará el tiempo de inactividad en el equipo vulnerado.

f = ::File.new("/home/pablo/prueba.jpg","wb")f.write(screen)f.closeprint_status "Screenshot realizado!"#ya tenemos el screenshot en local sin necesidad de hacer download explicitamenteif idleprint_status "Tiempo de inactividad: #{client.ui.idle_time}"end

Ahora os mostramos algunas imágenes de la ejecución del script, en el cual el objetivo es realizar una captura de pantalla, y mostrar como si además el usuario introduce el parámetro -i, también se informará del tiempo de inactividad en la máquina vulnerada.