Detection rules › Kusto

DNS events related to ToR proxies

Status
available
Severity
low
Time window
1d
Source
github.com/Azure/Azure-Sentinel

'Identifies IP addresses performing DNS lookups associated with common ToR proxies.'

MITRE ATT&CK coverage

Rule body kusto

id: a83ef0f4-dace-4767-bce3-ebd32599d2a0
name: DNS events related to ToR proxies
description: |
  'Identifies IP addresses performing DNS lookups associated with common ToR proxies.'
severity: Low
status: Available
requiredDataConnectors:
  - connectorId: DNS
    dataTypes:
      - DnsEvents
queryFrequency: 1d
queryPeriod: 1d
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Exfiltration
relevantTechniques:
  - T1048
query: |
  DnsEvents
  | where Name contains "."
  | where Name has_any ("tor2web.org", "tor2web.com", "torlink.co", "onion.to", "onion.ink", "onion.cab", "onion.nu", "onion.link",
  "onion.it", "onion.city", "onion.direct", "onion.top", "onion.casa", "onion.plus", "onion.rip", "onion.dog", "tor2web.fi",
  "tor2web.blutmagie.de", "onion.sh", "onion.lu", "onion.pet", "t2w.pw", "tor2web.ae.org", "tor2web.io", "tor2web.xyz", "onion.lt",
  "s1.tor-gateways.de", "s2.tor-gateways.de", "s3.tor-gateways.de", "s4.tor-gateways.de", "s5.tor-gateways.de", "hiddenservice.net")
  | extend HostName = iff(Computer has '.', substring(Computer,0,indexof(Computer,'.')),Computer)
  | extend DnsDomain = iff(Computer has '.', substring(Computer,indexof(Computer,'.')+1),"")
entityMappings:
  - entityType: Host
    fieldMappings:
      - identifier: FullName
        columnName: Computer
      - identifier: HostName
        columnName: HostName
      - identifier: DnsDomain
        columnName: DnsDomain
  - entityType: IP
    fieldMappings:
      - identifier: Address
        columnName: ClientIP
version: 1.0.3
kind: Scheduled

Stages and Predicates

Stage 1: source

DnsEvents

Stage 2: where

| where Name contains "."

Stage 3: where

| where Name has_any ("tor2web.org", "tor2web.com", "torlink.co", "onion.to", "onion.ink", "onion.cab", "onion.nu", "onion.link",
"onion.it", "onion.city", "onion.direct", "onion.top", "onion.casa", "onion.plus", "onion.rip", "onion.dog", "tor2web.fi",
"tor2web.blutmagie.de", "onion.sh", "onion.lu", "onion.pet", "t2w.pw", "tor2web.ae.org", "tor2web.io", "tor2web.xyz", "onion.lt",
"s1.tor-gateways.de", "s2.tor-gateways.de", "s3.tor-gateways.de", "s4.tor-gateways.de", "s5.tor-gateways.de", "hiddenservice.net")

Stage 4: extend

| extend HostName = iff(Computer has '.', substring(Computer,0,indexof(Computer,'.')),Computer)
HostName =
ifComputer has "."substring(Computer, 0, indexof(Computer, '.'))
elseComputer

Stage 5: extend

| extend DnsDomain = iff(Computer has '.', substring(Computer,indexof(Computer,'.')+1),"")
DnsDomain =
ifComputer has "."substring(Computer, (indexof(Computer, '.') + 1))
else""

Indicators

Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.

FieldKindValues
Namecontains
  • .
Namematch
  • hiddenservice.net
  • onion.cab
  • onion.casa
  • onion.city
  • onion.direct
  • onion.dog
  • onion.ink
  • onion.it
  • onion.link
  • onion.lt
  • onion.lu
  • onion.nu
  • onion.pet
  • onion.plus
  • onion.rip
  • onion.sh
  • onion.to
  • onion.top
  • s1.tor-gateways.de
  • s2.tor-gateways.de
  • s3.tor-gateways.de
  • s4.tor-gateways.de
  • s5.tor-gateways.de
  • t2w.pw
  • tor2web.ae.org
  • tor2web.blutmagie.de
  • tor2web.com
  • tor2web.fi
  • tor2web.io
  • tor2web.org
  • tor2web.xyz
  • torlink.co

Output fields

Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.

FieldSource
HostNameextend
DnsDomainextend