Geavanceerde Threat Hunting Voor Microsoft 365

💼 Management Samenvatting

Geavanceerde threat hunting vormt de proactieve component van moderne security operations, waarbij security analisten actief zoeken naar tekenen van compromittering en bedreigingen die nog niet door automatische detectieregels zijn geïdentificeerd. In Microsoft 365 omgevingen biedt threat hunting organisaties de mogelijkheid om geavanceerde aanvallen te ontdekken voordat deze tot volledige incidenten escaleren.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
100u (tech: 40u)
Van toepassing op:
M365
Microsoft 365 Defender
Microsoft Sentinel
Security Operations Center

Automatische detectieregels en signalen zijn essentieel maar niet volledig. Geavanceerde aanvallers gebruiken technieken zoals living-off-the-land, legitieme tools voor kwaadaardige doeleinden, en low-and-slow aanvallen die onder de radar blijven van standaard detectieregels. Zonder proactieve threat hunting blijven deze bedreigingen onopgemerkt totdat ze tot significante schade leiden. Threat hunting stelt organisaties in staat om bedreigingen te ontdekken in de zogenaamde 'detection gap', de periode tussen wanneer een aanval start en wanneer deze wordt gedetecteerd door automatische systemen. Voor Nederlandse overheidsorganisaties is threat hunting bovendien essentieel voor het naleven van compliance-eisen zoals BIO en NIS2, die vereisen dat organisaties proactieve maatregelen nemen om bedreigingen te identificeren en te mitigeren. Een volwassen threat hunting-programma demonstreert dat organisaties niet alleen reactief reageren op incidenten, maar actief werken aan het verbeteren van hun security posture.

PowerShell Modules Vereist
Primary API: Microsoft 365 Defender, Microsoft Sentinel, Microsoft Graph, Advanced Hunting API
Connection: Connect-MgGraph, Connect-ExchangeOnline, Azure Portal
Required Modules: Microsoft.Graph, Microsoft.Graph.Security, ExchangeOnlineManagement, Az.Accounts

Implementatie

Dit artikel beschrijft een gestructureerde aanpak voor geavanceerde threat hunting in Microsoft 365 omgevingen, met gebruik van Microsoft 365 Defender Advanced Hunting, Microsoft Sentinel, en aanvullende tools. Het artikel behandelt de fundamenten van threat hunting, verschillende jachtmethodologieën, hoe te werken met Advanced Hunting queries, het opzetten van een threat hunting-programma, en hoe bevindingen te documenteren en te gebruiken voor continue verbetering. De aanpak is afgestemd op de Nederlandse Baseline voor Veilige Cloud en bevat praktische voorbeelden en scripts die direct kunnen worden gebruikt in Nederlandse overheidsorganisaties.

Fundamenten van threat hunting

Threat hunting is een proactieve beveiligingsactiviteit waarbij security analisten systematisch door omgevingen zoeken naar indicatoren van compromittering (IoC's) en indicatoren van aanval (IoA's) die nog niet door automatische detectieregels zijn geïdentificeerd. Het belangrijkste onderscheid tussen threat hunting en traditionele security monitoring is dat threat hunting start vanuit een hypothese of een vraag, in plaats van te wachten op automatische alerts. Deze hypothese-gedreven aanpak maakt het mogelijk om bedreigingen te ontdekken die gebruik maken van legitieme tools, geavanceerde technieken, of aanvallen die langzaam genoeg zijn om onder de radar van automatische detectie te blijven.

Een effectieve threat hunting-activiteit volgt een gestructureerde cyclus die begint met het formuleren van een hypothese. Deze hypothese kan gebaseerd zijn op verschillende inputs: recente threat intelligence die nieuwe aanvallen of technieken beschrijft, anomalieën in basisstatistieken die suggereren dat er iets afwijkends gebeurt, de wens om te valideren dat bepaalde bedreigingen niet aanwezig zijn in de omgeving, of specifieke zorgen over bepaalde gebruikers, systemen of processen. Een goede hypothese is specifiek, testbaar, en relevant voor de organisatie. Bijvoorbeeld: 'Geavanceerde aanvallers gebruiken PowerShell voor living-off-the-land aanvallen. Laten we zoeken naar PowerShell-activiteit die afwijkt van normale gebruikspatronen' of 'APT-groepen gebruiken vaak Pass-the-Hash technieken. Laten we controleren op verdachte authenticatiepatronen die kunnen wijzen op credential theft'.

Nadat een hypothese is geformuleerd, verzamelen threat hunters data door queries uit te voeren in beschikbare data sources. In Microsoft 365 omgevingen zijn de belangrijkste data sources Microsoft 365 Defender Advanced Hunting, Microsoft Sentinel, Azure AD audit logs, Exchange Online message traces, en SharePoint audit logs. Advanced Hunting biedt toegang tot ruwe telemetrie van alle Microsoft 365 Defender-producten, waardoor threat hunters complexe queries kunnen schrijven die patronen zoeken over verschillende werkloads en tijdperiodes. De verzamelde data wordt vervolgens geanalyseerd om te bepalen of er bewijs is voor de hypothese. Deze analyse vereist zowel technische expertise als domeinkennis van de organisatie, omdat threat hunters moeten kunnen onderscheiden tussen normale activiteit en verdachte patronen.

Wanneer een threat hunter bewijs vindt dat de hypothese ondersteunt, wordt deze bevinding gevalideerd en geclassificeerd. Niet alle bevindingen zijn even urgent; sommige kunnen wijzen op een actieve bedreiging die onmiddellijke actie vereist, terwijl andere kunnen wijzen op configuratiefouten of ongebruikelijke maar legitieme activiteit. Validatie omvat meestal aanvullende onderzoek om de context te begrijpen, het bewijs te verifiëren, en te bepalen of er sprake is van een false positive. Een gevalideerde bevinding wordt vervolgens gebruikt om responsacties te initiëren, zoals het isoleren van gecompromitteerde systemen, het resetten van wachtwoorden, of het opstellen van een incidentresponse. Ten slotte worden alle bevindingen en het daarbij behorende onderzoek gedocumenteerd, zodat toekomstige threat hunting-activiteiten kunnen profiteren van opgedane kennis en zodat organisaties kunnen leren van ervaringen.

Het succes van een threat hunting-programma hangt af van verschillende factoren. Ten eerste is data quality essentieel: threat hunters kunnen alleen vinden wat er gelogd wordt, dus organisaties moeten ervoor zorgen dat alle relevante activiteiten worden vastgelegd en dat logretentie voldoende is voor historische analyses. Ten tweede is de beschikbaarheid van geschoolde threat hunters cruciaal: threat hunting vereist diepe technische kennis, analytische vaardigheden, en een goed begrip van zowel aanvalstechnieken als de eigen organisatie. Ten derde is automatisering belangrijk: hoewel threat hunting proactief is, moeten repetitieve taken worden geautomatiseerd zodat threat hunters zich kunnen focussen op complexe analyses. Ten slotte is een cultuur van continue verbetering essentieel: threat hunting moet worden gezien als een iteratief proces waarin bevindingen leiden tot verbeterde detectieregels, betere logging, en verfijnde hypotheses.

Threat hunting methodologieën en frameworks

Verschillende methodologieën en frameworks kunnen worden gebruikt om threat hunting-activiteiten te structureren en te organiseren. Deze methodologieën bieden gestructureerde aanpakken die helpen om systematisch te werk te gaan en om ervoor te zorgen dat belangrijke aspecten niet worden overgeslagen. De keuze voor een specifieke methodologie hangt af van factoren zoals de volwassenheid van het threat hunting-programma, de beschikbare tools en data sources, en de voorkeuren van het SOC-team.

De MITRE ATT&CK framework is waarschijnlijk de meest gebruikte methodologie voor threat hunting. MITRE ATT&CK beschrijft een uitgebreide kennisbank van aanvalstechnieken die door cybercriminelen worden gebruikt, georganiseerd in verschillende tactieken en technieken. Threat hunters kunnen MITRE ATT&CK gebruiken om hypotheses te formuleren door zich te richten op specifieke technieken die relevant zijn voor hun organisatie of die recent zijn gebruikt in bekende aanvallen. Bijvoorbeeld, een threat hunter kan zich richten op de techniek T1059.001 (Command and Scripting Interpreter: PowerShell) en zoeken naar PowerShell-activiteit die kenmerkend is voor kwaadaardig gebruik, zoals het uitvoeren van gecodeerde scripts, het downloaden van payloads, of het uitvoeren van commands zonder logging. Door systematisch door MITRE ATT&CK-technieken te werken, kunnen threat hunters ervoor zorgen dat zij een breed spectrum van aanvalstechnieken dekken.

Een andere populaire methodologie is de PEAK framework, ontwikkeld door Sqrrl en later overgenomen door Amazon. PEAK staat voor Planning, Execution, Analysis en Knowledge, en beschrijft een iteratieve cyclus voor threat hunting. De Planning-fase omvat het formuleren van hypotheses, het identificeren van data sources, en het ontwikkelen van jachtplannen. De Execution-fase omvat het uitvoeren van queries, het verzamelen van data, en het initiëren van jachtsessies. De Analysis-fase omvat het analyseren van resultaten, het valideren van bevindingen, en het classificeren van resultaten. De Knowledge-fase omvat het documenteren van bevindingen, het updaten van runbooks, en het verbeteren van detectieregels. Door deze cyclus te volgen, kunnen threat hunters ervoor zorgen dat hun activiteiten gestructureerd zijn en dat kennis wordt vastgelegd voor toekomstig gebruik.

De Diamond Model of Intrusion Analysis biedt een andere manier om threat hunting te benaderen. Het Diamond Model beschrijft elke cyberaanval als een verbinding tussen vier elementen: de Adversary (aanvaller), de Capability (aanvalstechniek), de Infrastructure (infrastructuur die wordt gebruikt), en de Victim (doelwit). Threat hunters kunnen dit model gebruiken om hun zoekacties te structureren door zich te richten op elk van deze elementen. Bijvoorbeeld, wanneer een bekende APT-groep wordt geassocieerd met specifieke technieken, kunnen threat hunters zoeken naar indicatoren die wijzen op het gebruik van deze technieken in de eigen omgeving. Of wanneer een specifieke infrastructuur wordt geassocieerd met aanvallen, kunnen threat hunters zoeken naar connecties naar deze infrastructuur vanuit de eigen omgeving.

Naast deze gestructureerde frameworks zijn er verschillende praktische aanpakken die threat hunters kunnen gebruiken. Hypothesis-driven hunting begint met een specifieke hypothese over een bedreiging en gebruikt data om deze hypothese te testen. Data-driven hunting begint met het identificeren van anomalieën in data en gebruikt deze als startpunt voor verder onderzoek. Intelligence-driven hunting gebruikt threat intelligence over bekende aanvallen of actoren als basis voor jachtacties. Situational awareness hunting richt zich op het begrijpen van de normale staat van de omgeving, zodat afwijkingen kunnen worden geïdentificeerd. Een volwassen threat hunting-programma combineert verschillende van deze aanpakken, afhankelijk van de specifieke situatie en de beschikbare informatie.

Ongeacht welke methodologie wordt gebruikt, is het belangrijk dat threat hunting-activiteiten worden gedocumenteerd en gestructureerd. Dit omvat het bijhouden van welke hypotheses zijn getest, welke queries zijn gebruikt, welke bevindingen zijn gedaan, en welke acties zijn ondernomen. Deze documentatie helpt niet alleen om kennis vast te leggen en te delen binnen het team, maar ook om te demonstreren aan bestuurders en auditors dat de organisatie proactief werkt aan het verbeteren van haar security posture. Voor Nederlandse overheidsorganisaties kan deze documentatie bovendien dienen als bewijsstuk voor compliance met BIO en NIS2, door aan te tonen dat de organisatie actief werkt aan het identificeren en mitigeren van bedreigingen.

Advanced Hunting queries en query-ontwikkeling

Microsoft 365 Defender Advanced Hunting biedt een krachtige query-interface die toegang geeft tot ruwe telemetrie van alle Microsoft 365 Defender-producten, inclusief Microsoft Defender for Endpoint, Microsoft Defender for Office 365, Microsoft Defender for Identity, en Microsoft Defender for Cloud Apps. Advanced Hunting gebruikt een KQL (Kusto Query Language) syntax, een krachtige querytaal die specifiek is ontworpen voor het werken met grote datasets en het uitvoeren van complexe analyses. Het beheersen van Advanced Hunting queries is essentieel voor effectieve threat hunting in Microsoft 365 omgevingen.

Een goede Advanced Hunting query begint met het begrijpen van de beschikbare data tables en de structuur van de data. Microsoft 365 Defender Advanced Hunting biedt verschillende data tables, elk met specifieke informatie. De DeviceLogonEvents table bevat informatie over aanmeldingen op endpoints, inclusief authenticatiemethoden, locaties, en resultaten. De EmailEvents table bevat informatie over e-mailactiviteit, inclusief verzenders, ontvangers, bijlagen, en URL's. De IdentityLogonEvents table bevat informatie over aanmeldingen in Azure AD, inclusief applicaties, locaties, en risicoscores. De DeviceProcessEvents table bevat informatie over procesexecutie, inclusief commando-regels, parent processen, en timestamps. Door deze tables te combineren in queries, kunnen threat hunters complexe patronen identificeren die zich over verschillende werkloads uitstrekken.

Effectieve Advanced Hunting queries gebruiken verschillende technieken om relevante signalen te identificeren. Filtering is essentieel om de hoeveelheid data te reduceren tot wat relevant is voor de specifieke hypothese. Bijvoorbeeld, een query kan filteren op specifieke tijdsperiodes, gebruikers, apparaten, of activiteitstypes. Joins worden gebruikt om data uit verschillende tables te combineren, bijvoorbeeld om procesexecutie te correleren met netwerkconnecties of om e-mailactiviteit te correleren met bestandstoegang. Aggregaties worden gebruikt om patronen te identificeren, bijvoorbeeld om te tellen hoeveel keren een specifiek proces is uitgevoerd of om te identificeren welke gebruikers de meeste afwijkende activiteit vertonen. Sorting en limiting helpen om de meest relevante resultaten naar boven te brengen.

Bij het ontwikkelen van Advanced Hunting queries is het belangrijk om te beginnen met eenvoudige queries en deze geleidelijk complexer te maken. Een goede praktijk is om eerst te valideren dat de query de verwachte data retourneert, bijvoorbeeld door te beginnen met een eenvoudige SELECT-query zonder filtering. Vervolgens kunnen filters worden toegevoegd om de resultaten te verfijnen, en kunnen joins en aggregaties worden toegevoegd om complexere analyses uit te voeren. Het is ook belangrijk om te testen met verschillende tijdsperiodes en verschillende datasets om ervoor te zorgen dat de query robuust is en niet te veel false positives genereert.

Een veelvoorkomend patroon in threat hunting queries is het zoeken naar afwijkingen van normale gedragspatronen. Bijvoorbeeld, een query kan zoeken naar PowerShell-activiteit die afwijkt van normale gebruikspatronen, zoals het uitvoeren van gecodeerde scripts, het uitvoeren van commands zonder logging, of het gebruik van ongebruikelijke executie methoden. Een andere veelvoorkomende aanpak is het zoeken naar indicatoren die geassocieerd zijn met bekende aanvalstechnieken, zoals het gebruik van specifieke tools, het uitvoeren van specifieke commando's, of het maken van specifieke netwerkconnecties. Threat hunters kunnen ook zoeken naar correlaties tussen verschillende activiteiten, bijvoorbeeld wanneer een gebruiker kort na een verdachte e-mail een ongebruikelijk proces start of wanneer meerdere systemen tegelijkertijd dezelfde verdachte activiteit vertonen.

Naast het schrijven van nieuwe queries kunnen threat hunters ook gebruik maken van bestaande query libraries en community resources. Microsoft biedt een uitgebreide collectie van voorbeeldqueries die direct kunnen worden gebruikt of aangepast voor specifieke behoeften. De Microsoft 365 Defender GitHub repository bevat honderden voorbeeldqueries die zijn georganiseerd per MITRE ATT&CK tactiek en techniek. De community biedt ook talrijke resources, inclusief blogs, artikelen, en discussieforums waar threat hunters queries kunnen delen en verbeteren. Door gebruik te maken van deze resources kunnen threat hunters sneller productief worden en kunnen zij profiteren van de kennis en ervaring van anderen.

Het beheren en onderhouden van Advanced Hunting queries is een belangrijke aspect van een volwassen threat hunting-programma. Queries moeten worden gedocumenteerd met duidelijke beschrijvingen van wat zij zoeken, waarom zij relevant zijn, en hoe resultaten moeten worden geïnterpreteerd. Queries moeten regelmatig worden gereviewd en bijgewerkt om ervoor te zorgen dat zij nog steeds relevant zijn en dat zij profiteren van nieuwe data sources of verbeterde query-technieken. Queries die succesvolle bevindingen opleveren kunnen worden omgezet in automatische detectieregels, zodat toekomstige instanties automatisch worden gedetecteerd zonder handmatige threat hunting-activiteiten. Het bijbehorende PowerShell-script ondersteunt dit proces door threat hunting queries te beheren, resultaten te analyseren, en bevindingen te documenteren.

Opzetten van een threat hunting-programma

Een succesvol threat hunting-programma vereist meer dan alleen technische vaardigheden en goede tools. Het vereist een gestructureerde organisatorische aanpak die ervoor zorgt dat threat hunting-activiteiten worden gepland, uitgevoerd, geëvalueerd, en verbeterd op een consistente en meetbare manier. Dit hoofdstuk beschrijft hoe organisaties een threat hunting-programma kunnen opzetten dat past bij hun volwassenheid, middelen, en doelstellingen.

De eerste stap in het opzetten van een threat hunting-programma is het definiëren van doelstellingen en success criteria. Deze doelstellingen moeten afgestemd zijn op de bredere security strategy van de organisatie en moeten duidelijk maken wat het threat hunting-programma moet bereiken. Doelstellingen kunnen bijvoorbeeld zijn: het reduceren van dwell time (de tijd tussen compromittering en detectie), het verbeteren van de detectie van geavanceerde bedreigingen, het valideren van de effectiviteit van bestaande detectieregels, of het voldoen aan compliance-eisen zoals BIO en NIS2. Success criteria moeten meetbaar zijn, zodat organisaties kunnen bepalen of het programma succesvol is en waar verbeteringen nodig zijn. Voorbeelden van success criteria zijn: het aantal gevonden bedreigingen per kwartaal, de tijd die nodig is om een bedreiging te identificeren, het percentage van bevindingen dat leidt tot verbeterde detectieregels, of de reductie in false positives.

Een belangrijke organisatorische beslissing is wie verantwoordelijk is voor threat hunting-activiteiten. In kleinere organisaties kunnen threat hunting-activiteiten worden uitgevoerd door dezelfde analisten die ook incidentresponse en monitoring uitvoeren. In grotere organisaties kan het zinvol zijn om dedicated threat hunters aan te stellen die zich volledig richten op proactieve jachtactiviteiten. Ongeacht de organisatiestructuur is het belangrijk dat threat hunters over de juiste vaardigheden beschikken: technische expertise in Microsoft 365, kennis van aanvalstechnieken en frameworks zoals MITRE ATT&CK, analytische vaardigheden, en de capaciteit om complexe queries te schrijven en te interpreteren. Training en certificering kunnen helpen om deze vaardigheden te ontwikkelen en te valideren.

Een gestructureerd threat hunting-programma gebruikt een planning-cyclus om ervoor te zorgen dat activiteiten systematisch worden uitgevoerd. Deze planning kan bijvoorbeeld kwartaalsgewijs of maandelijks plaatsvinden, waarbij het team bepaalt welke hypotheses zullen worden getest, welke data sources zullen worden gebruikt, en welke queries zullen worden uitgevoerd. De planning moet rekening houden met verschillende factoren: recente threat intelligence die nieuwe bedreigingen of technieken beschrijft, veranderingen in de omgeving die nieuwe risico's kunnen introduceren, bevindingen uit eerdere threat hunting-activiteiten die follow-up vereisen, en compliance-eisen die bepaalde activiteiten vereisen. Door expliciet te plannen voorkomt een organisatie dat threat hunting-activiteiten ad-hoc en ongestructureerd worden uitgevoerd.

Het uitvoeren van threat hunting-activiteiten vereist toegang tot de juiste tools en data sources. In Microsoft 365 omgevingen betekent dit meestal: toegang tot Microsoft 365 Defender Advanced Hunting, toegang tot Microsoft Sentinel, toegang tot Azure AD audit logs en andere relevante log sources, en de juiste licenties en permissions om queries uit te voeren en data te analyseren. Daarnaast kunnen aanvullende tools nuttig zijn, zoals SIEM-platforms voor correlatie, threat intelligence-platforms voor context, en forensische tools voor diepgaand onderzoek. Het is belangrijk dat threat hunters over voldoende training beschikken in het gebruik van deze tools, zodat zij effectief kunnen werken en optimaal gebruik kunnen maken van beschikbare functionaliteit.

Een volwassen threat hunting-programma meet en rapporteert over zijn activiteiten en resultaten. Dit omvat het bijhouden van metrics zoals: het aantal uitgevoerde jachtsessies, het aantal geteste hypotheses, het aantal gevonden bedreigingen, de tijd die nodig is om bedreigingen te identificeren, het percentage van bevindingen dat leidt tot verbeterde detectieregels, en de impact van threat hunting op de algehele security posture. Deze metrics helpen organisaties om te begrijpen of het threat hunting-programma effectief is en waar verbeteringen nodig zijn. Rapporten over threat hunting-activiteiten moeten regelmatig worden gedeeld met bestuurders en stakeholders, zodat zij begrijpen welke waarde het programma levert en waarom investeringen in threat hunting gerechtvaardigd zijn.

Continue verbetering is een essentieel aspect van een volwassen threat hunting-programma. Dit betekent dat bevindingen uit threat hunting-activiteiten worden gebruikt om detectieregels te verbeteren, logging te verbeteren, en processen te verfijnen. Het betekent ook dat threat hunters regelmatig worden getraind op nieuwe technieken, nieuwe tools, en nieuwe bedreigingen. Het betekent ten slotte dat het programma zelf regelmatig wordt geëvalueerd om te bepalen of het nog steeds effectief is en of aanpassingen nodig zijn. Door expliciet te werken aan continue verbetering zorgt een organisatie ervoor dat haar threat hunting-programma relevant blijft en effectief blijft in het identificeren en mitigeren van bedreigingen.

Documentatie en continue verbetering

Gebruik PowerShell-script threat-hunting-advanced.ps1 (functie Invoke-Monitoring) – Ondersteunt threat hunting-activiteiten door queries uit te voeren, resultaten te analyseren, en bevindingen te documenteren in een gestructureerd formaat..

Effectieve documentatie is essentieel voor een volwassen threat hunting-programma. Documentatie helpt niet alleen om kennis vast te leggen en te delen binnen het team, maar ook om te demonstreren aan bestuurders en auditors dat de organisatie proactief werkt aan het verbeteren van haar security posture. Voor Nederlandse overheidsorganisaties kan documentatie bovendien dienen als bewijsstuk voor compliance met BIO en NIS2, door aan te tonen dat de organisatie actief werkt aan het identificeren en mitigeren van bedreigingen.

Elke threat hunting-sessie moet worden gedocumenteerd met informatie over de hypothese die is getest, de queries die zijn uitgevoerd, de resultaten die zijn gevonden, en de acties die zijn ondernomen. Deze documentatie moet voldoende detail bevatten zodat andere threat hunters kunnen begrijpen wat er is gedaan en waarom, en zodat de sessie kan worden gereproduceerd indien nodig. Documentatie moet ook informatie bevatten over false positives en lessons learned, zodat toekomstige threat hunting-activiteiten kunnen profiteren van opgedane kennis en zodat repetitieve fouten kunnen worden vermeden.

Naast documentatie van individuele sessies is het belangrijk om overzichten en rapportages te maken die laten zien welke activiteiten zijn uitgevoerd, welke resultaten zijn behaald, en welke verbeteringen zijn doorgevoerd. Deze rapportages moeten regelmatig worden gedeeld met bestuurders en stakeholders, zodat zij begrijpen welke waarde het threat hunting-programma levert en waarom investeringen gerechtvaardigd zijn. Rapportages moeten zowel kwantitatieve metrics bevatten (zoals het aantal uitgevoerde sessies en gevonden bedreigingen) als kwalitatieve inzichten (zoals belangrijke bevindingen en aanbevelingen voor verbetering).

Een belangrijk aspect van documentatie is het vastleggen van queries en scripts die succesvol zijn gebleken. Deze queries kunnen worden opgeslagen in een centrale repository, georganiseerd per MITRE ATT&CK tactiek en techniek, zodat andere threat hunters ze kunnen gebruiken en aanpassen voor hun eigen behoeften. Het bijhouden van een query library helpt om kennis te delen binnen het team, om te voorkomen dat werk dubbel wordt gedaan, en om ervoor te zorgen dat succesvolle queries beschikbaar blijven voor toekomstig gebruik. Queries moeten worden gedocumenteerd met duidelijke beschrijvingen van wat zij zoeken, waarom zij relevant zijn, en hoe resultaten moeten worden geïnterpreteerd.

Continue verbetering vereist dat bevindingen uit threat hunting-activiteiten worden gebruikt om processen, tools en detectieregels te verbeteren. Wanneer een threat hunter een bedreiging vindt die niet door automatische detectieregels werd geïdentificeerd, moet dit leiden tot een evaluatie van waarom de bedreiging niet werd gedetecteerd en hoe detectieregels kunnen worden verbeterd om toekomstige instanties te identificeren. Dit kan betekenen dat nieuwe detectieregels worden gemaakt, dat bestaande regels worden bijgewerkt, of dat aanvullende logging wordt geïmplementeerd. Door expliciet te werken aan het omzetten van threat hunting-bevindingen in verbeterde detectie, zorgt een organisatie ervoor dat haar security posture continu verbetert en dat threat hunting niet alleen bedreigingen vindt, maar ook helpt om toekomstige bedreigingen sneller te identificeren.

Het bijbehorende PowerShell-script ondersteunt documentatie en continue verbetering door threat hunting-sessies te structureren, queries uit te voeren, resultaten te analyseren, en bevindingen vast te leggen in een herbruikbaar formaat. Door deze tooling te gebruiken kunnen organisaties gestructureerd werken aan threat hunting en kunnen zij ervoor zorgen dat kennis wordt vastgelegd en gedeeld. Op deze manier draagt threat hunting niet alleen bij aan het vinden van bedreigingen, maar ook aan het opbouwen van institutionele kennis en het verbeteren van de algehele security posture van de organisatie.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Geavanceerde Threat Hunting voor Microsoft 365 .DESCRIPTION Ondersteunt threat hunting-activiteiten door queries uit te voeren in Microsoft 365 Defender Advanced Hunting, resultaten te analyseren, en bevindingen te documenteren in een gestructureerd formaat. Het script werkt met een lokale configuratiefile waarin jachtsessies, hypotheses, queries en bevindingen worden vastgelegd. .NOTES Filename: threat-hunting-advanced.ps1 Author: Nederlandse Baseline voor Veilige Cloud Category: soc Workload: m365 .EXAMPLE .\threat-hunting-advanced.ps1 -Monitoring Voert een overzicht uit van geplande en uitgevoerde threat hunting-sessies en toont belangrijke metrics en bevindingen. .EXAMPLE .\threat-hunting-advanced.ps1 -Remediation Initialiseert of actualiseert de configuratiefile voor threat hunting-activiteiten. .EXAMPLE .\threat-hunting-advanced.ps1 -ExecuteHunt -HypothesisId "hunt-001" Voert een specifieke threat hunting-sessie uit op basis van een gedefinieerde hypothese. #> #Requires -Version 5.1 [CmdletBinding()] param( [Parameter(Mandatory = $false, HelpMessage = "Toon overzicht van threat hunting-activiteiten en metrics")] [switch]$Monitoring, [Parameter(Mandatory = $false, HelpMessage = "Initialiseer of actualiseer de threat hunting-configuratie")] [switch]$Remediation, [Parameter(Mandatory = $false, HelpMessage = "Voer een specifieke threat hunting-sessie uit")] [switch]$ExecuteHunt, [Parameter(Mandatory = $false, HelpMessage = "ID van de hypothese om uit te voeren")] [string]$HypothesisId, [Parameter(Mandatory = $false, HelpMessage = "Verwijder optioneel de configuratiefile")] [switch]$Revert, [Parameter(Mandatory = $false, HelpMessage = "Toon wat er zou gebeuren zonder wijzigingen door te voeren")] [switch]$WhatIf ) $ErrorActionPreference = 'Stop' Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Geavanceerde Threat Hunting (M365)" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan function Get-ConfigPath { <# .SYNOPSIS Bepaalt het pad naar de lokale configuratiefile. #> $scriptDir = Split-Path -Parent $PSCommandPath $configPath = Join-Path -Path $scriptDir -ChildPath "threat-hunting-advanced.config.json" return $configPath } function Initialize-DefaultConfig { <# .SYNOPSIS Maakt een basisconfiguratie voor threat hunting-activiteiten aan. #> $config = [ordered]@{ version = "1.0" lastUpdated = (Get-Date).ToString("yyyy-MM-dd") owner = "SOC Manager / Threat Hunter" programObjectives = @( "Reduceren van dwell time door proactieve detectie", "Verbeteren van detectie van geavanceerde bedreigingen", "Valideren van effectiviteit van bestaande detectieregels", "Voldoen aan compliance-eisen (BIO, NIS2)" ) successCriteria = @( "Minimaal 4 threat hunting-sessies per kwartaal", "Gemiddelde tijd tot identificatie van bedreigingen < 24 uur", "Minimaal 80% van bevindingen leidt tot verbeterde detectieregels" ) huntingSessions = @( @{ id = "hunt-001" title = "PowerShell Living-off-the-Land Detectie" hypothesis = "Geavanceerde aanvallers gebruiken PowerShell voor living-off-the-land aanvallen die niet door standaard detectieregels worden geïdentificeerd" mitreTactic = "Execution" mitreTechnique = "T1059.001" dataSources = @("DeviceProcessEvents", "DeviceLogonEvents") query = "DeviceProcessEvents | where ProcessCommandLine contains 'powershell' and ProcessCommandLine contains '-EncodedCommand' | project Timestamp, DeviceName, AccountName, ProcessCommandLine | take 100" status = "Planned" plannedDate = "" executedDate = "" findings = @() recommendations = @() } ) queryLibrary = [ordered]@{ categories = @( "Execution", "Persistence", "Privilege Escalation", "Defense Evasion", "Credential Access", "Discovery", "Lateral Movement", "Collection", "Exfiltration", "Command and Control" ) queries = @() } metrics = [ordered]@{ totalSessions = 0 sessionsThisQuarter = 0 threatsFound = 0 averageDetectionTime = 0 rulesImproved = 0 lastQuarterReview = "" } lastReview = "" nextPlannedReview = "" } return $config } function Invoke-Monitoring { <# .SYNOPSIS Toont overzicht van threat hunting-activiteiten en metrics. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[WARN] Geen threat hunting-configuratie gevonden." -ForegroundColor Yellow Write-Host " Verwacht bestand: $configPath" -ForegroundColor Yellow Write-Host " Voer '.\threat-hunting-advanced.ps1 -Remediation' uit om een configuratie aan te maken.`n" -ForegroundColor Yellow exit 1 } $rawContent = Get-Content -Path $configPath -Raw -ErrorAction Stop $config = $rawContent | ConvertFrom-Json -ErrorAction Stop Write-Host "Threat Hunting-configuratie: $configPath" -ForegroundColor Gray Write-Host "Versie: $($config.version)" -ForegroundColor Gray Write-Host "Eigenaar: $($config.owner)" -ForegroundColor Gray if ($config.lastReview) { Write-Host "Laatste review: $($config.lastReview)" -ForegroundColor Gray } if ($config.nextPlannedReview) { Write-Host "Volgende geplande review: $($config.nextPlannedReview)`n" -ForegroundColor Gray } Write-Host "Threat Hunting Metrics:" -ForegroundColor Cyan Write-Host "======================`n" -ForegroundColor Cyan Write-Host "Totale jachtsessies: $($config.metrics.totalSessions)" -ForegroundColor White Write-Host "Sessies dit kwartaal: $($config.metrics.sessionsThisQuarter)" -ForegroundColor White Write-Host "Gevonden bedreigingen: $($config.metrics.threatsFound)" -ForegroundColor White if ($config.metrics.averageDetectionTime -gt 0) { Write-Host "Gemiddelde detectietijd: $($config.metrics.averageDetectionTime) uur" -ForegroundColor White } Write-Host "Verbeterde detectieregels: $($config.metrics.rulesImproved)`n" -ForegroundColor White if ($config.huntingSessions.Count -gt 0) { Write-Host "Geplande jachtsessies:" -ForegroundColor Cyan Write-Host "=====================`n" -ForegroundColor Cyan $plannedSessions = $config.huntingSessions | Where-Object { $_.status -eq "Planned" } $executedSessions = $config.huntingSessions | Where-Object { $_.status -eq "Executed" } $completedSessions = $config.huntingSessions | Where-Object { $_.status -eq "Completed" } if ($plannedSessions.Count -gt 0) { Write-Host "Gepland ($($plannedSessions.Count)):" -ForegroundColor Yellow foreach ($session in $plannedSessions) { Write-Host " - [$($session.id)] $($session.title)" -ForegroundColor Gray Write-Host " MITRE: $($session.mitreTactic) - $($session.mitreTechnique)" -ForegroundColor DarkGray if ($session.plannedDate) { Write-Host " Gepland: $($session.plannedDate)" -ForegroundColor DarkGray } } Write-Host "" } if ($executedSessions.Count -gt 0) { Write-Host "In uitvoering ($($executedSessions.Count)):" -ForegroundColor Cyan foreach ($session in $executedSessions) { Write-Host " - [$($session.id)] $($session.title)" -ForegroundColor Gray if ($session.executedDate) { Write-Host " Gestart: $($session.executedDate)" -ForegroundColor DarkGray } } Write-Host "" } if ($completedSessions.Count -gt 0) { Write-Host "Voltooid ($($completedSessions.Count)):" -ForegroundColor Green foreach ($session in $completedSessions | Select-Object -First 5) { Write-Host " - [$($session.id)] $($session.title)" -ForegroundColor Gray if ($session.findings.Count -gt 0) { Write-Host " Bevindingen: $($session.findings.Count)" -ForegroundColor DarkGray } if ($session.executedDate) { Write-Host " Voltooid: $($session.executedDate)" -ForegroundColor DarkGray } } if ($completedSessions.Count -gt 5) { Write-Host " ... en $($completedSessions.Count - 5) meer`n" -ForegroundColor DarkGray } Write-Host "" } } else { Write-Host "[INFO] Geen jachtsessies gedefinieerd. Voeg sessies toe aan de configuratie.`n" -ForegroundColor Yellow } if ($config.metrics.totalSessions -gt 0 -or $config.metrics.sessionsThisQuarter -gt 0) { Write-Host "Samenvatting:" -ForegroundColor Cyan $hasActiveProgram = $config.metrics.sessionsThisQuarter -gt 0 if ($hasActiveProgram) { Write-Host " [OK] Threat hunting-programma is actief." -ForegroundColor Green if ($config.metrics.sessionsThisQuarter -lt 4) { Write-Host " [INFO] Minder dan 4 sessies dit kwartaal. Overweeg meer sessies te plannen." -ForegroundColor Yellow } if ($config.metrics.threatsFound -gt 0) { Write-Host " [INFO] $($config.metrics.threatsFound) bedreigingen gevonden. Zorg dat bevindingen leiden tot verbeterde detectieregels." -ForegroundColor Cyan } exit 0 } else { Write-Host " [WARN] Geen actieve jachtsessies dit kwartaal. Plan nieuwe sessies." -ForegroundColor Yellow exit 1 } } else { Write-Host " [WARN] Threat hunting-programma is nog niet gestart. Plan eerste jachtsessies." -ForegroundColor Yellow exit 1 } } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens monitoring: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Remediation { <# .SYNOPSIS Maakt of actualiseert de threat hunting-configuratie. #> try { $configPath = Get-ConfigPath if (Test-Path -Path $configPath) { Write-Host "[INFO] Bestaande configuratie gevonden op: $configPath" -ForegroundColor Cyan Write-Host " Er wordt een back-up gemaakt voordat de configuratie wordt bijgewerkt." -ForegroundColor Cyan $backupPath = "$configPath.bak_{0}" -f (Get-Date -Format "yyyyMMddHHmmss") if (-not $WhatIf) { Copy-Item -Path $configPath -Destination $backupPath -ErrorAction Stop } Write-Host " Back-up opgeslagen als: $backupPath`n" -ForegroundColor Gray } $config = Initialize-DefaultConfig # Als er al een configuratie bestaat, behoud de bestaande sessies en metrics if (Test-Path -Path $configPath) { $existingConfig = Get-Content -Path $configPath -Raw | ConvertFrom-Json if ($existingConfig.huntingSessions) { $config.huntingSessions = $existingConfig.huntingSessions } if ($existingConfig.metrics) { $config.metrics = $existingConfig.metrics } if ($existingConfig.queryLibrary) { $config.queryLibrary = $existingConfig.queryLibrary } if ($existingConfig.lastReview) { $config.lastReview = $existingConfig.lastReview } if ($existingConfig.nextPlannedReview) { $config.nextPlannedReview = $existingConfig.nextPlannedReview } } $json = $config | ConvertTo-Json -Depth 10 if ($WhatIf) { Write-Host "[WhatIf] Configuratie zou worden geschreven naar: $configPath" -ForegroundColor Yellow Write-Host $json } else { $configDir = Split-Path -Parent $configPath if (-not (Test-Path -Path $configDir)) { New-Item -ItemType Directory -Path $configDir -Force | Out-Null } $json | Out-File -FilePath $configPath -Encoding UTF8 -Force Write-Host "[OK] Threat hunting-configuratie is aangemaakt of bijgewerkt." -ForegroundColor Green Write-Host " Bestand: $configPath" -ForegroundColor Green } Write-Host "`nAanbevolen vervolgstappen:" -ForegroundColor Cyan Write-Host " 1. Definieer threat hunting-hypotheses op basis van threat intelligence en risico's." -ForegroundColor Gray Write-Host " 2. Ontwikkel of gebruik Advanced Hunting queries voor elke hypothese." -ForegroundColor Gray Write-Host " 3. Plan regelmatige jachtsessies (bijvoorbeeld wekelijks of maandelijks)." -ForegroundColor Gray Write-Host " 4. Documenteer alle bevindingen en vertaal deze naar verbeterde detectieregels." -ForegroundColor Gray Write-Host " 5. Gebruik -Monitoring om periodiek de voortgang en metrics te rapporteren." -ForegroundColor Gray exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens remediatie: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-ExecuteHunt { <# .SYNOPSIS Voert een specifieke threat hunting-sessie uit. #> try { if (-not $HypothesisId) { Write-Host "[FAIL] -HypothesisId is verplicht wanneer -ExecuteHunt wordt gebruikt." -ForegroundColor Red exit 1 } $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[FAIL] Geen threat hunting-configuratie gevonden." -ForegroundColor Red Write-Host " Voer eerst '.\threat-hunting-advanced.ps1 -Remediation' uit." -ForegroundColor Yellow exit 1 } $rawContent = Get-Content -Path $configPath -Raw -ErrorAction Stop $config = $rawContent | ConvertFrom-Json -ErrorAction Stop $session = $config.huntingSessions | Where-Object { $_.id -eq $HypothesisId } if (-not $session) { Write-Host "[FAIL] Geen jachtsessie gevonden met ID: $HypothesisId" -ForegroundColor Red exit 1 } Write-Host "Uitvoeren van jachtsessie: $($session.title)" -ForegroundColor Cyan Write-Host "Hypothese: $($session.hypothesis)`n" -ForegroundColor Gray if ($WhatIf) { Write-Host "[WhatIf] Query die zou worden uitgevoerd:" -ForegroundColor Yellow Write-Host $session.query -ForegroundColor Gray Write-Host "`n[WhatIf] Data sources: $($session.dataSources -join ', ')" -ForegroundColor Yellow exit 0 } # Opmerking: Voor daadwerkelijke uitvoering van Advanced Hunting queries # zou hier code moeten staan die verbinding maakt met Microsoft Graph Security API # of Microsoft 365 Defender API. Voor nu tonen we alleen de structuur. Write-Host "[INFO] Voor daadwerkelijke uitvoering van queries is verbinding met" -ForegroundColor Yellow Write-Host " Microsoft 365 Defender Advanced Hunting API vereist." -ForegroundColor Yellow Write-Host " Gebruik de Microsoft Graph PowerShell-module of de webinterface." -ForegroundColor Yellow Write-Host "`nQuery voor handmatige uitvoering:" -ForegroundColor Cyan Write-Host $session.query -ForegroundColor Gray exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens uitvoeren van jachtsessie: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } function Invoke-Revert { <# .SYNOPSIS Verwijdert optioneel de threat hunting-configuratiefile. #> try { $configPath = Get-ConfigPath if (-not (Test-Path -Path $configPath)) { Write-Host "[INFO] Er is geen configuratiefile om te verwijderen." -ForegroundColor Cyan exit 0 } if ($WhatIf) { Write-Host "[WhatIf] Configuratiefile zou worden verwijderd: $configPath" -ForegroundColor Yellow } else { Remove-Item -Path $configPath -Force -ErrorAction Stop Write-Host "[OK] Configuratiefile verwijderd: $configPath" -ForegroundColor Green } exit 0 } catch { Write-Host "`n[FAIL] Er is een fout opgetreden tijdens het verwijderen van de configuratie: $_" -ForegroundColor Red Write-Host "Details: $($_.Exception.Message)" -ForegroundColor Red exit 2 } } try { if ($Revert) { Invoke-Revert } elseif ($ExecuteHunt) { Invoke-ExecuteHunt } elseif ($Monitoring) { Invoke-Monitoring } elseif ($Remediation) { Invoke-Remediation } else { Write-Host "Gebruik:" -ForegroundColor Yellow Write-Host " -Monitoring Toon overzicht van threat hunting-activiteiten en metrics" -ForegroundColor Gray Write-Host " -Remediation Maak of actualiseer de threat hunting-configuratie" -ForegroundColor Gray Write-Host " -ExecuteHunt Voer een specifieke jachtsessie uit (vereist -HypothesisId)" -ForegroundColor Gray Write-Host " -Revert Verwijder de configuratiefile (optioneel, met -WhatIf voor dry-run)" -ForegroundColor Gray } } catch { throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Zonder proactieve threat hunting blijven geavanceerde bedreigingen die gebruik maken van legitieme tools, geavanceerde technieken, of low-and-slow aanvallen onopgemerkt totdat zij tot significante schade leiden. Dit kan resulteren in langdurige dwell times, uitgebreide compromittering, data breaches, en niet-naleving van compliance-eisen zoals BIO en NIS2.

Management Samenvatting

Implementeer een gestructureerd threat hunting-programma dat gebruik maakt van Microsoft 365 Defender Advanced Hunting en Microsoft Sentinel om proactief te zoeken naar bedreigingen die niet door automatische detectieregels worden geïdentificeerd. Gebruik methodologieën zoals MITRE ATT&CK en PEAK om activiteiten te structureren, ontwikkel en beheer Advanced Hunting queries systematisch, en documenteer bevindingen voor continue verbetering. Voor Nederlandse overheidsorganisaties draagt threat hunting bij aan compliance met BIO en NIS2 door aan te tonen dat de organisatie proactief werkt aan het identificeren en mitigeren van bedreigingen.