Haciendo auditoria a un servidor me encontré con un script en php, que se usa para cargar dinámicamente archivos de javascript, el cual un bug de seguridad.
Este no validaba si el usuario colocaba una URL mal formada con retornos en el path lo cual me permitía ver cualquier archivo en el servidor que tuviera permisos generales o del usuario que corre apache. Lo explote de la siguiente manera : www.siteVulnerable.com/images/loader.php?x=../../../../../../../etc/passwd
El Script es el siguiente :
Código:
<?php
$cache = (isset($_GET['cache']))? intval($_GET['cache']) : TRUE;
$LF = "\n";
$output = '';
$files = explode(',', $_GET['X']);
foreach ($files as $file) {
$filepath = realpath('./'.$file);
$output .= $LF.@file_get_contents($filepath);
}
if (!empty($output)) {
# Remove spaces
$output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
$output = str_replace(array("\r\n", "\r", "\n", "\t", '', '', ''), '', $output);
# Send HTTP headersheader('Content-Type: text/css');
if ($cache) {
header('Pragma: public');
header('Cache-Control: max-age=31536000');
header('Last-Modified: Thu, 28 Jan 2010 22:31:25 GMT');
header('Expires: '.gmdate('D, d M Y H:i:s', time()+31536000).' GMT');
header('ETag: "'.md5($output).'"');} else {header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
}
# Output file(s)
contentsob_start('ob_gzhandler');
echo $output;ob_end_flush();
}
else {
header('HTTP/1.0 404 Not Found');
header('Expires: 0');
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
}
exit;
?>
$cache = (isset($_GET['cache']))? intval($_GET['cache']) : TRUE;
$LF = "\n";
$output = '';
$files = explode(',', $_GET['X']);
foreach ($files as $file) {
$filepath = realpath('./'.$file);
$output .= $LF.@file_get_contents($filepath);
}
if (!empty($output)) {
# Remove spaces
$output = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $output);
$output = str_replace(array("\r\n", "\r", "\n", "\t", '', '', ''), '', $output);
# Send HTTP headersheader('Content-Type: text/css');
if ($cache) {
header('Pragma: public');
header('Cache-Control: max-age=31536000');
header('Last-Modified: Thu, 28 Jan 2010 22:31:25 GMT');
header('Expires: '.gmdate('D, d M Y H:i:s', time()+31536000).' GMT');
header('ETag: "'.md5($output).'"');} else {header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
}
# Output file(s)
contentsob_start('ob_gzhandler');
echo $output;ob_end_flush();
}
else {
header('HTTP/1.0 404 Not Found');
header('Expires: 0');
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
}
exit;
?>
Logre detectar que tipo de sistema para CMS usaban, por cierto fue algo difícil ya que modificaron mucho todo el sistema, aparte de que era uno algo desconocido. Tambien logre ver los usuarios (mas no sus contrasenas ya que usaban shadow). Pero si logre ver el archivo de configuracion a la base de datos: usuario, pass, nombre de la db y direccion. El problema es que no tiene puerto abierto para acceder a la base de datos de forma remota. Y no he podido reventar ese codigo php para ejecutar algun comando o levantarme una shell dentro del sistema.
En resumen:
El sistema usado es : Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny9 with Suhosin-Patch Server (Encontrado por errores que da apache)
Las puertas abiertas son: 21 y 80 (ftp y web)
Datos que tengo : /etc/passwd, /etc/hosts, default (de apache), httpd.conf, user y pass de la base de datos.
De aqui, y con estos datos, que puedo hacer? Es un camino sin salida?