mirror of
https://github.com/MattKeeley/Spoofy.git
synced 2026-06-13 18:10:25 +01:00
55 lines
3.2 KiB
Python
55 lines
3.2 KiB
Python
def is_spoofable(domain, p, aspf, spf_record, spf_all, spf_includes, sp, pct):
|
|
"""This function takes in DMARC and SPF data for a domain, as well as subdomain policy and percentage options,
|
|
and determines if the domain is vulnerable to email spoofing. The function returns an integer value indicating
|
|
the class of vulnerability.
|
|
ID Handler:
|
|
0: Indicates that spoofing is possible for the domain.
|
|
1: Indicates that subdomain spoofing is possible for the domain.
|
|
2: Indicates that organizational domain spoofing is possible for the domain.
|
|
3: Indicates that spoofing might be possible for the domain.
|
|
4: Indicates that spoofing might be possible (mailbox dependent) for the domain.
|
|
5: Indicates that organizational domain spoofing may be possible for the domain.
|
|
6: Indicates that subdomain spoofing might be possible (mailbox dependent) for the domain.
|
|
7: Indicates that subdomain spoofing is possible, and organizational domain spoofing might be possible.
|
|
8: Indicates that spoofing is not possible for the domain.
|
|
"""
|
|
try:
|
|
if pct and int(pct) != 100: return 3
|
|
elif spf_record is None:
|
|
if p is None: return 0
|
|
else: return 8
|
|
elif spf_includes > 10 and p is None:
|
|
return 0
|
|
elif spf_all == "2many":
|
|
if p == "none": return 3
|
|
else: return 8
|
|
elif spf_all and p is None: return 0
|
|
elif spf_all == "-all":
|
|
if p and aspf and sp == "none": return 1
|
|
elif aspf is None and sp == "none": return 1
|
|
elif p == "none" and (aspf == "r" or aspf is None) and sp is None: return 4
|
|
elif p == "none" and aspf == "r" and (sp == "reject" or sp == "quarentine"): return 2
|
|
elif p == "none" and aspf is None and (sp == "reject" or sp == "quarentine"): return 5
|
|
elif p == "none" and aspf is None and sp == "none": return 8
|
|
else: return 8
|
|
elif spf_all == "~all":
|
|
if p == "none" and sp == "reject" or sp == "quarentine": return 2
|
|
elif p == "none" and sp is None: return 0
|
|
elif p == "none" and sp == "none": return 8
|
|
elif (p == "reject" or p == "quarentine") and aspf is None and sp == "none": return 1
|
|
elif (p == "reject" or p == "quarentine") and aspf and sp == "none": return 1
|
|
else: return 8
|
|
elif spf_all == "?all":
|
|
if (p == "reject" or p == "quarentine") and aspf and sp == "none": return 6
|
|
elif (p == "reject" or p == "quarentine") and aspf is None and sp == "none": return 6
|
|
elif p == "none" and aspf == "r" and sp is None: return 0
|
|
elif p == "none" and aspf == "r" and sp == "none": return 8
|
|
elif p == "none" and aspf == "s" or None and sp == "none": return 8
|
|
elif p == "none" and aspf == "s" or None and sp is None: return 6
|
|
elif p == "none" and aspf and (sp == "reject" or sp == "quarentine"):return 5
|
|
elif p == "none" and aspf is None and sp == "reject": return 5
|
|
else: return 8
|
|
else: return 8
|
|
except:
|
|
print("If you hit this error message, Open an issue with your testcase.")
|