Tiene un problema con el análisis de los registros de Snort usando el módulo de pyparsing.Analizando Snort Logs con PyParsing
El problema es separar el registro de Snort (que tiene entradas de líneas múltiples separadas por una línea en blanco) y pellizcar para analizar cada entrada como un todo, en lugar de leer en línea y esperar que la gramática funcione con cada línea (obviamente, no).
He intentado convertir cada fragmento en una cadena temporal, quitando las líneas nuevas dentro de cada fragmento, pero se niega a procesar correctamente. Puede que esté completamente en el camino equivocado, pero no lo creo (una forma similar funciona perfectamente para registros tipo syslog, pero esas son entradas de una sola línea y se prestan para el procesamiento básico de iterador/línea de archivos)
he aquí una muestra del registro y el código que tengo hasta ahora:
[**] [1:486:4] ICMP Destination Unreachable Communication with Destination Host is Administratively Prohibited [**]
[Classification: Misc activity] [Priority: 3]
08/03-07:30:02.233350 172.143.241.86 -> 63.44.2.33
ICMP TTL:61 TOS:0xC0 ID:49461 IpLen:20 DgmLen:88
Type:3 Code:10 DESTINATION UNREACHABLE: ADMINISTRATIVELY PROHIBITED HOST FILTERED
** ORIGINAL DATAGRAM DUMP:
63.44.2.33:41235 -> 172.143.241.86:4949
TCP TTL:61 TOS:0x0 ID:36212 IpLen:20 DgmLen:60 DF
Seq: 0xF74E606
(32 more bytes of original packet)
** END OF DUMP
[**] ...more like this [**]
y el código de actualización:
def snort_parse(logfile):
header = Suppress("[**] [") + Combine(integer + ":" + integer + ":" + integer) + Suppress("]") + Regex(".*") + Suppress("[**]")
cls = Optional(Suppress("[Classification:") + Regex(".*") + Suppress("]"))
pri = Suppress("[Priority:") + integer + Suppress("]")
date = integer + "/" + integer + "-" + integer + ":" + integer + "." + Suppress(integer)
src_ip = ip_addr + Suppress("->")
dest_ip = ip_addr
extra = Regex(".*")
bnf = header + cls + pri + date + src_ip + dest_ip + extra
def logreader(logfile):
chunk = []
with open(logfile) as snort_logfile:
for line in snort_logfile:
if line !='\n':
line = line[:-1]
chunk.append(line)
continue
else:
print chunk
yield " ".join(chunk)
chunk = []
string_to_parse = "".join(logreader(logfile).next())
fields = bnf.parseString(string_to_parse)
print fields
Cualquier ayuda, punteros, RTFMs, lo están haciendo males, etc. ., apreciado enormemente.
Eres un dios. Esta es una solución más allá de mi experiencia, pero pronto será implementada tan pronto como me haga entender todas las partes que trabajan. ¡Gracias! –
+1 - Buena respuesta ~ unutbu, ¡pásame al golpe! (Tu código groupby se ve bastante loco, tendré que ordenarlo cuando tenga unos minutos.) – PaulMcG
+ muchas solo por el uso encantador y elegante de 'groupby'. – katrielalex