
Exploit pour CVE-2017-12945.
Une vulnérabilité d'injection de commandes OS (à distance) (authentifiée) (aveugle) existe dans les Mersive Solstice Pods - une plateforme de collaboration et de présentation sans fil conçue par Mersive Technologies Inc. - exécutant des versions du firmware antérieures à 2.8.4, comme reconnu/rapporté sur le site web du fournisseur, voir la capture d'écran ci-dessous. Par conséquent, un adversaire authentifié peut exécuter des commandes arbitraires (avec les privilèges root) sur les Mersive Solstice Pods vulnérables en leur envoyant des requêtes HTTP spécialement conçues.

Cette vulnérabilité existe en raison de l'absence de validation des entrées/paramètres côté serveur. Certaines entrées/paramètres contrôlés par l'utilisateur sont directement passés comme arguments à une méthode public static String runShellCommand(String command) conçue pour exécuter des commandes OS dans le contexte de l'utilisateur root. Cette configuration non sécurisée permettrait à un adversaire de compromettre entièrement les appareils vulnérables.
Référence CVE Mitre :
Journal des modifications du fournisseur :
Mersive Solstice Pods exécutant des versions du firmware antérieures à 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 "";
}
}
Pour exploiter cette vulnérabilité, un adversaire authentifié devrait envoyer une requête spécialement conçue aux appareils exécutant une version vulnérable du firmware (antérieure à 2.8.4). Cette requête pourrait être envoyée directement depuis l'interface web de l'appareil (à partir du formulaire set static IP address) lui-même, ou bien, elle pourrait être envoyée à l'aide d'un utilitaire en ligne de commande tel que cURL.
Dans les deux cas, la charge utile devrait être précédée d'un caractère spécial demandant à /bin/sh d'exécuter des commandes consécutives, par exemple le caractère ; ou &, afin que la charge utile soit exécutée après l'achèvement de la commande d'origine/légitime.
Le paramètre staticIP, qui est l'un des multiples paramètres vulnérables avec le paramètre gateway, n'est pas validé côté serveur et est plutôt directement passé comme argument à la méthode static void SetStaticIP(String ipAddr) qui, à son tour, le passe comme argument à la méthode public static String runShellCommand(String command).
Cette configuration permettrait à un adversaire authentifié d'exécuter des commandes arbitraires sur les appareils vulnérables dans le contexte de l'utilisateur root.
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.