Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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
25235hace 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í.

root@kitploit:~
   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.

root@kitploit:~
   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.

root@kitploit:~
   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

David Longenecker recomienda usar un script (JFFS) en combinación con el ajuste nvram script_usbmount para matar el proceso infosvr al arrancar. Para más información, consulte su entrada de blog.

Eric Sauvageau (@RMerl) recomienda bloquear el puerto 9999 con el cortafuegos. Para más información, vea su mensaje en el foro Small Net Builder.

Alternativamente, deshabilite el servicio infosvr matando el proceso después de cada arranque. Para diversión/ironía extra, use el exploit para hacer esto:

root@kitploit:~
$ ./asus-cmd "killall -9 infosvr"
[...]

NOTA: no recibirá respuesta a este comando. De nuevo, esto deberá hacerse cada vez que el dispositivo se reinicie.

Correcciones publicadas

Después de la divulgación inicial de este problema, varias partes abordaron el problema en sus bases de código.

2015/01/08 - Eric Sauvageau corrigió este problema en la base de código de asuswrt-merlin. La primera versión que incorpora la corrección es la 376.49_5. Sus cambios pueden revisarse aquí, aquí y aquí. 2015/01/12 - ASUS ha publicado nuevas revisiones de firmware para los dispositivos afectados (3.0.0.4.376.3754) que, según se informa, no son vulnerables.

ASUS abordó el problema asegurándose de que la variable nvram ateCommand_flag esté establecida en 1 antes de ejecutar el comando proporcionado. Esta variable no está establecida en las compilaciones típicas.

root@kitploit:~
loc_404958:
la      $v0, 0x400000
addiu   $a0, $v0, (aAtecommand_fla - 0x400000)  # "ateCommand_flag"
la      $v0, 0x400000
addiu   $a1, $v0, (g_ascONE - 0x400000)  # "1"
la      $v0, 0x400000
addiu   $t9, $v0, (check_nvram - 0x400000)
jalr    $t9 ; check_nvram
nop
lw      $gp, 0x290+var_270($fp)
bnez    $v0, lbl_execute_command
nop
sw      $zero, 0x290+var_14($fp)
b       lbl_return_zero

Exploit

El repositorio en el que reside este aviso contiene un exploit funcional para este problema.

Ejemplo de salida del exploit:

root@kitploit:~
$ ./asus-cmd "nvram show | grep -E '(firmver|buildno|extendno)'"
[*] sent command: nvram show | grep -E '(firmver|buildno|extendno)'
[!] received 512 bytes from 10.0.0.2:37625
    0c 15 0033 54ab7bc4 41:41:41:41:41:41
    0031 nvram show | grep -E '(firmver|buildno|extendno)'
[!] received 512 bytes from 10.0.0.1:9999
    0c 16 0033 54ab7bc4 xx:xx:xx:xx:xx:xx
    004e buildno=376
extendno_org=2524-g0013f52
extendno=2524-g0013f52
firmver=3.0.0.4

Otros enlaces

"ASUSWRT 3.0.0.4.376_1071 - LAN Backdoor Command Execution"
(esto provocó mi publicación. su exploit también está reflejado en el directorio others/)
http://www.exploit-db.com/exploits/35688/

"SEGURIDAD: agujero de seguridad en el lado LAN - mitigación"
http://forums.smallnetbuilder.com/showthread.php?t=21774

"¿Tiene un router Asus? Alguien en su red probablemente pueda hackearlo"
http://arstechnica.com/security/2015/01/got-an-asus-router-someone-on-your-network-can-probably-hack-it/

"El fallo de ASUS permite que quienes estén en su red local se apoderen de su router inalámbrico"
http://dnlongen.blogspot.com/2015/01/asus-bug-lets-those-on-your-local.html

"Un exploit permite hackear routers Asus desde la red local"
http://www.itworld.com/article/2867255/exploit-allows-asus-routers-to-be-hacked-from-local-network.html

"Los routers inalámbricos Asus pueden ser explotados por cualquiera dentro de la red"
http://it.slashdot.org/story/15/01/09/1349229/asus-wireless-routers-can-be-exploited-by-anyone-inside-the-network

"La mayoría de los routers Asus afectados por un fallo de secuestro; exploit publicado"
http://www.zdnet.com/article/asus-routers-vulnerable-to-network-attack-exploit-published/

"El fallo de ejecución de comandos como root acecha a los routers ASUS"
http://threatpost.com/root-command-execution-flaw-haunts-asus-routers/110276

Descargar herramienta