Redireccionando tráfico HTTP a partir de la cabecera User-Agent
Pro Tip: Cuando te enfrentes con un gran volumen de peticiones a un sitio web, recuerda las sabias palabras de Bruce Lee “Sé como el agua, mi amigo”
Hoy mi querido lector, hablaremos de un caso 100% real no fake, sobre un ataque a uno de nuestros sitios web.
Todo comenzó con el reporte de nuestro cliente sobre su sitio, indicándonos que no era posible acceder a él y era mostrado un mensaje como este:
Bandwidth Limit Exceeded
The server is temporarily unable to service your request due to the site owner reaching his/her bandwidth limit. Please try again later.
Este mensaje es mostrado por nuestros servidores cuando un sitio web llega al límite de la cantidad de Gigabytes de transferencia mensual contratada. (La transferencia, es el tráfico que cursa entre tu servidor y todo actor que se comunica con él, normalmente se mide únicamente la que tiene dirección saliente, es decir, desde tu servidor a los actores que visitan tu sitio o descargan archivos, por ejemplo).
A partir del reporte, iniciamos la verificación del tráfico del sitio web y encontramos algo como esto:
Muestra del tráfico malicioso usando bots
66.249.65.120 - - [23/Jan/2023:07:10:02 -0500] "GET /?0694lobc28030csi187359.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:11:22 -0500] "GET /?9453wyca61460akg1320522.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:11:22 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
114.119.142.37 - - [23/Jan/2023:07:11:54 -0500] "GET /?8655nqcp42237pkk88280.html HTTP/1.1" 500 7309 "https://mysamplesite.com/?8655nqcp40361pkk211402.html" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)"
66.249.65.120 - - [23/Jan/2023:07:12:41 -0500] "GET /?3598dhdz10101zsq1935112.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:13:33 -0500] "GET /?5116oavv41120vcm970162.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.122 - - [23/Jan/2023:07:13:33 -0500] "GET /?7537fatm18056mgo189475.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:14:01 -0500] "GET /?9928nbbl-23612leq-1793-634.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.122 - - [23/Jan/2023:07:15:20 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:15:20 -0500] "GET /?8425etst44656tek508701.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:16:40 -0500] "GET /?2288eqbi3960iqq1791964.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
114.119.138.65 - - [23/Jan/2023:07:17:41 -0500] "GET /?8655nqcp42236pkk87279.html HTTP/1.1" 500 7309 "https://mysamplesite.com/?8655nqcp39690pkk1539730.html" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)"
66.249.65.120 - - [23/Jan/2023:07:17:59 -0500] "GET /?2288eqbi3799iqq1630803.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:19:19 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:19:19 -0500] "GET /?8270bwnl15589loa1426605.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:19:33 -0500] "GET /?8270bwnl13152loa988166.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:19:34 -0500] "GET /?7537fatm5165mgo997171.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.122 - - [23/Jan/2023:07:20:38 -0500] "GET /?8270bwnl14918loa755933.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:21:58 -0500] "GET /?0898iiiy-31607ysq-1792-637.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.122 - - [23/Jan/2023:07:22:33 -0500] "GET /?8041kjhl-24025lic-207-48.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:22:33 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
114.119.158.196 - - [23/Jan/2023:07:23:00 -0500] "GET /?8655nqcp42202pkk53245.html HTTP/1.1" 500 7309 "https://mysamplesite.com/?8655nqcp39522pkk1371562.html" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)"
66.249.65.120 - - [23/Jan/2023:07:23:17 -0500] "GET /?9166yewp-6999pmm-1172-5.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:24:37 -0500] "GET /?9453wyca28952akg796981.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
114.119.138.127 - - [23/Jan/2023:07:24:38 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible;PetalBot;+https://webmaster.petalsearch.com/site/petalbot)"
66.249.65.120 - - [23/Jan/2023:07:25:33 -0500] "GET /?2288eqbi27556iqq1399584.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.122 - - [23/Jan/2023:07:25:33 -0500] "GET /?8731mhos8493sgc327502.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:25:56 -0500] "GET /robots.txt HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:25:56 -0500] "GET /?9453wyca28420akg264449.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.118 - - [23/Jan/2023:07:27:16 -0500] "GET /?8917ijnl21806lco1646828.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.120 - - [23/Jan/2023:07:28:35 -0500] "GET /?8316ktkj7656jcm1489664.html HTTP/1.1" 500 7309 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
114.119.159.197 - - [23/Jan/2023:07:28:40 -0500] "GET /?8655nqcp42195pkk46238.html HTTP/1.1" 500 7309 "https://mysamplesite.com/?8655nqcp37974pkk182213.html" "Mozilla/5.0 (Linux; Android 7.0;) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; PetalBot;+https://webmaster.petalsearch.com/site/petalbot)"
Gracioso verdad?, pero no gracioso divertido, gracioso raro. Ahora imagina esta muestra multiplicada por 100.000. Ahora si tenemos un problema.
En este punto tenemos varias opciones para resolver este evento:
Usar el firewall?
Por ejemplo podemos generar un listado de IPs de origen y agregar ciertos rangos a nuestro firewall, (estás usando un firewall en tu servidor verdad?) , pero esto es ineficiente y no ataca la raíz del problema ya que están usando los bots de Google como origen de las peticiones.
Si decides tomar esta opción terminarías por aislar tu servidor de un rango importante de IPs, siendo una solución que afectaría de forma general el tráfico a tus sitios alojados.
Pro Tip: Recuerda que primero se acaban tus ganas de luchar que los rangos de IPs.
En conclusión, esta sería una muy mala idea.
Deshabilitar el script que está recibiendo las peticiones
Es importante que revises el contenido del script que está recibiendo tanta atención por parte de nuestros autómatas virtuales. Es muy probable que contenga una sorpresa desagradable.
Si lo revisaste y no notas contenido extraño, deshabilitarlo o impedir el acceso a él tampoco resuelve el problema, al dueño o administrador del sitio tampoco le va a agradar ver su página suspendida o que no responda a las visitas.
Nuevamente, esta no sería una opción viable.
Usar el archivo robots.txt
Esta es la opción pasivo agresiva al mejor estilo “por favor no me golpees” del Internet. No la recomiendo, los bots pueden llegar a ignorar tus suplicas y no respetar esta configuración.
Utilizar reglas de redirección en el servidor web
Esta opción es la que más me gusta. Es personal, cercana y hasta divertida y será la que exploraremos a continuación.
Usar reglas de redirección (o sobreescritura de rutas) consiste en, a partir del análisis de las peticiones, detectar algún tipo de patrón particular en ellas y crear las reglas correspondientes para bloquear o redireccionar (esta es la alternativa que más me gusta) el tráfico. De esta forma se reduce la cantidad de información que se entrega durante la respuesta a la petición, se reduce el consumo de transferencia y podemos enviar al atacante al lugar que nuestra imaginación sugiera, el cielo es el límite.
Los pasos para implementar estas reglas serán los siguientes:
- Análisis de la información de las peticiones de muestra.
- Revisar la URL o archivo que recibe las peticiones.
- Diseñar las reglas a partir del tipo de servidor web usado.
- Implementarlas en la configuración del sitio web o servidor.
- Hacer seguimiento al tráfico.
- Sonreír, caminar, mantenerse hidratado y dormir bien.
Iniciemos!
Análisis de la información de las peticiones de muestra.
El registro de muestra que viste en una sección previa, pertenece a Apache httpd y corresponde al Log de acceso para un sitio web en formato Combinado o CLF (Combined Log Format), este contiene los siguientes campos:
- IP de origen: La IP desde donde nos visitan.
66.249.65.120
- Fecha y Hora: Este campo indica… es correcto, la fecha y hora de la petición o evento.
[23/Jan/2023:07:10:02 -0500]
- Tipo de petición y recurso solicitado: Este campo contiene el tipo de petición (GET, POST, PUT, PATCH, DELETE), la dirección del recurso o archivo que es solicitado y también puede incluír la versión de HTTP usada.
"GET /?0694lobc28030csi187359.html HTTP/1.1"
- Código HTTP de respuesta: El código de respuesta del servidor, normalmente es 200 si es exitosa, 500 si hay un error, etc. Si no los recuerdas aquí hay un video creado por Winkhosting.co para recordarlos (y si creciste viendo a Los Simpsons seguro te va a gustar).
- Tamaño de bytes de la respuesta del servidor: Muy importante, a mayor tamaño mayor consumo de transferencia en tu servicio contratado.
- El “User-Agent”: Este campo también será de interés para nosotros e informa al servidor el tipo de dispositivo, sistema operativo, aplicación, etc. que hace la petición. Recuerda que este campo puede ser manipulado por un atacante (spoofing), pero para efectos de este evento confirmamos que las IPs de origen de nuestras peticiones efectivamente pertenecen a los bots indicados por este campo en el log.
"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
A partir de la información en estos campos analizaremos el tipo de regla y qué parte de la petición podemos usar para filtrar, bloquear o redireccionar el tráfico.
En este evento usaremos la cabecera “User-Agent” simplemente porque es más fácil y tengo pereza, pero aún más porque será suficiente para resolver el comportamiento de forma temporal hasta que el tráfico se normalice, ten presente que si redireccionas o bloqueas tráfico de bots, puedes afectar los resultados de búsqueda e incluso las visitas de usuarios que usan un motor de búsqueda para ser redirigidos a una página.
Revisar la URL o archivo que recibe las peticiones
Para este caso en particular, revisamos el archivo index.php que estaba recibiendo las peticiones, pero no te voy a decir lo que encontramos porque puede ser un tema para otra publicación.
Vamos a asumir que no encontramos cosas que aún me persiguen en mis sueños y seguiremos adelante.
Pro tip: Es mucho muy pero muy importante que revises siempre los archivos o URLs que reciben las peticiones sospechosas, siempre!.
Diseñar las reglas a partir del tipo de servidor web usado
Muy bien, llegamos a la parte más compleja, diseñaremos las reglas de redirección del tráfico para tres servidores populares, Apache HTTP Server “el viejo confiable”, nginx “el hermano del medio” y el joven que viene tomando fuerza y le agrada a todas las chicas… caddy. (Te preguntas por qué no hablo de Tomcat?, bueno Java no es mi fuerte, tampoco le deseo un mal particular, pero no lo incluiremos)
Las reglas se definirán de forma general a partir de estos pasos:
- Detectar la cabecera “User-Agent” de la petición
- Buscar en la cabecera palabras clave para determinar si se toman acciones.
- Tomar las acciones a partir de la detección de un “User-Agent” de interés.
Apache HTTP Server
Apache es relativamente fácil de configurar para estos casos, sólo es necesario contar con el módulo mod_rewrite activado y acceso al archivo .htaccess para el sitio web atacado.
Para nosotros, los bots a redireccionar serán los encontrados en la muestra de tráfico:
- Googlebot
- PetalBot
Y nuestra configuración quedará de la siguiente forma:
Archivo .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (googlebot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (petalbot) [NC]
RewriteRule .* "http://0.0.0.0/" [R=301,L]
</IfModule>
Agrega estas líneas al inicio del archivo .htaccess en el directorio donde se encuentra el recurso o archivo solicitado en las peticiones. Si no existe un archivo .htaccess puedes crearlo.
Nuestra regla tiene una línea para activar el módulo de sobreescritura de rutas, y tantas líneas “RewriteCond” como sean necesarias para detectar el nombre de los bots a redireccionar a partir del “User-Agent” capturándolo a partir del header “%{HTTP_USER_AGENT}”. (Demasiados términos complicados en un solo párrafo, vas a terminar creyendo que soy todo un profesional)
La sentencia “RewriteCond” es usada para definir la condición a partir de la cual se aplicara una “RewriteRule”, es decir que si se cumple una de las condiciones se ejecuta la redirección. “[NC” indica que la búsqueda del término o texto no es sensible a mayúsculas/minúsculas y “,OR]” indica “ó” lógica para encadenar otras reglas que también quiere evaluarse, es decir que por lo menos se cumpla una de ellas.
Una regla final “RewriteRule” define la acción a tomar, y la acción que tomaremos es redireccionar permanentemente “[R=301”, detener la ejecución de reglas posteriores “,L]”, desde cualquier origen “.*”, a una dirección que me gusta mucho y es “http://0.0.0.0/", esta en términos de red significa no enrutable, desconocida, intangible, etérea, efímera, nebulosa, indefinida. Espero que entiendas el concepto.
Este cambio en el archivo es inmediato, así que puedes verificar el log de visitas nuevamente y notarás que las peticiones cambiaron a algo como esto:
66.249.65.54 - - [26/Jan/2023:07:12:19 -0500] "GET /?3529sryf20359fes199380.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.58 - - [26/Jan/2023:07:15:12 -0500] "GET /?9166yewp17868pmm1706886.html HTTP/1.1" 301 252 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:15:58 -0500] "GET /?5408qvgw19728waq1567748.html HTTP/1.1" 301 252 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.58 - - [26/Jan/2023:07:19:14 -0500] "GET /?7758aoex11194xkq1029206.html HTTP/1.1" 301 252 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:21:17 -0500] "GET /?7537fatm6174mgo7181.html HTTP/1.1" 301 248 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.58 - - [26/Jan/2023:07:24:59 -0500] "GET /?4338szji18409igq248428.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.58 - - [26/Jan/2023:07:26:09 -0500] "GET /?8425etst23249tek1090273.html HTTP/1.1" 301 252 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:28:15 -0500] "GET /?5408qvgw16062waq189979.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.54 - - [26/Jan/2023:07:28:33 -0500] "GET /?7537fatm21027mgo86749.html HTTP/1.1" 301 250 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.58 - - [26/Jan/2023:07:33:05 -0500] "GET /?3529sryf4892fes724897.html HTTP/1.1" 301 250 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:46:55 -0500] "GET /?7537fatm16622mgo460639.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.54 - - [26/Jan/2023:07:48:56 -0500] "GET /?1079ssfb2579bos410582.html HTTP/1.1" 301 250 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:53:51 -0500] "GET /?7537fatm10862mgo697873.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.65.56 - - [26/Jan/2023:07:54:07 -0500] "GET /?5116oavv14746vcm583761.html HTTP/1.1" 301 251 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Notarás que ahora el código de respuesta es 301 y el tamaño en bytes de la respuesta es mucho menor. Esto reducirá efectivamente el uso de transferencia y una vez el atacante lo note, el comportamiento dejará de presentarse (no es rentable para él continuar desperdiciando tráfico y recursos de esa forma, al menos si es un atacante inteligente.)
Mantén activas estas reglas tanto tiempo como sea posible, si cambian el tipo de bot, ajústalas de la forma correspondiente y a descansar.
Nginx
Nginx es una bestia diferente, para aplicar las reglas iremos a nuestro archivo nginx.conf (en la ruta en la que lo tengas guardado en tu servidor), y agregaros las siguientes líneas al bloque server asociado al dominio/subdominio del sitio web atacado:
if ($http_user_agent ~* 'googlebot|petalbot') {
return 301 http://0.0.0.0;
}
Nginx es un poco más elegante en la definición de la regla. Al usar “~*” buscará las coincidencias de las cadenas de texto con los nombres de los bots dentro de $http_user_agent sin sensibilidad a mayúsculas/minúsculas y, si hay coincidencias, realizará la redirección permanente 301 a http://0.0.0.0
A continuación una configuración básica completa de Nginx para que puedas tener la referencia del lugar donde debes agregar las líneas con la redirección, debes agregarlas en el bloque server del dominio afectado, justo bajo server_name:
events {
worker_connections 4096; ## Default: 1024
}
http {
index index.html;
server {
server_name mysamplesite.com;
if ($http_user_agent ~* 'googlebot|petalbot') {
return 301 http://0.0.0.0;
}
location / {
root /var/www/mysamplesite.com/htdocs;
}
}
server {
listen 80 default_server;
server_name _; # This is just an invalid value which will never trigger on a real hostname.
server_name_in_redirect off;
location / {
root /var/www/default/htdocs;
}
}
}
Y eso es todo. Fácil verdad?
Caddy
Caddy Server (cómo me gusta este servidor HTTP). Vamos a ver la implementación en este muchacho de mejillas rosadas.
Para configurar nuestras reglas vamos a usar el archivo Caddyfile, generalmente estará en Linux en /etc/caddy/Caddyfile ó puedes consultar la ruta en tu archivo de configuración .json de Caddy, para conocer la ruta del archivo de configuración puedes ejecutar en consola el comando a continuación:
>caddy environ
Vamos a editar el archivo Caddyfile. En una instalación por defecto se verá algo similar a esto:
The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
log {
output file /var/log/access.log
}
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
Caddy usa request matchers para permitir buscar contenido en la información enviada al servidor, y usaremos “header_regexp” en esta ocasión así:
@redirected header_regexp User-Agent (?i)(googlebot|petalbot)
handle @redirected {
redir http://0.0.0.0 permanent
}
Lo que le estamos indicando al servidor es que guarde el resultado de la búsqueda del regex “(?i)(googlebot|petalbot)” en el named matcher con nombre “redirected” y luego creamos un handle para este matcher.
El handle ejecuta la redirección “redir” permantente (código 301) si se encuentran las palabras en el “User-Agent” recibido.
Ahora vamos a agregar estas líneas a nuestro archivo, quedaría de la siguiente forma:
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
@redirected header_regexp User-Agent (?i)(googlebot|petalbot)
handle @redirected {
redir http://0.0.0.0 permanent
}
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
log {
output file /var/log/access.log
}
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
Agrega el texto justo bajo la línea que determina el path de archivos para tu sitio web y no olvides reiniciar caddy.
Y estamos listos, ya puedes aplicar este tipo de reglas en tus servidores.
Pruebas
Para realizar algunas pruebas puedes usar nuestro viejo y confiable curl así:
> curl http://localhost:8080 -H "User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.101 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Recuerda que debes cambiar localhost:8080 por la dirección de tu servidor y el header por aquél que estés intentando redireccionar.
En el caso de Nginx y Apache recibirás una respuesta del servidor indicando que fuiste redireccionado, caddy hará su trabajo de forma silenciosa y no te dirá nada, tendrías que consultar el log de peticiones.
Y eso es todo, espero que te sirva esta información y no olvides visitarnos en Winkhosting.co, somos mucho más que Hosting.