Programación y secuencias de comandos

Cómo hacer un sistema básico de detección de intrusos con bash

Cómo hacer un sistema básico de detección de intrusos con bash

Introducción

Para la mayoría de nosotros, el cifrado de WEP se ha convertido en una broma. WPA avanza rápidamente de la misma manera gracias a muchas herramientas como Aircrack-Ng. Además de esto, las redes con cable no son ajenos a los invitados no deseados. Cualquier persona en serio sobre la seguridad debe tener un buen sistema de detección de intrusos en su caja de herramientas.

Ya hay algunos muy buenos IDS (sistemas de detección de intrusos) disponibles. ¿Por qué alguien querría reinventar la rueda en Bash???? hay un par de razones para esto. Obviamente, los guiones BASH pueden ser muy livianos. Especialmente en comparación con algunos de los programas de GUI que existen. Si bien programas como Etherape nos absorben con colores bonitos, requieren un monitoreo constante para saber cuándo ha cambiado la red. Si eres como la mayoría de nosotros, solo usas la computadora para dos cosas, trabaja y juega. Al usar la campana del sistema para alertar a nuevos clientes en línea, puede dejar este script en funcionamiento y no tener que tener un reloj constante. Si decide que desea inspeccionar lo que un cliente sospechoso está haciendo más de cerca, siempre puede abrir Etherape, Wireshark o su herramienta de elección. Pero hasta que tengas un problema, puedes jugar o trabajar en otras cosas.

Otra ventaja para este programa es que solo mostrará direcciones IP en las redes conectadas a su computadora. Si estaba alojando un servidor ocupado o tal vez descargando la última distribución de Linux a través de un cliente torrent, un IDS puede inundarse con conexiones. Buscar un nuevo cliente malicioso puede ser como buscar una aguja en una pila de heno. Si bien este script puede parecer simple en comparación con otras ID, la simplicidad también puede tener sus ventajas.

Que necesitarás

Se requiere NMAP para que este script funcione. No haremos ningún escaneo de puertos. Sin embargo, para hacer este guión rápido, necesitábamos algo mejor que un ping regular. El parámetro -sp de NMAP solo usará un escaneo de ping para verificar si los clientes. Hubo algunas variaciones en cómo NMAP genera información entre versiones. Hasta ahora, este script solo se ha probado usando NMAP 5.00 (Debian Squeeze) y 5.21 (Debian Sid). Puede tener suerte con otras distribuciones y versiones de NMAP. Sin embargo, con todas las posibilidades solo podría apoyar a una pareja en este momento.

También deberá asegurarse de estar utilizando Bash Versión 4.0 o superior. Debe encontrar esto en cualquier distribución que sea estable o más nueva. Pero cualquier versiones de BASH a continuación que no admitirá matrices que se usan en este script. También se requiere acceso raíz o no se encontrará el comando ARP para bloquear ningún cliente.

NOTA: Este script no funciona bien con interfaces de red virtuales como VMware, Virtualbox y etc.

Ejecutando el script

Para ejecutar este script simplemente ejecute:

# Chmod +X Leecher.mierda; ./Leecher.mierda

En este momento no hay parámetros para establecer.

Cómo funciona este script

Saltar más allá de todas las funciones iniciales por ahora para que podamos ver el flujo real del guión. Lo primero que hacemos es verificar que el usuario sea root y NMAP está instalado en el sistema actual. Si no es el script, explicará que se requieren privilegios raíz o que NMAP es una dependencia aquí y salga. Si se cumplen estos requisitos, el guión se saltará con un saludo al usuario y explicará algunas características. Usé setterm para apagar el cursor. Definitivamente era un ojo estético.

Establecí un Trap Control-C para que el script se detenga. Si bien puede pensar 'esperar, el control-C generalmente detiene el programa de línea de comandos de todos modos!'Si bien esto normalmente es cierto, encontré el bucle para siempre que usamos más tarde para causar problemas para detener el script con control-c. Al usar una trampa con Sigint pudimos hacer que esto funcionara. Establecemos algunas variables en la siguiente declaración IF para verificar qué versión compatible de NMAP estamos usando aquí. Esto es importante ya que la salida es completamente diferente entre estas versiones. Lo primero que hicimos aquí fue hacer un bucle que primero obtendrá la versión de NMAP que estamos usando aquí. Esto es importante ya que la salida es completamente diferente entre estas versiones. Lo siguiente que hicimos aquí fue hacer un bucle que primero obtendrá las direcciones IP de todas nuestras interfaces que están actualmente en línea. También estamos usando AWK aquí para filtrar 127.0.0.1 ya que no es necesario escanear la dirección de bucleza. Además, estamos usando AWK para cortar el octeto final en estas direcciones IP. Por ejemplo, si la interfaz ETH0 tiene una IP de 192.168.1.12 No necesitamos el final 12. Un escaneo normal de una subred como esta sería "nmap -sp 192.168.1.0/24 ”, así que por ahora este bucle eliminará cualquiera de las IP en cualquier interfaces activas y las pasará a la vez para nmap hasta que hayamos terminado. Dentro del bucle recibimos el valor para IP una interfaz y agregamos ".0/24 ”para escanear toda la red en ese rango.(O 0-255) Pasaremos las variables correctas para la versión de NMAP, por lo que AWK sabe dónde obtener la IP de cada escaneo. Todos los valores devueltos de cada escaneo se conectarán a una matriz. Después del primer escaneo de todas las redes de interfaces, simplemente usaremos otro bucle para mostrar los resultados iniciales al usuario.

Debo señalar aquí lo que dice el nuevo mensaje siguiente al usuario. Si desea escuchar la campana del sistema, debe estar habilitado en su configuración de escritorio. La ubicación de esto variará según la versión de KDE, Gnome, Xface o cualquier escritorio que esté utilizando. Sin embargo, puede pensar que solo porque haya escuchado una campana antes de que esté habilitado. Noté que mi sistema operativo tenía una campana similar para que me hiciera saber que la batería de mi computadora portátil estaba a punto de morir. Verifique cómo habilitar la campana del sistema en su distribución si experimenta algún problema.

El siguiente es el bucle para siempre para mantener constante el escaneo y el monitoreo de este script. Si eres nuevo en Bash, o que los bucles para siempre, esto podría hacerte preguntar por qué usaríamos algo que es un bucle infinito. Sin duda, muchos de ustedes han sido advertidos sobre el peligro de los bucles infinitos y cómo pueden bloquear una máquina. Como habrás notado, usamos una declaración de sueño después del primer escaneo. Usaremos esto nuevamente dentro de nuestro bucle para siempre y algunas de las funciones que incluye. El sueño permitirá que la ejecución haga una pausa y devuelva temporalmente los recursos a la computadora. . Pero si está en una máquina muy antigua, o una para obtener recursos ya, puede cambiar la cantidad de segundos de que el sueño se está utilizando aquí.

Lo primero que hará nuestro bucle para siempre es saltar a la función llamada motor (). Lo que estamos haciendo aquí es exactamente lo mismo que nuestro primer escaneo, excepto que lo estamos poniendo en una matriz diferente. Después de que se ejecute esa función, ahora volvemos a nuestro bucle para siempre, donde una declaración IF se comparará si estas dos matrices son las mismas. Si son los mismos, la matriz de la segunda exploración se vaciará para evitar valores duplicados en la siguiente iteración del bucle. Sin embargo, si el valor es una diferencia en estas dos matrices, saltaremos a la cláusula delse que nos redirige a nuestra función de interrupción.

La función de interrupción se detendrá y anunciará al usuario que la lista de clientes ha cambiado. Desde aquí llamaremos a una función llamada "dos veces" donde mostramos al usuario el contenido de las direcciones IP en la segunda matriz. Ahora le preguntaremos al usuario si desea bloquear una dirección IP. Puede ser cualquier IP, no solo las que se muestran. Si el usuario responde "y" por sí, pedirá que ingrese una dirección IP. Si la IP ingresada no es nula, haremos ping a esta IP para agregar su dirección MAC a nuestro caché ARP. Por alguna razón, cuando NMAP pings la red, no hace esto. Luego usamos ARP para darnos la dirección MAC del cliente. Dado que las IP pueden ser reasignadas por un enrutador, no queremos bloquear por direcciones IP. Una vez hecho esto, usamos una declaración anidada IP para verificar si la dirección MAC que ahora hemos almacenado en $ Mac es nula. Esto es bueno para verificar errores en caso de que el usuario ingrese una cadena de basura. Si la dirección MAC no existe, le indicamos al usuario que el cliente existe o ha dejado la red y reanuda nuestro monitoreo en Forever Loop. Si la dirección MAC existe, la agregamos a una regla iptable que bloqueará a ese usuario de cualquier conexión a nuestra computadora. Debo tener en cuenta aquí que esto no le impide enviar paquetes a esa máquina, solo un tráfico entrante para usted. Sin embargo, esto no protege toda su red. Solo la máquina que está utilizando hasta que sus reglas iptables estén enjuagadas. Si bloquea accidentalmente un cliente que encuentra que debe conectarse a usted, puede liberar esta regla con algunos comandos simples de iptables. La declaración IF continúa diciéndole al usuario que la dirección MAC de la IP ingresada ahora está bloqueada y muestra los clientes actuales en línea. El cliente bloqueado aún aparecerá en esta lista, ya que solo lo hemos bloqueado de nosotros, no la red. Si el usuario hubiera elegido no bloquear un cliente, simplemente mostraríamos el cambio en la red y volveríamos a nuestro bucle para siempre.

Independientemente de lo que hizo el usuario en la función de interrupción, ahora necesitamos actualizar los valores de nuestras matrices. Dado que la segunda matriz actualmente contiene los nuevos valores de nuestra red, debemos alimentarla a la otra matriz antes de que la función del motor lo vuelva a llenar. Primero liquidamos esa matriz para evitar cualquier valores duplicados y luego copiar el contenido de la segunda matriz a la primera matriz. Ahora use vacío la segunda matriz y estamos listos para iniciar el bucle con la función del motor.

Por supuesto que había una función que me salté hasta ahora. Es posible que haya notado que nuestro primer mensaje al usuario dijo que presione el control-C en cualquier momento para bloquear clientes adicionales o salir. Nuestra trampa llama a la primera función llamada control_c (). Todo lo que hice aquí fue preguntarle al usuario en una declaración IF si quieren bloquear a un usuario de la misma manera que antes. Notará si el usuario responde sí a la declaración if, hay una nueva línea aquí. "Bash Leecher.SH ”se usa para reiniciar este script. Si ha nombrado a este script algo diferente, debe suministrar eso aquí. Reexecutamos nuestro script porque la trampa todavía quiere enviar a Sigint y matar el guión. Crear una nueva instancia evita que la secuencia de comandos muera de manera inesperada. Sin embargo, crear la nueva instancia no permite que Sigint complete.

Es posible que también hayas notado que también usamos dormir un poco más. Esto es solo para darle tiempo al usuario para leer lo que está sucediendo antes de cambiar a nuestra nueva instancia del script que se hará cargo de este terminal. Si el usuario hubiera elegido "no" en lugar de "sí", la cláusula delse solo permitiría que el script salga. También nos aseguraremos de usar setterm para devolver nuestro cursor o no tendremos uno en este terminal a pesar de que el script ha salido.

El propósito de tener un bloqueo sobre la marcha es fácil. Es posible que tenga más de un cliente que bloquear si hay múltiples clientes agresivos. Es posible que decida más tarde después de omitir el Bloqueo de Chance a un cliente en la función de interrupción que necesita para. O tal vez sabes que algo anda mal tan pronto como comienzas el script. Si ningún nuevo cliente viniera o se fue en la red en cuestión, no tendríamos la oportunidad de bloquear nada hasta que lo hicieran.

Cómo se puede mejorar este script

Obviamente, escuchar la campana del sistema constantemente apagarse por falsos positivos puede ser molesto. Hacer que este guión sea capaz de la lista blanca de clientes en los que confíe probablemente reduciría esto. La campana del sistema definitivamente puede ser molesta si una persona tiene problemas para mantenerse conectado por largos períodos de tiempo.
A veces puede notar que algunos de los clientes cambian de IP a nombres de host. Muchos programas, como Etherape, hacen lo mismo. Si su enrutador está actuando, ya que su DNS probablemente mostrará el nombre de anfitrión continuamente. No creo que ninguno de ustedes quiera bloquear las conexiones con su enrutador. Sin embargo, ofrecer un parámetro para cambiar a IP solo podría ser bueno para algunos de ustedes.
También hay un pequeño problema con la bifurcación de script cuando un usuario bloquea a un cliente con control-C. Esto no presenta peligro a menos que un usuario decida bloquear a miles de clientes con control-C. Sin embargo, todas las instancias del guión son asesinadas al salir. Pero como vamos por básico aquí, esto debería estar bien.

Un sistema de detección de intrusos con bash

#!/bin/bash # interapt y salir de la función control_c () clare echo -e "¿Le gustaría bloquear las conexiones con un cliente??\ n "echo -e" ingrese y n: "lea yn if [" $ yn "==" y "]; luego echo -e" \ nenter ip dirección para bloquear: \ n "leer ip if [-n $ $ ip]; luego echo -e "\ nnow recuperando la dirección MAC para bloquear ... \ n" ping -c 1 $ ip> /dev /null mac = "arp $ ip | Grep Ether | AWK "imprimir $ 3" if [-z $ Mac]; entonces borrar echo -e "\ n *** El cliente no existe o ya no está \ en esta red ***" echo -e "\ nskipping Action y reanudación de monitoreo.\ n \ n "Sleep 2 Bash Leecher.SH EXIT 0 Else iptables -A Entrada -m Mac - -Mac -Source $ Mac -J Drop Clare Echo -e "\ nclient con la dirección MAC $ Mac ahora está \ bloqueada.\ n "echo -e" Continuaremos monitoreando los cambios \ en clientes \ n \ n "Sleep 2 Bash Leecher.SH EXIT 0 FI FI Ose Clear Echo -e "\ n \ nleecher ha salido \ n \ n" setterm -cursor en rm -f $ pid exit 0 fi # imprima el escaneo desde el motor () dos veces () g = 0 len = $ #segundo [@] para ((g = 0; g /dev /null mac = "arp $ ip | grep éter | awk" imprima $ 3 "if [-z $ mac]; luego claro echo -e "\ n *** El cliente no existe o ya no está en \ esta red ***" echo -e "\ nskipping acción y monitoreo de reanudación.\ n \ n "else iptables -a entrada -m mac - -Mac -fuente $ Mac -J Drop Clare echo -e" \ nclient con la dirección MAC $ Mac ahora está bloqueada.\ n "echo -e" Continuaremos monitoreando los cambios \ en clientes \ n \ n "echo -e" Los clientes actuales son: \ n "dos veces echo -e" \ nresuming monitoreo ... "fi fi más claro eco -e" Los clientes actuales son: \ n "dos veces eco -e" monitoreo de reanudación ... "Fi # Función para mantener el monitoreo de cualquier cambio Engine ()  # SCAN Networks nuevamente para comparar los cambios. Para subred en $ (/sbin/ifconfig | awk '/inet addr/&& !/127.0.0.1/ && !a [$ 2] ++ \ print substr ($ 2,6) ') do segundo+= ("$ (nmap -sp $ subred%.*.24/04 | AWK 'ÍNDICE ($ 0, t) \ imprime $ i' t = "$ t" i = "$ i") ") Sleep 1 Hecho # Asegúrese de que el usuario esté registrado como root si [[$ euid -ne 0]]; luego echo "Este script debe ejecutarse como root" 1> y 2 Salir 1 fi # Compruebe si nmap está instalado ifnmap = "type -p nmap" si [-z $ ifnmap]; entonces echo -e "\ n Se debe instalar \ nnmap para que este programa funcione \ n "echo -e" solo nmap 5.00 y 5.21 son compatibles en este momento \ n "echo -e" por favor instale e intente nuevamente "Salir 0 fi clear echo -e" \ nnow encontrar clientes en sus redes locales "echo -e" presione control -c en cualquier momento Bloquear clientes adicionales o salir \ n " # Eliminar archivos TEMP al salir y permitir que el control-C salga. trampa control_c sigint # apague el cursor setterm -cursor apagado # Haga algunas matrices y variables declarar -Un primer declarar -A segundo sid = 5.21 # Verifique qué versión de NMAP if [5.21 = $ (nmap --version | awk '/ nmap/ imprimir $ 3')]; Entonces i = 5 t = Informe más i = 2 t = host fi # Obtenga IP de las interfaces y ejecute el primer escaneo de subred en $ (/sbin/ifconfig | awk '/inet addr/&& !/127.0.0.1/ && !a [$ 2] ++ print \ substr ($ 2,6) ') do primero+= ("$ (nmap -sp $ subred%.*.24/04 | AWK 'índice ($ 0, t) imprimir $ i' \ t = "$ t" i = "$ i") ") dormir 1 hecho echo -e" Los clientes actuales son: \ n "#display elementos de matriz y agregar nuevas líneas e = 0 len = $ #primero [@] para ((e = 0; e < $len; e++ )); do echo -e "$first[$e]\n" done echo -e "Leecher is now monitoring for new clients." echo -e "\nAny changes with clients will be reported by the system bell." echo -e "If bell is not enabled details will log to this console." # Forever loop to keep monitoring constant for (( ; ; )) do engine if [[ $first[@] == $second[@] ]]; then second=( ) else interupt sleep 1 first=( ) first=("$second[@]") second=( ) fi done

Salida de muestra

Ahora, encontrar clientes en su (s) red (s) local Presione Control-C en cualquier momento para bloquear clientes adicionales o salir de los clientes actuales son: 192.168.12.1 192.168.12.9 192.168.12.43 mefistolistas 10.0.0.121 10.0.0.137 10.0.0.140 Leecher ahora está monitoreando para nuevos clientes. El sistema informará cualquier cambio con los clientes. Si Bell no está habilitado, los detalles registrarán esta consola. ==================================================== ============= La lista de clientes ha cambiado! 192.168.12.9 192.168.12.43 mefistolistas 10.0.0.140 ¿Le gustaría bloquear las conexiones con un cliente?? Ingrese Y o N: Y Ingrese la dirección IP al bloque: 192.168.12.9 =================================================== === tiempos. Continuaremos monitoreando los cambios en los clientes ============================================= ==================
Perl - CGI - Formulario Enviar ejemplo
El siguiente ejemplo de formulario PERL/CGI le pide a un usuario que ingrese dos enteros y tras el envío se realiza una adición en ambos enteros envia...
Hash perl
PERL Hash Veamos en un par de ejemplos cómo podemos usar el hash perl. Primero necesitamos saber que el valor de Perl hash es accesible a través de la...
Hora su descarga fuera de pico con el comando en Linux
No todos tienen una descarga ilimitada de Internet. A veces, Internet proporciona horas máximas y apagadas y apenas es que alguien se quede despierto ...