网络安全 频道

邮件蠕虫与垃圾邮件技术的融合

至此,我们完成了邮件服务器和帐户信息的获取工作,蠕虫每到一处,都会搜集最新的服务器信息,搜集到的信息基本都是网络可达的。因为涉及的到服务器数量极多,范围极广,所以封杀服务器或者帐户是不可能的,这些都是Sniffer捕包获得服务器的优势所在。

垃圾邮件的关键技术

垃圾邮件的详细技术不在本文讨论范围之内,但为了说明问题,必须要有简要的说明,一般来说,垃圾邮件必须解决的两个问题是:

1.发送方式的选择

利用SMTP 协议无须认证的缺点

利用Open Relay (开放转发)

Open Relay是指由于邮件服务器不理会邮件发送者或邮件接受者的是否为系统所设定的用户,而对所有的入站邮件一律进行转发(Relay)的功能。

特快专递法

特快专递就是利用本机充当发件服务器的功能,由DNS解析出收件服务器的IP地址,然后将本机直接与收件服务器的相连,将邮件直接发送到收件人的收件服务器上。Foxmail的”特快专递”就是这个原理。现在,特快专递已经逐渐失效,安全级别高的Smtp Server不允许非Smtp Server直接发送,避免被Spammer利用。

自建SMTP服务器

Spammer自己建立SMTP服务器,直接和目标服务器连接,发送邮件。这种情况不需要匿名服务器和转发服务器的帮助。目标服务器没有理由拒绝来自一台邮件服务器的请求,所以原理上总能保证发信成功,缺点是必须申请域名,且必须频繁更换IP和域名,因为很快会被列入黑名单。

由上可见,垃圾邮件的发送技术不适合蠕虫使用,原因是利用上面的方法,Spammer只要找到一个SMTP Server就可以发送数以百万计的邮件了,一个地址失效后可以人为地更换,而蠕虫则不同,必须自力更生,如上所述的Sniffer就是解决途径。

2.邮件地址的获得

VRFY指令

该指令的作用是验证一个用户是否是本地用户:是,则返回完整的地址;否,则根据SMTP的设置回应。Spammer利用这个命令配合字典穷举用户名来收集有效的邮件地址。在新版本的SMTP软件中,这个指令已被禁用,但未取消。

EXPN指令

该指令用来向服务器查询邮件列表,成功则返回列表,每行一个地址。此指令在新版本的SMTP软件中也被禁用。

分析网页

Spammer通过搜索引擎如Google,Yahoo等,获得url,将网页下载到本地后,通过匹配关键字“mail to:”和“@”来收集地址。这种方法应用很广泛,因为有效并且上面两种方法已不可用。但是现在已经有应对措施,比如用代替@。

虚拟发信法

Spammer通过正规的步骤连接Smtp Server,然后发送HELO(EHLO),MAIL FROM成功后,再发送Rcpt To : ,如果得到正确的回应,则收录str,做为合法的邮件地址,然后读取下一个str,再次做Rcpt to尝试,直到发生错误或遍历了所有字符串为止。这种方法的优点在于,在Rcpt to之前发送的命令都是合理的,所有SMTP服务器都不能拒绝Rcpt To,正如所有Web Server都不能拒绝SYN包一样。

关键就在于此了,前面提到邮件蠕虫搜集地址数量的局限,我们可以采用虚拟发信法来解决。形象地描述如下:

客户:Connect(Smtp Server) 

服务器:220 smtp.263.net ESMTP ,连接成功

客户:HELO localhost         EHLO localhost

服务器:250-smtp.263.net

      250-PIPELINING

…

250-AUTH LOGIN

客户:AUTH LOGIN\r\n

服务器:334…

客户:用户名的base64编码

服务器回送:334…

客户:密码的base64编码

服务器:235 Authentication successful

客户:MAIL FROM: <username@263.net>\r\n

服务器:250 Ok

客户:RCPT TO: <str>\r\n

服务器回送:

&Oslash;250 , str为合法帐户。

&Oslash;550, invalid user。

&Oslash;522, too many rcpto。

客户:DATA\r\n 

…

前文已经实现了用Sniffer方法获得邮件服务器和帐户信息,并由bAuth字段标志是否需要认证。现在就可以利用SMTPSERVINFO来连接服务器,探测合法帐户了。还有一个问题,就是str的来源,我们选择从本地文件获得的方法,原则如下:

&Oslash;遍历硬盘,搜索以txt,ht*,doc,eml,ini等为扩展名的文件。

&Oslash;找到一个word,加入 m_WordList列表。

&Oslash;按照合法邮件地址的规则,找到一个email,加入m_EmailList列表,发送邮件线程会直接

读取m_EmailList列表并发送邮件。

&Oslash;邮件地址探测线程(EmailSpamer)读取m_WordList列表,验证是否为合法帐户,是则加入

到m_EmailLsit。

&Oslash;m_Wordlist和m_EmailList都要保持一定的数量且记录互斥,以减小向同一E-Mail地址发送

多次邮件的可能性。

现在获得了大量的str,可以根据(E)SMTP协议探测了,探测线程EmailSpamer如下:

while(TRUE)

{

m_Smtp.TalkWithSmtpServer();

do

{

int iRet = m_Smtp.SendRcptTo(szRcptTo); //szRcptTo来自m_WordList

if(iRet==250)       //代表成功,确实有这个帐户

  ::m_EMailList->Add(szRcptTo);

else if(iRet==550)       //帐户错误,休眠一会,避免被封

Sleep(100);

else           //错误,断开连接,重新探测

break;

}while(::m_WordList->GetCount());

…

至此,我们的思路已经十分清晰:

蠕虫运行后,首先启动文件遍历线程,从文件中获得大量的单词,加入m_WordList,同时把从文件中获得的邮件地址加入m_EmailList。地址探测线程先利用病毒体内已有的服务器信息开始探测,单词取自m_WordList, 对于验证成功的word,将此word+服务器域名构成word@xxx.yyy的形式后加入m_EmailList。发送邮件线程不断读取m_EmailList发送邮件。 监听线程捕获并分析网络报文,补充新的服务器资源,并写入病毒体。这样,源源不断的邮件地址就会应接不暇,蠕虫得以大面积扩散。

需要说明的是,大的邮件服务提供商通常有好的anti-spam特性,如果rcpt to错误次数达到一个上限,那么此帐户就会被停用一段时间。但是,规模越大,注册的帐户也就越多,随机找个单词,基本上都是合法帐户。对于小型的邮件服务提供者,安全性很差,对rcpt to次数根本没有限制。归根结底,不管被封与否,在此之前都已经发现了数目可观的邮件地址,并向这些地址发送了蠕虫。

结束语

网络安全的问题只有当所有的计算机用户都成为安全专家时才有可能得到彻底解决,事实上,这是不可能的,而且我们也不能依赖或等待全民计算机水平的提高。目前可以做的,并且各国一直在努力做的,就是加快反垃圾邮件的立法和规范邮件提供商的服务。中国反垃圾邮件协会今年采取了一系列有力措施,包括两次公布垃圾邮件服务器黑名单,制定邮件服务规范,推动垃圾邮件立法等,这些虽不能完全遏制融合垃圾邮件技术的蠕虫,但具有一定的制约效果。

0
相关文章