Blog
dark mode light mode Search Archivos descargables
Search

Ejecución remota de código en LimeSurvey < 3.16 mediante ataque de serialización en TCPDF

Ejecución de código limesurvey

Durante el Black Hat USA 2018, Sam Thomas presentó otra forma de explotar ataques de serialización en PHP. No es mi intención explicar esta técnica con demasiado detalle. Para más información puedes acceder al siguiente enlace PHP Unserialization Vulnerability Jim, but Not as We Know It.

Esta técnica de explotación se llama Unserialization via the phar:// Stream Wrapper, un archivo PHAR puede contener metadatos. Pueden ser incluso un objeto PHP serializado. Existen ciertas funciones PHP como: fopen(), file_exists(), copy(), filesize(), etc, que soportan el uso del phar://, cuando estas funciones realizan una llamada a un fichero PHAR mediante este wrapper, los metadatos del fichero son deserializados, esto permite la inyección de objetos maliciosos sin necesidad de controlar una función unserialize().

Requisitos

Controlar la entrada de cualquiera de estas funciones vulnerables:

  • archivo_existe()
  • fopen()
  • tamaño del archivo()
  • copiar()
  • incluir()
  • etc

Estas funciones vulnerables son utilizadas para poder subir un archivo de tipo PHAR al servidor. Junto con esta técnica, se reportaron diferentes CVE, uno de los cuales es CVE-2018-17057, el cual  describe una vulnerabilidad de deserialización en la biblioteca TCPDF.

TCPDF

Es una biblioteca de código abierto escrita en PHP que permite generar documentos PDF. Cuando se genera un documento PDF a partir de código HTML, es posible controlar la entrada de la función file_exists(), mediante la etiqueta <img>.

Serializacion-en-TCPDF

LimeSurvey <3.16 utiliza una versión antigua (6.2.13) de la librería TCPDF que es vulnerable a un ataque de deserialización a través del wrapper phar://. Recuerda que para explotar esta vulnerabilidad es necesario disponer de una cuenta de usuario administrador en la aplicación vulnerable.

¿Cómo se obtiene el RCE?

Cuando la exportación de una Encuesta se realiza a través de la opción “queXML PDF export”, es posible insertar código HTML dentro del campo de estilo y controlar la entrada de la función file_exists() dentro de la librería TCPDF. Te mostramos un ejemplo: 

PHPGGC

Es una herramienta que permite generar “gadgets” sobre diferentes Frameworks PHP, es decir, si la aplicación está utilizando uno de los frameworks de la lista soportada, es muy posible que podamos generar un payload para conseguir comandos en la aplicación vulnerable. Por suerte, LimeSurvey utiliza el Framework PHP Yii para manejar las peticiones HTTP, por lo que es posible generar un payload válido de la siguiente manera:

$ ./phpggc Yii/RCE1 system "echo 3c3f7068702073797374656d28245f4745545b2263225d293b203f3e0a | xxd -r -p > shell.php" -p phar -o /tmp/exploit.jpg

El comando anterior se encargará de crear un fichero PHAR con un objeto serializado, que terminará haciendo una llamada a system(). Como argumento pasamos el siguiente comando:

 "echo 3c3f7068702073797374656d28245f4745545b2263225d293b203f3e0a | xxd -r -p> shell.php"

 Que creará un simple web shell “shell.php”, en el directorio base de la aplicación.

En la siguiente imagen se puede ver, en el contenido del archivo PHAR, el objeto PHP serializado e inyectado en la sección de metadatos.

Obtener la shell

Una vez creado el archivo PHAR malicioso, lo subimos y obtenemos la ruta local donde está alojado.

Ahora podemos realizar la exportación de nuestra encuesta, inyectando el siguiente código HTML en el campo de estilo.

Como se puede observar, la librería TCPDF ha generado el siguiente error, ya que no se puede obtener el tamaño de la imagen mediante la función getimagesize(), debido a que el fichero cargado es de tipo PHAR.

Pero si hacemos la llamada al script “shell.php” en el directorio base, podemos ver que el objeto serializado se ejecutó correctamente y ya tenemos una consola web para ejecutar comandos libremente dentro del servidor.

Conclusión

Esta técnica de explotación lleva a los desarrolladores a prestar más atención a las entradas peligrosas en funciones como file_exists(), que antes no se consideraba una función de especial cuidado. Si te quedaste con ganas de conocer más, puedes entrar al siguiente link. 

PHP Unserialization Vulnerability Jim, but Not as We Know It.

Hackmetrix newsletter ciberseguridad