#!/usr/bin/perl
#
# Programme de test de relayage d'un serveur SMTP
# Utilisation: sp.pl adresse IP| nom d'hôte
#
# Auteur : Thibaut Maquet, http://www.pagasa.net
#
# Note: Aucun mail n'est envoye !

sub cntremote
{
  my($remadr)=@_;
  ($d1,$d2,$prot)=getprotobyname("tcp");
  ($d1,$d2,$d3,$d4,$rawclient)=gethostbyname('hostname');
  $remadr=~s/^\s+|\s+$//g;
  ($d1,$d2,$d3,$d4,$rawserver)=gethostbyname($remadr);
  $clientaddr=pack("Sna4x8",2,0,$rawclient);
  $serveraddr=pack("Sna4x8",2,25,$rawserver);
  socket(SOCKET,2,1,$prot)||die("Erreur de socket");
  bind(SOCKET,$clientaddr)||die("Erreur: le port n'est pas utilisé");
  connect(SOCKET,$serveraddr)||die("Impossible de se connecter sur le serveur SMTP");
}

sub chksmtprep
{
  my($argv)=@_;
  if($argv<400)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

sub helo
{
  my($argv)=@_;
  &cntremote("$argv");
  $li=<SOCKET>;
  print("$li");
  select((select(SOCKET), $| = 1)[0]);
  print SOCKET ("HELO mondomaine\n");
  $li=<SOCKET>;
  print("$li");
}

sub mailfrom
{
  my($argv)=@_;
  print ("RSET\n");
  print SOCKET ("rset\n");
  $li=<SOCKET>;
  print("$li");
  if($argv=~/\*/)
  {
    print SOCKET ("mail from: <>\n");
    print ("MAIL FROM: <>\n");
  }
  else
  {
    print SOCKET ("mail from: <$argv>\n");
    print ("MAIL FROM: <$argv>\n");
  }
  $li=<SOCKET>;
  print("$li");
  return &endtest();
}

sub rcpto
{
  my($argv)=@_;
  print SOCKET ("rcpt to: <$argv>\n");
  print "RCPT TO: <$argv>\n";
  $li=<SOCKET>;
  print("$li");
  return !&endtest();
}

sub endtest
{
  @rp=split(/\s+/,$li);
  if(&chksmtprep("$rp[0]"))
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

sub tst1
{
  my($from,$to)=@_;
  if(&mailfrom($from))
  {
    if(&rcpto($to))
    {
      return 1;
    }
    else
    {
      return 0;
    }
  }
  else
  {
    return -1;
  }
}
 
sub tst()
{
  $domaine="wanadoo.fr";
  $test="test";
  if(&tst1("$test\@$domaine","$test\@$domaine"))
  {
    if(&tst1("$test","$test"))
    {
      if(&tst1("*","$test\@$domaine"))
      {
        if(&tst1("$test\@[$iphst]","$test\@$domaine"))
        {
          if(&tst1("$test\@$nshst","$test\@$domaine"))
          {
            if(&tst1("$test\@[$iphst]","$test%$domaine\@[$iphst]"))
            {
              if(&tst1("$test\@[$iphst]","$test%$domaine\@$nshst"))
              {
                if(&tst1("$test\@[$iphst]","$test\@$domaine"))
                {
                  if(&tst1("$test\@[$iphst]","$test%$domaine"))
                  {
                    if(&tst1("$test\@[$iphst]","$test\@$domaine\@[$iphst]"))
                    {
                      if(&tst1("$test\@[$iphst]","\"$test\@$domaine\"\@[$iphst]"))
                      {
                        if(&tst1("$test\@[$iphst]","$test\@$domaine\@$nshst"))
                        {
                          if(&tst1("$test\@[$iphst]","\@[$iphst]:$test\@$domaine"))
                          {
                            if(&tst1("$test\@[$iphst]","\@$nshst:$test\@$domaine"))
                            {
                              if(&tst1("$test\@[$iphst]","$domaine!$test"))
                              {
                                if(&tst1("$test\@[$iphst]","$domaine!$test\@[$iphst]"))
                                {
                                  if(&tst1("$test\@[$iphst]","$domaine!$test\@$nshst"))
                                  {
                                    print "Tous les tests sont bons, votre serveur n'est pas un relais\n";
                                    return 1;
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  print "Aie! Votre serveur SMTP semble être un relais-ouvert !!\n"
}

sub iphst()
{
  my($h)=@_;
  $h=~s/^\s+|\s+$/ /g;
  if ($h=~/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/)
  {
    @bt=split(/\./,$h);
    $pk=pack("C4",@bt);
    if(!(($nm,$alt,$addr,$l,@lst)=gethostbyaddr($pk,2)))
    {
      die("Désole, je ne peux pas résoudre $h\n");
    }
    $iphst=$h;
    $nshst=$nm
  }
  else
  {
    if(!(($nm,$alt,$addr,$l,@lst)=gethostbyname($h)))
    {
      die("Désole, je ne peux pas résoudre $h\n");
    }
    for($i=0;$i<@lst;$i++)
    {
      @addrb=unpack("C4",$lst[$i]);
      $iphst=join(".",@addrb);
    }
    $nshst=$h;
  }
}

@h=@ARGV;
&iphst($h[0]);
&helo("$h[0]");
&tst();
close(SOCKET);

 
