LaTeX es un sistema de composición de textos, orientado a la creación de documentos escritos que presenten una alta calidad tipográfica. Está formado por un gran conjunto de macros de TeX y fue desarrolado por Leslie Lamport en 1984, con la intención de facilitar el uso del lenguaje de composición tipográfica, TeX, creado por Donald Knuth.
Es muy utilizado para la composición de artículos académicos, tesis y libros técnicos, dado que la calidad tipográfica de los documentos realizados en LaTeX, se considera adecuada a las necesidades de una editorial científica de primera línea.
Figura 2: Composición de un documento matemático
(parte derecha) utilizando LaTeX (parte izquierda)
En este artículo se presentan pruebas de concepto para entender y explotar las vulnerabilidades de Path Transversal y la Inyección de Comandos en plataformas web de trabajo colaborativo de documentos en LaTeX. También se propone una opción de configuración para evitar la inyección de comandos en los servidores.
Figura 3: Libro de "Hacking Web Technologies Silver Edition" 3ª Edición
Muchos de los conceptos de hacking y fortificación de vulnerabilidades son los expuestos en el libro de Hacking Web Technologies Silver Edition de 0xWord, que escribimos Enrique Rando, Pablo Gonzalez, Ricardo Martin, Chema Alonso y Amador Aparicio.
Plataformas colaborativas LaTeX
Tradicionalmente, la elaboración de documentos con LaTeX se ha realizado de forma individual tras la instalación de la distribución básica y un editor en el ordenador. Cada vez más la comunidad científica opta por utilizar plataformas web para la creación y generación de documentos en LaTeX debido a las ventajas que presentan:
Path Transversal
La etiqueta \input{filename} se utiliza para insertar el contenido del fichero en un documento LaTeX como si el contenido del fichero estuviera contenido en el archivo actual. Si el nombre del fichero cuyo contenido se quiere cargar tiene extensión .tex, LaTeX procesa su contenido como si fuera copiado y pegado. Si no hay ningún fichero con el nombre fichero.tex, LaTeX probará con el nombre fichero sin extensión (esto puede variar según la distribución de LaTeX).
Conociendo la ruta de un recurso interno en el servidor, si éste cuenta con los permisos de lectura necesarios para el usuario local del sistema operativo utilizado por el servicio de LaTeX, una vez compilado el fichero podremos tener acceso al contenido del fichero indicado en la etiqueta \input{}. Por ejemplo, si queremos conocer los usuarios locales del servidor web sobre un sistema Debian, basta incluir la ruta absoluta /etc/passwd en la etiqueta \input{} de la manera \input{/etc/passwd}
Como se muestra en la siguiente figura, si el sistema es vulnerable a Path Transversal, el resultado de la compilación de LaTeX será un fichero con el contenido del fichero /etc/passwd.
Para conocer los grupos presentes en el sistema operativo, bastaría incluir la etiqueta \input{/etc/group} y después compilar el fichero.
Si lo que se quiere obtener la versión del sistema operativo, bastaría incluir la etiqueta \input{/etc/issue} y después compilar el documento en la plataforma.
Tradicionalmente, la elaboración de documentos con LaTeX se ha realizado de forma individual tras la instalación de la distribución básica y un editor en el ordenador. Cada vez más la comunidad científica opta por utilizar plataformas web para la creación y generación de documentos en LaTeX debido a las ventajas que presentan:
- Permiten ahorrar la instalación y trabajar de manera colaborativa y así invitar a otras personas a revisar o escribir el de manera conjunta el contenido del fichero LaTeX.
- Cuentan con un coloreado de sintaxis y un log que informan de posibles errores de compilación del documento.
- Todos los paquetes y plantillas necesarias se encuentran instaladas dentro de la propia plataforma, por lo no es necesario realizar ningún tipo de instalación local.
- Cuentan con un “Historial de Documentos” para ver lo que se ha agregado y eliminado y poder hacer incluso una restauración a cualquier versión anterior.
Path Transversal
La etiqueta \input{filename} se utiliza para insertar el contenido del fichero en un documento LaTeX como si el contenido del fichero estuviera contenido en el archivo actual. Si el nombre del fichero cuyo contenido se quiere cargar tiene extensión .tex, LaTeX procesa su contenido como si fuera copiado y pegado. Si no hay ningún fichero con el nombre fichero.tex, LaTeX probará con el nombre fichero sin extensión (esto puede variar según la distribución de LaTeX).
Figura 4: Ejemplo de uso de la etiqueta \input{} en LaTeX.
Conociendo la ruta de un recurso interno en el servidor, si éste cuenta con los permisos de lectura necesarios para el usuario local del sistema operativo utilizado por el servicio de LaTeX, una vez compilado el fichero podremos tener acceso al contenido del fichero indicado en la etiqueta \input{}. Por ejemplo, si queremos conocer los usuarios locales del servidor web sobre un sistema Debian, basta incluir la ruta absoluta /etc/passwd en la etiqueta \input{} de la manera \input{/etc/passwd}
Figura 5: Payload para explotar la vulnerabilidad Path Transversal en LaTeX.
Como se muestra en la siguiente figura, si el sistema es vulnerable a Path Transversal, el resultado de la compilación de LaTeX será un fichero con el contenido del fichero /etc/passwd.
Figura 6: Contenido del fichero /etc/passwd.
Para conocer los grupos presentes en el sistema operativo, bastaría incluir la etiqueta \input{/etc/group} y después compilar el fichero.
Figura 7: Payload para conocer los grupos del usuario del servicio LaTeX.
Figura 8: Grupos dentro del sistema de generación de documentos LaTeX.
Si lo que se quiere obtener la versión del sistema operativo, bastaría incluir la etiqueta \input{/etc/issue} y después compilar el documento en la plataforma.
Figura 9: Payload para conocer la versión del sistema operativo del servicio LaTeX.
Figura 10: Versión del sistema operativo utilizado en la
plataforma de generación de documentos LaTeX.
Inyección de Comandos
LaTeX proporciona la etiqueta \write18{comando_shell} para realizar llamadas al sistema operativo. El sistema operativo ejecuta el comando y la ejecución de LaTeX se bloquea hasta que finaliza. Al ser \write18{comando_shell} un caso especial de la etiqueta \write{fichero} y ser LaTeX un sistema de composición tipográfica, el comportamiento estándar de \write{} y de \write18{} es esperar que se envíe una página entera para generar el fichero correspondiente. Una técnica más que útil en proyectos de Ethical Hacking.
Figura 11: Libro de Ethical Hacking 2ª Edición de Pablo González en 0xWord |
Existen ocasiones en la que se quiere “escribir ahora” o ejecutar comandos del sistema operativo sin la necesidad de que el proceso padre espere a que el proceso hijo haya terminado de enviar toda la información de una página para completar el proceso de escritura en un fichero. Para ellos se utiliza la etiqueta \immediate junto con la etiqueta \write18{} de la forma \immediate\write18{comando_shell}. El siguiente código es un ejemplo de la llamada a la shell de un sistema UNIX para ejecutar el comando id.
Tras llamar al comando id, se genera el fichero /tmp/test.txt con el UID y el GID del usuario especificado, además de sus grupos secundarios.
También podemos consultar directorios para tratar de encontrar los certificados digitales correspondientes a las autoridades de certificación (CA) de confianza.
Cómo evitar la inyección de comandos en entornos LaTeX
Si el compilador utilizado es pdflatex, éste soporta tres modos de operación en su fichero de configuración /usr/share/texmf/web2c/texmf.cnf:
Figura 12: Ejecución del comando id en el servidor de la plataforma LaTeX.
Tras llamar al comando id, se genera el fichero /tmp/test.txt con el UID y el GID del usuario especificado, además de sus grupos secundarios.
Figura 13: Contenido del fichero /tmp/test.txt tras la ejecución de código en el servidor.
También podemos consultar directorios para tratar de encontrar los certificados digitales correspondientes a las autoridades de certificación (CA) de confianza.
Figura 14: Código LaTeX para listar el contenido del fichero /usr/share
Figura 15: Directorio dentro de /usr/share con las autoridades
de certificación de los certificados digitales.
Figura 16: Información de las características de los
certificados digitales presentes en el sistema.
Cómo evitar la inyección de comandos en entornos LaTeX
Si el compilador utilizado es pdflatex, éste soporta tres modos de operación en su fichero de configuración /usr/share/texmf/web2c/texmf.cnf:
- -no-shell-escape: Deshabilita la etiqueta \write18{command}, por lo que no se podrán realizar llamadas a la shell del sistema operativo.
- -shell-restricted: Igual que -shell-escape, pero limitado a un conjunto 'seguro' de comandos predefinidos.
- -shell-escape: Habilita el uso de la etiqueta \write18{command} para ejecutar cualquier comando de la shell. Esta construcción normalmente no está permitida por razones de seguridad.
Si lo que quieres es reducir al máximo la superficie de exposición de tu servidor, basta con seleccionar la opción -no-shell-escape para eliminar la ejecución de comandos a nivel de shell en el servidor.
Saludos,
Saludos,
Autor: Amador Aparicio, escritor de libro "Hacking Web Technologies", CSE (Chief Security Envoy) de ElevenPaths. Puedes contactar con Amador Aparicio a través de su buzón público en MyPublicInbox.
Contactar con Amador Aparicio |
No hay comentarios:
Publicar un comentario