
Exploit für CVE-2017-12945.
Eine (entfernte) (authentifizierte) (blinde) OS-Command-Injection-Schwachstelle existiert in Mersive Solstice Pods - einer drahtlosen Kollaborations- und Präsentationsplattform von Mersive Technologies Inc. - die Firmware-Versionen vor 2.8.4 ausführen, wie auf der Herstellerwebsite bestätigt/gemeldet wurde, siehe Screenshot unten. Infolgedessen kann ein authentifizierter Angreifer beliebige Befehle (mit Root-Rechten) auf verwundbaren Mersive Solstice Pods ausführen, indem er ihnen manipulierte HTTP-Anfragen sendet.

Diese Schwachstelle existiert aufgrund der fehlenden serverseitigen Validierung von Eingaben/Parametern. Einige vom Benutzer kontrollierte Eingaben/Parameter werden direkt als Argumente an eine public static String runShellCommand(String command)-Methode übergeben, die dazu dient, Betriebssystembefehle im Kontext des Root-Benutzers auszuführen. Diese unsichere Konfiguration würde es einem Angreifer ermöglichen, verwundbare Geräte vollständig zu kompromittieren.
Mitre-CVE-Referenz:
Änderungsprotokoll des Herstellers:
Mersive Solstice Pods, die Firmware-Versionen vor 2.8.4 ausführen.
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 "";
}
}
Um diese Schwachstelle auszunutzen, müsste ein authentifizierter Angreifer eine speziell präparierte Anfrage an Geräte senden, die eine verwundbare Firmware-Version (vor 2.8.4) ausführen. Diese Anfrage könnte entweder direkt über die Weboberfläche des Geräts selbst (über das Formular set static IP address) gesendet werden oder alternativ über ein Befehlszeilentool wie cURL.
In beiden Fällen müsste dem Payload ein Sonderzeichen vorangestellt werden, das /bin/sh anweist, aufeinanderfolgende Befehle auszuführen, z. B. das Zeichen ; oder &, damit der Payload nach Abschluss des ursprünglichen/legitimen Befehls ausgeführt wird.
Der Parameter staticIP, der neben dem Parameter gateway einer der mehreren verwundbaren Parameter ist, wird serverseitig nicht validiert und stattdessen direkt als Argument an die Methode static void SetStaticIP(String ipAddr) übergeben, die ihn wiederum als Argument an die Methode public static String runShellCommand(String command) weitergibt.
Diese Konfiguration würde es einem authentifizierten Angreifer ermöglichen, beliebige Befehle auf verwundbaren Geräten im Kontext des Root-Benutzers auszuführen.
Copyright (C) 2019 Alexandre Teyar
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.