
Exploit para CVE-2017-12945.
Existe una vulnerabilidad de inyección de comandos del sistema operativo (remota) (autenticada) (ciega) en los Mersive Solstice Pods - una plataforma inalámbrica de colaboración y presentación diseñada por Mersive Technologies Inc. - que ejecutan versiones del firmware anteriores a 2.8.4, según lo reconocido/informado en el sitio web del proveedor, consulte la captura de pantalla a continuación. Como resultado, un adversario autenticado puede ejecutar comandos arbitrarios (con privilegios de root) en los Mersive Solstice Pods vulnerables enviándoles solicitudes HTTP manipuladas.

Esta vulnerabilidad existe debido a la falta de validación de entradas/parámetros en el lado del servidor. Algunas entradas/parámetros controlados por el usuario se pasan directamente como argumentos a un método public static String runShellCommand(String command) diseñado para ejecutar comandos del sistema operativo en el contexto del usuario root. Esta configuración insegura permitiría a un adversario comprometer por completo los dispositivos vulnerables.
Referencia CVE de Mitre:
Registro de cambios del proveedor:
Mersive Solstice Pods que ejecutan versiones del firmware anteriores a 2.8.4.
com/mersive/solstice/server/EthernetInterface.java:static void SetPrefixLength(int prefixLength) {
int value = -1 << (32 - prefixLength);
try {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ifconfig eth0 netmask " + InetAddress.getByAddress(new byte[]{(byte) (value >>> 24), (byte) ((value >> 16) & 255), (byte) ((value >> 8) & 255), (byte) (value & 255)}).getHostAddress()));
} catch (Exception e) {
e.printStackTrace();
}
}
static void SetGateway(String gateway) {
if (!gateway.equals(GetGateway())) {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ip route del default"));
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ip route add default via " + gateway + " dev " + ETH0));
}
}
static void SetStaticIP(String ipAddr) {
Log.d("Ethernet", "complete: " + ServerDisplay.runShellCommand("ifconfig eth0 " + ipAddr));
}
com/mersive/solstice/server/ServerDisplay.java:public static String runShellCommand(String command) {
return runShellCommand(command, true);
}
public static String runShellCommand(String command, boolean wait) {
Log.d("Shell Command", command);
try {
Process process = Runtime.getRuntime().exec("shell-tunnel --client");
DataOutputStream stdin = new DataOutputStream(process.getOutputStream());
InputStream is = process.getInputStream();
stdin.writeBytes(command + "\n");
stdin.flush();
stdin.writeBytes("exit\n");
stdin.flush();
if (wait) {
process.waitFor();
}
byte[] buffer = new byte[1024];
Arrays.fill(buffer, 0);
return new String(buffer, 0, is.read(buffer));
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
Para explotar esta vulnerabilidad, un adversario autenticado necesitaría enviar una solicitud especialmente manipulada a los dispositivos que ejecutan una versión vulnerable del firmware (anterior a 2.8.4). Esta solicitud podría enviarse directamente desde la interfaz web del dispositivo (desde el formulario set static IP address) o, alternativamente, podría enviarse mediante una utilidad de línea de comandos como cURL.
En cualquier caso, la carga útil debería ir precedida de un carácter especial que indique a /bin/sh que ejecute comandos consecutivos, por ejemplo, el carácter ; o &, para que la carga útil se ejecute después de que se complete el comando original/legítimo.
El parámetro staticIP, que es uno de los múltiples parámetros vulnerables junto con el parámetro gateway, no se valida en el lado del servidor y, en su lugar, se pasa directamente como argumento al método static void SetStaticIP(String ipAddr), que a su vez lo pasa como argumento al método public static String runShellCommand(String command).
Esta configuración permitiría a un adversario autenticado ejecutar comandos arbitrarios en los dispositivos vulnerables en el contexto del usuario root.
Copyright (C) 2019 Alexandre Teyar
Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"); no puede utilizar este archivo excepto en cumplimiento de la Licencia. Puede obtener una copia de la Licencia en
http://www.apache.org/licenses/LICENSE-2.0
Salvo que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer los permisos específicos y las limitaciones establecidas en la Licencia.