All pastes #921127 Raw Edit

lolz

public text v1 · immutable
#921127 ·published 2008-02-27 20:50 UTC
rendered paste body
#!/usr/bin/perl

#die "usage: $0 <filename>" if !defined($ARGV[0]);
my $fromaddr='brazilianpower@temporaryforwarding.com';
my $rcptaddr='brazilianpower@temporaryforwarding.com';

# Set $debug to 1 if you'd like to see server responses
my $debug=0;

# no user-serviceable parts inside
use Socket;

my $dport=25;
$SIG{PIPE}='IGNORE';
$| = 1;

#die "usage: $0 remote.mailserver.addr" if !defined($ARGV[0]);

open(FILE, $ARGV[0]);
while(<FILE>) {
chomp;
print $_;
my $remote_host=$_;
print "... checking $remote_host\n" if $debug;

if (!socket(S, PF_INET, SOCK_STREAM, getprotobyname('tcp'))) {
        print "::: socket: $!\n";
        exit(1);
}

my $daddr = inet_aton($remote_host);
if (!$daddr) {
        print "::: inet_aton: $!\n";
        exit(1);
}
my $sockaddr = sockaddr_in($dport, $daddr);

my $c=tconnect($sockaddr);
print "::: tconnect() returned $c\n" if $debug;
if ($c != 1) {
        print "::: failed to connect: $c\n";
        exit(1);
}

my $serverid;
my $welcome;
my $in;
while (!$welcome) {
        my $in=timerecv(30);
        if ($in !~ /^220/) {
                print "::: got unrecognized prompt form mailserver\n";
                exit(2);
        }
        if (!$serverid) {
                $serverid=$in;
        }
        if ($in =~ /^220 /) {
                $welcome=$in;
        }
}
qsend("HELO relaytest");

$in=timerecv(10);
if ($in !~ /^250/) {
        print "::: got unrecognized HELO response from mailserver\n";
        exit(2);
}
qsend("MAIL FROM: <$fromaddr>");

$in=timerecv(10);
if ($in !~ /^250/) {
        print "::: got unrecognized MAIL response from mailserver\n";
        exit(2);
}
qsend("RCPT TO: <$rcptaddr>");

$in=timerecv(10);
if ($in !~ /^250/) {
        print "::: got unrecognized RCPT response from mailserver - probably NO$
        exit(2);
}
qsend("DATA");

$in=timerecv(10);
if ($in !~ /^3/) {
        print "got unrecognized DATA response from mailserver\n";
        exit(2);
}
qsend("Subject: PROMISCUOUS RELAY $ARGV[0]");
qsend("");
qsend("$serverid");
qsend(".");

$in=timerecv(10);
if ($in !~ /^250/) {
        print "got unrecognized response after DATA sent\n";
        exit(2);
}
qsend("QUIT");
close(S);
print "+++ $ARGV[0] seems to be promiscuous\n";
}

exit(0);

sub grabline {
        my $xline="";
        my $char;
        while (1) {
                last if (!sysread S,$char,1);
                last if ($char eq "\n");
                $xline=$xline . $char;
        }
        print "... grabbed: $xline\n" if $debug;
        return $xline;
}

sub qsend {
        my $send=$_[0] . "\r\n";
        syswrite S,$send,length($send) || die "::: Could not write to socket: $!\n" ;
}


sub timerecv {
        my $timeout=$_[0];
        my $tmp;
        eval {
                local $SIG{ALRM} = sub { die "alarm\n" };
                alarm($timeout);
                $tmp=grabline();
                alarm(0);
        };
        if ($@) {
                if ($@ eq "alarm\n") {
                        return "_TIMEOUT_";
                } else {
                        return "_ERROR:$@_";
                }
        }
        return $tmp;

}

sub tconnect {
        my $sockaddr=$_[0];
        my $cr=0;
        eval {
                local $SIG{ALRM} = sub { die "alarm\n" };
                alarm(10);
                $cr=connect(S,$sockaddr);
                alarm(0);
        };
        if ($@) {
                if ($@ eq "alarm\n") {
                        return "_TIMEOUT_";
                } else {
                        return "_ERROR:$@_";
                }

        }
        return 1 if defined($cr);
        return $!;
}

}
close(FILE);