
Exploit per CVE-2017-12945.
Esiste una vulnerabilità di iniezione di comandi del sistema operativo (remota) (autenticata) (blind) nei Mersive Solstice Pods - una piattaforma wireless per collaborazione e presentazioni progettata da Mersive Technologies Inc. - con versioni del firmware precedenti alla 2.8.4, come riconosciuto/segnalato sul sito web del fornitore, vedere lo screenshot qui sotto. Di conseguenza, un avversario autenticato può eseguire comandi arbitrari (con privilegi di root) su pod Mersive Solstice vulnerabili inviando loro richieste HTTP appositamente formulate.

Questa vulnerabilità esiste a causa della mancanza di convalida degli input/parametri lato server. Alcuni input/parametri controllati dall'utente vengono passati direttamente come argomenti a un metodo public static String runShellCommand(String command) progettato per eseguire comandi del sistema operativo nel contesto dell'utente root. Questa configurazione insicura consentirebbe a un avversario di compromettere completamente i dispositivi vulnerabili.
Riferimento CVE Mitre:
Registro modifiche del fornitore:
Mersive Solstice Pods con versioni del firmware precedenti alla 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 "";
}
}
Per sfruttare questa vulnerabilità, un avversario autenticato dovrebbe inviare una richiesta appositamente formulata a dispositivi che eseguono una versione vulnerabile del firmware (precedente alla 2.8.4). Questa richiesta potrebbe essere inviata direttamente dall'interfaccia web del dispositivo (dal modulo set static IP address) oppure, in alternativa, tramite un'utilità a riga di comando come cURL.
In entrambi i casi, il payload dovrebbe essere preceduto da un carattere speciale che istruisca /bin/sh a eseguire comandi consecutivi, ad esempio il carattere ; o &, affinché il payload venga eseguito dopo il completamento del comando originale/legittimo.
Il parametro staticIP, che è uno dei molteplici parametri vulnerabili insieme al parametro gateway, non viene convalidato lato server e viene invece passato direttamente come argomento al metodo static void SetStaticIP(String ipAddr), che a sua volta lo passa come argomento al metodo public static String runShellCommand(String command).
Questa configurazione consentirebbe a un avversario autenticato di eseguire comandi arbitrari sui dispositivi vulnerabili nel contesto dell'utente root.
Copyright (C) 2019 Alexandre Teyar
Concesso in licenza secondo l'Apache License, Versione 2.0 (la "Licenza"); non è consentito utilizzare questo file se non in conformità con la Licenza. È possibile ottenere una copia della Licenza all'indirizzo
http://www.apache.org/licenses/LICENSE-2.0
Salvo quanto diversamente previsto dalla legge o concordato per iscritto, il software distribuito con la Licenza è distribuito "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. Vedere la Licenza per il linguaggio specifico che regola le autorizzazioni e le limitazioni previste dalla Licenza.