Blog

Noticias y eventos

Hoy venimos a hablar sobre una vulnerabilidad presente en algunos php-cgi desactualizados, los cuales nos permiten entre otras cosas hacer RCE.

La pregunta a hacerse es, ¿cómo comprobamos si en caso de que exista, posee una versión vulnerable?. Si miramos en la foto adjunta en la parte superior, el parámetro ‘-s‘ nos permite ver el Source de aquello que le pasemos, y esto está interesante. Si desde la propia url, probamos a “inyectar” un ‘/?-s‘, vemos que obtenemos los siguientes resultados:

Esto quiere decir, en pocas palabras, que es probable que podamos hacer RCE (Remote Code Execution). Si nos fijamos, hemos sido capaces de ver el Source de la propia web a través del parámetro pasado, pero no sirve de mucho si lo que pretendemos hacer es dar un enfoque intrusivo a la máquina que sustenta este servidor web.

Sin embargo, existe otro parámetro interesante del php-cgi del cual nos podemos aprovechar, el parámetro ‘-d‘. Este parámetro nos permite definir las entradas INI de la configuración de archivos. Algo a tener en cuenta, en caso de pretender lograr ejecución remota de código, es tratar de enviar código PHP al servidor y que sea capaz de interpretarlo. Para ello, lo que hacemos es utilizar ‘php://input‘, con el fin de incrustar el código definido en el cuerpo de la solicitud.

Necesitamos 2 cosas para ello, por un lado, necesitamos que se lea el código php de nuestra solicitud. Lo que buscamos es una opción PHP que diga al propio PHP que lea de un archivo y lo apunte a ‘php://input‘. Afortunadamente, PHP cuenta con la opción ‘auto_prepend_file‘ desde la versión 4.2.3. Lo bueno de esta opción, es que el contenido del archivo se incluye antes que cualquier otro archivo, o en otras palabras, se incluye antes de ejecutar cualquier otro código, por lo que garantizamos que ningún otro código afecte a nuestra explotación.

Por otro lado, si queremos usar ‘php://input‘, debemos permitir que la url lo incluya, pero esto no supone ningún problema, dado que podemos redefinir las entradas INI. Podemos activarlo fácilmente usando ‘-d allow_url_include=1‘.

Suponiendo que quisiéramos ejecutar en remoto el comando ‘whoami‘, lo que hacemos es montarnos un simple script PHP de antemano el cual enviamos posteriormente vía POST a la web con todo lo que hemos comentado. De la siguiente forma:

Y como vemos, logramos la ejecución remota de código. Resulta evidente por tanto intuir cómo acceder a la máquina a través de este procedimiento:

De ahí la importancia de tener bien actualizadas las versiones de nuestros programas expuestos públicamente, pues pueden convertirse en un gran vector de ataque por parte de un ciberdelincuente.

 

Artículo publicado por:

Marcelo Raúl Vázquez Pereyra
redteam@enigmasec.com