
Demostración educativa de explotación de la inyección SQL CVE-2014-2323 en mod_mysql_vhost de lighttpd, con laboratorio basado en Docker para el análisis práctico de vulnerabilidades y su parcheo.
title: Ep4 - Vulnerabilidad Relacionada con Redes members:
Vulnerabilidad relacionada:
CVE-2014-2323 [1] was assigned to SQL injection bug.
CVE-2014-2324 [2] was assigned to the path traversal bug.
Confirmación: http://download.lighttpd.net/lighttpd/security/lighttpd_sa_2014_01.txt
El servicio a explotar es Lighttpd. Es un servidor web de código abierto (licencia BSD) optimizado para ser ligero y rápido. Surgió como una 'prueba de concepto' del famoso problema c10k (cómo manejar 10 mil conexiones simultáneas en un servidor), ganando bastante popularidad en esa época (2003), siendo utilizado actualmente por Whatsapp.com, Xkcd y, en el pasado, Youtube. Su posicionamiento en el mercado es bastante interesante, como podemos ver en el gráfico:

El servidor busca manejar el problema de muchas conexiones mediante el uso de mecanismos asíncronos basados en eventos (kqueue en BSDs, epoll en Linux), reduciendo la necesidad de múltiples hilos, lo que resulta en una 'huella' de memoria mucho menor y una mejor utilización de la CPU (estrategia también utilizada por servidores Nginx, cuyo uso ha aumentado significativamente a lo largo de los años):

Una de las características de lighty es la fácil gestión de virtual hosts.
Es un método utilizado para alojar más de un nombre de dominio cuya resolución se hace a una misma IP, reduciendo los costos de hospedaje para empresas que buscan ofrecer sitios web, ya que no es necesario reservar un servidor dedicado para cada sitio web.
La técnica puede basarse en IP (una interfaz para cada host) o basarse en nombre (un nombre para cada host, compartiendo la interfaz) - explorada en esta presentación.
Name-Based
: utiliza el 'Hostname' proporcionado por el cliente para identificar qué servicio usar para responder en consecuencia. Este método presenta dos dificultades: complicaciones para manejar sesiones seguras (TLS): el handshake debe realizarse antes de cualquier paso de cabecera que indique el Host al servidor, lo que complica la determinación de qué certificado presentar en el handshake. Una salida a este problema es una extensión de TLS llamada Server Name Indication (SNI) que permite presentar el nombre al inicio del handshake, posibilitando así la elección del certificado correcto. Un segundo problema es el intento de conexión sin la cabecera Host bien definida, lo que conlleva a la indeterminación del servicio a utilizar.
IP-Based
: utiliza IPs separados para cada aplicación. El servidor web se configura entonces para múltiples interfaces de red físicas (o virtuales sobre una misma interfaz) y responde de forma correspondiente de acuerdo con la dirección IP (destino)G;.
IP aliasing, permite que creemos interfaces virtuales para cada servicio.
En el caso de una gran empresa, administrar dicho mapeo puede volverse complejo dependiendo del número de clientes. Lighty ofrece entonces soporte para el uso de bases de datos para tal fin, como mostraremos más adelante.
Antes, veamos cómo hacer "a mano" la configuración de un servidor y luego agregar vhosting.
Preparar un servidor básico lighttpd es muy fácil. Basta con realizar su instalación y crear un archivo de configuración que indique el puerto que se utilizará, cómo responder a determinadas solicitudes y otras configuraciones.
Podemos preparar un ejemplo de configuración que solo se ocupa de recibir solicitudes de archivos estáticos (.html o .txt):
server.document-root = "/usr/lighttpd/mysite.com/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
Imagine ahora que queremos crear un negocio basado en la venta de sitios web y ofrecemos un dominio propio al comprador. Con el fin de minimizar los costos, queremos entonces crear vhosts para cada cliente. Digamos que el curso de la asignatura de redes desea adquirir tres sitios web: redes.io, mac0448.io y mac5910.io. Nuestra empresa entonces registra los dominios, todos apuntando al IP de nuestro único servidor, de única interfaz.
PD: como queremos simular esto, podemos alterar el archivo /etc/hosts:
172.17.0.2 redes.io
172.17.0.2 mac0448.io
172.17.0.2 mac5910.io
Para que seamos capaces de servir los diferentes sitios web de los clientes resolviendo a partir de un único IP, podemos entonces configurar el servidor a mano:
server.document-root = "/usr/lighttpd/default/"
server.port = 80
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain"
)
$HTTP["host"] == "redes.io" {
server.document-root = "/usr/lighttpd/redes/"
} else $HTTP["host"] == "mac0448.io" {
server.document-root = "/usr/lighttpd/mac0448/"
} else $HTTP["host"] == "mac5910.io" {
server.document-root = "/usr/lighttpd/mac5910/"
}
Pero, como podemos imaginar, esto puede convertirse en un problema a medida que queremos lidiar con muchos clientes y proporcionar diferentes configuraciones a cada sitio web, como se mencionó anteriormente.
Con el módulo mod_mysql_vhost podemos entonces conectar nuestro servidor a una base de datos mysql responsable de dicho mapeo. Especificamos entonces el nombre de la base de datos, cómo encontrarla en nuestra red y qué comando utilizar para realizar la búsqueda.
server.modules = (
"mod_accesslog",
"mod_mysql_vhost"
)
mysql-vhost.db = "NOME_DO_BANCO"
mysql-vhost.user = "USUARIO"
mysql-vhost.pass = "SENHA"
(!!!!!!!!!!!!!!!)
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
(!!!!!!!!!!!!!!!)
mysql-vhost.hostname = "HOSTNAME"
mysql-vhost.port = "PORTA"
SQL es un lenguaje declarativo para administrar bases de datos relacionales, que se utiliza (...) etc
TODO
TODO
Los problemas surgen entonces por el hecho de que los sistemas de gestión de bases de datos que utilizan SQL suponen que los comandos insertados serán comandos conocidos por el administrador y bien gestionados por él. Esa suposición no siempre es cierta, ya que las fallas en los sistemas que interactúan con el sistema de BD pueden presentar vulnerabilidades, principalmente en la web, donde la interacción con el usuario es grande.