Instalando DDoS Deflate para evadir ataques DoS

Medialayer sufria ataques de denegación de servicio. Para atajar ese problema, uno de los chicos de Medialayer pensó en crear una solución Open Source para mitigar estos ataques. Ese día nació DDoS Deflate, un script en Bash bastante efectivo para mitigar ataques de denegación de servicio.

Instalando DDoS Deflate

DDoS Deflate requiere que APF 0.96 este instalado si queremos usar que las IP´s sean baneadas a traves de APF.
La instalación de APF va mas allá del objetivo de esta guia.

wget http://www.inetbase.com/scripts/ddos/install.sh
chmod 0700 install.sh
./install.sh

Configurando DDoS Deflate

Abrimos el fichero ddos.conf localizado en /usr/local/ddos

Editamos las rutas para que encajen con la estructura de nuestro sistema:

PROGDIR=”/usr/local/ddos”
PROG=”/usr/local/ddos/ddos.sh”
IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list”
CRON=”/etc/cron.d/ddos.cron”
APF=”/etc/apf/apf”
IPT=”/sbin/iptables”

Posteriormente, tendremos que adecuar las opciones restantes según la naturaleza de la situación en la que estemos inmersos:

FREQ=1
# Frecuencia en minutos en la que el script sera ejecutado

NO_OF_CONNECTIONS=150
# Número de conexiones para proceder a banear una supuesta IP atacante

APF_BAN=1
# 1 indica que DDoS Deflate usara APF para banear, 0 llama directamente a Iptables

* Es necesario APF 0.96 como minimo si queremos activar el baneo por APF

BAN_PERIOD=600

# Tiempo durante el cual el atacante estará baneado. En segundos

EMAIL_TO=”root”

# Dirección a la cual se enviara un correo cuando alguien sea baneado

KILL=1

# Con la opción en 0, los atacantes no seran baneados. 1 esta activo por defecto

Securizar el directorio /tmp a noexect

Buenas como todos sabeis hay un colectivo de gente que se dedica a explotar exploits de scripts estilo php-nuke pos bla bla que lo que hace es colarte en tu directorio /tmp del server un script muy chulo que o se te logea como root o te hace mil putadas bien la mejor manera de evitar esto es hacer que nada se pueda ejecutar desde ese directorio aparte de configurar bien tu firewall y tener una vigilancia constante como es lógico

Como ROOT haceis estos pasos:

cd /dev
dd if=/dev/zero of=tmpMnt bs=1024 count=100000
/sbin/mke2fs /dev/tmpMnt
(Contestad y a la pregunta que os hace)
cp -R /tmp/ /tmp_backup
mount -o loop,rw,nosuid,noexec /dev/tmpMnt /tmp
chmod 0777 /tmp
cp -R /tmp_backup/* /tmp/
rm -rf /tmp_backup

Ahora hay que modificar el /etc/fstab para hacer que el /dev/tmpMnt se monte al reiniciar el server. Es añadir esta linea:

/dev/tmpMnt /tmp ext2 loop,rw,nosuid,noexec 0 0
(OJO: los espacios de esta linea son tabuladores).

Reiniciad los servicios como por ejemplo postgresql , mysql, el clamantivirus, etc… para que se recreen bien los sockets y locks en el dir tmp si es ahi donde los creaban.

Para probarlo cread un shell en el /tmp e intentad ejecurtarlo. Ejemplo:
pegad esto dentro:

#!/bin/sh
echo prueba

lo guardais como en /tmp/test.sh y le haceis un chmod 0755 e intentad ejecutarlo desde dentro del /tmp, y os ha de dar esto:

[root@server tmp]# ./test.sh
bash: ./test.sh: bad interpreter: Permission denied

chapucillas que tb funciona y es bueno tenerlas.
Una formna rápida si no te quieres liar mucho con el asunto es anulando el acceso a wget linx y derivados, si no los usas y al compilador de C.

Para lo primero tienes una forma facil de hacerlo, cambiales el nombre wget ->wlee pr ejemplo y no lo encontrarán.

O chmod -ax cuando no lo utilizes con lo que anulas el acceso a ejecutar.

Es mas facil, mas rápido y menos dolores de cabeza que el poner tmp en noexec.

o bien:

Te creas un archivo de texto pones esto

chmod 000 /usr/bin/wget
chmod 000 /usr/bin/lynx
chmod 000 /usr/bin/*cc*
chmod 000 /usr/sbin/*cc*

Y luego le das permisos de ejecucion, nadie podra utilizar el wget ni el lynx ni compilar, puedes añadir todos los que quieras.

Despues creas el mismo (con otro nombre, por ejemplo abrir)

y le pones

chmod 755 /usr/bin/wget
chmod 755 /usr/bin/lynx
chmod 755 /usr/bin/*cc*
chmod 755 /usr/sbin/*cc

Tambien le das permisos de ejecucion, asi cuando quieras compilar o descargar algo solo tu podras dar esos permisos.
Espero que os guste amigos sysadmins

Borrar una linea en el fichero known_hosts

Si has reinstalado el sistema operativo en un servidor, o le has cambiado la ip, seguramente cuando vuelvas a intentar acceder a la máquina por ssh te impedirá el acceso y recibiras un mensaje como este:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
b1:3b:85:a5:b3:ab:37:a9:6d:3e:98:7a:d5:9d:78:15.
Please contact your system administrator.
Add correct host key in /home/ghosti/.ssh/known_hosts to get rid of this message.
Offending key in /home/ghosti/.ssh/known_hosts:240
RSA host key for 29.23.11.34 has changed and you have requested strict checking.
Host key verification failed.

La solución es eliminar la linea número 240 del fichero known_hosts, puedes hacerlo con un editor de texto, pero es mas cómodo teclear lo siguiente:

ssh-keygen -R hostname|ip

Si no has tocado nada, ten cuidado, puede que alguien este intentando acceder a tu servidor con técnicas man in the middle.

Crear un proxy Socks usando un tunel ssh

Si tienes una cuenta ssh en algún ordenador de internet la puedes utilizar como proxy para navegar desde ese ordenador remoto. En esencia un proxy es un ordenador que utilizas como puente para acceder a Internet a través de él. Esto puede ser útil para muchas situaciones. Por ejemplo:

  • Tienes que conectarte a una página a la que no puedes acceder desde tu red por estar «prohibida».
  • Quieres conectar a una página pero no quieres que sepan de entrada desde que ordenador estás consultando. Aclaración: siempre, repito, siempre se puede averiguar desde dónde se ha consultado una página, es una cuestión de tiempo y recursos (como los que tiene la policía)
  • Estas configurando un servidor de páginas web en tu red local y quieres comprobar si funciona desde Internet. Puedes llamar a un amigo para que se conecte o puedes hacerlo tú desde el proxy.

Basta con tener un cliente de ssh instalado y una cuenta en internet. En mi caso tengo una cuenta en el servidor de Hostmonster que permite acceso de ssh. Si no tienes ninguna cuenta y no quieres alquilarla hay muchos sitios en internet que te ofrecen cuentas shell gratuítas con servicios limitados.

Lo primero que haremos será usar el cliente de ssh para crear la conexión y abrir el proxy. En linux lo puedes hacer con el siguiente comando:

ssh -D 9999 usuario@direccion_servidor_ssh

Tras esto y una vez introducida la contraseña ya tendremos preparada la conexión y el puente SOCKS en el puerto 9999 de nuestro ordenador. Por supuesto se puede cambiar el número de puerto y los valores «usuario» y «direccion_servidor_ssh» correponderán con los de nuestra cuenta ssh.

La segunda parte es configurar el navegador web (o cualquier otro programa que queramos usar) para que use el puente SOCKS. En el ejemplo utilizaré el navegador Firefox. Vamos al menú «Editar->Preferencias» y en la ventana que se abre seleccionamos «Avanzado» y la pestaña «Red».

Preferencias firefox
Preferencias firefox

Una vez aquí pinchamos en «Configuración» y introducimos los datos como sigue cambiando el número de puerto 9999 si hemos seleccionado otro al crear el túnel.

Preferencias firefox
Preferencias firefox

Si hemos realizado los pasos correctamente nos conectamos a cualquier página para comprobar si funciona. Será algo más lenta que la navegación directa pero hay veces que no hay otra solución que utilizar este método.

Ejemplos de reglas para IPtables

Aqui os dejo unos ejemplos de configuración de reglas para IPtables, encontraréis más en la siguiente web:

http://danieldegraaf.afraid.org/info/iptables/examples

Accept-all policy (Aceptar todo)

#!/usr/bin/env iptables-restore
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*filter
:FORWARD ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Minima:

#!/usr/bin/env iptables-restore
*filter
:FORWARD DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT

Aceptar SSH para un solo host:

#!/usr/bin/env iptables-restore
*filter
:FORWARD DROP [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 1.8.9.7 -p tcp --dport 22 -j ACCEPT
COMMIT

Muchas más en el enlace mencionado anteriormente.

iptables example rulesets