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
CVE-2021-3156 — CVE-2021-3156 (Baron Samedit) Informe e Investigación | Kitploit
Herramientas/GitHubGitHub/ijbaig/cve-2021-3156
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónAprendizaje y EducaciónExplotación de BinariosLabs y Práctica
GitHubijbaig/cve-2021-3156

CVE-2021-3156

CVE-2021-3156 (Baron Samedit) Informe e Investigación

Ver Repositorio
hace 1 mesAún no revisado

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

Exploit Chain Deep-Dive: CVE-2021-3156 (Baron Samedit)

Autor: IJ Baig
Fecha: 7 de julio de 2026


1. CVE ID, Versiones afectadas y confirmación de compilación

  • CVE ID: CVE-2021-3156
  • Tipo de vulnerabilidad: Desbordamiento de búfer basado en montón
  • Rango de versiones afectadas: Versiones heredadas de Sudo 1.8.2 a 1.8.31p2, y versiones estables 1.9.0 a 1.9.5p1.
  • Versión objetivo compilada: Sudo 1.9.5p1

1.1 Configuración del entorno

Para analizar esta vulnerabilidad de forma segura, la versión vulnerable de Sudo se compiló en un entorno aislado y ajeno a producción.

Información del SO

1.2 Compilación desde el código fuente

El código fuente de Sudo 1.9.5p1 se descargó y compiló localmente utilizando las utilidades estándar de make. Se tuvo cuidado de ejecutar esto desde un directorio local para que no sobrescribiera el binario sudo nativo y parcheado del sistema anfitrión.

Paso 1 de compilación

Confirmación de compilación: Después de la compilación, se ejecutó el binario personalizado para verificar que se había compilado la versión vulnerable correcta.

Instalación con make

Versión de Sudo

2. Análisis de la causa raíz

2.1 Ubicación del código vulnerable

  • Archivo: plugins/sudoers/sudoers.c
  • Función: set_cmnd() (alrededor de la línea 864 en la versión 1.9.5p1)

Código vulnerable

2.2 Explicación de la vulnerabilidad

Imagina que tienes un asistente cuyo trabajo es eliminar los caracteres de escape (barras invertidas) de una lista de palabras antes de colocarlas en una caja de almacenamiento recién asignada (un búfer del montón). El asistente asume ciegamente que cada barra invertida siempre va seguida de un carácter válido, así que cada vez que ve una barra invertida, la omite y copia el siguiente carácter.

Sin embargo, existe una falla en cómo el programa maneja los argumentos al ejecutar sudoedit -s. Permite que un usuario introduzca una palabra que termina exactamente con una barra invertida (\), seguida inmediatamente por el marcador invisible de fin de palabra (un terminador nulo, \0).

Cuando el código del asistente llega a esta barra invertida al final, la omite y mira el siguiente carácter—el terminador nulo. En lugar de detenerse, la lógica de la sentencia if obliga al asistente a omitir también el terminador nulo. El bucle continúa, copiando en la caja de almacenamiento cualquier memoria arbitraria fuera de los límites que venga a continuación. Esta copia continua más allá de la longitud prevista de la palabra desborda el búfer designado, lo que provoca un grave desbordamiento de búfer basado en montón.

Fragmento de código vulnerable:

root@kitploit:~
/* Unescape characters, skipping over backslashes */
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {
    while (*from) {
        // VULNERABILITY: If from[0] is '\' and from[1] is '\0', 
        // the loop evaluates to true, increments 'from', skipping the null terminator.
        if (from[0] == '\\' && !isspace((unsigned char)from[1]))
            from++;
        *to++ = *from++; 
    }
    *to++ = ' ';
}
*--to = '\0';

2.3 Explicación del parche y la corrección oficial

Los desarrolladores de Sudo corrigieron este error lógico en la versión 1.9.5p2 añadiendo una comprobación estricta de límites. El código ahora garantiza explícitamente que el carácter que sigue a la barra invertida no sea el terminador nulo antes de intentar desescaparlo.

Diff del parche:

root@kitploit:~
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))

Por qué esto corrige la causa raíz: La adición de from[1] != '\0' detiene inmediatamente la lectura fuera de límites. Ahora, si el código encuentra una barra invertida al final de la cadena (lo que significa que from[1] es el terminador nulo), la sentencia if se evalúa como falsa. El puntero no se incrementa prematuramente, el terminador nulo se procesa correctamente como el final de la cadena, y el bucle termina de manera segura sin desbordar el montón.

3. Reproducción del exploit

3.1 Prueba de concepto pública (PoC)

Para esta reproducción, se utilizó el exploit Python ampliamente reconocido desarrollado por el investigador de seguridad Worawit (específicamente la variante exploit_nss.py).

3.2 Desglose de la ejecución del PoC

Antes de ejecutar el PoC, es fundamental comprender su mecánica. El script no solo provoca un bloqueo del programa; orquesta una manipulación de memoria altamente precisa para obtener ejecución de código.

Aquí está el desglose paso a paso de las operaciones del PoC:

  1. Generación del payload: El script compila dinámicamente un payload C malicioso en un archivo de objeto compartido (.so). Este payload está diseñado para ejecutar /bin/sh como root.
  2. Heap Feng Shui: El script configura variables de entorno específicas (como LC_ALL, LANG y TZ). Debido a que Sudo carga las variables de entorno en el montón al iniciarse, el script calcula los tamaños exactos necesarios para organizar el montón en un diseño predecible.
  3. El desbordamiento: El script ejecuta sudoedit -s y pasa un argumento de línea de comandos que termina en una barra invertida. Esto desencadena la vulnerabilidad off-by-one discutida en la Sección 2, provocando una escritura fuera de límites.
  4. Apuntando a la estructura NSS: La escritura fuera de límites sobrescribe precisamente una estructura específica de glibc en la memoria adyacente del montón: la estructura service_user. Esta estructura es utilizada por el Name Service Switch (NSS) para buscar información del sistema.
  5. Ejecución de código: La estructura service_user es corrompida para apuntar a la librería .so maliciosa compilada en el Paso 1. Cuando Sudo intenta buscar los privilegios del usuario, carga y ejecuta ciegamente la librería del atacante, otorgando una shell de root.

3.3 Desencadenando la vulnerabilidad (Sudo 1.9.5p1)

Primero, se realizó una prueba básica de bloqueo para demostrar que la vulnerabilidad existe sin llegar a armarla.

Verificación de vulnerabilidad

A continuación, se ejecutó el script completo exploit_nss.py de Worawit contra el binario vulnerable.

Acceso a terminal como root

3.4 Verificación del parche (Sudo 1.9.5p2)

Para verificar la corrección oficial, se ejecutó el mismo desencadenante del PoC contra el binario de Sudo parcheado.

root@kitploit:~
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Verificación del parche

4. Resumen no técnico

Sudo, un programa administrativo estándar utilizado en nuestros servidores, contiene una falla crítica en la forma en que procesa las entradas de texto que contienen barras invertidas. Al enviar cuidadosamente un comando mal formado, un atacante con acceso básico de usuario puede engañar al sistema para que escriba datos fuera de su área de memoria designada. Este error les permite eludir por completo los controles de seguridad y obtener control administrativo completo y no autorizado sobre la máquina sin necesidad de contraseña.

5. Desafíos enfrentados y lecciones aprendidas

Desafíos: Uno de los principales desafíos fue la fragilidad de la manipulación del montón. Los payloads de exploits que apuntan a versiones específicas del sistema operativo a menudo fallan en otras porque la biblioteca estándar de C subyacente (glibc) gestiona los fragmentos de memoria de manera diferente. Armar con éxito esta vulnerabilidad requirió una comprensión exacta de la alineación de la memoria y los diseños de las variables de entorno (Heap Feng Shui) específicos del entorno objetivo.

Lecciones aprendidas: Desde una perspectiva defensiva y de operaciones de seguridad, esta inmersión profunda reforzó varios conceptos críticos:

  • El valor de los entornos de laboratorio controlados: Pasar de rangos guiados basados en web (como TryHackMe) a construir y explotar un binario vulnerable desde el código fuente localmente proporciona una comprensión mucho más profunda de cómo los mecanismos subyacentes del sistema operativo dictan la viabilidad del exploit.
  • La ingeniería de detección es primordial: Confiar únicamente en parchear binarios SUID es insuficiente porque el ciclo de parches lleva tiempo. Explorar este exploit destacó la necesidad de reglas de detección SIEM robustas. Monitorear la telemetría de ejecución de procesos en busca de comandos sospechosos sudoedit -s que terminen en caracteres de escape podría permitir a un equipo de SOC detectar intentos de explotación antes de que se implemente completamente un parche en la infraestructura.
  • Límites de privilegios: El ejercicio subrayó el inmenso riesgo asociado con los binarios SUID. Debido a que Sudo se ejecuta con privilegios de root desde su primera instrucción, cualquier error de lógica de análisis al inicio garantiza la completa compromisión del sistema.

6. Extra: Vulnerabilidades paralelas en Sudo

CVE paralelo: CVE-2019-14287 (Omisión de seguridad de Sudo) Otra vulnerabilidad destacada dentro del mismo código base de Sudo comparte un patrón de causa raíz similar: análisis y validación incorrectos de la entrada del usuario. En CVE-2019-14287, una falla lógica en la forma en que Sudo analizaba el ID de usuario (UID) permitía a un atacante ejecutar comandos como root especificando el ID de usuario -1 o 4294967295.

El paralelismo: Mientras que Baron Samedit (CVE-2021-3156) es una falla de corrupción de memoria y CVE-2019-14287 es una omisión de autorización, la causa raíz en ambos casos es una falla en la lógica inicial de análisis de argumentos. Ambas vulnerabilidades se originan en que Sudo confía incorrectamente y maneja mal los argumentos de línea de comandos en casos límite (barras invertidas al final frente a envolturas inesperadas de enteros) antes de ejecutar sus funciones privilegiadas principales.


Declaración de seguridad y ética: Toda la explotación y pruebas demostradas en este informe se realizaron íntegramente dentro de una máquina virtual local aislada y autorizada. No se atacó ni interactuó con sistemas de producción o redes no autorizadas durante este ejercicio.

Descargar herramienta