<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ITDR on Nicola Suter</title><link>https://nicolasuter.ch/tags/itdr/</link><description>Recent content in ITDR on Nicola Suter</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>© 2026 Nicola Suter</copyright><lastBuildDate>Sun, 22 Mar 2026 10:00:03 +0000</lastBuildDate><atom:link href="https://nicolasuter.ch/tags/itdr/rss.xml" rel="self" type="application/rss+xml"/><item><title>Don't let Entra ID Protection miss your next breach!</title><link>https://nicolasuter.ch/entra-id-protection-stop-account-breach/</link><pubDate>Sun, 22 Mar 2026 10:00:03 +0000</pubDate><guid>https://nicolasuter.ch/entra-id-protection-stop-account-breach/</guid><description>&lt;p&gt;All too often, my baseVISION (IR) colleagues and I find compromised cloud accounts where many security &amp;lsquo;signals&amp;rsquo; were missed—both from a prevention and detection perspective. In this blog post, I want to share some motivation and tips to help you adopt Entra ID Protection risk-based Conditional Access policies to increase your tenant&amp;rsquo;s security posture, and ensure you don&amp;rsquo;t miss the next obvious account breach.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Real-world motivation
 &lt;div id="real-world-motivation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#real-world-motivation" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Anyone who has seen an AiTM campaign in the wild will probably notice the following details from the Entra ID sign-in logs of a compromised account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResourceDisplayName: &lt;code&gt;OfficeHome&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UserAgent: &lt;code&gt;axios/1.13.2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Entra ID Protection - High - AiTM"
 src="https://nicolasuter.ch/content/images/2026/eidp/id-protection-high.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;The problem? Even though Entra ID Protection flagged the sign-in as &amp;lsquo;High&amp;rsquo; risk, the user could still sign in because MFA automatically remediated the sign-in risk (&lt;code&gt;userPassedMfaDrivenByRiskBasedPolicy&lt;/code&gt;).&lt;/p&gt;

&lt;h3 class="relative group"&gt;The bummer?
 &lt;div id="the-bummer" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-bummer" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Report Only ID Protection Policy"
 src="https://nicolasuter.ch/content/images/2026/eidp/id-protection-report-only.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;The environment had a Conditional Access policy in place that would have blocked users with high sign-in risk, but the policy was only in &lt;em&gt;report-only&lt;/em&gt; mode, so the user could sign in without any issues.&lt;/p&gt;</description></item><item><title>Mai 2024 KQL Café Recap</title><link>https://nicolasuter.ch/mai-2024-kql-cafe-recap/</link><pubDate>Mon, 01 Jul 2024 20:07:46 +0000</pubDate><guid>https://nicolasuter.ch/mai-2024-kql-cafe-recap/</guid><description>&lt;p&gt;In May I had the pleasure to be invited to the &lt;a href="https://kqlcafe.github.io/website/" target="_blank" rel="noreferrer"&gt;KQL Café&lt;/a&gt; which is hosted by &lt;a href="https://twitter.com/castello_johnny" target="_blank" rel="noreferrer"&gt;Gianni Castaldi&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/alexverboon" target="_blank" rel="noreferrer"&gt;Alex Verboon&lt;/a&gt;. Within this format they empower people to work with KQL and share various tips and tricks. So this is not a usual blogpost but rather a summary and resource hub for the things I presented within the KQL Café.&lt;/p&gt;

&lt;h1 class="relative group"&gt;Summary
 &lt;div id="summary" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#summary" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h1&gt;
&lt;p&gt;To make the content of my talk more accessible, you can find a summary of the individual topics, including the leveraged KQL queries and further resources as part of this post. The KQL queries were mostly consuming the Entra ID Sign-In and Audit Logs. You can forward them to your Microsoft Sentinel or Log Analytics workspace.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Recording
 &lt;div id="recording" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#recording" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;You can find the full recording of the KQL Café on YoutTube.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/lKB1sfZuDio?si=HgXMFWTI21ypES3g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h2 class="relative group"&gt;What the heck is ITDR?!
 &lt;div id="what-the-heck-isitdr" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-the-heck-isitdr" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Identity Threat Detection and Response (ITDR) is currently one of my favourite topics. It’s basically a combination of the disciplines Identity and Access Management (IAM) and the cyber security disciplines detection and response. Similar to other cybersecurity topics there’s a rule of thumb: The more you invest on the preventive side to increase your identity security posture — the less effort you (hopefully) have on the detection and response side 🤞🤞. Within my talk for the KQL Café I addressed various of those ITDR topics that help you on the preventive side.&lt;/p&gt;</description></item><item><title>AiTM Phishing with Azure Functions</title><link>https://nicolasuter.ch/aitm-phishing-with-azure-functions/</link><pubDate>Mon, 01 Apr 2024 18:23:49 +0000</pubDate><guid>https://nicolasuter.ch/aitm-phishing-with-azure-functions/</guid><description>&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://cdn-images-1.medium.com/max/800/1*2rGHexNlD4iRO2hqP2zfAg.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;Recently I stumbled over a nice &lt;a href="https://zolder.io/aitm-attacks-using-cloudflare-workers/" target="_blank" rel="noreferrer"&gt;post from Wesly Neelen&lt;/a&gt; who built an AiTM phishing toolkit based on a cloudflare worker. Although ‘prooven’ AitM phishing toolkits such as evilginx provide more capabilities in terms of flexibility and robustness I wanted to setup my own phishing toolkit that runs serverless on Azure — based on Azure Functions to phish some Entra ID credentials and cookies.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Advantages of serverless phishing toolkits
 &lt;div id="advantages-of-serverless-phishingtoolkits" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#advantages-of-serverless-phishingtoolkits" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Serverless platform solutions such as Cloudflare workers, AWS lambda and Azure functions provide some advantages to phishing toolkits that are server-based:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No Infrastructure as a Service (IaaS) resources like virtual machines and public IP addresses are required, this allows faster deployments, easier scaling and comes with low costs&lt;/li&gt;
&lt;li&gt;Serverless platforms often have pooled outbound IP addresses that are dynamically assigned by the cloud provider&lt;/li&gt;
&lt;li&gt;No DNS domain name or name server entries are required as the cloud provider assigns URLs to the serverless functions&lt;/li&gt;
&lt;li&gt;As the domain names, IP addresses and certificates are issued and managed by the cloud provider, this goes usually hand-in-hand with better reputation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;Let’s do AiTM Phishing with Azure Functions
 &lt;div id="lets-do-aitm-phishing-with-azure-functions" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#lets-do-aitm-phishing-with-azure-functions" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;

&lt;h3 class="relative group"&gt;Demo
 &lt;div id="demo" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#demo" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;The following demo provides a quick overview about the Azure AiTM Function and the replay of the cookies in an incognito browser window:&lt;/p&gt;</description></item><item><title>Have you heard about passkeys and AAGuids?</title><link>https://nicolasuter.ch/have-you-heard-about-passkeys-and-aaguids/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://nicolasuter.ch/have-you-heard-about-passkeys-and-aaguids/</guid><description>&lt;p&gt;With the availability of passkeys the FIDO2 standards become more accessible in the form of password managers, web-browsers and (mobile) operating systems — without the need for dedicated hardware such as FIDO2 keys.&lt;/p&gt;
&lt;p&gt;Microsoft is currently in the process of developing support for passkeys and shipping the public preview in Q1 2024:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://nicolasuter.ch/content/images/1__pwNnOdcgBQPCEwZRTpGKNg.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;While this is a very welcome addition to make passwordless authentication easily accessible without dedicated hardware such as FIDO2 security keys this also introduces new risks, especially for high value accounts — But why’s that?&lt;/p&gt;
&lt;p&gt;Let’s imagine a fictive scenario (that might become reality in the future) of a user registering a passkey with his password manager app for a Microsoft Entra account. The security of this passkey is now determined by the security measures on the password manager app.&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://nicolasuter.ch/content/images/0__7Mdx6OFRnIJ__wVbJ.jpg"
 &gt;&lt;/figure&gt;
&lt;p&gt;For the Microsoft roadmap this scenario is not (yet) applicable as Entra will only support device-bound passkeys. At the end of the day it is a similar situation as the security of the passkey depends on the device with the authenticator (passkey) on it and that’s not necessarily under the umbrella of IT security measures.&lt;/p&gt;
&lt;p&gt;Fortunately there is hope and the FIDO alliance included that critical aspect of distinguishing authenticators in their standards as we’ll find out below.&lt;/p&gt;</description></item><item><title>Enriching Microsoft Sentinel tables with eligible Entra directory roles</title><link>https://nicolasuter.ch/enriching-microsoft-sentinel-tables-with-eligible-entra-directory-roles/</link><pubDate>Fri, 17 Nov 2023 00:00:00 +0000</pubDate><guid>https://nicolasuter.ch/enriching-microsoft-sentinel-tables-with-eligible-entra-directory-roles/</guid><description>&lt;p&gt;Microsoft 365 Defender and Sentinel provide an &lt;em&gt;IdentityInfo&lt;/em&gt; table that contains various information that is helpful for threat hunting and detections. One key piece are also the assigned Entra directory roles for a specific identity. Unfortunately only permanently assigned permissions are covered and in times of Entra Privileged Identity Management (PIM) we should have standing permissions only for non-privileged roles and break-glass accounts.&lt;/p&gt;
&lt;p&gt;Within this blog post I want to share a few tips and tricks to answer the following questions with Sentinel and a little bit of scripting and KQL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How can we enrich the &lt;em&gt;IdentityInfo&lt;/em&gt; table to include eligible assigned directory roles?&lt;/li&gt;
&lt;li&gt;Which synchronized user accounts have permanent or eligible directory roles assigned? (Spoiler: this should be avoided at all cost)&lt;/li&gt;
&lt;li&gt;Were eligible directory role assignments not used within the last couple of days and can therefore be removed?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a bonus I also prepared an analytics rule for mass unassignment of highly privileged Entra roles, as this tactic was used for example by the LAPSUS$ group.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Gathering PIM eligible Entra Directory Roles
 &lt;div id="gathering-pim-eligible-entra-directory-roles" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#gathering-pim-eligible-entra-directory-roles" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;As the &lt;em&gt;IdentityInfo&lt;/em&gt; and other available built-in data sources do not include eligible role assignments we need a way to gather the existing role assignments. Fortunately, we can query the following Microsoft Graph endpoint to get the eligible permission assignments:&lt;/p&gt;</description></item><item><title>Maintaining Microsoft Sentinel Analytic Rules in JSON and YAML with GitHub Actions</title><link>https://nicolasuter.ch/maintaining-microsoft-sentinel-analytic-rules-in-json-and-yaml-with-github-actions/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><guid>https://nicolasuter.ch/maintaining-microsoft-sentinel-analytic-rules-in-json-and-yaml-with-github-actions/</guid><description>&lt;p&gt;Microsoft Sentinel Analytic Rules can be shared in both the YAML and ARM format, whereas the ARM format leverages JSON as file type. Within…&lt;/p&gt;
&lt;p&gt;Microsoft Sentinel Analytic Rules can be shared in both the YAML and ARM format, whereas the ARM format leverages JSON as file type. Within this short post I want to demonstrate an approach that leverages a GitHub Action to automatically build and update the rules in YAML format — so you can just export and update existing rules without any manual conversion effort.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/fabian_bader" target="_blank" rel="noreferrer"&gt;Fabian Bader&lt;/a&gt; built a cool solution called &lt;a href="https://cloudbrothers.info/convert-sentinel-analytics-rules/" target="_blank" rel="noreferrer"&gt;SentinelARConverter&lt;/a&gt; that allows conversion of exported Sentinel Analctic rules from ARM/JSON to YAML (and vice-versa). To emphasize sharing of analytic rules I wanted to adopt also the YAML format without the need to always manually convert the rules. Therefore I incorporated his solution into a GitHub Action.&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://nicolasuter.ch/content/images/1__epyol1VOFkyQ9BI2j7__Agg.png"
 &gt;&lt;/figure&gt;

&lt;h3 class="relative group"&gt;Building a GitHub Action
 &lt;div id="building-a-githubaction" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#building-a-githubaction" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;The automation of this task is fairly simple if you are already familiar with GitHub actions. In case you want to directly see the full pipeline, you can find it &lt;a href="https://github.com/nicolonsky/ITDR/blob/main/.github/workflows/build-yaml-rules.yml" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;. Otherwise keep on reading.&lt;/p&gt;
&lt;p&gt;The GitHub action should be triggered as soon as I upload a new Export of an Analytics Rule to the repository. For that, we need to define a folder structure. I maintain the rules within a folder called &lt;code&gt;AnalyticRules&lt;/code&gt;. Based on that we can define the triggers for the workflow and filter only for the analytic rules path. This will only run the Action, when a file within that folder get’s changed. Additionally, I added a &lt;code&gt;workflow_dispatch&lt;/code&gt; trigger, this allows manual execution of the pipeline.&lt;/p&gt;</description></item><item><title>Have you heard of workload identity access token replay?</title><link>https://nicolasuter.ch/have-you-heard-of-workload-identity-access-token-replay/</link><pubDate>Wed, 08 Nov 2023 00:00:00 +0000</pubDate><guid>https://nicolasuter.ch/have-you-heard-of-workload-identity-access-token-replay/</guid><description>&lt;p&gt;Microsoft recently made the Microsoft Graph Activity Logs available as part of the Microsoft Entra ID diagnostic settings. This means we can use the &lt;em&gt;MicrosoftGraphActivityLogs&lt;/em&gt; Table to enrich custom detections and analytic rules.&lt;/p&gt;
&lt;p&gt;Within this post I want to elaborate closer on an attack scenario for workload identities that leverage workload identity federation and don’t have any persistent credentials or long lived secrets. But one type of credential artefacts is still theft-able — the short lived access tokens.&lt;/p&gt;
&lt;p&gt;Adversaries can try to exfiltrate the access token from the CI/CD environment such as a GitHub action and replay the token within another system to access Entra ID protected resources.&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt=""
 src="https://nicolasuter.ch/content/images/1__iTbbTvAIBrAQsd2KErnBGg.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;This tactic could also be used in scenarios with App Registrations that leverage certificates or clients secrets where adversaries don’t have access to the credentials but get possession of the access token due to exposure in cleartext such as in log files or decrypted TLS traffic.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Stealing and replaying workload identity access tokens
 &lt;div id="stealing-and-replaying-workload-identity-accesstokens" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#stealing-and-replaying-workload-identity-accesstokens" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;To demonstrate a scenario to steal and replay an access token of a workload identity, I prepared a demo scenario with a GitHub action that acquires access tokens for the Microsoft Graph API and the Azure Resource Manager API. The pipeline leverages federated credentials (also referred to as workload identity federation).&lt;/p&gt;</description></item></channel></rss>