<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>KQL on Nicola Suter</title><link>https://nicolasuter.ch/tags/kql/</link><description>Recent content in KQL on Nicola Suter</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>© 2026 Nicola Suter</copyright><lastBuildDate>Thu, 04 Jun 2026 08:15:02 +0000</lastBuildDate><atom:link href="https://nicolasuter.ch/tags/kql/rss.xml" rel="self" type="application/rss+xml"/><item><title>Enhanced Filtering for Connectors: SPF failures in Defender for Office 365</title><link>https://nicolasuter.ch/til/mdo-enhanced-filtering/</link><pubDate>Thu, 04 Jun 2026 08:15:02 +0000</pubDate><guid>https://nicolasuter.ch/til/mdo-enhanced-filtering/</guid><description>&lt;p&gt;Enhanced Filtering for Connectors&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; (aka skip listing) lets Exchange Online and Defender for Office 365 see the actual sender IP address instead of only the last hop. This is required so that MDO can verify message authentication attributes such as SPF, DMARC, and DKIM. Microsoft recommends it in its guides for third party mail flows&lt;cite&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; &lt;cite&gt;&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; to get the full value out of MDO.&lt;/p&gt;
&lt;p&gt;Without enhanced filtering, MDO only sees your 3rd party gateway as the sender for incoming e-mails. As a result, you lose important sender metadata, which degrades your experience in Threat Explorer, Advanced Hunting, and the Tenant Allow/Block List.&lt;/p&gt;
&lt;p&gt;The mail flow in the environment roughly looks like this, with the 3rd party gateway acting as the MX for inbound mail and as the smart host for outbound mail. Exchange Online is connected to an on-premises Exchange server via the hybrid connector:&lt;/p&gt;
&lt;pre class="not-prose mermaid"&gt;
flowchart LR
 Internet([Internet])
 Gateway[3rd Party&lt;br/&gt;Mail Gateway&lt;br/&gt;&lt;i&gt;MX record&lt;/i&gt;]
 EXO[Exchange Online&lt;br/&gt;&lt;i&gt;Defender for Office 365&lt;/i&gt;]
 OnPrem[On-Premises&lt;br/&gt;Exchange Server]

 %% Inbound flow
 Internet --&gt; Gateway
 Gateway -- "&lt;i&gt;Partner connector&lt;br/&gt;+ Enhanced Filtering&lt;/i&gt;" --&gt; EXO
 EXO -- "&lt;i&gt;Hybrid connector" --&gt; OnPrem

 %% Outbound flow
 OnPrem -. "&lt;i&gt;Hybrid connector&lt;br/&gt;+ Enhanced Filtering&lt;/i&gt;&lt;/i&gt;" .-&gt; EXO
 EXO -. "&lt;i&gt;Partner connector&lt;/i&gt;" .-&gt; Gateway
 Gateway .-&gt; Internet

 classDef cloud fill:#e6f2ff,stroke:#0078d4,color:#000
 classDef onprem fill:#fff4e6,stroke:#d97706,color:#000
 classDef gw fill:#f3e8ff,stroke:#7c3aed,color:#000
 class EXO cloud
 class OnPrem onprem
 class Gateway gw
&lt;/pre&gt;

&lt;p&gt;Following the Microsoft recommendation, enhanced filtering was enabled on both the 3rd party connector and the Exchange hybrid connectors.&lt;/p&gt;</description></item><item><title>Chasing Entra re-authentication prompts</title><link>https://nicolasuter.ch/til/entra-expiration-requirement/</link><pubDate>Mon, 01 Jun 2026 15:37:02 +0000</pubDate><guid>https://nicolasuter.ch/til/entra-expiration-requirement/</guid><description>&lt;p&gt;While troubleshooting unexpected re-authentication prompts in Entra ID, I stumbled over a legacy setting I had almost forgotten existed. The environment was piloting a new set of Conditional Access policies, and some pilot users received daily re-authentication prompts in Microsoft 365 apps, although no Conditional Access policy was forcing this.&lt;/p&gt;
&lt;p&gt;Entra ID Protection was the first suspect, but no risk detections were present for the affected users. The actual reason was hiding in plain sight in the Entra sign-in logs, in the &lt;code&gt;SessionLifetimePolicies&lt;/code&gt; field.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Inspecting SessionLifetimePolicies
 &lt;div id="inspecting-sessionlifetimepolicies" 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="#inspecting-sessionlifetimepolicies" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;A quick KQL query against &lt;code&gt;SigninLogs&lt;/code&gt; reveals every distinct &lt;code&gt;expirationRequirement&lt;/code&gt; reason observed in the tenant:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="ExpirationRequirement"
 width="627"
 height="148"
 src="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png"
 srcset="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png 800w, https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png"&gt;&lt;figcaption&gt;Distinct expirationRequirement reasons surfaced from SigninLogs&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;SigninLogs
| mv-expand parse_json(SessionLifetimePolicies)
| extend ExpirationRequirement = tostring(SessionLifetimePolicies.expirationRequirement)
| extend ExpirationDetail = tostring(SessionLifetimePolicies.detail)
| distinct ExpirationRequirement, ExpirationDetail&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;sessionLifetimePolicy&lt;/code&gt; resource is also documented as part of the Microsoft Graph API&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Legacy MFA settings
 &lt;div id="legacy-mfa-settings" 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="#legacy-mfa-settings" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;rememberMultifactorAuthenticationOnTrustedDevices&lt;/code&gt; value stood out and reminded me of the Azure AD days and the legacy MFA settings. Sure enough, the &lt;em&gt;Remember multi-factor authentication on trusted devices&lt;/em&gt; setting was still enabled:&lt;/p&gt;</description></item><item><title>Detecting Intune device compliance drift with KQL</title><link>https://nicolasuter.ch/til/intune-device-compliance-drift-kql/</link><pubDate>Tue, 26 May 2026 16:26:02 +0000</pubDate><guid>https://nicolasuter.ch/til/intune-device-compliance-drift-kql/</guid><description>&lt;p&gt;Why are my Intune devices no longer compliant? Rolling out new compliance policies, raising minimum OS versions, or adjusting other controls can all cause devices to drift out of compliance. Ultimately, this impacts resource access whenever Conditional Access enforces a compliant device.&lt;/p&gt;
&lt;p&gt;If you forward the &lt;code&gt;IntuneOperationalLogs&lt;/code&gt; to a Log Analytics workspace&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;, you can query, parse, and alert on non-compliance events with just a few lines of KQL:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="Managed Device Not Compliant"
 width="1356"
 height="232"
 src="https://nicolasuter.ch/til/intune-device-compliance-drift-kql/query1_hu_73ea0739d283cb9e.png"
 srcset="https://nicolasuter.ch/til/intune-device-compliance-drift-kql/query1_hu_73ea0739d283cb9e.png 800w, https://nicolasuter.ch/til/intune-device-compliance-drift-kql/query1_hu_9e3091403bbe2d05.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/intune-device-compliance-drift-kql/query1.png"&gt;&lt;figcaption&gt;Anonymized example of noncompliant devices&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;IntuneOperationalLogs 
| where OperationName == &amp;#34;Compliance&amp;#34;
| extend Properties = parse_json(Properties)
| evaluate bag_unpack(Properties)
| where AlertType == @&amp;#34;Managed Device Not Compliant&amp;#34;
| extend UserPrincipalName = iif(UserDisplayName != &amp;#34;System account&amp;#34;, strcat(UserName, &amp;#39;@&amp;#39;, UPNSuffix), &amp;#34;System account&amp;#34;)
// Extract the reason
| extend ReasonRaw = tostring(split(Description, &amp;#39;||&amp;#39;)[0])
// Parse the compliance Policy ID
| parse ReasonRaw with ReasonParsed:string &amp;#34;_IID_&amp;#34; PolicyIdRaw:string
| extend Reason = coalesce(ReasonParsed, ReasonRaw)
| extend PolicyId = coalesce(PolicyIdRaw, &amp;#39;DefaultDeviceCompliancePolicy&amp;#39;)
| project-away *Raw
| project-reorder TimeGenerated, UserPrincipalName, DeviceHostName, IntuneDeviceId ,Reason, PolicyId&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="note"&gt;
 &lt;div class="flex items-center gap-2 font-semibold text-inherit"&gt;
 &lt;div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"&gt;&lt;span class="relative block icon"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z"/&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/div&gt;
 &lt;div class="grow"&gt;
 Note
 &lt;/div&gt;
 &lt;/div&gt;&lt;div class="admonition-content mt-3 text-base leading-relaxed text-inherit"&gt;&lt;p&gt;The &lt;code&gt;Properties&lt;/code&gt; column is a serialized JSON string that holds all the non-compliance details. The &lt;code&gt;bag_unpack&lt;/code&gt; plugin&lt;cite&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; expands every property in the bag into its own column, which keeps the rest of the query much simpler.&lt;/p&gt;</description></item><item><title>Microsoft Authenticator App Details now exposed in Entra SignInLogs</title><link>https://nicolasuter.ch/til/authenticationappdevicedetails/</link><pubDate>Wed, 20 May 2026 12:00:01 +0000</pubDate><guid>https://nicolasuter.ch/til/authenticationappdevicedetails/</guid><description>&lt;p&gt;In response to CVE-2026-41615&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; (Microsoft Authenticator Information Disclosure Vulnerability), Microsoft started exposing the used Microsoft Authenticator app details as part of the Entra ID Sign-In Logs in the &lt;code&gt;AuthenticationAppDeviceDetails&lt;/code&gt; column. The information can be queried via KQL. Vulnerable builds include versions prior to 6.2605.2973 (Android) and 6.8.47 (iOS), which have been patched.&lt;/p&gt;
&lt;p&gt;You can use the below KQL query to find users with outdated Microsoft Authenticator app versions, which are vulnerable:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="AuthenticationAppDeviceDetails"
 width="872"
 height="213"
 src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails_hu_8cac35efb14eb6ad.png"
 srcset="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails_hu_8cac35efb14eb6ad.png 800w, https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails.png"&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;// https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-41615
let MinimumVersions = datatable(
 AuthenticatorOperatingSystem: string,
 PatchedAuthenticatorVersion: string
)[
 &amp;#34;Android&amp;#34;, &amp;#34;6.2605.2973&amp;#34;,
 &amp;#34;Ios&amp;#34;, &amp;#34;6.8.47&amp;#34;
];
SigninLogs
| where isnotempty(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetails = parse_json(AuthenticationAppDeviceDetails)
| extend AuthenticatorOperatingSystem = tostring(AuthenticationAppDetails.operatingSystem)
| extend UsedAuthenticatorVersion = tostring(AuthenticationAppDetails.appVersion)
// b2b and guest accounts include: {&amp;#34;deviceId&amp;#34;:&amp;#34;{PII Removed}&amp;#34;} and no authenticator details
| where isnotempty(UsedAuthenticatorVersion)
| join kind=leftouter MinimumVersions on AuthenticatorOperatingSystem
| extend isVulnerable = parse_version(UsedAuthenticatorVersion) &amp;lt; parse_version(PatchedAuthenticatorVersion)
| where isVulnerable
| distinct UserPrincipalName, AuthenticatorOperatingSystem, UsedAuthenticatorVersion, isVulnerable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;AuthenticationAppDeviceDetails&lt;/code&gt; (JSON) column itself consists of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appVersion&lt;/li&gt;
&lt;li&gt;clientApp&lt;/li&gt;
&lt;li&gt;deviceId&lt;/li&gt;
&lt;li&gt;operatingSystem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;clientApp&lt;/code&gt; property is really helpful, as we now also have another option to identify users who use the Authenticator light capabilities, available as part of the Outlook app:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="AuthenticationAppDetailsClientApp"
 width="754"
 height="276"
 src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png"
 srcset="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png 800w, https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png"&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;SigninLogs
| where isnotempty(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetails = parse_json(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetailsClientApp = tostring(AuthenticationAppDetails.clientApp)
| where AuthenticationAppDetailsClientApp == &amp;#34;Outlook&amp;#34;
| distinct UserPrincipalName, AuthenticationAppDetailsClientApp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This might be relevant in your environment if you did not disable the Microsoft-managed setting for using the Authenticator light option, which, for example, does not support Conditional Access authentication strengths, passkeys, and app protection policies:&lt;/p&gt;</description></item><item><title>AI just solved a CTF for me!</title><link>https://nicolasuter.ch/ai-solved-ctf/</link><pubDate>Fri, 16 Jan 2026 21:00:03 +0000</pubDate><guid>https://nicolasuter.ch/ai-solved-ctf/</guid><description>&lt;p&gt;At this year&amp;rsquo;s YellowHat conference in Almere, the Dutch security community had the chance to participate in a Capture The Flag (CTF) competition organized by one of the conference sponsors - &lt;a href="https://academy.bluraven.io/" target="_blank" rel="noreferrer"&gt;Blu Raven&lt;/a&gt;. Mehmet from Blu Raven did a great job setting up a CTF with realistic scenarios and datasets, which made it a lot of fun to solve the challenges.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Foreword
 &lt;div id="foreword" 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="#foreword" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Being a big fan of CTFs and digital forensics and incident response (DFIR) in general, I couldn&amp;rsquo;t resist the temptation to participate. After numerous attempts to solve the first challenge and an enlightening tip from a colleague, I made some progress and solved the first 12 challenges.&lt;/p&gt;
&lt;p&gt;To avoid running out of time, I decided to try something unconventional for the remaining challenges - I used AI to help me solve them. Professor Smoke aka Henning Rauch teased the new Microsoft Fabric Real-Time Intelligence (RTI) capabilities during his talk at YellowHat&lt;sup&gt;1&lt;/sup&gt;, so I thought this would be a great opportunity to test these out in a real-world scenario. Little did I know that the outcome would be surprising!&lt;/p&gt;

&lt;h2 class="relative group"&gt;Preconditions
 &lt;div id="preconditions" 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="#preconditions" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;

&lt;h3 class="relative group"&gt;Azure Data Explorer
 &lt;div id="azure-data-explorer" 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="#azure-data-explorer" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Because the CTF data was stored in an Azure Data Explorer (ADX) cluster, the prerequisite for using the Fabric RTI MCP server was already met, because we can query data in Eventhouse &lt;strong&gt;and ADX&lt;/strong&gt;.
Besides that I had already set up &lt;a href="https://learn.microsoft.com/en-us/visualstudio/ide/copilot-agent-mode?view=visualstudio" target="_blank" rel="noreferrer"&gt;GitHub Copilot within Visual Studio Code in agent mode&lt;/a&gt; from previous AI ramblings.&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></channel></rss>