Title: Evitar httpflood sin tener acceso a herramientas administrativas
1.-
¿Que es httflood?Httpflood es un tipo de ataque de denegación de servicio que se basa en el envio de peticiones http al servidor objetivo.
2.-
¿Que necesitamos?-Acceso a los logs del apache
-Poder modificar archivos del servidor
-Que el servidor tenga soporte a php y .htaccess
-Que el servidor tenga mod_rewrite
3.-
IntroducciónA veces nuestras webs son atacadas por personajillos que intentan tirarla con una tool hecha por terceros, como por ejemplo con el programa doshttp. Normalmente atacan a archivos .php de el servidor, y entonces el php es compilado una y tra vez. En esos casos el uso de la cpu puede llegar al 100%; es hay cuando los trabajadores del hosting nos cierran la cuenta por sobrepasar el uso de cpu que pone en sus terminos y condiciones de uso.
En este manual conseguiremos parar al atacante

4.-
Detectando el ataqueTenemos que tener acceso a los logs de apache. Veremos que si un ataque a sido bastante potente pueden llegar a pesar gb's, pero normalmente eso no suele ser asi ya que el hosting nos cierra la cuenta antes :p
4.0.1-
Leiendo logs de apacheNormalmente los logs de apache tienen el siguiente formato:
[ip] [hora] [peticion] [respuesta] [user-agent]
Un ejemplo:
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 403 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
En ese caso 1.2.3.4 la ip 06/Dec/20... la fecha GET /index..... La peticion, 403 la respuesta (forbidden), mozilla... el navegador
Los codigos basicos de respuesta son:
404 - no encontrado
403 - Prohibido
200 - OK
Cuando los logs pesan alrededor de 300 mb o mas esta bien utilizar esta utilidaz para que separe los logs en diferentes archivos de menos tamaño:
http://vzack.com/descargar.php?dir=/Programas%20utiles/&archivo=hjsplit.exeNota: Si no teneis logs de apache podeis usar el script que crea logs adjuntado al final de este mismo post.
5.-
Tipos de ataques:5.1-
Unico atacante con la misma ip y un user agent "normal"Ejemplo de log de apache:
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:41 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
1.2.3.4 - - [06/Dec/2007:00:29:42 -0800] "GET /index.php HTTP/1.1" 200 590 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; WinuE v6; WinuE v6)"
Como vemos en ese ejemplo es un atacante de la ip 1.2.3.4 que hace 6 peticiones por segundo, eso no es mucho pero puede llegar a colapsar la mysql.
Estas ips las podemos evitar manualmente escribiendo en el .htaccess del dir en el que se encuentra el archivo este código:
Order allow,deny
DENY FROM 1.2.3.4
Ese codigo lo que hace es denegar el acceso a 1.2.3.4 y la proxima vez que haga una peticion le saldra error 403
Nota: Tambien podemos usar el antidos que se encuentra al final de este mismo manual
5.2-
Diferentes ips con el mismo user-agentSi los bots tienen un user-agent en comun, podemos banearlo desde el .htaccess.
Log de Ejemplo:
189.192.49.142 - - [04/Dec/2007:17:36:53 -0800] "GET / HTTP/1.1" 200 11962 "-" "vb-wininet"
201.255.158.89 - - [04/Dec/2007:17:36:53 -0800] "GET / HTTP/1.1" 200 11948 "-" "vb-wininet"
200.92.54.238 - - [04/Dec/2007:17:36:54 -0800] "GET / HTTP/1.1" 200 633 "-" "vb-wininet"
200.92.124.84 - - [04/Dec/2007:17:36:57 -0800] "GET / HTTP/1.1" 200 633 "-" "vb-wininet"
200.77.3.129 - - [04/Dec/2007:17:36:57 -0800] "GET / HTTP/1.1" 200 11955 "-" "vb-wininet"
200.92.124.84 - - [04/Dec/2007:17:36:58 -0800] "GET / HTTP/1.1" 200 632 "-" "vb-wininet"
200.92.124.84 - - [04/Dec/2007:17:36:59 -0800] "GET / HTTP/1.1" 200 632 "-" "vb-wininet"
200.92.124.84 - - [04/Dec/2007:17:37:03 -0800] "GET / HTTP/1.1" 200 633 "-" "vb-wininet"
200.92.54.238 - - [04/Dec/2007:17:37:04 -0800] "GET / HTTP/1.1" 200 633 "-" "vb-wininet"
200.92.124.84 - - [04/Dec/2007:17:37:04 -0800] "GET / HTTP/1.1" 200 632 "-" "vb-wininet"
Para esto necesitamos tener el modulo mod_rewrite de apache. Para bannear ese user agent pondriamos este codigo en el .htaccess:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} vb-wininet
RewriteRule .* - [F,L]
5.3-
Distintas ips con distintos user-agent "normales"En estos casos no se puede bannear al user-agent ya que nuestros visitantes habituales tambien usaran ese mismo user-agent y se les bloqueara el acceso.
En estos casos lo mejor es usar el anti-dos adjuntado abajo, y si eso no resuelve el problema comprar un servidor dedicado e instalarle un buen firewall.
6.-
Fin del manual y referenciasCon estas simples tecnicas podremos detener httpflood causados por noobs pero nunca un httpflood potente con una botnet/gusano de mas de 30 bots.
Y eso es todo

.
Todos los logs han sido extraidos de los logs de ataques a vZack.
Script para crear logs usando php:
modificar la config y hacerle un include
<?php
error_reporting(0);
//config
$logsdir = '/home/hondamena/public_html/logs/';
//fin de config
$ua = $_SERVER['HTTP_USER_AGENT'];
$ip = getenv('REMOTE_ADDR');
$uri = $_SERVER['REQUEST_URI'];
$fecha = date("Ymd");
$hora = date("H:i:s");
$current = realpath('./');
chdir($logsdir);
if(!is_file('.htaccess')) file_put_contents('.htaccess', 'DENY FROM ALL');
$filenamelog = $fecha.'.dat';
file_put_contents($filenamelog, "$ip - $hora - $uri - $ua");
chdir($current);
?>
Script que deniega acceso a bots con php usando cookies:
<?php
$nombrecookie = 'botid';
$logdir = '/home/xxx/public_html/logz/'; //con la / final
$tupaag = 'http://vzack.com';
//fin config
$ip = getenv('REMOTE_ADDR');
setcookie($nombrecookie, '1');
if(!$_COOKIE[$nombrecookie]){
header('location: '.$tupag);
exit;
}
?>