ES|QL

Sigma to Elastic ES|QL

Paste a Sigma rule, get an ES|QL pipeline query for Elastic — with Sigma's case-insensitive matching actually preserved. Free, no sign-up.

  1. Paste the ruleYAML in
  2. Pick your SIEMElastic Security · ES|QL
  3. Read the reportQuery, field map, gaps
certutil
Tab indents · Shift+Tab outdents · Esc then Tab leaves the fieldValid Sigmaprocess_creation · windows29 lines · 968 B
Splunk logo An information technology company based in California, United States Splunk2
Microsoft3
Elastic3
CrowdStrike1
SentinelOne1
Palo Alto Networks1
Carbon BlackCarbon Black2
Google Security OperationsGoogle1
IBM1
Sumo Logic1
Rapid71
Graylog1
OpenSearch2
Grafana1
DFIR2
FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
| WHERE event.category == "process" AND event.type == "start" AND ((TO_LOWER(process.executable) LIKE """*\\certutil.exe""" OR TO_LOWER(process.pe.original_file_name) LIKE """certutil.exe""") AND (TO_LOWER(process.command_line) LIKE """*-encode*""" OR TO_LOWER(process.command_line) LIKE """*/encode*"""))
2 lines · 413 B2/2 conditions

Notes — not part of the query

Target: Elastic Security (ES|QL) — engine 1.0.1 — 2026-09-09

Profile: windows / process_creation → Elastic Security

Coverage: 2/2 conditions

Setup (logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*): The FROM clause lists the conventional index patterns for this log source — logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*. Adjust them to wherever your deployment ships this telemetry before running the query; an ES|QL detection rule takes its indices from the query's own FROM (type 'esql', language 'esql'), not from an index array on the rule object.

huntrule.com — sigma 7c1e0a34-2b5f-4d18-9a63-0c8b1f4e5a71 — HuntRule Team — NOASSERTION

Verify against your own telemetry before deploying.

Elastic Security ES|QL detection rule JSON

{
  "rule_id": "7c1e0a34-2b5f-4d18-9a63-0c8b1f4e5a71",
  "name": "Base64 Encoding Via Built-In Windows Utility",
  "description": "A sample rule for the huntrule.com converter. Detects a built-in utility being asked to\nbase64-encode a file, which is a common way to stage data before moving it off a host.\nThe flag is written out in both its dash and slash spellings, because the utility\naccepts either and a rule that names only one misses half the invocations.",
  "type": "esql",
  "language": "esql",
  "query": "FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-* METADATA _id\n| WHERE event.category == \"process\" AND event.type == \"start\" AND ((TO_LOWER(process.executable) LIKE \"\"\"*\\\\certutil.exe\"\"\" OR TO_LOWER(process.pe.original_file_name) LIKE \"\"\"certutil.exe\"\"\") AND (TO_LOWER(process.command_line) LIKE \"\"\"*-encode*\"\"\" OR TO_LOWER(process.command_line) LIKE \"\"\"*/encode*\"\"\"))",
  "severity": "medium",
  "risk_score": 47,
  "from": "now-6m",
  "interval": "5m",
  "to": "now",
  "enabled": false,
  "author": [
    "HuntRule Team"
  ],
  "tags": [
    "huntrule.com",
    "sigma:7c1e0a34-2b5f-4d18-9a63-0c8b1f4e5a71"
  ],
  "note": "[huntrule] Generated from Sigma rule 7c1e0a34-2b5f-4d18-9a63-0c8b1f4e5a71 (\"Base64 Encoding Via Built-In Windows Utility\") by huntrule.com on 2026-09-09. Engine 1.0.1. Original author: HuntRule Team.\nDefaults applied: severity=medium→medium, risk_score=47, from=now-6m, interval=5m, enabled=false.\nREVIEW BEFORE DEPLOYING.",
  "threat": [
    {
      "framework": "MITRE ATT&CK",
      "tactic": {
        "id": "TA0009",
        "name": "Collection",
        "reference": "https://attack.mitre.org/tactics/TA0009/"
      },
      "techniques": [
        {
          "id": "T1560",
          "name": "Archive Collected Data",
          "reference": "https://attack.mitre.org/techniques/T1560/",
          "subtechniques": [
            {
              "id": "T1560.001",
              "name": "Archive via Utility",
              "reference": "https://attack.mitre.org/techniques/T1560/001/"
            }
          ]
        }
      ]
    }
  ]
}

risk_score: risk_score has no vendor-published level→score table; this is a product decision, not a documented mapping.

unlike every other target in this document, Elastic de-duplicates alerts discovered during the additional look-back overlap, so applying the window==frequency rule here would cause missed alerts instead of preventing duplicates — the 1m overlap above is Elastic's own recommended minimum

Imported rules land disabled (enabled=false); review the FROM indices and enable the rule after checking it against your telemetry.

POST /api/detection_engine/rules46 lines · 2.1 KB

Verify this query against your own telemetry before deploying it — a converted rule is a starting point, not a tuned detection.

No account needed for this, and none for reading the library. Every rule shows the reporting behind it, the telemetry it needs and the ATT&CK technique it covers. Sign in to keep the ones you use.

Conversion reportwindows / process_creation → Elastic Security3 fields mappedClean

Every condition converted cleanly to Elastic Security ES|QL.

Profile

Matched on product + category

Field map

Sigma fieldTarget fieldSource
CommandLineprocess.command_linegithub.com
Imageprocess.executablegithub.com
OriginalFileNameprocess.pe.original_file_namegithub.com

Coverage

  1. selection_imgexpressed
  2. selection_cliexpressed

2 / 2 conditions expressed

Engine 1.0.12026-09-09Rule licensed NOASSERTION

Worked examples on Elastic Security

Real published rules run through the same engine as the tool above — including the ones it cannot take whole.

  1. Base64 Encoding Via Built-In Windows Utilitywindows / process_creationClean

    Sigma

    title: Base64 Encoding Via Built-In Windows Utility
    id: 7c1e0a34-2b5f-4d18-9a63-0c8b1f4e5a71
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects a built-in utility being asked to
        base64-encode a file, which is a common way to stage data before moving it off a host.
        The flag is written out in both its dash and slash spellings, because the utility
        accepts either and a rule that names only one misses half the invocations.
    author: HuntRule Team
    date: 2026-08-01
    tags:
        - attack.collection
        - attack.t1560.001
    logsource:
        category: process_creation
        product: windows
    detection:
        selection_img:
            - Image|endswith: '\certutil.exe'
            - OriginalFileName: 'CertUtil.exe'
        selection_cli:
            CommandLine|contains:
                - '-encode'
                - '/encode'
        condition: all of selection_*
    falsepositives:
        - Administrative scripts that legitimately encode files
    level: medium
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND ((TO_LOWER(process.executable) LIKE """*\\certutil.exe""" OR TO_LOWER(process.pe.original_file_name) LIKE """certutil.exe""") AND (TO_LOWER(process.command_line) LIKE """*-encode*""" OR TO_LOWER(process.command_line) LIKE """*/encode*"""))

    Every condition converted cleanly to Elastic Security ES|QL. 2/2 conditions

  2. PowerShell Download Cradle On The Command Linewindows / process_creationClean

    Sigma

    title: PowerShell Download Cradle On The Command Line
    id: 1f9d4c02-6a77-4e5b-8c31-2d0af7b96e48
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects the download-and-run pattern where a
        remote payload is fetched and executed in one command. It exercises a value list under a
        single field, which every backend has to expand into its own OR form.
    author: HuntRule Team
    date: 2026-08-01
    tags:
        - attack.execution
        - attack.t1059.001
    logsource:
        category: process_creation
        product: windows
    detection:
        selection_fetch:
            CommandLine|contains:
                - '.DownloadString('
                - '.DownloadFile('
                - 'Invoke-WebRequest '
                - 'Invoke-RestMethod '
        selection_run:
            CommandLine|contains:
                - '| IEX'
                - 'IEX ('
                - 'Invoke-Expression'
        condition: all of selection_*
    falsepositives:
        - Installers and package managers that fetch and run their own payloads
    level: high
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND ((TO_LOWER(process.command_line) LIKE """*.downloadstring(*""" OR TO_LOWER(process.command_line) LIKE """*.downloadfile(*""" OR TO_LOWER(process.command_line) LIKE """*invoke-webrequest *""" OR TO_LOWER(process.command_line) LIKE """*invoke-restmethod *""") AND (TO_LOWER(process.command_line) LIKE """*| iex*""" OR TO_LOWER(process.command_line) LIKE """*iex (*""" OR TO_LOWER(process.command_line) LIKE """*invoke-expression*"""))

    Every condition converted cleanly to Elastic Security ES|QL. 2/2 conditions

  3. Registry Import With A Suspicious Pathwindows / process_creationClean

    Sigma

    title: Registry Import With A Suspicious Path
    id: 5b3a8e91-4c26-4f70-b1d8-6e97c30a2f5d
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects a registry import whose argument does
        not look like an ordinary file path. It exercises a regular expression alongside a `not`
        filter, so the report has both a regex to check against the target's engine and a negated
        branch to place.
    author: HuntRule Team
    date: 2026-08-01
    tags:
        - attack.defense-evasion
        - attack.t1112
    logsource:
        category: process_creation
        product: windows
    detection:
        selection_img:
            - Image|endswith: '\regedit.exe'
            - OriginalFileName: 'REGEDIT.EXE'
        selection_cli:
            CommandLine|contains: '.reg'
            CommandLine|re: ':[^ \\]'
        filter_flags:
            CommandLine|contains|windash:
                - ' -e '
                - ' -a '
        condition: all of selection_* and not filter_flags
    falsepositives:
        - Scripted registry maintenance
    level: high
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND ((TO_LOWER(process.executable) LIKE """*\\regedit.exe""" OR TO_LOWER(process.pe.original_file_name) LIKE """regedit.exe""") AND TO_LOWER(process.command_line) LIKE """*.reg*""" AND process.command_line RLIKE """.*:[^ \\].*""" AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* -e *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* /e *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* –e *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* —e *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* ―e *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* -a *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* /a *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* –a *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* —a *"""))) AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """* ―a *"""))))

    Every condition converted cleanly to Elastic Security ES|QL. 3/3 conditions

  4. File Copy Through The Print Utilitywindows / process_creationClean

    Sigma

    title: File Copy Through The Print Utility
    id: 3e6c17b8-9f40-4a2d-85e1-7b4d0c9a6f23
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects the print utility being used to copy an
        executable rather than to print. It exercises `startswith` together with `contains|all`, where
        several substrings must all appear in one field.
    author: HuntRule Team
    date: 2026-08-01
    tags:
        - attack.defense-evasion
        - attack.t1218
    logsource:
        category: process_creation
        product: windows
    detection:
        selection:
            Image|endswith: '\print.exe'
            CommandLine|startswith: 'print'
            CommandLine|contains|all:
                - '/D'
                - '.exe'
        filter_self:
            CommandLine|contains: 'print.exe'
        condition: selection and not filter_self
    falsepositives:
        - Printing a file whose name ends in .exe
    level: medium
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND (TO_LOWER(process.executable) LIKE """*\\print.exe""" AND TO_LOWER(process.command_line) LIKE """print*""" AND TO_LOWER(process.command_line) LIKE """*/d*""" AND TO_LOWER(process.command_line) LIKE """*.exe*""" AND ((process.command_line IS NULL OR NOT (TO_LOWER(process.command_line) LIKE """*print.exe*"""))))

    Every condition converted cleanly to Elastic Security ES|QL. 2/2 conditions

  5. Scheduled Task Created From A Temp Pathwindows / process_creationClean

    Sigma

    title: Scheduled Task Created From A Temp Path
    id: 9d24a3ee-8a1b-4f26-b90f-4a71e2c85d17
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects schtasks.exe registering a task whose
        command line points into a temp directory, a common persistence shape. It exercises the
        bread-and-butter Sigma form — several selections ANDed by the condition — with no exotic
        modifiers, so it converts on every shipped target.
    author: HuntRule Team
    date: 2026-08-11
    tags:
        - attack.persistence
        - attack.t1053.005
    logsource:
        category: process_creation
        product: windows
    detection:
        selection_img:
            Image|endswith: '\schtasks.exe'
        selection_create:
            CommandLine|contains: '/create'
        selection_path:
            CommandLine|contains:
                - '\AppData\Local\Temp\'
                - '\Windows\Temp\'
        condition: all of selection_*
    falsepositives:
        - Installers registering update tasks from their extraction directory
    level: medium
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND (TO_LOWER(process.executable) LIKE """*\\schtasks.exe""" AND TO_LOWER(process.command_line) LIKE """*/create*""" AND (TO_LOWER(process.command_line) LIKE """*\\appdata\\local\\temp\\*""" OR TO_LOWER(process.command_line) LIKE """*\\windows\\temp\\*"""))

    Every condition converted cleanly to Elastic Security ES|QL. 3/3 conditions

  6. LSASS Memory Dump Via Comsvcswindows / process_creationClean

    Sigma

    title: LSASS Memory Dump Via Comsvcs
    id: 6a95c2d4-1e08-4f7b-9d52-8c41e7b30a96
    status: experimental
    description: |
        A sample rule for the huntrule.com converter. Detects the comsvcs.dll MiniDump export being
        invoked through rundll32 to dump process memory, a common LSASS credential-theft technique.
        It exercises `endswith` against the image path together with `contains|all` on one field.
    author: HuntRule Team
    date: 2026-08-10
    tags:
        - attack.credential-access
        - attack.t1003.001
    logsource:
        category: process_creation
        product: windows
    detection:
        selection_img:
            Image|endswith: '\rundll32.exe'
        selection_cli:
            CommandLine|contains|all:
                - 'comsvcs'
                - 'MiniDump'
        condition: all of selection_*
    falsepositives:
        - Administrators legitimately capturing a process dump with comsvcs
    level: high
    

    Elastic Security · ES|QL

    FROM logs-endpoint.events.process-*, logs-windows.sysmon_operational-*, logs-system.security*, winlogbeat-*
    | WHERE event.category == "process" AND event.type == "start" AND (TO_LOWER(process.executable) LIKE """*\\rundll32.exe""" AND TO_LOWER(process.command_line) LIKE """*comsvcs*""" AND TO_LOWER(process.command_line) LIKE """*minidump*""")

    Every condition converted cleanly to Elastic Security ES|QL. 2/2 conditions

What to know about Elastic Security ES|QL

ES|QL is Elastic's third query surface and the first one where a Sigma rule's case semantics can be kept rather than flagged. KQL and Lucene match keyword fields byte-exactly and have no operator to change that, so a converted rule silently becomes case-sensitive. ES|QL has TO_LOWER, and since 9.1 the optimizer pushes a TO_LOWER comparison down into an index-level case-insensitive query — so this converter folds both sides, emits TO_LOWER(field) LIKE against a lowercased value, and PowerShell.EXE matches powershell the way the rule's author expected. A |cased modifier drops the fold and matches exactly.

The query is a pipeline, and unlike the other two Elastic surfaces the index lives in it: FROM names the conventional index patterns for the rule's log source, then | WHERE carries the profile's event.category and event.type alongside the rule's own predicates. Regular expressions work too — RLIKE uses the same Lucene engine as the Lucene page, so patterns are wrapped for its whole-string matching, shorthand classes like \d are expanded, and a construct the engine genuinely lacks, such as a lookahead or \b, is refused with its name rather than emitted broken.

Two things earn ES|QL its strict badge. It is typed: a field name that is not mapped in the target indices fails the whole query at verification, so a Sigma field without a verified ES|QL column refuses the conversion instead of shipping a query that cannot run. And comparisons on a multivalued field evaluate to null — a field holding an array matches neither the predicate nor its negation — which is why every negation here carries an IS NULL guard, and why a rule aimed at an array-typed field deserves a look at the report before you schedule it.

Elastic Security ES|QL reference →

How it works

  1. Step 1

    Paste the rule

    Drop a Sigma rule into the left pane, or open a .yml file. The tool says what it thinks you pasted before anything is sent.

  2. Step 2

    Pick your SIEM

    Choose the target dialect. Every shipped target is free and none of them are behind a sign-up.

  3. Step 3

    Read the report

    The query comes back with the log-source profile that was used, every field it renamed, and anything the target could not express.

  4. Step 4

    Verify, then deploy

    Run it against your own telemetry in audit mode before it alerts on anything.

Questions

Paste the Sigma rule into the tool on this page and press Convert. It returns ES|QL for Elastic Security, the log-source profile it matched, the field map it applied, and anything Elastic Security cannot express. Free, no sign-up.

Use ES|QL when case matters: it is the only Elastic surface where Sigma's case-insensitive default can be preserved, via TO_LOWER folding that the 9.1+ optimizer pushes down to the index. It also handles regular expressions, which KQL cannot. Choose KQL for the shortest queries on older stacks, Lucene if you specifically need the query_string rule type.

No — and that is the point. ES|QL's own ==, LIKE and RLIKE are case-sensitive, so the converter emits TO_LOWER(field) against a lowercased value, which matches Sigma's case-insensitive default exactly. A |cased modifier drops the fold and matches byte-exactly. On Elastic 9.1+ the fold is rewritten into an index-level query, not a per-row scan.

Every construct emitted is available from 8.14, ES|QL's GA release. The default target is 9.1, the first release pairing where the case-insensitive pushdown optimizations are GA on both the 8.x and 9.x lines — below that the query is still correct but the TO_LOWER fold is evaluated per row.

It will run if your field names match the profile shown in the report. Whether it matches the right events depends on your own telemetry, so verify it before deploying. The coverage figure tells you how much of the rule made it into the query.

The other pair

The same tool, with a different target preselected.

Every rule in the detection catalog is written in Sigma, so any of them converts to Elastic Security here.