#!/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=; print("$li"); select((select(SOCKET), $| = 1)[0]); print SOCKET ("HELO mondomaine\n"); $li=; print("$li"); } sub mailfrom { my($argv)=@_; print ("RSET\n"); print SOCKET ("rset\n"); $li=; 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=; print("$li"); return &endtest(); } sub rcpto { my($argv)=@_; print SOCKET ("rcpt to: <$argv>\n"); print "RCPT TO: <$argv>\n"; $li=; 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);