Logo de HeartBleed. |
Todos conocíamos HeartBleed dado el enorme revuelo e impacto que tuvo cuando fue redescubierto. Ahora de la mano de Apache llega OptionBleed con CVE: CVE-2017-9798. Una vulnerabilidad similar en tanto a que es otro Memory Leak fácilmente explotable.
Esta vulnerabilidad afecta a casi todos los servidores Apache por lo que si tienes uno te recomendamos actualizar, aplicar el parche, o la solución alternativa que prefieras. No es una vulnerabilidad que se de “por defecto” sino por un error de tratamiento de un fallo de configuración en la directiva Limit de HTACCESS.
No obstante tiene especial gravedad puesto que para explotar la vulnerabilidad solo es necesario realizar una petición OPTIONS a un servidor vulnerable varias veces.
elchicodepython@honeysec:~# wget -S --method=OPTIONS http://localhost
--2017-09-20 20:50:49-- http://localhost/
Resolviendo localhost (localhost)... ::1, 127.0.0.1
Conectando con localhost (localhost)[::1]:80... conectado.
Petición HTTP enviada, esperando respuesta...
HTTP/1.1 200 OK
Date: Wed, 20 Sep 2017 20:50:49 GMT
Server: Apache/2.4.10 (Debian)
Allow: OPTIONS,POST,GET,HEAD,,HEAD,,HEAD,,HEAD
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Longitud: 0 [text/html]
Grabando a: “index.html”
Como podemos ver en la respuesta la cabecera Allow que le indica al cliente que métodos tiene permitidos tiene más datos de los que debería: ,,HEAD,,HEAD,,HEAD
Además de estos datos puede devolver información de memoria como en el ejemplo de la Web: blog.segu-info.com.ar/2017/09/optionsbleed-bug-similar-heartbleed.html
Para replicar la vulnerabilidad es necesario disponer de un servidor Apache sin la última actualización y sin la aplicación del parche.
Dentro de la configuración de un archivo .htaccess deberemos incluir la directiva Limit mal formulada. Esta directiva espera métodos HTTP como son POST, PUT, GET, DELETE…
Si especificamos un método inexistente como puede ser
<Limit honeysec.info>
</Limit>
Cuando realicemos una solicitud OPTIONS que podemos realizer de la siguiente forma:
wget -S --method=OPTIONS <url>
Nos encontraremos con que entre las opciones puede haber más datos. Es posible que en la primera petición no encontremos información pero si repetimos la petición N veces dentro de la cabecera Allow podemos encontrar respuestas distintas.
Para solucionar la vulnerabilidad podemos comprobar que no tenemos errores en las directivas Limit, aplicar el parche ubicado en la siguiente URL https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/server/core.c?r1=1805223&r2=1807754&pathrev=1807754&view=patch, o, aplicar la actualización correspondiente cuando esté disponible para nuestro sistema operativo. Los principales ya tienen paquetes con el parche aplicado.
También existe una posibilidad alternativa de evitar el parche y la explotación del bug que he comprobado y es por medio del módulo allowmethods que deberemos habilitarlo previamente con la directiva a2enmod allowmethods. Finalmente dentro del directorio que pretendamos proteger en Apache aplicamos la siguiente instrucción señalada en negrita. De esta manera permitimos únicamente los métodos GET POST y HEAD. Excluyendo así el resto de los métodos entre ellos el método OPTIONS que explota esta vulnerabilidad.
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
AllowMethods GET POST HEAD
</Directory>
elchicodepython@honeysec:~# wget -S --method=OPTIONS http://localhost
--2017-09-20 21:20:40-- http://localhost/
Resolviendo localhost (localhost)... ::1, 127.0.0.1
Conectando con localhost (localhost)[::1]:80... conectado.
Petición HTTP enviada, esperando respuesta...
HTTP/1.1 405 Method Not Allowed
Date: Wed, 20 Sep 2017 21:20:40 GMT
Server: Apache/2.4.10 (Debian)
Allow:
Content-Length: 300
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
Como podemos ver en la respuesta la vulnerabilidad aunque esté presente no puede explotarse pues la respuesta es un Error 405: Método no permitido.
Por: @elchicodepython