Los servicios de RMI a menudo exponen una funcionalidad peligrosa sin controles de seguridad adecuados, sin embargo, los servicios de RMI tienden a pasar desapercibidos durante las evaluaciones de seguridad debido a la falta de herramientas de prueba efectivas. En 2008, Adam Boulton habló en AppSec USA ( YouTube ) y lanzó algunas herramientas de ataque RMI que desaparecieron poco después. Sin embargo, incluso con esas herramientas, un ataque exitoso de conocimiento cero se basa en un ataque de fuerza bruta significativo (~ 64 bits / 9 quintillones de posibilidades) siendo realizado a través de la red.

El objetivo de BaRMIe es permitir que los profesionales de la seguridad identifiquen, ataquen y protejan los servicios de RMI inseguros. Utilizando interfaces RMI parciales del software existente, BaRMIe puede interactuar directamente con esos servicios sin primero forzar bruto de 64 bits a través de la red.

Uso

El uso de BaRMIe es sencillo. Ejecute BaRMIe sin parámetros de información de uso.

$ java -jar BaRMIe.jar
  ▄▄▄▄ ▄▄▄ ██▀███ ███▄ ██▓▓█████ ██▓▓█████
 ▓█████▄ ▒████▄ ▓██ ▒ ▀ ▀ ▀
 ▒██▒ ▄█ ▄█ ▄█ ▄█▓██
 ▒██░█▀ ░██▄▄▄▄██ ██▄▄▄▄██ ██ ██ ██▒██████████████
 ░▓█ ██▓ ██▓ ██▓░██▓ ▒████▒░██▒ ▒████▒ ░██▒░██░░▒████▒
 ░ ░ ░ ▒▓▓▒█ ░▓▒█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
 ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
  ░ ░ ░ ░ ░ ░ ░ ░ ░
  ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
       ░ v1.0
             Herramienta de enumeración Java RMI.
               Escrito por Nicky Bloor (@NickstaDB)

Advertencia: BaRMIe se escribió para ayudar a los profesionales de la seguridad a identificar el
         uso inseguro de servicios de RMI en sistemas que el usuario tiene previamente
         permiso para atacar BaRMIe se debe usar de acuerdo con todos
         leyes relevantes. De lo contrario, podría llevar a su enjuiciamiento.
         Los desarrolladores no asumen ninguna responsabilidad y no son responsables de ninguna
         mal uso o daño causado por este programa.

Uso:
  BaRMIe -enum [opciones] [host] [puerto]
    Enumerar los servicios de RMI en los puntos finales dados.
    Nota: si -enum no está especificado, este es el modo predeterminado.
  BaRMIe -ataque [opciones] [host] [puerto]
    Enumerar y atacar el (los) objetivo (s) dado (s).
Opciones:
  - hilos El número de hilos a usar para la enumeración (por defecto 10).
  --timeout El tiempo de espera para bloquear las operaciones de socket (5,000 ms predeterminados).
  --destina un archivo que contiene objetivos para escanear.
             El archivo debe contener un único host o espacio separado
             par de host y puerto por línea.
             Alternativamente, todos los formatos de salida nmap son compatibles, BaRMIe
             Salida parse nmap para el puerto 1099, 'rmiregistry' o 'Java RMI'
             servicios al objetivo.
             Nota: [host] [puerto] no es compatible cuando se usa --targets.
Confiabilidad:
    Un sistema +/- se utiliza para indicar la fiabilidad del ataque de la siguiente manera:
      [+]: Indica un ataque específico de la aplicación
      [-]: indica un ataque de JRE
      [+]: Atacar métodos inseguros (como 'writeFile' sin auth)
      [-]: atacar la deserialización de Java (es decir, los parámetros del objeto)
      [+]: No requiere dependencias no predeterminadas
      [-]: se requieren dependencias no predeterminadas

El modo de enumeración (-enum) extrae los detalles de los objetos que están expuestos a través de un servicio de registro de RMI y enumera los ataques conocidos que afectan al punto final. El modo de ataque (-ataque) primero enumera los objetivos dados, luego proporciona un sistema de menú para lanzar ataques conocidos contra los servicios de RMI. Se puede especificar un único objetivo en la línea de comando. Alternativamente, BaRMIe puede extraer objetivos de un archivo de texto simple o una salida nmap.

Tipos de ataque

BaRMIe es capaz de realizar tres tipos de ataques contra los servicios de RMI.

Atacar métodos inseguros

El primer y más directo método para atacar los servicios RMI inseguros es simplemente llamar a métodos remotos inseguros. A menudo, la funcionalidad peligrosa está expuesta a través de RMI, que se puede desencadenar simplemente recuperando la referencia del objeto remoto y llamando al método peligroso. El siguiente código es un ejemplo de esto:

// Obtenga una referencia al servicio de registro RMI remoto
Registry reg = LocateRegistry.getRegistry (targetHost, targetPort);

// Obtener una referencia al objeto RMI objetivo
Foo bar = (Foo) reg.lookup (objectName);

// Llamar al método remoto executeCommand ()
bar.executeCommand (cmd);

Deserialización mediante parámetros de tipo de objeto

Algunos servicios de RMI no exponen la funcionalidad peligrosa, o implementan controles de seguridad tales como autenticación y administración de sesiones. Si el servicio RMI expone un método que acepta un Objeto arbitrario como parámetro, entonces el método se puede usar como un punto de entrada para los ataques de deserialización. Algunos ejemplos de tales métodos se pueden ver a continuación:

public void setOption (String name, Object value);
public void addAll (valores de lista);

Deserialización mediante Invocación de Método Ilegal

Debido al uso de la serialización y el manejo inseguro de los parámetros del método en el servidor, es posible utilizar cualquier método con tipos de parámetros no primitivos como un punto de entrada para los ataques de deserialización. BaRMIe logra esto mediante el uso de proxies TCP para modificar los parámetros del método en el nivel de la red, lo que esencialmente activa las invocaciones de métodos ilegales. Algunos ejemplos de métodos vulnerables se pueden ver a continuación:

public void setName (String name);
public Long add (Integer i1, Integer i2);
suma de vacío pública (valores int []); 

Los parámetros de cada uno de estos métodos se pueden reemplazar con una carga útil de deserialización cuando la invocación del método pasa a través de un proxy. Este ataque es posible porque Java no intenta verificar que los parámetros de métodos remotos recibidos a través de la red sean compatibles con los tipos de parámetros reales antes de deserializarlos.

Fuente: n0where.net

Compartir