Diario de un perito informático: forense a un WordPress [I]

La necesidad de prestar juramento o promesa por parte del perito en el dictamen,  no permite o empodera a un perito para actuar como un fedatario público. Debemos dejar de lado que un perito informático, en este caso, pueda afirmar que un contenido de una web, o cualquier otra prueba digital, es real y no ha sido alterado en algún momento porque está bajo juramento… Como si de un notario tratase.

El perito informático deberá autentificar de forma técnica. Con su análisis e investigación concluir si ha encontrado, o no, indicios y/o evidencias de modificación y alteración en las posibles pruebas digitales. Ya que, me atrevería a decir que las pruebas digitales por naturaleza son susceptibles de modificación o alteración.

Antecedentes de hechos:

Mi cliente me manifiesta llevar muchos años en la empresa y haber sido despedido de forma procedente. Los argumentos que expone la empresa son: haber modificado la entrada del blog de la empresa y cambiar un título insultando a la directiva y superiores.

El cliente afirma (varias veces) no haber realizado esa modificación y ser inocente.

Contrapericial:

La empresa aportó un informe pericial informático que se realizó ante notario. Básicamente describen como observan una web WordPress, donde en el apartado de “Noticias”, el artículo más buscado tiene un título “insultante para cargos de la directiva de la empresa y otros trabajadores superiores [..]”. Concluyen que la autoría de tal hecho es mi cliente. En la web aparece el usuario y  solo tienen 3 personas con 3 usuarios diferentes accesos al panel de control; el jefe y dos trabajadores. No obstante, según la fecha que se puede ver en la captura de pantalla, solo puede ser mi cliente.

Un ejemplo para que lo entendáis mejor de las capturas de pantalla que aportaban podría ser un fragmento de este blog. Donde encontramos una imagen destacada, un título (cambialo por uno “insultante”), el nombre de un usuario, la fecha compuesta por el día, mes y año y unas breves líneas de descripción.

 

Como podéis observar aparece el usuario “QuantiKa14” y fecha “16 abril, 2018”. Sin embargo ¿Es susceptible de modificación? ¿Es posible que una persona modifique el título y ponga otra fecha?

Mirando los logs del servidor web

Lo primero que quise investigar es ver si hubo alguna conexión al WordPress desde fuera de la empresa.

En Linux podemos encontrar diversos servidores web pero los más comunes son Apache o Nginx. En Apache y Nginx el registro que guarda las peticiones HTTP se llama “access.log” y puede estar en diferentes directorios. Normalmente en Apache están en las siguientes direcciones: /var/log/apache/access.log, /var/log/apache2/access.log, /var/log/httpd/access.log

Si no lo encontramos, no te preocupes. Podemos usar el comando “locate” y fácilmente nos dará las ubicaciones:

Efectivamente, encontramos que el día que aparece en la web se accede desde la web de la empresa

En Windows por ejemplo si tiene instalado XAMPP la ruta sería:

Para el análisis utilicé el siguiente comando: cat access.log | grep “[12/Jun/2018:” > datos.txt

Posteriormente realicé un proceso manual (pufff…) pero para buscar peticiones de interés podemos hacer otro Grep con rutas como “/wp-admin” y “/wp-login” en el caso de tenerlas por defecto.

Tras finalizar, no encontré ningún acceso exterior en la fecha de publicación/modificación del artículo que aparece en la web de la empresa. Por lo cual, nuestro cliente sigue siendo culpable ya que, los únicos accesos que aparecen son; desde la IP de la empresa, cuando el cliente estaba trabajando. Pero seguimos investigando…

Cómo funciona WordPress

WordPress es un gestor de contenido que nos permite realizar decenas de diversas funcionalidades complejas y sencillas para que nuestra web tenga diferentes estructuras y formas de forma fácil: tienda online, web corporativa, foro, plataformas de e-learning, etc.

Como buen gestor de contenido nos permite subir, eliminar y actualizar la información que subimos. WordPress dispone de 2 caras, un frontend donde los visitantes a nuestra web verán la información publicada, y un backend limitado el acceso por un login a usuarios con privilegios. Como hemos comentado anteriormente, en nuestro caso solo habrá 3 usuarios con privilegios de Administrador (sin limitaciones).

Importante añadir que si el WP es vulnerable es posible que terceras personas puedan acceder al backend, y también si un intruso averigua las credenciales de los usuarios.

En el panel de control (backend), los usuarios con privilegios podrán modificar la web y subir contenidos en diferentes formatos: apartados específicos de la web, páginas, post del blog y widgets. Además WordPress permite instalar plugins que permite adquirir nuevas funcionalidades a la web. En nuestro caso, nos centraremos en el funcionamiento de modificación o actualización de los post (artículos) del blog.

¿Qué hace la función “wp_update_post()”?

Es una función que aparece en 37 ocasiones en 16 archivos diferentes del core de WP. Es una función que se encarga de actualizar el post que le digamos a través de su ID. Un ejemplo sería:

Su funcionamiento es bastante sencillo. El primer parámetro acepta un array con los campos de la tabla “wp_post” de la base de datos que queramos cambiar. Más información de los campos aquí. El segundo parámetro es opcional. Recibe un booleano que se puede pasar para controlar lo que se devuelve en caso de error. La configuración predeterminada (false) devolverá un 0 si la publicación no se actualiza. Sin embargo, si la actualización se realiza de forma correcta, regresará con un objeto WP_Error. Predeterminado: false.

 

¿Esto qué significa?

WP permite modificar todos los campos sin problemas. Por lo cual, una tercera persona podría desde el panel de control modificar la fecha de publicación a otro día, pero actualizará no solo el campo “post_date”, sino también el registro “post_modified” por la última fecha de del día y hora de modificación.

Es fácil realizar una modificación de un artículo del blog de un WP desde el panel. Si. Entrando al artículo que queremos cambiar la fecha en el menú de la derecha podemos configurar para actualizar por los datos que queramos.

Sorpresa al ver que no hacía falta ir a la base de datos. Porque si pinchamos en “Posts” o “Entradas” nos saldrá un listado donde a la derecha podemos ver la fecha de última modificación…

Cruzando datos

De momento tenemos:

  • El 5 de abril de 2018 se realiza una modificación de un artículo de la web y realizó 2 cambios: el título (“post_title”) y la fecha (“post_date”)
  •  Un artículo de un blog en WordPress con fecha de publicación el 11 de junio de 2018. Comprobado que ese dia solo accedió nuestro cliente desde su puesto de trabajo al panel de control

Volvemos hacer el mismo proceso y miramos en el access.log qué pasó el día 5 de abril. Efectivamente encontramos la misma IP de la empresa y otra al final del día diferente.

Comprobando la base de datos

Ahora que tenemos al culpable tenemos que verificar que esos datos no fueron puestos de otra forma. Es decir, debemos comprobar que ningún usuario ha modificado la base de datos. También una persona con acceso al FTP podría conocer los datos de conexión de la DB en el archivo “wp-config.php”, excepto que esté bien protegido. Cambiando a una ruta diferente por defecto y limitando su acceso. También podemos cifrar las claves. Además deberemos saber quienes han entrado al servidor.

Las preguntas que nos tenemos que hacer ahora son:

  • ¿La web es vulnerable? ¿Ha sufrido alguna intrusión?
  • ¿Qué personas tienen acceso al FTP?
  • ¿La base de datos tiene acceso remoto? ¿Cómo?
  • ¿Qué usuarios han accedido en la base de datos en los últimos meses? ¿Y qué han hecho?
  • ¿El servidor tiene acceso remoto por SSH u otra aplicación?
  • ¿Qué usuarios han accedido al servidor en los últimos meses? ¿Y qué han hecho?

Estás preguntas las resolveremos en la segunda parte de este artículo.

Continuará…

 

 

 

 

 

4 Comments

  1. Pablo Espada 18 julio, 2018 Reply
    • Jorge Websec 18 julio, 2018 Reply
  2. ice 18 julio, 2018 Reply

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *