File Watcher

Iniciado por Once, Mayo 23, 2014, 02:08:51 AM

Tema anterior - Siguiente tema

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

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
# -*- coding: utf-8 -*-

#11Sep

import os
import sys
import hashlib
import cPickle

recursividad = False
diccionario = {}
COLORES = {
    "archivo": "\033[91m\t[Archivo nuevo] %s\033[0m",     # Rojo
    "carpeta": "\033[94m\t[Carpeta nueva] %s\033[0m",     # Azul
    "modificado": "\033[93m\t[Modificado] %s\033[0m",     # Amarillo
    "backup": "\033[91m\t[BACKUP] %s\033[0m",             # Rojo
}

MENU = """Modo de uso:
%s ruta [parametros]

-r          Modo recursivo
-a          Actualiza la BD
-v          Para ver archivos y hashes
"""


def imprimir(data, color):
    if its_linux:
        print COLORES[color] % data
    else:
        print data

def es_archivo(ruta):
    if os.path.isfile(ruta):
        return True

def es_directorio(ruta):
    if os.path.isdir(ruta):
        return True

def guardar():
    with open("./data.sf", "wb") as archivo:
        cPickle.dump(diccionario, archivo, 2)

def cargar():
    global diccionario
    try:
        with open("./data.sf", "rb") as archivo:
            diccionario = cPickle.load(archivo)
        return True
    except:
        return False

def get_md5(ruta):
    md5 = hashlib.md5()
    with open(ruta, "r") as hash:
        for linea in hash.readlines():
            md5.update(linea)
    return md5.hexdigest()

def recorrer(path, opt):
    if es_directorio(path):
       
        if not diccionario.has_key(path):
            diccionario[path] = {}
            imprimir(path, "carpeta")
       
        archivos = os.listdir(path)
       
        for archivo in archivos:
            ruta_completa = os.path.join(path, archivo)
            if es_archivo(ruta_completa):
                extension = os.path.splitext(ruta_completa)[1]
                if extension.endswith("~"):
                    imprimir(ruta_completa, "backup")
               
                if opt == 1:
                    diccionario[path][archivo] = get_md5(ruta_completa)
                else:
                    md5 = get_md5(ruta_completa)
                    md5_bd = diccionario[path].get(archivo)
                    if md5_bd:   
                        if md5_bd != md5:
                            imprimir(ruta_completa, "modificado")
                    else:
                        imprimir(ruta_completa, "archivo")

            elif es_directorio(ruta_completa) and recursividad:
                recorrer(ruta_completa, opt)

its_linux = (os.name == "posix")

argumentos = sys.argv
if len(argumentos) > 1:
    parametros = []
    ruta = argumentos[1]
    parametros = argumentos[2:]
   
    if "-r" in parametros:
        recursividad = True
   
    if not es_directorio(ruta):
        print "Ruta no valida"
        exit()
    else:
        if "-a" in parametros:
            diccionario = {}
            recorrer(ruta, 1)
            guardar()
            exit()
        if cargar():
            recorrer(ruta, 2)
        else:
            recorrer(ruta, 1)
            guardar()
   
    if "-v" in parametros:
        for x, y in diccionario.iteritems():
            print x
            for archivo, hash in sorted(y.iteritems()):
                print "\t", archivo, hash
       
else:
    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. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Muy útil! Gracias.

Saludos.