📜  SpoofThatMail – 检查域是否可以在 DMARC 记录中被欺骗(1)

📅  最后修改于: 2023-12-03 14:47:32.227000             🧑  作者: Mango

SpoofThatMail - 检查域是否可以在 DMARC 记录中被欺骗

简介

SpoofThatMail 是一款用于检查域名是否可以被欺骗的工具。它主要使用了 DMARC (Domain-based Message Authentication, Reporting and Conformance) 标准来验证域名是否可以被伪造。

DMARC 是一种基于 SPF (Sender Policy Framework) 和 DKIM (DomainKeys Identified Mail) 的标准,它可以帮助邮件服务器判断一封邮件是否为伪造。当一个邮件服务器收到一封邮件时,它会查找邮件头中是否有 SPF 和 DKIM 记录,根据这些记录来判断邮件的真伪性。如果 DMARC 记录中指定了接收方对未能通过 SPF 或 DKIM 验证的邮件的处理措施,那么邮件服务器将按照 DMARC 记录中的指示来处理这些邮件。

SpoofThatMail 使用了一个公共的 DMARC 测试服务器来查询指定域名的 DMARC 记录,并根据 DMARC 记录中设置的策略来判断这个域名是否可以被欺骗。

如何使用

你可以通过以下步骤来使用 SpoofThatMail:

  1. 安装 Python 3.x。
  2. 克隆 SpoofThatMail 代码仓库。
  3. 进入 SpoofThatMail 目录,安装依赖库:pip install -r requirements.txt
  4. 在终端中执行 python spoofthatmail.py example.com 命令来测试 example.com 域名是否可以被欺骗。
代码解析

首先,导入必要的库:

import requests
import xml.etree.ElementTree as ET
import sys

然后,定义一个函数 query_dmarc_record(domain),用于查询指定域名的 DMARC 记录。这里使用了一个公共的 DMARC 测试服务器,可以将 query_dmarc_record(domain) 函数理解为向这个服务器发送了一个 HTTP 请求。

def query_dmarc_record(domain):
    try:
        response = requests.get(f'https://mxtoolbox.com/api/dmarc/lookup/xml/?argument={domain}')
        tree = ET.fromstring(response.text)
        if tree.find('dmarc').find('records').find('record').find('rule').text == 'none':
            return 'No DMARC record found!'
        else:
            dmarc_record = tree.find('dmarc').find('records').find('record').find('txtdata').text
            return dmarc_record
    except:
        print('Error: Failed to query DMARC record!')
        sys.exit()

接下来是主函数 main()。首先,检查命令行参数是否合法,如果不合法则打印错误信息并退出程序。

def main():
    if len(sys.argv) != 2:
        print('Usage: python spoofthatmail.py <domain>')
        sys.exit()
    else:
        domain = sys.argv[1]

接下来,调用 query_dmarc_record(domain) 函数来查询指定域名的 DMARC 记录,并打印查询结果。

    print(f"Querying DMARC record for {domain}...\n")
    dmarc_record = query_dmarc_record(domain)
    print(f"DMARC record for {domain}: {dmarc_record}\n")

接着,解析 DMARC 记录,打印 DMARC 策略和报告地址。

    dmarc_policy = 'unknown'
    dmarc_rua = 'unknown'

    if dmarc_record:
        try:
            for record in dmarc_record.split(';'):
                record = record.strip()
                if record.startswith('p='):
                    dmarc_policy = record.split('=')[1]
                elif record.startswith('rua='):
                    dmarc_rua = record.split('=')[1]

            print(f"DMARC policy: {dmarc_policy}")
            print(f"DMARC report address: {dmarc_rua}\n")
        except:
            print('Error: Failed to parse DMARC record!')
            sys.exit()

最后,根据 DMARC 策略来判断域名是否可以被欺骗。根据 DMARC 记录中设置的处理措施来判断是否可以欺骗。

    if dmarc_policy == 'none':
        print('The domain does not have DMARC policy set, it can be spoofed.')
    elif dmarc_policy == 'reject':
        print('The domain has configured DMARC policy "reject", it cannot be spoofed.')
    elif dmarc_policy == 'quarantine':
        print('The domain has configured DMARC policy "quarantine", it may be spoofed.')
    else:
        print('Unknown DMARC policy, unable to determine if it can be spoofed.')
总结

以上就是 SpoofThatMail 的介绍和代码解析。通过这个简单的工具,我们可以很容易地查询一个域名的 DMARC 记录,并根据 DMARC 策略来判断这个域名是否可以被欺骗。当然,这个工具只是一个简单地示例,实际上 DMARC 的检查远比这个复杂得多,如果你需要更加完备的 DMARC 检查工具,可以考虑使用已有的第三方库。