Detect SMTP Domain Mismatch

This example can detect SMTP messages where the domain in the email address of the sender does not match the domain of the SMTP server sending the email. This might be a sign of a phishing attack, though additional indicators may be needed to confirm.

For Example:

SenderEmail: mrX@corporateXYZ-email.com

SenderDomain: openSMTPserver.com

function Flow_SMTPDomainMismatch (dpiMsg, ruleEngine)

require('LOG')

-- get/verify application SMTP

local app = GetLatestApplication(dpiMsg)

if app == "smtp" then

-- get/verify sender domain

local sender_domain = GetString(dpiMsg, "smtp", "sender_domain")

if sender_domain ~= nil and sender_domain ~= '' then

sender_domain = string.lower(sender_domain)

-- get/verify sender email

local sender_email = GetString(dpiMsg, "smtp", "sender_email")

if sender_email ~= nil and sender_email ~= '' then

-- parse/verify/save the domain from sender email

local sender_email_domain = string.sub(sender_email, string.find(sender_email, '@')+1, string.len(sender_email))

if (sender_email_domain ~= nil and sender_email_domain ~= '') then

sender_email_domain = string.lower(sender_email_domain)

SetCustomField(dpiMsg, "sender_email_domain", sender_email_domain)

-- check if sender's real domain matches their claimed domain (exclude gmail)

-- alarm on mismatch

if not string.find(sender_domain, sender_email_domain, 1, true)

and not string.find(sender_domain, 'gmail')

and not string.find(sender_domain, 'google') then

SetCustomField(dpiMsg, "sender_domain", sender_domain)

SetCustomField(dpiMsg, "sender_domain_mismatch", 'true')

TriggerUserAlarm(dpiMsg, ruleEngine, 'medium')

EZINFO('domain mismatch, sender domain: '

.. sender_domain .. ', email domain: ' .. sender_email_domain

.. ', UUID: ' .. GetUuid(dpiMsg))

end

end

end

end

end

end