def is_spf_record_strong(domain): strong_spf_record = True spf_record = spflib.SpfRecord.from_domain(domain) if spf_record is not None and spf_record.record is not None: output_info("Found SPF record:") output_info(str(spf_record.record)) strong_all_string = check_spf_all_string(spf_record) if strong_all_string is False: redirect_strength = check_spf_redirect_mechanisms(spf_record) include_strength = check_spf_include_mechanisms(spf_record) strong_spf_record = False if redirect_strength is True: strong_spf_record = True if include_strength is True: strong_spf_record = True else: output_good(domain + " has no SPF record!") strong_spf_record = False return strong_spf_record
def check_dmarc_org_policy(base_record): policy_strong = False try: org_record = base_record.get_org_record() if org_record is not None and org_record.record is not None: output_info("Found organizational DMARC record:") output_info(str(org_record.record)) if org_record.subdomain_policy is not None: if org_record.subdomain_policy == "none": output_good("Organizational subdomain policy set to %(sp)s" % {"sp": org_record.subdomain_policy}) elif org_record.subdomain_policy == "quarantine" or org_record.subdomain_policy == "reject": output_bad("Organizational subdomain policy explicitly set to %(sp)s" % {"sp": org_record.subdomain_policy}) policy_strong = True else: output_info("No explicit organizational subdomain policy. Defaulting to organizational policy") policy_strong = check_dmarc_policy(org_record) else: output_good("No organizational DMARC record") except Exception as e: logging.exception(e) return policy_strong
def check_dmarc_policy(dmarc_record): policy_strength = False if dmarc_record.policy is not None: if dmarc_record.policy == "reject" or dmarc_record.policy == "quarantine": policy_strength = True output_bad("DMARC policy set to " + dmarc_record.policy) else: output_good("DMARC policy set to " + dmarc_record.policy) else: output_good("DMARC record has no Policy") return policy_strength
def check_spf_all_string(spf_record): strong_spf_all_string = False if spf_record.all_string is not None: if spf_record.all_string == "~all" or spf_record.all_string == "-all": output_indifferent("SPF record contains an All item: " + spf_record.all_string) else: output_good("SPF record All item is too weak: " + spf_record.all_string) strong_spf_all_string = True else: output_good("SPF record has no All string") return strong_spf_all_string
def is_dmarc_record_strong(domain): dmarc_record_strong = False dmarc = get_dmarc_record(domain) if dmarc is not None: dmarc_record_strong = check_dmarc_policy(dmarc) check_dmarc_extras(dmarc) else: output_good(domain + " has no DMARC record!") return dmarc_record_strong
def is_dmarc_record_strong(domain): dmarc_record_strong = False try: dmarc = get_dmarc_record(domain) dmarc_record_strong = check_dmarc_policy(dmarc) check_dmarc_extras(dmarc) except dmarclib.NoDmarcRecordException: output_good(domain + " has no DMARC record!") return dmarc_record_strong
def is_dmarc_record_strong(domain): dmarc_record_strong = False dmarc = get_dmarc_record(domain) if dmarc is not None and dmarc.record is not None: dmarc_record_strong = check_dmarc_policy(dmarc) check_dmarc_extras(dmarc) elif dmarc.get_org_domain() is not None: output_info("No DMARC record found. Looking for organizational record") dmarc_record_strong = check_dmarc_org_policy(dmarc) else: output_good(domain + " has no DMARC record!") return dmarc_record_strong
def is_spf_record_strong(domain): strong_spf_record = True try: spf_record = spflib.SpfRecord.from_domain(domain) output_info("Found SPF record:") output_info(str(spf_record.record)) all_string_weak = check_spf_all_string(spf_record) if all_string_weak is True: strong_spf_record = False except spflib.NoSpfRecordException: output_good(domain + " has no SPF record!") strong_spf_record = False return strong_spf_record
def single_domain(domain): color_init() spoofable = False spf_record_strength = is_spf_record_strong(domain) dmarc_record_strength = is_dmarc_record_strong(domain) if dmarc_record_strength is False: spoofable = True else: spoofable = False if spoofable: output_good("Spoofing possible for " + domain + "!") else: output_bad("Spoofing not possible for " + domain)
def check_spf_all_string(spf_record): strong_spf_all_string = True if spf_record.all_string: if spf_record.all_string == "~all" or spf_record.all_string == "-all": output_indifferent( f"SPF record contains an All item: {spf_record.all_string}") else: output_good( f"SPF record All item is too weak: {spf_record.all_string}") strong_spf_all_string = False else: output_good("SPF record has no All string") strong_spf_all_string = False if not strong_spf_all_string: strong_spf_all_string = check_spf_include_redirect(spf_record) return strong_spf_all_string
def check_dmarc_org_policy(base_record): policy_strong = False try: org_record = base_record.get_org_record() if org_record is not None and org_record.record is not None: output_info("Found organizational DMARC record:") output_info(str(org_record.record)) if org_record.subdomain_policy is not None: if org_record.subdomain_policy == "none": output_good( "Organizational subdomain policy set to %(sp)s" % {"sp": org_record.subdomain_policy}) elif org_record.subdomain_policy == "quarantine" or org_record.subdomain_policy == "reject": output_bad( "Organizational subdomain policy explicitly set to %(sp)s" % {"sp": org_record.subdomain_policy}) policy_strong = True else: output_info( "No explicit organizational subdomain policy. Defaulting to organizational policy" ) policy_strong = check_dmarc_policy(org_record) else: output_good("No organizational DMARC record") except dmarclib.OrgDomainException: output_good("No organizational DMARC record") except Exception as e: logging.exception(e) return policy_strong
def is_spf_record_strong(domain): strong_spf_record = True spf_record = spflib.SpfRecord.from_domain(domain) if spf_record and spf_record.record: output_info("Found SPF record:") output_info(str(spf_record.record)) strong_all_string = check_spf_all_string(spf_record) if not strong_all_string: redirect_strength = check_spf_redirect_mechanisms(spf_record) include_strength = check_spf_include_mechanisms(spf_record) strong_spf_record = False if redirect_strength or include_strength: strong_spf_record = True else: output_good(f"{domain} has no SPF record!") strong_spf_record = False return strong_spf_record
check_dmarc_extras(dmarc) elif dmarc.get_org_domain(): output_info( "No DMARC record found. Looking for organizational record...") dmarc_record_strong = check_dmarc_org_policy(dmarc) else: output_good(f"{domain} has no DMARC record!") return dmarc_record_strong if __name__ == "__main__": color_init() spoofable = False try: domain = sys.argv[1] spf_record_strong = is_spf_record_strong(domain) dmarc_record_strong = is_dmarc_record_strong(domain) if spf_record_strong and dmarc_record_strong: output_bad(f"Spoofing not possible for {domain}") else: output_good(f"Spoofing possible for {domain}!") except IndexError: output_error(f"Usage: {sys.argv[0]} [DOMAIN]")
output_info("No DMARC record found. Looking for organizational record") dmarc_record_strong = check_dmarc_org_policy(dmarc) else: output_good(domain + " has no DMARC record!") return dmarc_record_strong if __name__ == "__main__": color_init() spoofable = False try: domain = sys.argv[1] spf_record_strength = is_spf_record_strong(domain) dmarc_record_strength = is_dmarc_record_strong(domain) if dmarc_record_strength is False: spoofable = True else: spoofable = False if spoofable: output_good("Spoofing possible for " + domain + "!") else: output_bad("Spoofing not possible for " + domain) except IndexError: output_error("Usage: " + sys.argv[0] + " [DOMAIN]")
spoofable = False try: scope = sys.argv[1] hosts = open(scope).readlines() hosts_spoofable = [] for host in hosts: domain = host.strip() spf_record_strength = is_spf_record_strong(domain) dmarc_record_strength = is_dmarc_record_strong(domain) if dmarc_record_strength is False: spoofable = True else: spoofable = False if spoofable: output_good("Spoofing possible for " + domain + "!") hosts_spoofable.append(domain) else: output_bad("Spoofing not possible for " + domain) output_good("\n") if len(hosts_spoofable) > 0: output_good("Spoofing possible for the following domains:\n") for line in hosts_spoofable: output_good(line) else: output_bad("Spoofing not possible for any of the domains.") except IndexError: output_error("Usage: " + sys.argv[0] + " [SCOPE_FILE]")
elif dmarc.get_org_domain() is not None: output_info("No DMARC record found. Looking for organizational record") dmarc_record_strong = check_dmarc_org_policy(dmarc) else: output_good(domain + " has no DMARC record!") return dmarc_record_strong if __name__ == "__main__": color_init() spoofable = False try: domain = sys.argv[1] spf_record_strength = is_spf_record_strong(domain) dmarc_record_strength = is_dmarc_record_strong(domain) if dmarc_record_strength is False: spoofable = True else: spoofable = False if spoofable: output_good("Spoofing possible for " + domain + "!") else: output_bad("Spoofing not possible for " + domain) except IndexError: output_error("Usage: " + sys.argv[0] + " [DOMAIN]")