juliobm algunos videos algunas notas algunos scripts aprendiendo

Detectar y avisar nuevas concesiones de IP en nuestra red DHCP

Si tienes una red en Windows y un servidor DHCP en ella, sería bueno que cada vez que se conecte un equipo nuevo a nuestra red, recibamos un aviso sobre ello, así como su mac, su nombre y la IP asignada.

El siguiente script en Python,

Este script hay que ponerlo en el servidor DHCP y yo lo tengo puesto que se ejecute cada 5min.

Por supuesto es muy mejorable, por ejemplo cargar en un fichero .ini los datos del email (destinatario, datos de smtp, etc..), pero como me funciona y es para mi uso particular … me da pereza.

Lo tengo instalado desde ++junio 2011++ con muy buen resultado, ya que me ha avisado bastantes veces de gente que intenta enchufar a la red corporativa equipos no validados.

dhcp_nuevo.pyw (en gists)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import poplib, smtplib, datetime, os
import locale, unicodedata

from email.Parser import Parser
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders

def mandaemail(user,passw,smtp,aquien,subject,texto,adjunto):
    msg = MIMEMultipart()

    textomsg=MIMEText(texto)
    msg['Subject']=subject
    msg['From']=user
    msg['To']=aquien
    msg.attach(textomsg)

    if adjunto<>"":
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(adjunto,"rb").read() )
        Encoders.encode_base64(part)
        (directorio, fichero) = os.path.split(adjunto)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
                            % fichero)
        msg.attach(part)

    smtp=smtplib.SMTP(smtp)
    smtp.login(user,passw)

    smtp.sendmail(msg['From'],msg['To'],msg.as_string())
    smtp.close()

def dhcp_log():
    # el nombre del fichero log dhcp a pelo
    locale.setlocale(locale.LC_TIME, '')
    ruta = r'c:\windows\system32\dhcp'
    dia = datetime.datetime.now().strftime('%a')
    if datetime.datetime.now().isoweekday() == 3:
        dia = 'Mier'


    return ruta + '\DhcpSrvLog-' + dia + '.log'


#
fic_dhcp_hoy = dhcp_log()
#fic_dhcp_hoy = 'dhcpsrvlog-lun.log'
fic_fichados = 'dchp_fichados.txt'
dic={}
email=1
haynuevo=0
texnuevo=''
# Id., fecha, hora, descripción, dirección IP, nombre de host, dirección MAC
# cagemos id = 11 que tiene la mac

# leemos todos los pc que tenemos grabados
if os.path.exists(fic_fichados):
    fic_abre_fichados = open(fic_fichados,"r")
    lista=fic_abre_fichados.readlines()
    for cada in lista:
        cadena=cada.split(chr(9))[:-1]
        if len(cadena)>0:
            dic[cadena[0]]=cada[:-1]
    fic_abre_fichados.close()

# vemos los pcs asignados del log dhcp
if os.path.exists(fic_dhcp_hoy):
    fic_abre_dhcp_hoy = open(fic_dhcp_hoy,"r")
    for row in fic_abre_dhcp_hoy.readlines():
        fila=row.split(",")
        try:
            pc = fila[5]
            #print fila
            mac = fila[6]
            ip = fila[4]
	    	fecha = fila[1]
            hora = fila[2]
            id = fila[0]
        except:
            continue
	if pc=='' and mac<>'':
		pc=mac
    if pc <> ''  and not pc in dic:
        if id=='11' or id=='10':
        	dic[pc] = pc + chr(9) + ip + chr(9) + mac + chr(9) + fecha + chr(9) + hora
            haynuevo += 1
            texnuevo = texnuevo + pc.split(".")[0] + '_' + mac + '+'

# grabamos nueva lista pcs grabados
if haynuevo>0:
    fic_abre_fichados = open(fic_fichados,"w")
    ordenado=sorted(dic.items())
    #print ordenado
    for cada in ordenado:
        #print dic[cada[0]]
        fic_abre_fichados.write(dic[cada [0]] + '\n' )
    fic_abre_fichados.close()
    # mandamos email de aviso
    if email>0:
        asunto = 'dhcp_nuevos_'+str(haynuevo)
        texto = texnuevo
        adjunto = fic_fichados
        aquien='a@quienquieras.com'
        mandaemail("remitente","passw","smtp",aquien,asunto,texto,adjunto)
        
exit()


'''
                    Registro de actividad del servicio DHCP de Microsoft


ID de suceso  Significado
00        Se inició el registro.
01        Se detuvo el registro.
02        Se pausó temporalmente el registro debido a la falta de espacio en disco.
10        Se concedió una nueva dirección IP a un cliente.
11        Un cliente renovó la concesión.
12        Un cliente liberó la concesión.
13        Se encontró una dirección IP en uso en la red.
14        No se pudo atender una solicitud de concesión debido a que
          se agotó el conjunto de direcciones del ámbito.
15        Se denegó una concesión.
16        Se eliminó una concesión.
17        Caducó una concesión.
20        Se concedió una dirección BOOTP a un cliente.
21        Se concedió una dirección dinámica BOOTP a un cliente.
22        No se pudo atender una solicitud de BOOTP debido a que
          se agotó el conjunto de direcciones del ámbito para BOOTP.
23        Se eliminó una dirección BOOTP IP después de comprobar
          que no estaba en uso.
24        Se ha iniciado la operación de eliminación de direcciones IP.
25        Estadísticas de eliminación de direcciones IP.
30        Solicitud de actualización de DNS para el servidor DNS nombrado
31        Error de actualización de DNS
32        Actualización correcta de DNS
50+      Los códigos superiores a 50 se usan para información de detección de servidores Rogue.
'''