imagen

Detectar y avisar de procesos nuevos en los servidores de nuestra red

05.May.2015 — Julio

Son multitud los procesos que pueden correr habitual o esporádicamente en los servidores u ordenadores de una red.

Sería bueno tenerlos registrados todos y cada vez que surja uno nuevo, avise a la persona encargada. Así, esa persona podría investigar sobre ese proceso y poder detectar malware.

El siguiente script en Python,

- carga de un fichero una lista de procesos ya registrados, 
- se recorre los servidores estipulados 
- y con `wmic` ejecutado en cada uno de ellos, manda un email si detecta un proceso nuevo. 
- además ese proceso queda registrado en la lista de procesos para que no vuelva a avisar.  
- en el email va como adjunto la nueva lista de procesos y el servidor sobre el que se ha detectado

Este script yo lo tengo puesto que se ejecute cada 5min.


Por supuesto tiene muchas mejoras, como cargar la lista de servidores de un fichero .ini por ejemplo, así como 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 noviembre 2010 con muy buen resultado, y es por ello que no me pide modificar nada.

procesos_grupo.pyw (en gists)

```  
import os,shutil,re,sys  
import poplib,os,sys,subprocess,time,datetime  
import urllib  
from envia_email import mandaemail  

/#  
equipo=os.getenv('COMPUTERNAME')  
servidores='server1,server2,server3,server4,server5'  
grupo='/node:'+servidores  
namelista=r'procesos_grupo_'+servidores.replace(',','_')+'_lista.txt'  
dic={}  
email=1  
haynuevo=0  
texnuevo=''  

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

/# vemos los procesos actuales  
sentencia='tasklist /fo csv'  
sentencia='wmic '+grupo+' process get name,commandline /format:csv'  
pid4 = subprocess.Popen(sentencia,shell=False,stdout=subprocess.PIPE) # con esto esperamos a que termine antes de seguir con el siguiente  
for row in pid4.stdout.readlines():  
    fila=row.split(",")  
    try:  
        proceso=fila[0]+'-->'+fila[2][:-3]  
    except:  
        continue  
    proceso=proceso.replace('"','')  
    if not proceso in dic:  
        #print proceso  
        tipo=''  
        descripcion=''  
        dic[proceso]=proceso+chr(9)+datetime.datetime.now().strftime('%d/%m/%Y %H:%M')+chr(9)+fila[1]+chr(9)+descripcion+'\n'  
        haynuevo+=1  
        texnuevo=texnuevo+proceso+'+'  

/# grabamos nueva lista  
if haynuevo>0:  
    flista=open(namelista,"w")  
    ordenado=sorted(dic.items())  
    for cada in ordenado:  
        #print dic[cada[0]][:-1]  
        flista.write(dic[cada[0]])  
    flista.close()  
    # mandamos email de aviso  
    if email>0:  
        asunto='nuevoprocesos_GRUPO_'+str(haynuevo)  
        texto=texnuevo  
        adjunto=namelista  
        mandaemail("remitente","passw","smtp",['destinatario'],asunto,texto,adjunto)  
fich_log =open("ftp_cada_5m_do_log.txt","a+")  
fich_log.write('fin procesos_grupo '+ str(datetime.datetime.now()) + '\n')  
fich_log.close()  
exit()  
```

pd: para el envio por email se necesita otro script en python (mandaemail.py)

Tags: python, security

Comments? Tweet