Detectar y avisar de procesos nuevos en los servidores de nuestra red
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)