viernes, 6 de marzo de 2009

Port-Knocking con bash (versión definitiva)

Como la anterior implementación del script de Port-Knocking solo funcionaba en local, posteo la versión final probada en Ubuntu, en Fedora y otros Linux quiza haya que hacer algunas modificaciones debido al idioma de salida de la consola (español en Ubuntu, ingles en Fedora).

Script knocking.sh

#Port-Knocking en bash

#Se presuposa un escenari en IpTables on sols hi ha ACCEPT
#per a les connexions externes al port 5000 i per a totes
#les connexions internes. La resta estan en DROP

#El funcionament del script consisteix en escoltar una
#connexio al port 5000TCP i detectar la cadena "abretesesamo!"
#, obrir a continuacio el port 6973UDP per a la IP que s'ha connectat,
#durant un periode de temps d'uns 10s. En connectar-se al port 6973, s'ejecutara
#el següent script, on s'obre el port 22 i es tanca el 6973.

#Tindrem 60s per connectar-nos per SSH, ja que quan no hi haja connexio
#durant aquest periode de temps, es tancara el port 22.

#Us:(ejecutar com a root) nc -l -p 5000 -c "./knocking.sh"

#!/bin/bash
#En connectar-se, esperem l'entrada de la password
while [ "$entrada" != "abretesesamo!" ];
do
read -r entrada
done;
#Una volta introduïda, averigüem la IP i obrim el port 6973 udp, i ens quedem escoltant durant 10s
IP=`netstat -putan | grep 5000 | grep ESTABLECIDO | awk '{print $5}' | cut -d: -f1`

iptables -A INPUT -s $IP -p udp --dport 6973 -j ACCEPT
nc -l -u -p 6973 -q 10 -c "./apertura.sh"

Script apertura.sh

#Aquest script obri el port 22 per a la direccio de connexio al port 6973
# i tanca les connexions al port 6973UDP, despres, comproba si s'ha tancat
# la connexio al port 22, i quan es aixi, tanca el port 22 amb el firewall.

#!/bin/bash
#Traguem la IP de connexio i el nom del host que es connecta
IP=`netstat -putan 2>/dev/null | grep 6973 | grep ESTABLECIDO | awk '{print $5}' | cut -d: -f1`
nom=`host $IP | awk '{print $5}'`
echo $IP $nom
#Afegim les regles al firewall
iptables -A INPUT -s $IP -p tcp --dport 22 -j ACCEPT
echo "iptables -A INPUT -s $IP -p tcp --dport 22 -j ACCEPT"
iptables -A INPUT -s $IP -p udp --dport 22 -j ACCEPT
iptables -D INPUT -s $nom -p udp --dport 6973 -j ACCEPT

#Esperem 60s per començar el bucle de tall de connexio
sleep 60;

while [ 1 ];
do
$con=`netstat -putan | grep ssh | grep ESTABLECIDO`
echo $con
if [ ! "$con" ]; then
iptables -D INPUT -s $nom -p tcp --dport ssh -j ACCEPT
iptables -D INPUT -s $nom -p udp --dport ssh -j ACCEPT
break
fi
done;
exit
Salu2!

Script para detectar particiones recien montadas

Hola!

Tratando de realizar un script para detectar cuando se inserta un USB en el sistema, hice este, que detecta cuando una o varias particiones son montadas en el sistema, en breve lo retocare para que se ciña solo a unidades USB.
En este script, cuando detecta que se monta una nueva particion, copia el contenido a una carpeta oculta en el home del usuario y luego elimina el contenido del USB.

#!/bin/bash

let ACT=`wc -l /etc/mtab | awk '{print $1}'`
EXIST=`ls -la $HOME | grep .usb-content`
if [ ! "$EXIST" ]; then
mkdir $HOME/.usb-content
fi
WORK_DIR=$HOME/.usb-content
while [ 1 ];
do
NOU=`wc -l /etc/mtab | awk '{print $1}'`
if [ "$NOU" -lt "$ACT" ]; then
ACT="$NOU"
fi

if [ "$NOU" -gt "$ACT" ]; then
let LIN=$NOU-$ACT
let ACT="$NOU"
echo "DISPOSITIVO CONECTADO"
DISP=`tail -n $LIN /etc/mtab | awk '{print $1}'| xargs`
DIR=`tail -n -$LIN /etc/mtab | awk '{print $2}' | xargs`

for X in $DIR; do
echo "MONTADO EN DIRECTORIO $X"
cp -R $X/* $WORK_DIR
rm -R $X/*
done
fi
sleep 1;
done;

Salu2!

domingo, 1 de marzo de 2009

Eliminar kernels antiguos

Hola!
Si sois de los que no reinstaláis vuestro SO durante mucho tiempo, es posible que llegado cierto punto tengáis un montón de kernels antiguos instalados en vuestro sistema.
No suelen molestar mucho, ya que no tienen un tamaño demasiado grande, pero hay que le gusta eliminarlos, así que aquí os adelanto como:

Para ver un listado de los paquetes con los kernels antiguos haced:

$ dpkg --get-selections | grep linux-image

Por ejemplo, a mi me devolvió esto:

slayer@NeMeSiS:~$ dpkg --get-selections | grep linux-image
linux-image-2.6.22-14-generic install
linux-image-2.6.24-16-generic install
linux-image-2.6.24-17-generic install
linux-image-2.6.24-18-generic install
linux-image-2.6.24-19-generic install
linux-image-2.6.24-21-generic install
linux-image-2.6.24-22-generic install
linux-image-2.6.24-23-generic install
linux-image-generic install

Ahora podéis eliminar todos los kernels (obviamente no eliminéis el mas reciente, dejad uno!) con esta sencilla instrucción:

$ sudo aptitude purge paquete

(paquete es cualquiera de las entradas que te ha sacado el listado de dpkg. p.ej linux-image-2.6.22-14-generic)

Si el paquete a eliminar no está actualizado te pedirá actualizarlo, luego de lo cual puedes aplicar lo mismo a las actualizaciones y paquetes antiguos:
$ sudo aptitude purge paquete

En caso que no quieras actualizar para luego eliminar puedes aplicar:

$ sudo aptitude remove paquete

pero esto puede no eliminar los ficheros de configuración del paquete.

Ahora ya solo queda editar /boot/grub/menu.lst para eliminar las entradas antiguas.

Dos notas importantes:

1.- No desinstaléis el kernel linux-image-generic ya que es necesario para recibir actualizaciones del kernel.

2.- Conservad al menos uno o dos kernels antiguos, es una buena practica de seguridad, ya que si el nuevo kernel no funcionara bien, o dejara de funcionar por cualquier motivo, no tendríais mas salida que reinstalar, y eso en casa puede no ser mucho, pero en un entorno empresarial... pueden rodar cabezas