
Exploit para CVE-2017-12945.
Existe uma vulnerabilidade de injeção de comandos do sistema operativo (remota) (autenticada) (cega) nos Mersive Solstice Pods - uma plataforma sem fios de colaboração e apresentação concebida pela Mersive Technologies Inc. - que executam versões do firmware anteriores a 2.8.4, conforme reconhecido/comunicado no site do fornecedor, veja a captura de ecrã abaixo. Como resultado, um adversário autenticado pode executar comandos arbitrários (com privilégios de root) em Mersive Solstice Pods vulneráveis, enviando-lhes pedidos HTTP especialmente concebidos.

Esta vulnerabilidade existe devido à falta de validação de entradas/parâmetros do lado do servidor. Algumas entradas/parâmetros controlados pelo utilizador são passados diretamente como argumentos para um método public static String runShellCommand(String command) concebido para executar comandos do sistema operativo no contexto do utilizador root. Esta configuração insegura permitiria a um adversário comprometer totalmente dispositivos vulneráveis.
Referência CVE Mitre:
Registo de alterações do fornecedor:
Mersive Solstice Pods que executam versões do 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 explorar esta vulnerabilidade, um adversário autenticado teria de enviar um pedido especialmente concebido para dispositivos que executem uma versão vulnerável do firmware (anterior a 2.8.4). Este pedido poderia ser enviado diretamente a partir da própria interface web do dispositivo (através do formulário set static IP address) ou, em alternativa, poderia ser enviado usando um utilitário de linha de comandos como o cURL.
Em qualquer um dos casos, o payload teria de ser precedido por um caractere especial que instrui o /bin/sh a executar comandos consecutivos, por exemplo, o caractere ; ou &, para que o payload seja executado após a conclusão do comando original/legítimo.
O parâmetro staticIP, que é um dos vários parâmetros vulneráveis juntamente com o parâmetro gateway, não é validado no servidor e é, em vez disso, passado diretamente como argumento para o método static void SetStaticIP(String ipAddr), que por sua vez o passa como argumento para o método public static String runShellCommand(String command).
Esta configuração permitiria a um adversário autenticado executar comandos arbitrários em dispositivos vulneráveis no contexto do utilizador root.
Copyright (C) 2019 Alexandre Teyar
Licenciado sob a Apache License, Versão 2.0 (a "Licença"); não pode utilizar este ficheiro exceto em conformidade com a Licença. Pode obter uma cópia da Licença em
http://www.apache.org/licenses/LICENSE-2.0
Salvo quando exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença é distribuído numa base "COMO ESTÁ", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para conhecer as permissões específicas e as limitações da Licença.