martes, 11 de diciembre de 2012

Asegura tu RaspberryPi del ataque de los juankers!!

¡¡NO PUEDES PASAAAAR!!

Buenas noches, hace un par de días me dio por mirar algunos de los logs de mi RaspberryPi y vi lo siguiente:
Dec  9 08:22:36 raspberrypi ftpd[17083]: pam_unix(ftp:auth): authentication failure; logname= uid=0 euid=0 tty= ruser= rhost=219.143.103.190
Dec  9 08:22:39 raspberrypi ftpd[17083]: pam_ftp(ftp:auth): conversation failed
y en el apache:
88.252.139.68 - - [10/Nov/2012:11:52:00 +0100] "POST /cgi-bin/firmwarecfg HTTP/1.1" 400 527 "-" "veryprivateacsor"
78.175.195.203 - - [10/Nov/2012:11:52:30 +0100] "POST /cgi-bin/firmwarecfg HTTP/1.1" 400 527 "-" "veryprivateacsor"
son intentos de hackers, afortunadamente solo intentos. Para que esto no vuelva a pasar, a parte de limitar las conexiones a ssh y vpn, he instalado fail2ban, con un par de toques mágicos para el RaspberryPi, veámoslo.

Como ya he dicho, el 99% de los ataques vienen al exponer un host a internet, es decir, abrir al exterior algún puerto como el de FTP, Apache, Asterisk ... Lo mejor es dejar el menor número de puertos expuestos, yo los he limitado a SSH y VPN, dos de los más seguros, pero aún así tengo miles de intentos de  intrusión al puerto 22 (SSH). Para evitar esto, se usa (entre otras cosas) fail2ban, un servicio que corre como demonio, monitorizando los archivos de logs, en busca de ataques. Al detectar alguno, bloquea la IP atacante con iptables.
Para instalarlo, no puede ser más fácil:
apt-get update
apt-get install fail2ban
fááááácil. Hay varios millones de manuales y tutoriales de fail2ban, yo voy a lo fácil. Editamos el archivo: /etc/fail2ban/jail.conf y cambiamos las líneas:
[DEFAULT]
bantime  = 3600
maxretry = 3

[apache]
enabled  = true

[pure-ftpd]
enabled  = true
¡ojo! esas son las líneas modificadas, el resto del archivo déjalo tal cual. Como mu bien se suele decir ¡¡si no sabes no toques!! ¿PA QUÉ TOCAS?
Hasta aquí no hay misterio, así que vamos a darle una vuelta de tuerca más. En el archivo /etc/fail2ban/action.d/iptables-multiport.conf hacemos la siguiente modificación:
ver -> aqui
lo cambiamos por:
ver -> aqui
y por supuesto:
ver -> aqui
... efectivamente!! que nos envíe un whatsapp cuando haga un baneo y cuando lo desbanee

¿a que mola? Ahora puedes decir aquello de:
"No puedes pasar!!!! Soy siervo del Fuego Secreto, administrador de la llama de Anor!!! Tu fuego oscuro es en vano!!!! Llama de Udûn!!!! ¡Regresa a la Sombra! No puedes pasar!!!"

ACTUALIZACIÓN:
Al final no hice nada contra los ataques vía web ':( Para evitar cosas como:
78.187.122.116 - - [21/Nov/2012:11:27:47 +0100] "POST /cgi-bin/firmwarecfg HTTP/1.1" 400 527 "-" "veryprivateacsor"

en el archivo /etc/fail2ban/jail.conf :
[apache-badbots]

enabled = true
port    = http,https
filter  = apache-badbots
logpath = /var/log/apache*/*access.log
maxretry = 2

y en seguida llega un whatsapp:
de verdad es superfácil,  nos ahorrará más de un dolor de cabeza.

37 comentarios:

  1. Joder con el WhatsApp, el tuto iba guay hasta que he leído que te envía las notificaciones al 'Was' y como a mi no me funciona, ya me he muerto de envidia y ya no quiero hacerlo xD

    Cuenta con mi hacha...
    y con mi espada...
    y con mi arco...
    y... con mi raspi... no cuentes que no la funciona el whatsapp.

    Ahora en serio. Muy útil e interesante, no sabía que había tanta gente en internet intentando tramarla :_(

    ResponderEliminar
  2. Hola,

    A mí tampoco me funciona el Whatsapp, creo que han cambiado el método de generar la password. De todas formas en el archivo jail.conf le puedes configurar una dirección de correo para que esas notificaciones te las envíe por email.

    ResponderEliminar
  3. funcionado todo correctamente, gracias!!

    ResponderEliminar
  4. soy nuevo en eso como lo miro ??? estoy perdido gracias

    ResponderEliminar
    Respuestas
    1. como miras ... el qué? los logs? los tienes en /var/log/ cada servicio usa un archivo.log distinto y si no tiene, envia el log al archivo syslog.log que es el del sistema. Creo que te referías a eso ¿no?

      Eliminar
  5. o ya me funciono ise la prueba active el puerto 22 de mi router y desde un mac mi laptop ise la prueba con putty entre y todo a la consola despues volvi a entar a putty y meti datos malos y todo y cerre putty y quise volver a entar y ya no me dejo entrar XD

    ResponderEliminar
  6. quisiera saber como crear script pero para twitter ya que el whatsapp no me funciono

    ResponderEliminar
  7. A mi el Whatsapp me funciona perfectamente. Si quereis os pego mi "script", aunque es mas chapuzero que el de Juanmol va bien. AHI VA!

    Por un lado envia_whatsapp.sh:
    nano /usr/local/bin/envia_whatsapp.sh
    ----------------------------------------
    #!/bin/bash
    # programado por Juanmol para http://rsppi.blogspot.com
    echo se recibe: $@ >> /tmp/enviawhatsapp.log
    ruta=/usr/src/WhatsAPI-master/src/php/
    cat $ruta/testprotocol.php | sed "s/destino/$1/g" | sed "s/mensaje/$2/g" > $ruta/elphp.php
    estado=$(php $ruta/elphp.php | wc -l ) # ademas de enviarlo guarda el estado
    echo Mensaje se ha enviado: $@;
    rm $ruta/elphp.php
    -----------------------
    Por otro lado testprotocol.php
    nano /usr/src/WhatsAPI-master/src/php/testprotocol.php
    -------------------------
    Connect();
    $w->Login();
    $w->Message("34destino", "mensaje");
    sleep(2); //Este es el detallito chapuzero jeje
    ?>


    Con eso va de maravilla y no hace falta el encola_whatsapp.

    Si os funciona bien como a mi, dad un aplauso y a ver si me dan una papeleta extra para el sorteo por lo que me he enrollado! JAJAJAJA

    ResponderEliminar
  8. No se porque me ha cortado parte del php de testprotocol. a ver si ahora no lo corta!!!

    Para que no lo corte he quitado el la etiqueta de abrir php. Solo le faltaria eso a lo que pego ahora

    require "whatsprot.class.php";
    $options = getopt("d::", array("debug::"));
    $debug = (array_key_exists("debug", $options) || array_key_exists("d", $options)) ? true : false;
    $w = new WhatsProt("TUPHONEYOU", "TUIMEIDELPC", "John Doe", $debug);
    $w->Connect();
    $w->Login();
    $w->Message("34destino", "mensaje");
    sleep(2);// Aqui el detalle rastrero y chapuzero
    ?>

    ResponderEliminar
    Respuestas
    1. Disculpa la ignorancia estimado, estoy tratando de seguir tu tutorial.
      acabo de generar el enviar_whatsapp.sh
      y ahora veo lo del test_protocol..
      yo baje esto: https://github.com/venomous0x/WhatsAPI/archive/master.zip
      calculando de que de ahi sacas los archivos.
      El archivo test_protcol, coloco el tuyo en vez de ese que viene en el ZIP?
      yo no comprender. =D gracias

      Eliminar
  9. tengo una duda aparmetne todo me funciona pero yo vivo en guatemala y el codigo es 502 de los numero me pregunto si donde dice 34 va 502? o es obligatorio el 34 que es de españa? gracias

    ResponderEliminar
    Respuestas
    1. Evidentemente pon el codigo de tu zona. 34 es el numero de españa. A veces lo veras asi: (0034, +34) seguido de nueve digitos. Desconozco el codigo internacional de Guatemala, pero seguro que debes de cambiarlo.

      Si te ha ayudado mi script a que te vaya bien el Whatsapp me alegra mucho. Presiona a JuanMol que me de una papeleta extra en el sorteo por revivir un puperpoder a la gente que aun no podia usar el Guasap!

      Eliminar
  10. gracias pero no me funciono T-T
    e estado provando con twitter y si puedo enviar pero no logro que me los envie e echo pequeños script con el internet cree el script llamado aviso_torrent.sh
    #!/bin/bash
    twidge update "$1 bajado" //

    y despues recibo_torrent.sh
    #!/bin/bash
    /usr/local/bin/aviso_torrent.sh "$TR_TORRENT_NAME"

    lo ejecuto yo y funciona pero cuando lo asocio a transmission y termina una descarga no me envia nada ??? lo detengo modifico el archivos y despues lo reinicio no se si ise algo mal ???
    y tambien para el fail2ban
    cre uno llamado aviso_bloqueo.sh
    #!/bin/bash
    twidge update "$1"

    iptables -I fail2ban- 1 -s -j DROP
    /usr/local/bin/aviso_bloqueo.sh "se bloqueo la ip durante segundos por intentos al servicio "

    iptables -D fail2ban- -s -j DROP
    /usr/local/bin/aviso_bloqueo.sh "se desbanea la ip "

    funciona si yo escribo aviso_bloqueo.sh y envia el twitter con los datos erroneo porq no se llenan esos espacio pero no lo envia cuando lo asocio ayuda porfa o que estoy asiendo mal T-T





    ResponderEliminar
  11. El tema de twitter aun no me he puesto. Yo prefiero whatsapp.

    Dime que error te daba en el whatsapp. Si no me das mas datos de como lo usas me es dificil adivinar porque no te funciona.

    ResponderEliminar
  12. donde esta el codigo de encola_whatsapp.sh?

    ResponderEliminar
    Respuestas
    1. http://rsppi.blogspot.com.es/2012/11/demonio-para-el-envio-progresivo-de.html

      Eliminar
  13. hola juan mol, sabes otra forma de activar el whatsapp sin usar el bluestacks no me descarga el whatsapp, sebes alguna forma de hacerlo directo con el sdk de windows? ese si me funciona.

    gracias

    ResponderEliminar
  14. o el sdk de linux tengo linux en mi pc con whatsapp jalando desde el sdk !

    ResponderEliminar
    Respuestas
    1. busca por yowsup en los comentarios de http://rsppi.blogspot.com.es/2012/10/uso-de-whatsapp-para-el-envio-de.html

      Eliminar
    2. Estimados, hago todo tal cual, solo que el primer paso lo omiti haciendo:
      http://whitesoft.dyndns.org:2222/whatsapp_sms

      el segundo me devuelve el pass
      coloco tal cual en el config.example
      es decir password=XXXXXXXXXXXXXXXXXXXXXXXXXXX=

      en el tercero pongo el numero al cual quiero enviar el sms,
      y luego me dice :

      "Connecting to c.whatsapp.net"
      "Auth Fail"
      "Auth Failed"

      Que puede ser? Gracias
      Tolosafacundo@hotmail.com

      Eliminar
    3. tal y como ponía en el post de whatsapp, la gente de whatsapp cambia continuamente el tipo de conexión para que no funcionen las apis de terceros. Es probable que lo estés haciendo bien, pero tu cuenta de whatsapp necesita otra tipo de autenticación. Yo te recomiendo usar GTALK para estos menesteres.

      Eliminar
  15. Hola Juan, estoy tratando de configurar fail2ban para que me notifque por gtalk. Sendxmpp funciona desde la linea de comando pero cuando quiero definir la notificación en iptables-multiport.conf no tengo suerte. Esto es lo que he puesto:

    actionstart = iptables -N fail2ban-
    iptables -A fail2ban- -j RETURN
    iptables -I -p -m multiport --dports -j fail2ban-
    echo "Fail2ban activo" | /usr/bin/sendxmpp -t miusuario@gmail.com

    Sabes cuál es mi error? gracias!

    ResponderEliminar
    Respuestas
    1. creo que esta en que lo as puesto en la definicion de actionstart, que no se si funcionaría ahí. Si te fijas, yo lo he puesto en actionban, mira a ver si es eso.

      Eliminar
  16. Muy buenas, solo decirte que se agradecen post de este tipo para sacar más partido a la raspi. Quería comentarte que tengo un problema a la hora de notificar el baneo de ips. La ip la banea correctamente, pero no consigo que mande la notificación por Gtalk. En el log (/var/log/fail2ban.log) me dice esto:

    2013-05-06 22:10:07,410 fail2ban.actions: WARNING [ssh] Ban 192.168.1.13
    2013-05-06 22:10:11,055 fail2ban.actions.action: ERROR iptables -I fail2ban-ssh 1 -s 192.168.1.13 -j DROP
    /usr/local/bin/aviso_gtalk.sh "se banea la ip 192.168.1.13 durante 1367871007.41 segundos por 3 intentos al servicio ssh" returned 100

    Si ejecuto la linea del script me manda correctamente el mensaje.

    Gracias

    ResponderEliminar
    Respuestas
    1. tengo el mismo problema. No encuentro la solución en otros posts. Alguien lo ha solucionado?

      Eliminar
  17. Hola, muchas gracias por el manual, solo una pregunta, el mensaje que se muestra del estilo "se banea la ip 192.168.1.13 durante 1367871007.41 segundos por 3 intentos al servicio ssh" , no se puede hacer algo para que el 1367871007.41 sea la hora en la que dejara de estar ban.
    Gracias

    ResponderEliminar
    Respuestas
    1. no sabria decirte ahora mismo, podrias sumar ese dato a la hora unix actual y despues convertir de unix a normal.

      Eliminar
    2. Hola, ya lo he encontrado
      /usr/local/bin/aviso_fail2ban.sh "`date -d @` : Se banea la ip por intentos al servicio

      Lo que se muestra es la fecha en la que se banea la ip, quedando el mensaje como el siguiente
      Fri May 31 16:08:31 CEST 2013 : Se banea la ip xxx.yyy.zzz.www por 6 intentos al servicio ssh.
      Esto lo he puesto que lo envíe por Google Talk y funciona correctamente.
      Muchas gracias

      Eliminar
  18. Juanmol, tienes hecho en el router el desvio de puertos a la raspberry para filtrar desde ahí? Deduzco que solo tienes entonces un firewalll, iptables, no?

    Nos vemos en el curro

    ResponderEliminar
    Respuestas
    1. en el curro? quién eres?
      Hago nat desde el ruter y el iptables con el baneo lo hago en el raspberry, lo ideal seria poder mandarle esa orden al ruter, pero mi ruter no lo permite. Acepto donaciones para comprarme un ruter adsl 2+ que permita instalarle OpenWRT con todas sus funciones.

      Eliminar
  19. Estupendo articulo, felicidades.
    Al final lo he hecho funcionar con los "whatsapp" y todo. Pero me he sudado lo mio, os explico por si os es de ayuda.

    Los PCs de casa están con Archlinux, y la Raspberry no podía ser menos y tiene el ArchlinuxARM
    Al instalar el "fail2ban" me he vuelto loco al ver que no hacia caso a los "ban" del SSH, con todo correcto y estupendamente bien configurado.
    El problema: el programa era incapaz de detectar la entradas del ssh ya que este no genera fichero de log en /var/log, sino entradas en journald.
    La solución: Instalar el "fail2ban" desde "git" que es la versión preparada para el journald del Systemd.
    Lo que hace el "fail2ban" es buscar los patrones en los logs del sshd, pero Arch se actualizo a Systemd y esta nueva versión de "fail2ban" busca las entrada en el journald.


    ResponderEliminar
  20. Hola juanmol

    He podido poner el fail2ban sin problemas pero queria hacer que en lugar de enviar un whatsapp enviara por gtalk pero no funciona. Así es como lo tengo

    /home/pi/Scripts/send.sh:
    #!/bin/bash
    echo "prueba" | centerim -s msg -p jab -t DESTINO@gmail.com

    y ese fichero es llamado desde fail2ban así:
    actionban = iptables -I fail2ban- 1 -s -j DROP /home/pi/Scripts/send.sh

    Gracias de antemano


    Un saludo




    ResponderEliminar
    Respuestas
    1. te funciona si lo ejecutas a mano?

      Eliminar
    2. Si, el log no dice nada de error ni nada

      Eliminar
    3. pruebaaa ... umm prueba prueba ... vamos a probar con sudo, cambia el script:
      sudo echo "prueba" | centerim -s msg -p jab -t DESTINO@gmail.com

      Eliminar
    4. ahora me da error return 200 en el fail2ban.log

      Menudo lio..... :(

      Eliminar