Skip to content

LimaCharlie WEL - Sysmon

Normalizer limacharlie sysmon windows

Maps Sysmon events delivered through LimaCharlie's Windows Event Log stream.

Part of: LimaCharlie normalizers

Add it

In Bifract, open Exchange, find LimaCharlie WEL - Sysmon and click Add. Adds an instance-wide normalizer. Needs a tenant admin.

File

exchange/normalizers/limacharlie/limacharlie-wel-sysmon-normalizer.yaml

limacharlie-wel-sysmon-normalizer.yaml
name: LimaCharlie WEL - Sysmon
description: >-
  Maps Sysmon events as delivered by LimaCharlie's WEL (Windows Event Log) stream onto
  Bifract's normalized field contract. This is not the same shape as sysmon-normalizer.yaml,
  which expects native Sysmon fields, flat or in Velociraptor's System/EventData shape. LimaCharlie wraps
  every WEL record in an envelope, so the same data arrives as event.EVENT.System.* and
  event.EVENT.EventData.*, which flatten_full turns into event_EVENT_System_* and
  event_EVENT_EventData_*.

transforms:
  - flatten_full

field_mappings:
  # Common. LimaCharlie renders EventID either as an XML element with attributes
  # (EventID.content) or as the synthetic _event_id, depending on the record.
  - sources: [event_EVENT_System_EventID_content, event_EVENT_System__event_id]
    target: event_id
  - sources: [event_EVENT_System_Computer]
    target: computer_name
  - sources: [event_EVENT_System_Channel]
    target: channel
  - sources: [event_EVENT_System_Provider_Name]
    target: provider
  - sources: [routing_sid]
    target: sensor_id

  # Events 1/3/11/22 carry Image; events 8/10 carry SourceImage. No event carries both.
  - sources: [event_EVENT_EventData_Image, event_EVENT_EventData_SourceImage]
    target: image
  - sources: [event_EVENT_EventData_TargetImage]
    target: target_image
  - sources: [event_EVENT_EventData_OriginalFileName]
    target: original_file_name
  - sources: [event_EVENT_EventData_Hashes]
    target: hash
  - sources: [event_EVENT_EventData_User]
    target: user

  # Process identity comes from Sysmon's own GUIDs, not the LimaCharlie routing atoms.
  - sources: [event_EVENT_EventData_ProcessGuid]
    target: process_guid
  - sources: [event_EVENT_EventData_ParentProcessGuid]
    target: parent_process_guid
  - sources: [event_EVENT_EventData_ParentImage]
    target: parent_image
  - sources: [event_EVENT_EventData_CommandLine]
    target: commandline
  - sources: [event_EVENT_EventData_ParentCommandLine]
    target: parent_commandline
  - sources: [event_EVENT_EventData_ProcessId]
    target: process_id
  - sources: [event_EVENT_EventData_ParentProcessId]
    target: parent_process_id

  # Sysmon uses "Guid" casing on event 8 and "GUID" on event 10; both spellings must land
  # on the same target or those branches silently emit nothing.
  - sources: [event_EVENT_EventData_SourceProcessGuid, event_EVENT_EventData_SourceProcessGUID]
    target: source_process_guid
  - sources: [event_EVENT_EventData_TargetProcessGuid, event_EVENT_EventData_TargetProcessGUID]
    target: target_process_guid
  - sources: [event_EVENT_EventData_GrantedAccess]
    target: access_flags
  - sources: [event_EVENT_EventData_NewThreadId]
    target: thread_id

  # File
  - sources: [event_EVENT_EventData_TargetFilename]
    target: target_file

  # Network
  - sources: [event_EVENT_EventData_SourceIp]
    target: src_ip
  - sources: [event_EVENT_EventData_SourcePort]
    target: src_port
  - sources: [event_EVENT_EventData_DestinationIp]
    target: dst_ip
  - sources: [event_EVENT_EventData_DestinationPort]
    target: dst_port
  - sources: [event_EVENT_EventData_Protocol]
    target: proto

  # DNS
  - sources: [event_EVENT_EventData_QueryName]
    target: query
  - sources: [event_EVENT_EventData_QueryResults]
    target: query_result

  # Registry (12/13/14)
  - sources: [event_EVENT_EventData_TargetObject]
    target: target_object
  - sources: [event_EVENT_EventData_Details]
    target: details
  - sources: [event_EVENT_EventData_EventType]
    target: event_type
  - sources: [event_EVENT_EventData_NewName]
    target: new_name

  # Image load (7)
  - sources: [event_EVENT_EventData_ImageLoaded]
    target: image_loaded
  - sources: [event_EVENT_EventData_Signed]
    target: signed
  - sources: [event_EVENT_EventData_Signature]
    target: signature
  - sources: [event_EVENT_EventData_SignatureStatus]
    target: signature_status

  # Named pipes (17/18)
  - sources: [event_EVENT_EventData_PipeName]
    target: pipe_name

# LimaCharlie outputs filter on event TYPE only, and Sysmon shares the single WEL type
# with Security, WMI-Activity, PowerShell and the classic channels. Those records also
# reach this normalizer, get their common System fields mapped, and are left with
# bifract_category unset, which is correct: an event this normalizer does not understand
# should not be claimed by a category.
value_mappings:
  - from_field: event_id
    to_field: bifract_category
    map:
      "1": process_creation
      "3": network_connect
      "6": driver_load
      "7": image_load
      "8": remote_thread
      "10": process_access
      "11": file_write
      "12": registry_event
      "13": registry_event
      "14": registry_event
      "15": create_stream_hash
      "17": pipe_created
      "18": pipe_created
      "22": dns_query
      "23": file_delete
      "26": file_delete

timestamp_fields:
  - field: routing_event_time
    format: unixmilli