Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
asus-cmd — Ejecución de comandos root mediante broadcast UDP de infosvr en router ASUS | Kitploit
Herramientas/GitHubGitHub/jduck/asus-cmd
Seguridad de Sistemas EmbebidosSeguridad IoTAnálisis de VulnerabilidadesExplotaciónSeguridad de RedesPruebas de PenetraciónSeguridad de Hardware e IoT
GitHubjduck/asus-cmd

asus-cmd

Ejecución de comandos root mediante broadcast UDP de infosvr en router ASUS

Ver Repositorio
2523522hace 11 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

ASUS Router infosvr UDP Broadcast root Command Execution

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.

CVE

El CVE asignado a este problema es CVE-2014-9583 (por desgracia, no fue CVE-2014-10000 después de todo :-/).

Versiones afectadas

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:

RouterVersión del firmwareVerificado por
RT-N66U3.0.0.4.376_1071-g8696125Friedrich Postelstorfer
RT-AC87U3.0.0.4.378_3754David Longenecker
RT-N56U3.0.0.4.374_5656@argilo
RT-AC68U3.0.0.4.376_3626-g9a8323e@Arie
DSL-N55U3.0.0.4.374_4422-gc83c78f@S2-
DSL-AC68U3.0.0.4.376_2158-g340202b@magJ, @gitFurious
RT-AC66R3.0.0.4.376_2524-g0013f52@asgh
RT-AC66R3.0.0.4.376_3602@facerolling
RT-AC55U3.0.0.4.376_6587-gaa506e9@pellaeon
RT-N12HP_B13.0.0.4.374_1327@vittee
RT-N163.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.

RouterVersión del firmwareVerificado por
RT-AC66R3.0.0.4.376_3754-g5ef7c1f@asgh
RT-N12HP_B13.0.0.4.376_3754-g5ef7c1f@vittee

Detalles técnicos

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.

Recomendaciones

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.

Solución alternativa

Descargar herramienta