#!/usr/bin/perl ## fauxsmtp.pl - Fake SMTP server for sandnet use ## (c)2006 Joe Stewart use IO::Socket; $| = 1; my (@user, @nick); my $port = "25"; print "Starting Faux SMTP Server Emulation on port $port\n"; my $sock = IO::Socket::INET->new( LocalAddr => "4.5.6.1", LocalPort => $port, Type => SOCK_STREAM, Reuse => 1, Listen => 10) or die "Fatal: Couldn't bind to port $port (Already in use?)\n"; while ($remote = $sock->accept()) { my ($port, $addr) = unpack_sockaddr_in($remote->peername); my $ip = inet_ntoa($addr); logger("Connection from $ip"); print $remote "220 microsoft.com SMTP ready\r\n"; my $data; my $c1; my $auth; while (<$remote>) { chomp; logger($_); if (/^(MAIL|RCPT|RSET|\.)/i) { print $remote "250 Ok\r\n"; } elsif (/(^\.$|LIG4l)/) { print $remote "250 2.0.0 h4WORMX12943 Message accepted for delivery\r\n"; } elsif (/^DATA/i) { $data = 1; print $remote "354 whateva... I do what I want!\r\n"; print $remote "250 2.0.0 h4WORMX12943 Message accepted for delivery\r\n"; } elsif (/^AUTH (.*)/i) { $auth = 1; #print $remote "503 5.3.3 AUTH not available\r\n"; print $remote "334 VXNlcm5hbWU6\r\n"; } elsif ((!$c1) && (!$data) && ($auth)) { $c1 = 1; print $remote "334 UGFzc3dvcmQ6\r\n"; } elsif (($c1) && (!$data) && ($auth)) { $auth = 0; $c1 = 0; #print $remote "235 2.0.0 OK Authenticated\r\n"; print $remote "535 5.3.3 Authentication failed\r\n"; } elsif (/^HELO (.*)/i) { chomp (my $hel = $1); print $remote "250 Hello $hel, pleased to meet you.\r\n"; } elsif (/^EHLO/i) { print $remote qq~250-wormx.com Hello blah 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-SIZE 250-DSN 250-ONEX 250-ETRN 250-XUSR 250 HELP ~; } elsif (/^QUIT/i) { logger("end of mail session\n"); last; } } sleep 1; } close OUT; sub logger { my $msg = shift; open(OUT,">>/tmp/sandnetsmtp.log") or die "$!"; print OUT "$msg\n"; close OUT; }