Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Crear un bastion en tu casa

Ee52a2d59741190e1263b0017ea987bd?s=47 HackMadrid27
April 04, 2020
660

Crear un bastion en tu casa

Cómo bastionar tu casa u oficina y proteger tu privacidad por poco dinero con una raspberry pi. Construiremos nuestro propio servidor “openvpn” para poder conectarnos a nuestros dispositivos de manera remota con seguridad, construiremos nuestro propio fw mediante scripts con bash e iptables. Crearemos nuestra propia red local asignando ips por dhcp y crearemos nuestro propio punto de acceso wifi aprovechando el interfaz wlan. Instalaremos maltrail para detectar ataques, intrusiones, fuga de información y malware en nuestra red, programaremos nuestro propio sistema de respuesta ante incidencias, y configuraremos ntop-ng para poder analizar el tráfico de nuestros dispositivos en nuestra red.

Bueno, esto da no para una sesión sino para más. Esta primera parte hará hincapié en cómo montar la rpi, el fw, la wifi y el servidor vpn, y luego viene más …..

Ee52a2d59741190e1263b0017ea987bd?s=128

HackMadrid27

April 04, 2020
Tweet

Transcript

  1. # Alicante, 26 de octubre de 2019 @JLNavarroAdam jlnavarro@girsanet.com

  2. # whoami José Luis Navarro Adam Técnico Superior de Seguridad

    Informática Perito Judicial de Seguridad Informática Director de Proyectos e I+D GirsaNet ( https://girsanet.com ) # cat /home/jlnavarro/.profile "Constructor de Murallas". Apasionado de la seguridad informática y la privacidad en Internet. Creador del firewall CDC-data. Email: jlnavarro@girsanet.com Twitter: @JLNavarroAdam @JLNavarroAdam jlnavarro@girsanet.com
  3. # ./charla.sh Cómo crear nuestro propio sensor de Malware IDS

    y analizador de tráfico en red sobre una RasberryPI y ofrecer seguridad y privacidad tanto en el hogar como en entornos industriales (IoT) Objetivo: Detectar las alertas de malware y bloquear automáticamente los destinos hacia Ips maliciosas y rechazar las peticiones entrantes en el firewall HW: Rasberry Pi b 3+ SW: Raspbian + Maltrail + NTOPNG + iptables + iproute2 + Postfix + un poco de imaginación (autoreject.php) - Sí, pone PHP ;) - @JLNavarroAdam jlnavarro@girsanet.com
  4. ¿Nos podemos fiar de las nuevas tecnologías que inundan el

    mercado sin haber sido probadas o diseñadas desde la seguridad por defecto? @JLNavarroAdam jlnavarro@girsanet.com
  5. ¿Inteligencia Artificial? ¿En un Smart TV? @JLNavarroAdam jlnavarro@girsanet.com

  6. Nos recuerda un poco a “esto”… @JLNavarroAdam jlnavarro@girsanet.com

  7. Nadie está a salvo de vulnerabilidades 0-day @JLNavarroAdam jlnavarro@girsanet.com

  8. IP: 192.168.10.1/24 DHCP:192.168.10.101-199 IP AUTOMÁTICA (ASIGNADA POR EL ROUTER) ROUTER

    ¡Bienvenido a la república independiente de mi casa! (y en mi casa decido yo) @JLNavarroAdam jlnavarro@girsanet.com
  9. Descargar RASPBIAN: http://downloads.raspberrypi.org/ Tostar la tarjeta SD (con cualquier programa

    que escriba imágenes de archivo a SD. Yo he usado Etcher) @JLNavarroAdam jlnavarro@girsanet.com
  10. Insertar SD, conectar y arrancar... Login por defecto: Usuario: pi

    Contraseña: raspberry @JLNavarroAdam jlnavarro@girsanet.com
  11. Accedemos como root: Cambio de contraseñas de root (creamos una

    contraseña, la que queramos) # sudo passwd root Y a continuación logueamos como root ejecutando: # su E introduciendo la contraseña de root creada anteriormente Ahora instalamos los paquetes necesarios maltrail y ntop-ng: La instalación paso a paso la tenemos aquí (VOL1): https://sistemasit.girsanet.com/wp-content/uploads/sliders/Hackandbeers-Cuenca-2019.pdf @JLNavarroAdam jlnavarro@girsanet.com
  12. ¿¿ LO VEMOS EN ACCIÓN ??? Para conectar a maltrail:

    https://192.168.10.1:8338 Usuario: admin Contraseña: changeme! Para conectar a ntopng: http://192.168.10.1:3000 Usuario: admin Contraseña: admin @JLNavarroAdam jlnavarro@girsanet.com
  13. @JLNavarroAdam jlnavarro@girsanet.com

  14. @JLNavarroAdam jlnavarro@girsanet.com Dispositivo Android con capa añadida sin conocimiento del

    fabricante
  15. @JLNavarroAdam jlnavarro@girsanet.com

  16. @JLNavarroAdam jlnavarro@girsanet.com

  17. @JLNavarroAdam jlnavarro@girsanet.com

  18. Dónde tenemos cada cosa… - Configuración del fw: /etc/rc.local -

    Configuración wifi ap: /etc/hostapd/hostapd.conf - Configuración dhcp wifi y bloquear dominios: /etc/dnsmasq.conf - Configuración reglas automáticas de bloqueo: /root/maltrail_reglas.conf - Tareas programadas automáticas: /etc/crontab - Correo electrónico: /etc/postfix/main.cf - Nombre de la raspberry: /etc/hosts , /etc/hostname , /etc/mailname y /etc/postfix/main.cf - Scripts y autoreject.php: /root/ - Logs: /var/log/maltrail/ Reiniciar los servicios - Ntopng: service ntopng restart - Maltrail: /root/servicemal.sh - DNSMasq: service dnsmasq restart - Postfix: service postfix reload - Tareas programadas: service cron restart - Actualizar el sistema: apt update && apt upgrade - REINICIAR LA RASPBERRY: reboot - APAGARLA: halt @JLNavarroAdam jlnavarro@girsanet.com
  19. Inicio: /etc/rc.local @JLNavarroAdam jlnavarro@girsanet.com !/bin/sh –e ## rc.local ## This

    script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other value on error. ## In order to enable or disable this script just change the execution bits. ## By default this script does nothing. # Print the IP address_ IP=$(hostname -I) || trueif [ "$_IP" ]; then printf "La dirección IP es %s\n" "$_IP“ fi ### RESETEAMOS CAPTURAS DE MALTRAIL rm -f /tmp/maltrail_fwd && touch /tmp/maltrail_fwd ### REGLAS DEL FW ## PERMITIMOS ENMASCARAMIENTO DESDE WLAN0 HACIA ETH0 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT ## BLOQUEAMOS PETICIONES MALICIOSAS iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -f -j DROP iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP iptables -A INPUT -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP iptables -A INPUT -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
  20. Inicio: /etc/rc.local @JLNavarroAdam jlnavarro@girsanet.com ## RECHAZAMOS LAS CONEXIONES ENTRANTES DESDE

    ETH0 iptables -A INPUT -i eth0 -p tcp --dport 8338 -j REJECT iptables -A INPUT -i eth0 -p tcp --dport 3000 -j REJECT iptables -A INPUT -i eth0 -p tcp --dport 53 -j REJECT iptables -A INPUT -i eth0 -p udp --dport 53 -j REJECT #iptables -A INPUT -i eth0 -p tcp --dport 22 -j REJECT ## REDIRIJIMOS EL TRAFICO SALIENTE DNS HACIA RPI iptables -t nat -A PREROUTING -s 192.168.10.0/24 -p tcp --dport 53 -j DNAT --to 192.168.10.1 iptables -t nat -A PREROUTING -s 192.168.10.0/24 -p udp --dport 53 -j DNAT --to 192.168.10.1 iptables -A FORWARD -s 192.168.10.1 -d 192.168.10.0/24 -p tcp --sport 53 -j ACCEPT iptables -A FORWARD -s 192.168.10.1 -d 192.168.10.0/24 -p udp --sport 53 -j ACCEPT ## BLOQUEAMOS BROADCAST REDES MICROSOFT Y SNMP HACIA LA RED EXTERIOR iptables -A OUTPUT -o eth0 -p udp --dport 137:139 -j DROP iptables -A OUTPUT -o eth0 -p udp --dport 445 -j DROP iptables -A OUTPUT -o eth0 -p udp --dport 161:162 -j DROP ## Y MOSTRAMOS LAS REGLAS iptables –nL exit 0
  21. DNS y DHCP: /etc/dnsmasq.conf @JLNavarroAdam jlnavarro@girsanet.com ### RANGO DHCP PARA

    EL INTERFAZ WLAN0 interface=wlan0 dhcp-range=192.168.10.101,192.168.10.199,255.255.255.0,24h ### Logueamos las consultas dns log-queries ### PARA BLOQUEAR DOMINIOS POR DNS address=/taobao.com/0.0.0.0 address=/thebrighttag.com/0.0.0.0 address=/dropbox-test.com/0.0.0.0 address=/aliexpress.com/0.0.0.0 address=/alicdn.com/0.0.0.0 address=/.mobi/0.0.0.0 address=/.ru/0.0.0.0 address=/.tt/0.0.0.0 address=/.tc/0.0.0.0 address=/.cn/0.0.0.0 address=/.cc/0.0.0.0 address=/.website/0.0.0.0 address=/spotxchange.com/0.0.0.0 address=/.br/0.0.0.0 address=/dartsearch.net/0.0.0.0 address=/socialpointgames.com/0.0.0.0 address=/xiaomi.com/0.0.0.0 address=/unity3d.com/0.0.0.0 address=/tapjoy.com/0.0.0.0 address=/mopub.com/0.0.0.0 address=/applovin.com/0.0.0.0 address=/gemius.pl/0.0.0.0 address=/baidu.com/0.0.0.0
  22. AUTOREJECT: /root/maltrail_reglas.conf @JLNavarroAdam jlnavarro@girsanet.com

  23. AUTOREJECT: /var/log/maltrail/ @JLNavarroAdam jlnavarro@girsanet.com # cat /var/log/maltrail/2019-10-26.log | egrep ‘(malware|tor

    exit|leakage|scan|attack|reputation)’ | cut –d ‘ ‘ –f 10
  24. SCRIPTS: /root/autoreject.php @JLNavarroAdam jlnavarro@girsanet.com #!/usr/bin/php –f <?php #### DEFINIMOS LAS

    REGLAS DE FILTRADO EN EL ARCHIVO /root/maltrail_reglas.conf #### PONIENDO CADA EXPRESION DE DETECCION EN UN LINEA DIFERENTE # SI HAY OTRO PROCESO AUTOREJECT EN EJECUCION, SALIMOS... if (file_exists("/tmp/autoreject.tmp")) { exit; } function es_ip($ip) { if ( (preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(\s*)$/" , $ip, $matches)) && ($matches[1] < 256) && ($matches[2] < 256) && ($matches[3] < 256) && ($matches[4] < 256) ) { return 1; } else { return 0; } } date_default_timezone_set('Europe/Madrid'); $dia=date("d"); $mes=date("m"); $ano=date("Y"); $log="/var/log/maltrail/" . $ano . "-" . $mes . "-" . $dia . ".log"; $fwd="/tmp/maltrail_fwd";
  25. SCRIPTS: /root/autoreject.php @JLNavarroAdam jlnavarro@girsanet.com ### GENERAMOS EL FILTRADO DE REGLAS

    PARA LA BUSQUEDA $MisReglas=file("/root/maltrail_reglas.conf"); $reglas=""; foreach ($MisReglas as $linea) { $linea=trim($linea); if ($linea != "") { if ($reglas == "") { $reglas=$linea; } else { $reglas=$reglas."|".$linea; } } } # SI NO HAY REGLAS DEFINIDAS, CANCELAMOS... if ($reglas=="") { exit; } # BUSCAMOS COINCIDENCIAS Y EXTRAEMOS EL “TRAIL” $cmd="cat $log | egrep '(". $reglas . ")' | cut -d ' ' -f 10"; $cmd=$cmd . " > /tmp/autoreject.tmp"; exec($cmd); # GENERAMOS EL REGISTRO DE AMENAZAS DE MALTRAIL DEL DIA DE HOY FILTRADO CON NUESTRAS REGLAS $regs=file("/tmp/autoreject.tmp");
  26. SCRIPTS: /root/autoreject.php @JLNavarroAdam jlnavarro@girsanet.com # COMPROBAMOS SI SON NUEVOS touch($fwd);

    $IPs=file($fwd); $cont=count($IPs); $f=fopen($fwd,'a'); foreach ($regs as $linea) { $linea=trim($linea); if ($linea != "") { if (!in_array($linea."\n",$IPs)) { # SI ES UNA NUEVA IP LA AÑADIMOS Y BLOQUEAMOS if ( es_ip($linea) ) { $IPs[$cont]=$linea."\n"; fwrite($f,$IPs[$cont]); $cmd="ip route add blackhole $linea"; exec($cmd); $cmd="iptables -A INPUT -s $linea -j DROP"; exec($cmd); $cmd="iptables -A FORWARD -d $linea -j DROP"; exec($cmd); $cont++; } } } } fclose($f); # ELIMINAMOS EL TEMPORAL Y LIBERAMOS PROXIMOS PROCESOS unlink("/tmp/autoreject.tmp"); # Y SALIMOS exit; ?>
  27. SCRIPTS: /root/autoreject.php @JLNavarroAdam jlnavarro@girsanet.com Curiosidades... ip route add blackhole a.b.c.d

    = ip r add a.b.c.d via 127.0.0.1 => Enruta hacia el interfaz loopback y genera TTL=0 => TIEMPO DE VIDA CADUCADO (PAQUETE NO ENRUTABLE) PILA TCP (kernel) APP (servicios) ENRUTAMIENTO (kernel) PAQUETE IP LOGS LOOPBACK TTL = 0
  28. SCRIPTS: /root/autoreject.php @JLNavarroAdam jlnavarro@girsanet.com Curiosidades... Protegemos cualquier servicio a partir

    de sus registros (logs): • Apache • Nginx • SSH • … Y todo tipo de dispositivos: • Centrifugadoras • Sistemas de Control de Tráfico • Cajeros automáticos • IoT en general…
  29. Se podía haber evitado… @JLNavarroAdam jlnavarro@girsanet.com

  30. En ciberseguridad, el usuario es el eslabón más débil… @JLNavarroAdam

    jlnavarro@girsanet.com
  31. GRACIAS jlnavarro@girsanet.com Twitter: @JLNavarroAdam Telegram: @Navarrux @JLNavarroAdam jlnavarro@girsanet.com