comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

File Watcher

  • 1 Respuestas
  • 1987 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« en: Mayo 23, 2014, 02:08:51 am »
Buscando en un backup acabo de encontrar este script y lo dejo por si a alguien le sirve.

Hace un tiempo programé un wargame y necesitaba una manera de comprobar que nadie hubiese comprometido los archivos de la web. Las opciones eran verificar los arhivos de más de 20 retos a mano y comprobar que no hubiesen subido una shell o incrustado código en algún php existente. Así que decidí codear un script que me indicara si se creó o modificó algún archivo.

Funcionamiento de script: El script crawlea un directorio y guarda en una "base de datos" (en este caso un diccionario serializado) la ruta de los archivos y sus respectivos hash md5. Para comprobar si un archivo a sido modificado, simplemente se compara su hash md5 con el que está en la BD y obviamente si el archivo no se encuentra en la BD es porque fue creado despues.

Además indica los archivos de backup (.*~) que encuentra.

Código: Python
  1. # -*- coding: utf-8 -*-
  2.  
  3. #11Sep
  4.  
  5. import os
  6. import sys
  7. import hashlib
  8. import cPickle
  9.  
  10. recursividad = False
  11. diccionario = {}
  12. COLORES = {
  13.     "archivo": "\033[91m\t[Archivo nuevo] %s\033[0m",     # Rojo
  14.     "carpeta": "\033[94m\t[Carpeta nueva] %s\033[0m",     # Azul
  15.     "modificado": "\033[93m\t[Modificado] %s\033[0m",     # Amarillo
  16.     "backup": "\033[91m\t[BACKUP] %s\033[0m",             # Rojo
  17. }
  18.  
  19. MENU = """Modo de uso:
  20. %s ruta [parametros]
  21.  
  22. -r          Modo recursivo
  23. -a          Actualiza la BD
  24. -v          Para ver archivos y hashes
  25. """
  26.  
  27.  
  28. def imprimir(data, color):
  29.     if its_linux:
  30.         print COLORES[color] % data
  31.     else:
  32.         print data
  33.  
  34. def es_archivo(ruta):
  35.     if os.path.isfile(ruta):
  36.         return True
  37.  
  38. def es_directorio(ruta):
  39.     if os.path.isdir(ruta):
  40.         return True
  41.  
  42. def guardar():
  43.     with open("./data.sf", "wb") as archivo:
  44.         cPickle.dump(diccionario, archivo, 2)
  45.  
  46. def cargar():
  47.     global diccionario
  48.     try:
  49.         with open("./data.sf", "rb") as archivo:
  50.             diccionario = cPickle.load(archivo)
  51.         return True
  52.     except:
  53.         return False
  54.  
  55. def get_md5(ruta):
  56.     md5 = hashlib.md5()
  57.     with open(ruta, "r") as hash:
  58.         for linea in hash.readlines():
  59.             md5.update(linea)
  60.     return md5.hexdigest()
  61.  
  62. def recorrer(path, opt):
  63.     if es_directorio(path):
  64.        
  65.         if not diccionario.has_key(path):
  66.             diccionario[path] = {}
  67.             imprimir(path, "carpeta")
  68.        
  69.         archivos = os.listdir(path)
  70.        
  71.         for archivo in archivos:
  72.             ruta_completa = os.path.join(path, archivo)
  73.             if es_archivo(ruta_completa):
  74.                 extension = os.path.splitext(ruta_completa)[1]
  75.                 if extension.endswith("~"):
  76.                     imprimir(ruta_completa, "backup")
  77.                
  78.                 if opt == 1:
  79.                     diccionario[path][archivo] = get_md5(ruta_completa)
  80.                 else:
  81.                     md5 = get_md5(ruta_completa)
  82.                     md5_bd = diccionario[path].get(archivo)
  83.                     if md5_bd:    
  84.                         if md5_bd != md5:
  85.                             imprimir(ruta_completa, "modificado")
  86.                     else:
  87.                         imprimir(ruta_completa, "archivo")
  88.  
  89.             elif es_directorio(ruta_completa) and recursividad:
  90.                 recorrer(ruta_completa, opt)
  91.  
  92. its_linux = (os.name == "posix")
  93.  
  94. argumentos = sys.argv
  95. if len(argumentos) > 1:
  96.     parametros = []
  97.     ruta = argumentos[1]
  98.     parametros = argumentos[2:]
  99.    
  100.     if "-r" in parametros:
  101.         recursividad = True
  102.    
  103.     if not es_directorio(ruta):
  104.         print "Ruta no valida"
  105.         exit()
  106.     else:
  107.         if "-a" in parametros:
  108.             diccionario = {}
  109.             recorrer(ruta, 1)
  110.             guardar()
  111.             exit()
  112.         if cargar():
  113.             recorrer(ruta, 2)
  114.         else:
  115.             recorrer(ruta, 1)
  116.             guardar()
  117.    
  118.     if "-v" in parametros:
  119.         for x, y in diccionario.iteritems():
  120.             print x
  121.             for archivo, hash in sorted(y.iteritems()):
  122.                 print "\t", archivo, hash
  123.        
  124. else:
  125.     print MENU % os.path.split(argumentos[0])[-1]

Las opciones son:
-v: para ver la BD de los archivos y hashes md5
-a: para actualizar la BD
-r: para recorrer las carpetas en modo recursivo








Saludos!






You are not allowed to view links. Register or Login

Desconectado morodog

  • *
  • Underc0der
  • Mensajes: 350
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
  • Skype: MorodoG
  • Twitter: m4r4d4g
« Respuesta #1 en: Mayo 23, 2014, 04:14:46 am »
Muy útil! Gracias.

Saludos.

 

¿Te gustó el post? COMPARTILO!



[Código-Python] If file exists Python puro - JaAViEr

Iniciado por JaAViEr

Respuestas: 5
Vistas: 1743
Último mensaje Agosto 21, 2011, 09:29:56 pm
por blozzter
File and Process VT Checker

Iniciado por Sanko

Respuestas: 1
Vistas: 1925
Último mensaje Abril 12, 2013, 11:59:09 am
por Once
File-Sorter

Iniciado por ZanGetsu

Respuestas: 0
Vistas: 906
Último mensaje Julio 19, 2017, 08:04:55 pm
por ZanGetsu