miércoles, 26 de octubre de 2011

Sniffer de Red - Censa la red cada minuto de los host encendidos y lo registra en una base de datos para una Estadística posterior

Descripcion:


sniffer.sh - Inicio de Archivo
---------------------------------------------------------------------------------------------------
#!/bin/bash
#script inspirado en el creado por: franklin aliaga
#script mejorado y actualizado por: Ivan Vergés (microstudi)
#script modificado para el ingreso a la Base de datos: KZ DR

#declaracion de arrays
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.0.0" )

#Array de MAC's conocidas (para que no liste las direcciones DHCP de ordenadores conocidos)
#para conocer una MAC, usar el comando "arp IP"
#separar por espacios las macs

#Interfaz de red (eth0, wlan0, etc)

#Mascara de red (24=255.255.255.0, 16=255.255.0.0)
#Mi red es de 19 Bits
MASK=19

#####################
#Menu de opciones

#aqui obtenemos la nuestra ip
#if [ ! $LOG ]; then
#echo "Mi ip: $ip"
#fi
#añadimos nuestra IP al array
IPS_CONOCIDAS[${#IPS_CONOCIDAS[*]}]=$ip
#if [ ! $LOG ]; then
#echo "No se controlan los equipos siguientes: "${IPS_CONOCIDAS[*]}
#if [ "${MACS_CONOCIDAS[*]}" != "" ] && [ ! $NOMAC ]; then
# echo "No se controlan los equipos con las MAC siguientes: "${MACS_CONOCIDAS[*]}
#fi
#fi

IPS_MAQUINA='192.168.31.6/32'

#ComproBar si existen los programas que usaremos:
if [ ! -x /usr/bin/nmap ]; then
echo "El programa nmap 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

/usr/bin/nmap -sP -n --exclude $IPS_MAQUINA ${IPS_CONOCIDAS[0]}/$MASK  | sed '/#/d' - | sed '/Nmap/d' - | sed '/^$/d' -    > /tmp/tmp1

/usr/bin/awk 'BEGIN {x=0}
   {  
if (x<2) {
     printf("%s",$0)
     x=x+1
   }
    if (x==2) {
     printf("\n")
   x = 0
  }
}' /tmp/tmp1 > /tmp/tmp2

HOST_IPS=$(</tmp/tmp2)

rm -rf /tmp/tmp1
rm -rf /tmp/tmp2
rm -rf /root/lista_export.txt

#aqui cortamos el formato obtenido anteriormente de archivo para solo obtener las ip's
IPS=$(echo "$HOST_IPS" | awk '{print $2}' )
MAC1=$(echo "$HOST_IPS" | grep Host  )
#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 - )
contador=$(echo "$contador" | cut -f1 -d "-"  )
total=$(expr $contador - 1)
#esto es para que el script tenga acceso a las X des de crontab

#Bucle de búsqueda entre las ip's encontradas
var=0
while [ $var -le $total ]; do
let var=$var+1
#capturamos la ip por linea
linea=$(echo "$IPS" | sed -n "$var p")
        MAC=$(echo "$MAC1"   | sed -n "$var p" | awk '{print $8}' )

echo "$linea|$MAC" >> lista_export.txt
done

//Se exporta al archivo lista_export.txt para luego ser ingresado a la base de datos

/usr/local/Zend/Core/bin/php /usr/local/Zend/apache2/htdocs/sistemas/net-sistema.php > /dev/null 2>&1

---------------------------------------------------------------------------------------------------
Fin de Archivo

net-sistema.php - Inicio de archivo
---------------------------------------------------------------------------------------------------


<?php

function dame_un_dato($query)
{
        include('connect.php');
        $stid = oci_parse($conn, $query);
        oci_execute($stid, OCI_DEFAULT);
        $row = oci_fetch_array($stid , OCI_RETURN_NULLS);
        return  $row[0];
}

/////////////////////////////////////////////////////////
include ('connect.php');
$archivo = file('/root/lista_export.txt');
//////////////////////////////////////
// DEVUELVE COD_NETWORK + 1
$s_cod_network = dame_un_dato("SELECT lpad( NVL(MAX(mae.Cod_Network),0)+1,6,'0') FROM net_lan_cab mae");
//////////////////////////////////////

$CantPc=0;
foreach($archivo as $linea => $contenido) {
  ++$CantPc;
}

$queryCAB = "insert into net_lan_cab (cod_network,fec_registro,cant_equi_encendidos) VALUES ('$s_cod_network',sysdate,$CantPc)";


$stid = oci_parse($conn, $queryCAB);
        if (!$stid) {
                $e = oci_error($conn);
                print htmlentities($e['message']);
                exit;
        }
$r = oci_execute($stid, OCI_DEFAULT);
        if (!$r) {
                $e = oci_error($stid);
                echo htmlentities($e['message']);
                exit;
        }
$committed = oci_commit($conn);
/////////////////////////////////////////////////

$num_id=0;
foreach($archivo as $linea => $contenido) {

  $i=0;
  $num_ip="";
  $num_mac="";
  ++$num_id;
  $array = explode('|', $contenido);
  foreach($array as $columna) {
    if ($i == 0 ) {
$num_ip=trim($columna);
    }else{
$num_mac=trim($columna);
    }
    ++$i;
  }

$queryDET = "insert into net_lan_det (cod_network, num_ip, num_mac,num_id) VALUES ('$s_cod_network','$num_ip','$num_mac',$num_id)";

$stid = oci_parse($conn, $queryDET);
        if (!$stid) {
                $e = oci_error($conn);
                print htmlentities($e['message']);
                exit;
        }
$r = oci_execute($stid, OCI_DEFAULT);
        if (!$r) {
                $e = oci_error($stid);
                echo htmlentities($e['message']);
                exit;
        }
$committed = oci_commit($conn);
}

?>
---------------------------------------------------------------------------------------------------
Fin de archivo

connect.php - Inicio de archivo
---------------------------------------------------------------------------------------------------
<?
$Servidor = '//ip-servidor/oraclesid'; //suele ser localhost
$Usuario  = "user"; //usuario de la base de datos
$Password = "user"; //contraseña de la base de datos
$conn=oci_connect($Usuario,$Password,$Servidor) or die("</br><Strong>Disculpen las molestias. Estamos trabajando para usted...</Strong>");

if (!$conn) {
$e = oci_error();
print htmlentities($e['message']);
exit;
}
?>
---------------------------------------------------------------------------------------------------
Fin de archivo

crontab -e 

* * * * * /usr/sbin/sniffer.sh

Estructura de las 2 tablas 

cabecera - (net_lan_cab)  cod_network , fec_registro , cant_equi_encendidos
detalle - (net_lan_det) cod_network , num_ip , num_mac , num_id

No hay comentarios:

Publicar un comentario