Script para notificar intrusiones en tu red con Ubuntu.

sudo apt-get install libnotify-bin nmap
sudo gedit alertared
Copia y pega el siguiente codigo:
#!/bin/bash
#script creado por: franklin aliaga
#si no tienes nmap digita sudo apt-get install nmap
#con este comnado de nmap nos muestra los hosts conectados
#y los guarda en un archivo *.txt
#script mejorado y actualizado por: microstudi (lector de tuxapuntes)
# Modificica esta linea a tu gusto si deseas guardar los temporales en otra ruta.
ARCHIVOS="$HOME/bin/hosts"
/usr/bin/nmap -sP 192.168.2.1/24 -oG $ARCHIVOS/hosts_ip.txt
#aqui cortamos el formato obtenido anteriormente de archivo para solo obtener las ip's
#y mandarlo a otro archivo *.txt
cat $ARCHIVOS/hosts_ip.txt | grep Host | cut -c 7-20 | tr -d "\()" > $ARCHIVOS/host_ip1.txt
#aqui capturamos el numero de lineas que tiene nuestro archivo
#en este caso la cantidad de ip's que hay en el archivo
contador=$(wc -l $ARCHIVOS/host_ip1.txt | cut -c 1-2)
#aqui obtenemos la nuestra ip
ip=$(/sbin/ifconfig eth0 | grep "inet addr" | awk '{print $2}' | cut -c 6-)
echo "Mi ip: $ip"
total=$(expr $contador - 1)
var=0
while [ $var -le $total ]; do
let var=$var+1
#capturamos la ip por linea
linea=$(cat $ARCHIVOS/host_ip1.txt | sed -n "$var p")
if [ $linea != "192.168.2.1" ]; then
if [ $linea != $ip ]; then
/usr/bin/notify-send "Conectado $linea"
#Para enterar-se por la consola también:
echo "Conectado $linea"
fi
fi
done
Guarda el fichero que acabas de crear y en consola teclea:
sudo chmod +x alertared
Despues creamos el demonio:
crontab -e
Y añadimos la linea:
*/3 * * * * /home/tu nombre de usuario/alertared
*Con esto el sistema ejecutara cada 3 minutos el script y nos notificara los intrusos.



muy bueno, genial
muy bueno, genial
Tengo una duda, soy muy
Tengo una duda, soy muy novato en esto de linux. He seguido paso a paso todo lo dicho pero llego a algo que no se hacer. Al llegar a teclear en el terminal crontab -e como añado la siguiente linea?, no me deja escribir nada. A partir de aquí ya no se seguir.
Un saludo y gracias de antemano.
cuando ejecutas crontab -e te
cuando ejecutas crontab -e
te sale lo siguiente?
# m h dom mon
debajo de esa linea es donde has de escribir la tarea.
Ivan (microstudi) ¿podrías
Ivan (microstudi) ¿podrías añadir una opcion para que se pudiera guardar en log la salida de notify-send y asi poder hacer un seguimiento cuando el PC está desatendido? Se podría pasar como un parametro en la línea de comandos del Script ($1).
Enhorabuena por la mejora!
Eso es muy fácil! no hace
Eso es muy fácil! no hace falta añadir nada al script,
cambia la linea de crontab asi:
*/3 * * * * /home/tu nombre de usuario/alertared 2>&1 >> /home/tu nombre de usuario/algun sitio/alertared.log
Esto te irá añadiendo la salida a un log.
De todas maneras podria poner-se un log un poco mejor modificando el script para que salga la fecha, ya lo haré y lo postearé. Pero en la nueva bitácora que he hecho: http://www.tuxapuntes.com/drupal/node/1710
la belleza del código libre!
la belleza del código libre!
Posteo aqui un nuevo script
Posteo aqui un nuevo script completament reescrito que funciona mejor.
Notas:
1. no usa archivos, asi que hay que preocuparse por los directorios
2. comprueba si tienes los programas nmap i notify-send instalados
3. permite poner una serie de ip's conocidas para que no incordie con los equipos propios, tambien hay una variable para poner el interfaz de red que queremos usar
4. arregla un fallo con el notify-send (almenos en mi caso), ya que el programa se ejecuta en un usuario desde crontab que no tiene acceso directo al escritorio
#!/bin/bash
#script creado por: franklin aliaga
#script mejorado y actualizado por: Ivan Vergés (microstudi)
declare -a IPS_CONOCIDAS
####################
#Configuracion:
####################
#Array de ip's conocidas, la primera debe ser la del router, no hace falta poner la propia
#separar por espacios las ips
IPS_CONOCIDAS=( "192.168.2.1" "192.168.2.3" )
#Interfaz de red (eth0, wlan0, etc)
DEVICE="eth0"
#####################
#aqui obtenemos la nuestra ip
ip=$(/sbin/ifconfig "$DEVICE" | grep "inet addr" | awk '{print $2}' | cut -c 6-)
echo "Mi ip: $ip"
#añadimos nuestra IP al array
IPS_CONOCIDAS[${#IPS_CONOCIDAS[*]}]=$ip
echo "No se controlan los equipos siguientes: "${IPS_CONOCIDAS[*]}
#Comprovar si existen los programas que usaremos:
if [ ! -x /usr/bin/nmap ]; then
echo "El programa nmap no está instalado!"
exit
fi
if [ ! -x /usr/bin/notify-send ]; then
echo "El programa notify-send no está instalado!"
exit
fi
#con este comnado de nmap nos muestra los hosts conectados
#y los guarda en el fichero "-" que es la salida standard
#redireccionada a la variable variable HOST_IPS
echo "Buscando equipos..."
HOST_IPS=$(/usr/bin/nmap -sP ${IPS_CONOCIDAS[0]}/24 -oG -)
#aqui cortamos el formato obtenido anteriormente de archivo para solo obtener las ip's
IPS=$(echo "$HOST_IPS" | grep Host | cut -c 7-20 | tr -d "\()")
#aqui capturamos el numero de lineas que tiene nuestro archivo
#en este caso la cantidad de ip's que hay en el archivo "-" (entrada standard)
contador=$(echo "$IPS" | wc -l - | cut -c 1-2)
total=$(expr $contador - 1)
#esto es para que el script tenga acceso a las X des de crontab
export DISPLAY=:0
export XAUTHORITY="$HOME/.Xauthority"
#Bucle de búsqueda entre las ip's encontradas
var=0
while [ $var -le $total ]; do
SALTA_BUCLE=0
let var=$var+1
#capturamos la ip por linea
linea=$(echo "$IPS" | sed -n "$var p")
for i in ${IPS_CONOCIDAS[*]}
do
if [ $i == $linea ]; then
echo "$linea está en la red conocida"
SALTA_BUCLE=1
break
fi
done
if [ "$SALTA_BUCLE" == "1" ]; then
continue
fi
/usr/bin/notify-send "Conectado $linea"
#Para enterar-se por la consola también:
echo "Conectado $linea"
done
Pero si esto es ya un nuevo
Pero si esto es ya un nuevo script, ja ja ja , te creas una bitacora, lo publicas con tu nomobre y te lo promociono a los feeds, creo que merece la pena, te importa ?
Ok, ya te lo he hecho,
Ok, ya te lo he hecho, modifica lo que te parezca si quieres!
Saludos!
En mi caso tuve que cambiar
En mi caso tuve que cambiar eth0 por wlan0, y como los comandos están en castellano tuve que cambiar "inet addr" por "Direc. inet", y anda perfecto.
Se podría meter el interface
Se podría meter el interface en una variable y lo automatizamos tambien, asi como las direcciones de red, que se podrian sacar de un modo sencillo y el script quedaría totalmente funcional, sin tener que modificar parametros a mano, ;), pero la verddad es que ya esta super currado, si alguno lo ha puesto que lo pase y lo actualizamos.
Como aporte, yo sustituiria
Como aporte, yo sustituiria las linias de obtención de IP:
ifconfig > $HOME/bin/hosts/ip.txt
ip=$(cat $HOME/bin/hosts/ip.txt | grep 192 | cut -c 23-36)
por esta:
ip=$(/sbin/ifconfig eth0 | grep "inet addr" | awk '{print $2}' | cut -c 6-)
es mas fiable si cambia la configuracion del fichero que genera ifconfig
Por cierto que el comando "notify-send" no viene instalado por defecto en karmic:
sudo apt-get install libnotify-bin
Saludos y muy buena idea este script!
Como dejarias el script
Como dejarias el script entonces ? ponlo aqui y te lo posteo..
Mi script queda asi (de
Mi script queda asi (de momento),
se puede cambiar la linia ARCHIVOS="$HOME/bin/hosts" para que cada cual ponga el directorio que quiera para guardar los archivos temporales.
#!/bin/bash
#script creado por: franklin aliaga
#si no tienes nmap digita sudo apt-get install nmap
#con este comnado de nmap nos muestra los hosts conectados
#y los guarda en un archivo *.txt
ARCHIVOS="$HOME/bin/hosts"
/usr/bin/nmap -sP 192.168.2.1/24 -oG $ARCHIVOS/hosts_ip.txt
#aqui cortamos el formato obtenido anteriormente de archivo para solo obtener las ip's
#y mandarlo a otro archivo *.txt
cat $ARCHIVOS/hosts_ip.txt | grep Host | cut -c 7-20 | tr -d "\()" > $ARCHIVOS/host_ip1.txt
#aqui capturamos el numero de lineas que tiene nuestro archivo
#en este caso la cantidad de ip's que hay en el archivo
contador=$(wc -l $ARCHIVOS/host_ip1.txt | cut -c 1-2)
#aqui obtenemos la nuestra ip
ip=$(/sbin/ifconfig eth0 | grep "inet addr" | awk '{print $2}' | cut -c 6-)
echo "Mi ip: $ip"
total=$(expr $contador - 1)
var=0
while [ $var -le $total ]; do
let var=$var+1
#capturamos la ip por linea
linea=$(cat $ARCHIVOS/host_ip1.txt | sed -n "$var p")
if [ $linea != "192.168.2.1" ]; then
if [ $linea != $ip ]; then
/usr/bin/notify-send "Conectado $linea"
#Para enterar-se por la consola también:
echo "Conectado $linea"
fi
fi
done
muy bueno .. me funciona
muy bueno .. me funciona perfecto ...
habría manera de sacar también la MAC del equipo intruso por el terminal sin tener que acudir al router ???
salu2.
Nueva versión del script
Nueva versión del script en:
http://www.tuxapuntes.com/drupal/node/1710
Con detection de MAC y opciones por parámetros, creo que ya queda fino fino...
Salut!
jugoooooooooonnnnnnnn
jugoooooooooonnnnnnnn ............
jugooooooooooooooonnnnnnnnn ............
thx.
Hay que retocarlo como
Hay que retocarlo como dijeron antes. Para hacerlo mas general hay que reemplazar
/home/fal/.... por $HOME/...
Llevas toda la razón,
Llevas toda la razón, retocado esta, si alguno tiene mas suguerencias, las añadimos.
Yo, sin que se entere la
Yo, sin que se entere la cuadrilla templix que ultimamente está en otra constalación, mandaria el post a “redes y seguridad” ... tiene categoria más que suficiente.. ja ja ja... y si se mosquean... que se chinchen!! ja ja ja
Al executarlo me da un error
Al executarlo me da un error repetido asta que decido pararlo Alguien tiene una posible solucion?. Las carpetas estan creadas i con los permisos correspondientes. El error es el siguiente:
ed: -e expresión #1, carácter 3: uso inválido de la dirección de línea 0
[: 34: !=: unexpected operator
alertared: 34: let: not found
sed: -e expresión #1, carácter 3: uso inválido de la dirección de línea 0
[: 34: !=: unexpected operator
alertared: 34: let: not found
sed: -e expresión #1, carácter 3: uso inválido de la dirección de línea 0
^C
Y al archivo le he añadido los cambios correspondientes a mi red:
#!/bin/bash
#script creado por: franklin aliaga
#si no tienes nmap digita sudo apt-get install nmap
#con este comnado de nmap nos muestra los hosts conectados
#y los guarda en un archivo *.txt
nmap -sP 172.26.0.1/24 -oG /home/fal/hosts/hosts_ip.txt
#aqui cortamos el formato obtenido anteriormente de archivo para solo obtener las ip's
#y mandarlo a otro archivo *.txt
cat /home/fal/hosts/hosts_ip.txt | grep Host | cut -c 7-20 | tr -d "\()" > /home/fal/hosts/host_ip1.txt
#aqui capturamos el numero de lineas que tiene nuestro archivo
#en este caso la cantidad de ip's que hay en el archivo
contador=$(wc -l /home/fal/hosts/host_ip1.txt | tr -d "\/home/fal/hosts/host_ip1.txt")
#aqui obtenemos la nuestra ip
ifconfig > /home/fal/hosts/ip.txt
ip=$(cat /home/fal/hosts/ip.txt | grep 172 | cut -c 23-36)
total=$(expr $contador - 1)
var=0
while [ $var -le $total ];do
let var=$var+1
#capturamos la ip por linea
linea=$(cat /home/fal/hosts/host_ip1.txt | sed -n "$var p")
if [ $linea != "172.26.0.1" ];then
if [ $linea != $ip ];then
notify-send "Conectado" $linea
fi
fi
done
/home/fal/hosts/hosts_ip.txt
/home/fal/hosts/hosts_ip.txt
para esto tienes que crear el directorio hosts en tu carpeta personal
fal es el nonmbre del usuario con que estas logeado
172.26.0.1 tiene que ser la puerta de enlace predeterminada
ja cree los directorios
ja cree los directorios /home/fal/hosts i les di los permisos 777 pero lo pondre en /home/ aver si funciona.
Si, la puerta de enlace es 172.26.0.1/24.
ejecutalo antes, fuera del
ejecutalo antes, fuera del crontab, asegurate de tener instalada la suite nmap
sudo apt-get isntall nmap
... ejecutalo con bash alertared ...
¿ le has dado los permisos de ejecucion de forma correcta ?
Si, tiene los permisos
Si, tiene los permisos correctos,seguire haciendo pruevas aver que tal va.
Me da la impresion de que el
Me da la impresion de que el Script necesita mas modificaciones.
Por ejemplo: 192.168.xx.1
O
/fal/
/tu nombre de usuario/
Faltaria esta linea:
#listamos la configuracion de los interfaces de red
ifconfig > /home/tu nombre de usuario/hosts/ip.txt
Y esto si que funciona
contador=$(wc -l /home/tu nombre de usuario/hosts/host_ip1.txt | cut -c 1-2)
Enhorabuena por el trabajo que has hecho
Simplemente genial!!!
Simplemente genial!!!
Enviar un comentario nuevo