分析垃圾邮件

看到一个用户投诉,说他们偶尔能收到自己信箱给自己信箱发送邮件。用户应用的是我们公司的 Mail 服务,客户说可能我们的服务器‘被黑’了。

我们的服务器都有监控,显然没有’被黑‘,换句话说,如果’被黑‘那影响就大了。

这个用户还是懂一些技术的,它发过来的是Email的源码。通过对源码分析就能分辨出这是一封匿名投递的欺骗邮件。
—-源码中隐藏了用户的真实信箱地址。

From - Mon Aug 27 10:11:19 2012
X-Account-Key: account1
X-UIDL: ----.c7QeEm
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys: 
Received: from 45.176.58.176.tellas.gr(176.58.176.45)
by mx1.YYYYY.com(127.0.0.1);
Mon, 27 Aug 2012 09:38:11 +0800
Received: from apache by shuirgsgsfceatoia.regallager.com with local (Exim 4.67)
(envelope-from <<A@X.com>,
<B@X.com>>)
id FOSJ30-WFU711-2O
for <A@X.com>,
<B@X.com>; Mon, 27 Aug 2012 03:38:10 +0200
To: <A@X.com>,
<B@X.com>
Subject: From advisement and promotion company
X-PHP-Script: shuirgsgsfceatoia.momix.org/sendmail.php for 176.58.176.45
From: <A@X.com>,
<B@X.com>
X-Sender: <A@X.com>,
<B@X.com>
X-Mailer: PHP
X-Priority: 1
Content-Type: text/plain; charset=us-ascii
Message-Id: <QB9JMF-Q0U5IS-4S@shuirgsgsfceatoia.siaminet.com>
Date: Mon, 27 Aug 2012 03:38:10 +0200
Our contacts: [email protected]

从源码中能看出X域的A,B两个信箱给自己发信。在SMTP(Simple Mail Transfer Protocol)中,允许用匿名方式发送邮件(即用HELO命令交互,不需要用户鉴权)。一般SMTP服务器会对客户端进行信息核对,比如:反向解析校验,MX记录检查。

1、 176.58.176.45上的某个PHP程序向 smtp.X.com匿名方式建立链接;
2、 smtp.X.com 反向解析校验,发现这个 IP有反向解析地址( 45.176.58.176.tellas.gr) ;
3、 smtp.X.com 检查tellas.gr的X记录时发现有记录;
4、 自己给自己的信箱发送邮件属于同域投递;

Non-authoritative answer:
45.176.58.176.in-addr.arpa      name = adsl-45.176.58.176.tellas.gr
176.58.176.in-addr.arpa nameserver = dns2.tellas.gr
176.58.176.in-addr.arpa nameserver = dns1.tellas.gr
tellas.gr.              300     IN      MX      10 smtp.tellas.gr.
tellas.gr.              300     IN      NS      dns2.tellas.gr.
tellas.gr.              300     IN      NS      dns1.tellas.gr.
smtp.tellas.gr.         300     IN      A       62.169.194.25
dns1.tellas.gr.         300     IN      A       62.169.194.17
dns2.tellas.gr.         300     IN      A       62.169.194.18

结合以上几点 发送垃圾邮件的服务器既有反向解析地址又有X记录,而且是同域下发送。
大多数SMTP服务都可以被他欺骗了。后来业务部门通过服务器日志也得到了同样的验证。
有些 SMTP 服务器对头域中的 “mail from” 和 “rcpt to”有检查,虽然用了HELO交互,但是发现是跨域的,仍然需要需要账号和密码校验。

.Net平台实战Mail C#版本

完全按照RFC821/822协议,用Socket实现SendMail模型。

对于mail服务来说,发送相对解析来说是很简单的。本文主要是用Socket来实现SendMail服务。

程序名称SendMail.cs
辅助工具Base64.cs

调用方法:

............
SendMail mail = new SendMail("smtp.163.com",25);
mail.Authorization=true;
mail.Username="";
mail.Password="";
mail.HtmlStyle=true;
mail.From="my-mail";
mail.To=new string[]{"mail1","mail2"};
 
if(mail.connect())
{
 
bool b=mail.send("标题","内容");
MessageBox.Show(b?"信已经成功提交到对方服务器":"发送信件失败");
 
}else{
MessageBox.Show("连接不上SMTP服务器");
}
..........

其中SendMail中的成员属性.
对于附件来说,所有的类定都定义为:application/octet-stream也就是下载。但是我测试发现gmail会把图片自动显示出来

系统截图:

该工程已经提交到 Google Code:

http://code.google.com/p/rfc821/