La misión aquí
es escribir el código que se enviará y ejecutará en el equipo de la víctima,
para así realizar nuestras acciones de post-explotación.
El meterpreter a
desarrollar será compatible con el código que genera Metasploit para
desencadenar dicha funcionalidad. Será
centrado en Python, y seleccionaremos una conexión reversa por TCP, si echamos
un vistazo al código a alto nivel:
Vemos arriba
que se encarga de recibir nuestro código y lo ejecuta con exec, algo importante a
tener en cuenta antes de empezar el desarrollo, es que se pasa el socket en un
parámetro, por lo tanto en nuestro código recogeremos esa conexión por la variable s.
Si echamos un
vistazo al post que se comentó al inicio, se comprueba que en Metasploit se
tiene el código corriendo en la memoria de la víctima, y en local se cuenta con
un “manejador” de comandos y un apartado de extensión.
Para facilitar
el concepto, aquí se va a desarrollar un breve código en local, que administre
los comandos, y el código para el equipo víctima. Un gráfico para resumir el funcionamiento (números 1 y 2 van en dirección víctima, y el 3 y 4 a la máquina del atacante):
En la imagen
anterior se pone un ejemplo con whoami, por ser conocida, pero en el
meterpreter nosotros definiremos los comandos que existen y lo que se puede
ejecutar. ¡Vamos a por ello! El código está en mi GitHub, aquí se dejarán breves capturas.
No pretende ser
nada más que un camino para que puedas hacer el tuyo, y juguetear un rato.
En el código se puede apreciar que solo tiene una función implementada, execute, según se vaya complicando, se recomienda la división en módulos en la parte cliente (atacante) e implementar la funcionalidad load para la carga dinámica en el servidor (víctima), ya que si no se vuelve inmanejable.
Además, solo está funcionando mediante un simple socket, y el típico encode de red + json… recomendable agregar un túnel ssh, o agregar otras posibles comunicaciones, como hace Metasploit. Pero para el ejemplo, esto es más que suficiente, esa funcionalidad es un añadido fácil de agregar.
En el código se puede apreciar que solo tiene una función implementada, execute, según se vaya complicando, se recomienda la división en módulos en la parte cliente (atacante) e implementar la funcionalidad load para la carga dinámica en el servidor (víctima), ya que si no se vuelve inmanejable.
Además, solo está funcionando mediante un simple socket, y el típico encode de red + json… recomendable agregar un túnel ssh, o agregar otras posibles comunicaciones, como hace Metasploit. Pero para el ejemplo, esto es más que suficiente, esa funcionalidad es un añadido fácil de agregar.
Anteriormente,
se ha indicado que en la máquina víctima, el socket va en una variable llamada
s, por ello, verás en el archivo boomerpreter.py el uso de dicha variable sin declararla en nuestro código y el IDE pensará que es un error. Se deja captura a continuación:
Teniendo en
cuenta que la funcionalidad aquí implementada es la ejecución de un comando en
el sistema, si nosotros escribimos en el boomerpreter:
execute ls -l
En el código cliente se formará contenido con la siguiente estructura, que es lo que llegará al servidor:
data = {
"function": “execute”,
"args": [“ls”,”-l”]
}
Es realizado por el código ejecutado en el cliente en la función send_msg:
En el código ejecutado en la máquina víctima, se buscará por la función execute en el mapa llamado operations, si existe, se llamará a la función y se le pasará como argumento [“ls”, “-l”]. Se deja una pequeña captura del código:
Antes de eso se hace un simple decode y se decodifica el JSON, porque así lo he implementado yo, prueba otras opciones y juega con ello.
Y para enviar el resultado, se lleva el camino contrario “encoding”.
En el código ejecutado en la máquina víctima, se buscará por la función execute en el mapa llamado operations, si existe, se llamará a la función y se le pasará como argumento [“ls”, “-l”]. Se deja una pequeña captura del código:
Antes de eso se hace un simple decode y se decodifica el JSON, porque así lo he implementado yo, prueba otras opciones y juega con ello.
Y para enviar el resultado, se lleva el camino contrario “encoding”.
Se recomienda consultar el código en el GitHub, ya que visto completo será más sencillo de comprender. Si corremos dicho código, tendremos algo parecido a la siguiente
imagen:
Podemos
agregarle toda la funcionalidad que se nos ocurra, exploits, código para
recolectar información, extensiones, etc. Aportamos una imagen, para que aprecie la funcionalidad:
A continuación,
se deja un vídeo del uso de un meterpreter en BoomER, ya que cuenta con una
complejidad bastante mayor, se pueden gestionar las sesiones, mandarlas a segundo plano y muchas cosas más, creo que se puede captar mejor la idea:
Para cualquier
duda, me podéis contactar. Un saludo
No hay comentarios:
Publicar un comentario