如何查明 SMTP 服务器是否处于开放中继状态?

如何查明 SMTP 服务器是否处于开放中继状态?

我用它nmap来进行网络安全测试。它发现 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)

我无法重现此问题。如何在没有扫描仪的情况下自行重现此问题?

答案1

正如 juwi 在他的回答中所说,只需与相关服务器的 tcp/25 建立网络连接即可。您可以使用 telnet 或 netcat 来实现这一点。

以下是 SMTP 事务的一个示例:

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

如果尝试提交服务器未配置为接受的 RCPT 后中继失败,则中继将关闭。如果中继接受您在 RCPT 行中指定的任何域,则中继将打开。

我不知道 nmap 扫描是如何确定您是否有开放中继的。需要记住的一件事是,您的 SMTP 服务器可能配置为接受来自您正在测试的 IP 的所有流量,因此,是的,它是开放的,但对世界其他地方则不是,所以这可能是没问题的。您应该从远程框运行测试以确保万无一失。

答案2

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

自动化测试http://www.mailradar.com/openrelay/但是,当我在 Microsoft IIS6 中使用它时,使用带有引号的电子邮件地址进行测试(例如方法 7 RCPT TO: <"[电子邮件保护]“>) 似乎失败了,但实际上并没有被发送出去。如果您发现自己处于这种情况,您可能希望进一步调查设置,并实际验证这些设置不会出现在您不希望它们出现的地方。然而,178.209.36.55 却顺利通过了所有这些测试。

一旦你确定没有运行开放中继,下一步就是确保你没有反向散射。反向散射是指第三方使用伪造的发件人标头向无法送达的地址发送电子邮件,因此 NDR 被发送给明显的发件人(伪造)。

这通常是由于服务器配置为为整个域中继邮件而没有有效用户列表所致,因此它最初会接受电子邮件,然后无法将其中继到具有有效用户列表的服务器。

简单测试 - 我将拨打您的外部个人电子邮件地址[电子邮件保护]您的域名是 domain.com

ehlo hotmail.com
邮件来自[电子邮件保护]
收件地址:[电子邮件保护]
数据
主题:主题
文本

然后检查[电子邮件保护]帐户(可能在垃圾邮件文件夹中)的 NDR,例如[电子邮件保护]

答案3

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

#!/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;

答案4

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

可中继的电子邮件服务器不一定是开放中继。如果我在需要发送电子邮件的服务器上运行应用程序,并且我配置电子邮件服务器以允许该应用程序服务器通过它进行中继,方法是将服务器的 IP 地址放在电子邮件服务器上的“允许中继”列表中,或者如果我配置应用程序以向电子邮件服务器进行身份验证,并且配置电子邮件服务器以允许经过身份验证的中继,那么这不是开放中继。它只是一个中继(经过身份验证,或根据 IP 地址允许等)。

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

因此,在不了解服务器配置方式的情况下,简单地建立与电子邮件服务器的 25 端口的 telnet 连接并将电子邮件发送到该服务器不具有权威性的域并不能准确判断该电子邮件服务器是否为开放中继。

相关内容