
Ejecución de comandos root mediante broadcast UDP de infosvr en router ASUS
Varios modelos de routers de ASUS incluyen un servicio llamado infosvr que escucha en el puerto de broadcast UDP 9999 en la interfaz LAN o WLAN. Lo utiliza una de las herramientas de ASUS para facilitar la configuración del router localizando automáticamente los routers en la subred local. Este servicio se ejecuta con privilegios de root y contiene una vulnerabilidad de ejecución de comandos sin autenticación. El código fuente de este servicio, así como el resto del router, está disponible en el sitio de soporte de ASUS.
El CVE asignado a este problema es CVE-2014-9583 (por desgracia, no fue CVE-2014-10000 después de todo :-/).
Actualmente, se asume que todas las versiones de firmware conocidas para los routers aplicables (RT-AC66U, RT-N66U, etc.) son vulnerables. Las pruebas se realizaron contra la versión 3.0.0.376.2524-g0013f52.
Los siguientes routers/versiones de firmware están confirmados como vulnerables:
| Router | Versión del firmware | Verificado por |
|---|---|---|
| RT-N66U | 3.0.0.4.376_1071-g8696125 | Friedrich Postelstorfer |
| RT-AC87U | 3.0.0.4.378_3754 | David Longenecker |
| RT-N56U | 3.0.0.4.374_5656 | @argilo |
| RT-AC68U | 3.0.0.4.376_3626-g9a8323e | @Arie |
| DSL-N55U | 3.0.0.4.374_4422-gc83c78f | @S2- |
| DSL-AC68U | 3.0.0.4.376_2158-g340202b | @magJ, @gitFurious |
| RT-AC66R | 3.0.0.4.376_2524-g0013f52 | @asgh |
| RT-AC66R | 3.0.0.4.376_3602 | @facerolling |
| RT-AC55U | 3.0.0.4.376_6587-gaa506e9 | @pellaeon |
| RT-N12HP_B1 | 3.0.0.4.374_1327 | @vittee |
| RT-N16 | 3.0.0.4.220 | @xorrbit |
Adicionalmente, los routers que ejecutan firmware basado en asuswrt-merlin, respaldado por la comunidad, son vulnerables antes de la versión 376.49_5.
Los routers que utilicen revisiones de firmware publicadas el 12 de enero de 2015 o después no deberían verse afectados. La siguiente tabla recoge los informes de routers/firmwares no afectados.
| Router | Versión del firmware | Verificado por |
|---|---|---|
| RT-AC66R | 3.0.0.4.376_3754-g5ef7c1f | @asgh |
| RT-N12HP_B1 | 3.0.0.4.376_3754-g5ef7c1f | @vittee |
Considere el siguiente extracto del proyecto ASUSWRT-Merlin, que es un fork mejorado del código de ASUS. Puede ver el archivo completo (recomendado para diversión extra) aquí.
177 char *processPacket(int sockfd, char *pdubuf)
178 {
...
202 phdr = (IBOX_COMM_PKT_HDR *)pdubuf;
...
207 if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&
208 phdr->PacketType==NET_PACKET_TYPE_CMD)
209 {
...
La función processPacket se invoca tras recibir un paquete de INFO_PDU_LENGTH (512) bytes. La ruta de código vulnerable específica es main->processReq->processPacket. El servicio convierte el paquete a una estructura y comprueba que los campos ServiceID y PacketType coinciden con los valores esperados.
El siguiente bloque contiene lo que se cree que es la causa raíz de esta vulnerabilidad.
222 if (phdr->OpCode!=NET_CMD_ID_GETINFO && phdr->OpCode!=NET_CMD_ID_GETINFO_MANU)
223 {
224 phdr_ex = (IBOX_COMM_PKT_HDR_EX *)pdubuf;
225
226 // Check Mac Address
227 if (memcpy(phdr_ex->MacAddress, mac, 6)==0)
228 {
229 _dprintf("Mac Error %2x%2x%2x%2x%2x%2x\n",
230 (unsigned char)phdr_ex->MacAddress[0],
231 (unsigned char)phdr_ex->MacAddress[1],
232 (unsigned char)phdr_ex->MacAddress[2],
233 (unsigned char)phdr_ex->MacAddress[3],
234 (unsigned char)phdr_ex->MacAddress[4],
235 (unsigned char)phdr_ex->MacAddress[5]
236 );
237 return NULL;
238 }
239
240 // Check Password
241 //if (strcmp(phdr_ex->Password, "admin")!=0)
242 //{
243 // phdr_res->OpCode = phdr->OpCode | NET_RES_ERR_PASSWORD;
244 // _dprintf("Password Error %s\n", phdr_ex->Password);
245 // return NULL;
246 //}
247 phdr_res->Info = phdr_ex->Info;
248 memcpy(phdr_res->MacAddress, phdr_ex->MacAddress, 6);
249 }
El bloque comienza excluyendo un par de valores de OpCode, que presumiblemente no requieren autenticación por diseño. Luego, llama a memcpy y, de forma sospechosa, compara el valor de retorno con cero. Esto indica claramente que el autor pretendía usar memcmp. Dicho esto, incluso si esta comprobación se implementara correctamente, conocer la dirección MAC del dispositivo apenas constituye una autenticación suficiente.
El siguiente bloque está comentado, pero muestra que el autor en algún momento experimentó con la comprobación de una contraseña. Aunque, en este caso, la contraseña estaba codificada como "admin".
Continuando, la siguiente sentencia switch despacha el procesamiento según el OpCode proporcionado.
251 switch(phdr->OpCode)
252 {
...
428 case NET_CMD_ID_MANU_CMD:
429 {
430 #define MAXSYSCMD 256
431 char cmdstr[MAXSYSCMD];
432 PKT_SYSCMD *syscmd;
...
440 syscmd = (PKT_SYSCMD *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));
...
443 if (syscmd->len>=MAXSYSCMD) syscmd->len=MAXSYSCMD;
444 syscmd->cmd[syscmd->len]=0;
445 syscmd->len=strlen(syscmd->cmd);
446 fprintf(stderr,"system cmd: %d %s\n", syscmd->len, syscmd->cmd);
447 #if 0
...
512 #endif
513 {
514 sprintf(cmdstr, "%s > /tmp/syscmd.out", syscmd->cmd);
515 system(cmdstr);
Si un atacante especifica el valor de OpCode NET_CMD_ID_MANU_CMD, el bloque anterior procesa el paquete convirtiéndolo a una estructura PKT_SYSCMD. Por lo tanto, cualquier miembro de syscmd está totalmente controlado por el atacante. Antes de preocuparse (guiño) por terminar la cadena de comando con NUL, el autor ejecuta el comando en la línea 514. Después de ejecutar el comando, la salida se lee del archivo temporal y se envía de vuelta a la dirección de origen del paquete iniciador.
Usuarios finales: Actualice el firmware a la revisión 3.0.0.4.376.3754 o superior. Es importante tener en cuenta que la funcionalidad "Buscar actualización" del router puede no funcionar correctamente. Compruebe manualmente la versión del firmware que está ejecutando y, si es anterior, descargue/instale el nuevo firmware.
ASUS/Merlin: Elimine la funcionalidad de ejecución remota de comandos de este servicio. Incluso si estuviera protegida con una autenticación sólida, difundir una contraseña a toda la red local no es algo deseable. Si realmente se desea la ejecución de comandos, debería proporcionarse a través de SSH o un mecanismo seguro similar.