Anteriormente ya vimos como conectar diferentes recursos para obtener información de diferentes dispositivos, en este caso vamos a parsear los eventos que nos llega de Sysmon
Si observamos como nos llega los eventos de Sysmon nos damos cuenta que realmente los eventos importantes se almacenan dentro de las dos columnas «ParameterXml» y «EventData»:
esas columnas se pueden analizar mediante consultas KQL. Microsoft Publico en su repositorio unos parsers los cuales podemos utilizar: https://github.com/Azure/Azure-Sentinel/tree/master/Parsers
También tenemos los parsers de BlueTeamLabs: https://github.com/BlueTeamLabs/sentinel-attack/tree/master/parsers
Para agregar los parsers nos tenemos que ir: Azure Sentinel > Seleccionamos nuestro workspace > Logs y ejecutamos el parse que hemos mostrado en las paginas anteriores.
Una vez ejecutado la query presionamos sobre Save
Guardamos la query ejecutado como Funtion
Por alguna razón que aun no se cual es me dio muchos problemas los diferentes parsers y por lo tanto tuve que realizar algunas modificaciones en las querys.
Finalmente mi query quedo de la siguiente manera:
Event
| where Source == "Microsoft-Windows-Sysmon"
| extend RenderedDescription = tostring(split(RenderedDescription, ":")[0])
| extend EventData = parse_xml(EventData).DataItem.EventData.Data
| mv-expand bagexpansion=array EventData
| evaluate bag_unpack(EventData)
| extend Key=tostring(['@Name']), Value=['#text']
| evaluate pivot(Key, any(Value), TimeGenerated, Source, EventLog, Computer, EventLevel, EventLevelName, EventID, UserName, RenderedDescription, MG, ManagementGroupName, Type, _ResourceId)
| extend RuleName = column_ifexists("RuleName", ""), TechniqueId = column_ifexists("TechniqueId", ""), TechniqueName = column_ifexists("TechniqueName", "")
| parse RuleName with * 'technique_id=' TechniqueId ',' * 'technique_name=' TechniqueName
| project TimeGenerated, Source, EventLog, Computer, EventLevel, EventLevelName, EventID, UserName, RenderedDescription, MG, ManagementGroupName, Type, _ResourceId, CommandLine, Company, CurrentDirectory, Description, DestinationHostname, DestinationIp, DestinationIsIpv6, DestinationPort, DestinationPortName, FileVersion, Hashes, Image, ImageLoaded, Initiated, IntegrityLevel, LogonGuid, LogonId, OriginalFileName, ParentCommandLine, ParentImage, ParentProcessGuid, ParentProcessId, ProcessGuid, ProcessId, Product, Protocol,
RuleName, Signature, SignatureStatus, Signed, SourceHostname, SourceIp, SourceIsIpv6, SourcePort, SourcePortName, TerminalSessionId, User, UtcTime, TechniqueId, TechniqueName
Ahora si lanzamos cualquier query utilizando la función creada anteriormente podemos comprobar que ya podemos obtener con mayor facilidad los datos que se encontraban en «ParameterXml» y «EventData»