-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfile_system_analyzer.py
More file actions
161 lines (140 loc) · 5.59 KB
/
file_system_analyzer.py
File metadata and controls
161 lines (140 loc) · 5.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Analizador de Sistemas de Archivos
Este script analiza el sistema de archivos en busca de indicadores
de compromiso y actividad maliciosa.
"""
import os
import logging
from datetime import datetime
import json
import argparse
import hashlib
import stat
import time
from pathlib import Path
import magic
class FileSystemAnalyzer:
def __init__(self, directorio, output_file='filesystem_analysis.json'):
"""
Inicializa el analizador de sistema de archivos
Args:
directorio (str): Directorio a analizar
output_file (str): Archivo de salida para los resultados
"""
self.directorio = directorio
self.output_file = output_file
self.extensiones_sospechosas = [
'.exe', '.dll', '.bat', '.cmd', '.ps1', '.vbs',
'.js', '.jse', '.wsf', '.wsh', '.msi', '.scr'
]
self.patrones_sospechosos = [
'cmd.exe',
'powershell.exe',
'wscript.exe',
'cscript.exe',
'mshta.exe'
]
self.resultados = {
'fecha_analisis': datetime.now().isoformat(),
'directorio': directorio,
'archivos_analizados': [],
'alertas': []
}
def calcular_hash(self, archivo):
"""Calcula el hash MD5 de un archivo"""
try:
with open(archivo, 'rb') as f:
return hashlib.md5(f.read()).hexdigest()
except Exception as e:
logging.error(f"Error al calcular hash de {archivo}: {str(e)}")
return None
def analizar_permisos(self, archivo):
"""Analiza los permisos de un archivo"""
try:
st = os.stat(archivo)
permisos = {
'usuario': st.st_uid,
'grupo': st.st_gid,
'modo': oct(st.st_mode)[-3:],
'tamaño': st.st_size,
'ultimo_acceso': datetime.fromtimestamp(st.st_atime).isoformat(),
'ultima_modificacion': datetime.fromtimestamp(st.st_mtime).isoformat()
}
return permisos
except Exception as e:
logging.error(f"Error al analizar permisos de {archivo}: {str(e)}")
return None
def analizar_archivo(self, archivo):
"""Analiza un archivo en busca de indicadores sospechosos"""
try:
info = {
'ruta': str(archivo),
'nombre': archivo.name,
'hash': self.calcular_hash(archivo),
'permisos': self.analizar_permisos(archivo),
'tipo': magic.from_file(str(archivo)),
'sospechoso': False,
'razones': []
}
# Verificar extensión sospechosa
if archivo.suffix.lower() in self.extensiones_sospechosas:
info['sospechoso'] = True
info['razones'].append('Extensión sospechosa')
# Verificar nombre sospechoso
if any(patron in archivo.name.lower() for patron in self.patrones_sospechosos):
info['sospechoso'] = True
info['razones'].append('Nombre sospechoso')
# Verificar permisos inusuales
if info['permisos'] and info['permisos']['modo'] in ['777', '666']:
info['sospechoso'] = True
info['razones'].append('Permisos inusuales')
# Verificar archivos ocultos
if archivo.name.startswith('.'):
info['sospechoso'] = True
info['razones'].append('Archivo oculto')
self.resultados['archivos_analizados'].append(info)
if info['sospechoso']:
alerta = {
'tipo': 'archivo_sospechoso',
'archivo': str(archivo),
'razones': info['razones'],
'timestamp': datetime.now().isoformat()
}
self.resultados['alertas'].append(alerta)
except Exception as e:
logging.error(f"Error al analizar archivo {archivo}: {str(e)}")
def analizar_directorio(self):
"""Analiza todos los archivos en el directorio"""
try:
for root, _, files in os.walk(self.directorio):
for file in files:
archivo = Path(root) / file
self.analizar_archivo(archivo)
except Exception as e:
logging.error(f"Error al analizar directorio: {str(e)}")
def generar_reporte(self):
"""Genera un reporte con los resultados del análisis"""
try:
with open(self.output_file, 'w') as f:
json.dump(self.resultados, f, indent=4)
logging.info(f"Reporte generado en {self.output_file}")
except Exception as e:
logging.error(f"Error al generar reporte: {str(e)}")
def main():
parser = argparse.ArgumentParser(description='Analizador de Sistemas de Archivos')
parser.add_argument('directorio', help='Directorio a analizar')
parser.add_argument('--output', default='filesystem_analysis.json',
help='Archivo de salida para los resultados')
args = parser.parse_args()
# Configurar logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
analyzer = FileSystemAnalyzer(args.directorio, args.output)
analyzer.analizar_directorio()
analyzer.generar_reporte()
if __name__ == "__main__":
main()