如何找出SMTP服务器在开放中继?

我使用nmap进行networking安全testing。 发现SMTP服务器处于开放中继。 这是输出:

 nmap --script smtp-open-relay testwww.confidesk.com PORT STATE SERVICE 25/tcp open smtp |_smtp-open-relay: Server is an open relay (16/16 tests) 

我无法重现这个问题。 如何在没有扫描仪的情况下自己复制?

正如juwi在他的回答中,只要build立一个networking连接到服务器tcp / 25的问题。 您可以使用telnet或netcat。

这是一个SMTP事务的例子:

http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_transport_example

如果尝试提交服务器未configuration为接受的RCPT,则中继将closures。 如果一个继电器接受您在RCPT行中指定的任何域,则它是开放的。

我不知道nmap扫描是做什么来确定你是否有一个开放的中继。 有一件事要记住,你的SMTP服务器可能被configuration为接受来自你testing的IP的所有stream量,所以,是的,它是开放的,但不是世界其他地方,所以这可能是好的。 您应该从远程盒子运行testing以确保。

Microsoft检测开放中继的程序 – 手动telnet命令,太多了,无法在这里发布。 http://support.microsoft.com/kb/324958

自动化testinghttp://www.mailradar.com/openrelay/然而,当我用微软IIS6使用这个testing时,电子邮件地址被语言标记包围的testing(例如方法7 RCPT TO:<“[email protected]”> )似乎失败,但实际上并没有发送出去。 如果你发现自己处在这种情况下,你可能希望进一步调查设置,并实际validation这些不会结束在你不想要的地方。 178.209.36.55然而通过所有这些testing。

一旦你感到高兴,你就不会开着一个开放的继电器,下一步就是确保你不是反向散射。 反向散射是当一个第三方发送一个电子邮件到一个带有伪造的发送者头的无法送达的地址,所以NDR被发送给明显的发送者(伪造的)。

这通常是由于服务器被configuration为中继整个域的邮件而没有有效的用户列表,所以它最初将接受电子邮件,然后将无法通过有效用户列表将其中继到服务器。

简单的testing – 我打电话给您的外部个人电子邮件地址[email protected]和您的域名是domain.com

ehlo hotmail.com
来自[email protected]的邮件
rcpt to:[email protected]
数据
主题:主题
文本

然后检查[email protected]帐户(可能在垃圾文件夹中),从[email protected]这样的NDR。

这是我在我的脚本文件夹中的代码。 不记得我在哪里。 致原创作者:

 #!/usr/bin/perl -w #Script to check for Open Relay EMAIL Servers on port 25 #Author: Felipe Ferreira fel.h2o(at)gmail Date: 18/02/2009 #ref. http://www.perlmonks.org/index.pl?node_id=718552 #TODO: #1. Should get from a list of IPs, should report any Open servers to a .txt file #smtp->code() and message() are the responses of the server! use Net::SMTP; my $host; my $filename = "servers.txt"; #open .txt file with all servers names or IPs #open($filehandle, "<" . $filename); open FILE, "<servers.txt" or die $!; while (my $host = <FILE>) { print "Testing: $host"; my $smtp = Net::SMTP->new($host, Hello => "admin", Timeout => 3, Debug => 0); if (!$smtp) { print STDOUT "No connection to $host \n"; } else { $smtp->mail('[email protected]'); $smtp->to('[email protected]') or print "SERVIDOR OK: $host RCPT TO: ", $smtp->code(), " ", $smtp->message(); if ($smtp->code() eq "250" ) { print "SERVIDOR CRITICAL: $host Tiene problema de OPEN RELAY!!!"; } # $smtp->quit; } } #Next host close FILE; 

您可以使用端口25上的Telnet手动login。

然后你说HELO ,然后试试MAIL FROM: <mailadress>下一步RCPT TO: <mailaddress>在这一点上它应该告诉你它拒绝了这个地址,因为如果它不是一个开放的中继,它会拒绝访问。 如果它是开放的,它会做你刚才所说的 – 发送一封电子邮件。

虽然这里的答案指向了正确的方向,但我想添加一个免责声明:

一个电子邮件服务器,将中继不一定是一个开放的中继。 如果我有一个应用程序运行在需要发送电子邮件的服务器上,并且configuration我的电子邮件服务器以允许应用程序服务器通过将服务器的IP地址放在我的电子邮件服务器上的“允许中继”列表中进行中继,或者如果我configuration我的应用程序来validation我的电子邮件服务器,我configuration我的电子邮件服务器允许通过身份validation中继,这不是一个开放的中继。 这只是一个中继(authentication,或允许基于IP地址等)。

开放中继是一个电子邮件服务器,允许任何用户,系统等通过它进行中继。

因此,简单地将telnet连接到电子邮件服务器的端口25,并将电子邮件发送到服务器不具有权威性的域,这并不是电子邮件服务器是否是开放中继的铁腕指示,而不知道更多关于如何服务器已configuration。