在电子邮件中伪造“发件人”字段


9

如何处理电子邮件中的“发件人”字段,并使“收件人”用户看到与实际不同的内容。

例:

真的来自

From: TStamper@yahoo.com

但他们看到

From: Tremayne "Top Dog" Stamper

我从操作SMTP时就已经听说过它,但是真的不确定它的准确性或如何实现


2
我认为这是一个有效的问题。我们一直在这样做(特别是使某件软件发出的电子邮件看起来像是在向用户发送)。
C. Ross,2009年

我同意,如果您要更改“发件人”字段以显示真实姓名而不是地址,这可能是一个有效的问题。我们也一直在系统中这样做。由于问题中的示例,它只是一个标志,从一个地址更改为另一个地址。垃圾邮件诱饵。
squillman

更新了更好的示例
TStamper

这就是为什么他们创建SPF记录的原因
Elijah Glover,2009年

Answers:


14

从根本上讲,SMTP只是基于文本的协议,没有实际的验证。这是一个例子:

=== Trying g3.example.net:25...
=== Connected to g3.example.net.
<-  220 home.example.net ESMTP Exim 4.68 Thu, 07 May 2009 11:03:21 -0400
 -> EHLO g3.example.net
<-  250-home.example.net Hello g3.example.net [192.168.0.4]
<-  250-SIZE 52428800
<-  250-PIPELINING
<-  250-AUTH CRAM-SHA1 CRAM-MD5 MSN
<-  250-STARTTLS
<-  250 HELP
 -> MAIL FROM:<jj33@g3.example.net>
<-  250 OK
 -> RCPT TO:<jj33@g3.example.net>
<-  250 Accepted
 -> DATA
<-  354 Enter message, ending with "." on a line by itself
 -> Date: Thu, 07 May 2009 11:03:21 -0400
 -> To: jj33@g3.example.net
 -> From: jj33@g3.example.net
 -> Subject: test Thu, 07 May 2009 11:03:21 -0400
 -> X-Mailer: swaks v20070921.0-dev jetmore.org/john/code/#swaks
 -> 
 -> This is a test mailing
 -> 
 -> .
<-  250 OK id=KJA4HL-0006M6-8T
 -> QUIT
<-  221 home.example.net closing connection
=== Connection closed with remote host.

“ MAIL FROM:”行定义了SMTP信封发件人,并且From:在消息DATA中定义。有多种方法可以防止这种情况,但是它们是在邮件服务器逻辑中定义的,而不是在协议本身中定义的。

例如,作为邮件提供者,我可能要求用户使用user @ domain类型的用户名进行身份验证。然后,我的邮件服务器可能要求它们发送的所有邮件都具有一个信封发送者和一个From:标头,该标头与他们作为身份验证的用户相匹配。诸如DKIM和SPF之类的其他技术也可以在此领域提供帮助。


8

这里有几件不同的事情要考虑。如果只想显示其他名称或电子邮件地址,请将邮件的“发件人”标头(来自地址的邮件)设置为电子邮件地址,并在方括号中显示名称:

发件人:Joe示例<joe@example.com>

请记住,消息标题中的“ from”行仅用于显示目的。实际的路由由SMTP信封地址完成。这就是SMTP服务器实际用于在服务器之间传输邮件的方式。这可以与消息“ from”标头不同。如果您有一个自定义SMTP引擎,只需让它在SMTP信封中使用一个地址,然后在实际邮件的“发件人”标头中使用另一个地址即可。

您可能有很多正当的理由要这样做,但请不要出于邪恶目的。

请注意,可以在RFC 5322-A.2.1中找到正确的语法示例


1
括号中的示例是错误的,它是向后的
jj33

固定; 自从我实现这种东西已经有一段时间了。
贾斯汀·斯科特

我现在再次更新它以匹配RFC 822
Mike Graf '18年

1
@MikeGraf 822至少被取代了两次,5322更好。
Patrick Mevzek '18年

2
telnet some_smtp_server.com 25
ehlo whatsup
mail from: JohnBaker@yahoo.com
rcpt to: recipient@somewhere.com
data
your message here
end with a dot on a single line like this:
.

当然,您将需要一个允许中继的SMTP服务器,这几乎是不可能找到的...或自己滚动(只是不要使用此知识来发送垃圾邮件!)。


2

“真正的发件人”地址来自SMTP对话中的“发件人:”对话框。

“伪造”来自利用电子邮件客户端中的常规做法,即显示SMTP对话的“数据”部分中列出的各种标头字段。例如:

# telnet mail.example.com 25
Connected to mail.example.com.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
helo fakeserver
250 mail.example.com
mail from: real@example.com
250 2.1.0 OK
rcpt to: real@example.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
from: fake@example.com
to: you@example.com
subject: This is a subject
This is the body.
.
250 2.0.0 Ok: queued as 90D0F95A06
quit
221 2.0.0 Bye
Connection closed by foreign host.
#

如果您在“数据”部分中省略了“从:”和“至:”行,则它将显示实际的信封发件人和收件人。

请注意,垃圾邮件过滤器通常会寻找这些技巧,它们肯定不会使您成为永久朋友。此外,这并不适用于所有邮件客户端(只是最常见的客户端)。


1

是的,这是通过手动设置SMTP标头完成的,很简单。去谷歌上查询。但是不要被垃圾邮件困扰......


0

这是我的2c代码-用C#编写

    public static void SendSpam(string message, string to)
    {
        System.Net.Mail.MailMessage myMessage = new System.Net.Mail.MailMessage("Fake Name", to);
        myMessage.Subject = "SPAM";
        myMessage.Body = message;
        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("mail.mailserver.com", 25);
        System.Net.NetworkCredential c = new System.Net.NetworkCredential("realusername@mailserver.com", "realpassword");
        client.Credentials = c;
        client.Send(myMessage);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.