# SMTP open relay scanner ;-)

## ruth

hallo zusammen;

nachdem es ja gross in mode gekommen ist (selbst für, naja, anfänger  :Wink:  )

sich einen rootie zu mieten und dann geballte 100Mbit auf die menschheit

loszulassen, habe ich mittlerweile

erstens:

auf meinem eigenen rootie einen portscan traffic von ca. 70 - 100 MB / Monat !!!

zweitens:

die nase voll von offenen SMTP relays in diesen segmenten...

(wenn ich mir die mailheaders meiner spam mails ansehe -  naja...  :Wink:  )

folge:

ich veröffentliche hier eine abgespeckte version eines von mir geschriebenen scanners, wieder aus der reihe 

rootshell's useful scripts

natürlich in perl ( ich liebe es *grins* )

```

#!/usr/bin/perl -w

use IO::Socket;

# If you have any comments, suggestions, etc., feel free to send me a mail ;-)

# flames and other things like that will go to /dev/null

#

#  This script is free software; you can redistribute it and/or

# modify it under the terms of the GNU Lesser General Public

# License as published by the Free Software Foundation; either

# version 2 of the License, or (at your option) any later version.

#

# This script is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

# Lesser General Public License for more details.

#

# You should have received a copy of the GNU Lesser General Public

# License along with this program; if not, write to the Free Software

# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#

# changes to original:

# removed proxy cluster scanning -->>ANTI STEALTH<<-- this version is noisy ;-)

# removed subnet/iprange scanning

# removed whois query

# removed google && whois based automated scanning

# removed some weird relay techniques via SMTP AUTH && qmail... ;-)

# removed SMTP AUTH brute force

#

$DEBUG = "1"; # comment to disable

$VERBOSE = "1"; # comment to disable

$target = "192.168.1.15";

$target_port = "25";

print "this is harvesterII/SMTP (c) 2004 by rootshell <rootshell\@front.ru>\n";

print "       additional (c) by the _terror_coding_syndicate_ -=tcs=-\n";

print "             this program is licensed under the GPLv2\n\n";

my $fqdn = gethostbyaddr(inet_aton($target), AF_INET);

print "Test 1: regular/simple sending\n" if ($VERBOSE);

my $email_sender = "<spamtest\@nospam.org>";

my $email_receiver = "<nobody\@mozilla.org>";

do_test($email_sender, $email_receiver);

print "Test 2: sender/receiver are identical\n" if ($VERBOSE);

$email_sender = "<nobody\@mail-abuse.org>";

$email_receiver = "<nobody\@mail-abuse.org>";

do_test($email_sender, $email_receiver);

print "Test 3: trying to use an invalid source domain\n" if ($VERBOSE);

$email_sender = "<nobody\@maps1.pam.vixie.org>";

$email_receiver = "<nobody\@mail-abuse.org>";

do_test($email_sender, $email_receiver);

print "Test 4: use localhost in source domain\n" if ($VERBOSE);

$email_sender = "<spamtest\@localhost>";

$email_receiver = "<nobody\@mail-abuse.org>";

do_test($email_sender, $email_receiver);

print "Test 5: omit source domain\n" if ($VERBOSE);

$email_sender = "<spamtest>";

$email_receiver = "<nobody\@mail-abuse.org>";

do_test($email_sender, $email_receiver);

print "Test 6: omit source address entirely\n" if ($VERBOSE);

$email_sender = "<>";

$email_receiver = "<nobody\@mail-abuse.org>";

do_test($email_sender, $email_receiver);

print "Test 7: use FQDN of victim as source domain\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<nobody\@mail-abuse.net>";

do_test($email_sender, $email_receiver);

print "Test 8: use IP of victim in brackets as source\n" if ($VERBOSE);

$email_sender = "<spamtest\@[$target]>";

$email_receiver = "<nobody\@mail-abuse.net>";

do_test($email_sender, $email_receiver);

print "Test 9: use % style relaying\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<" . "nobody\%mail-abuse.net" . "\@" . "$fqdn" . ">";

do_test($email_sender, $email_receiver);

print "Test 10: use % style relaying and victim IP as source in brackets \n" if ($VERBOSE);

$email_sender = "<spamtest\@mozilla.org>";

$email_receiver = "<" . "nobody\%mail-abuse.net" . "\@" . "[$target]" . ">";

do_test($email_sender, $email_receiver);

print "Test 11: encapsulate destination address in double quotes\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<\"nobody\@mail-abuse.net\">";

do_test($email_sender, $email_receiver);

print "Test 12: use % style syntax encapsulated in double quotes\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<\"nobody\%mail-abuse.net\">";

do_test($email_sender, $email_receiver);

print "Test 13: use @ style syntax\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<nobody\@mail-abuse.net" . "\@" . "[$target]" . ">";

do_test($email_sender, $email_receiver);

print "Test 14: use @ style syntax encapsulated in double quotes\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<\"nobody\@mail-abuse.net" . "\@" . "[$target]" . "\">";

do_test($email_sender, $email_receiver);

print "Test 15: use another weird syntax\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<" . "\@" . "$fqdn" . ":" . "nobody\@mail-abuse.net" . ">";

do_test($email_sender, $email_receiver);

print "Test 16: same as above - (IP version)\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<" . "\@" . "[$target]" . ":" . "nobody\@mail-abuse.net" . ">";

do_test($email_sender, $email_receiver);

print "Test 17: use ! syntax\n" if ($VERBOSE);

$email_sender = "<" . "spamtest" . "\@" . "$fqdn" . ">";

$email_receiver = "<nobody\!mail-abuse.net>";

do_test($email_sender, $email_receiver);

print "Test 18: testing for SMTP AUTH misconfiguration\n" if ($VERBOSE);

$email_sender = "<spamtest\@nospam.org>";

$email_receiver = "<nobody\@mozilla.org>";

do_smtp_auth($email_sender, $email_receiver);

sub do_test {

   sleep 1; # better safe than sorry ;-)

   my $socket = IO::Socket::INET->new(PeerAddr => $target,

               PeerPort => $target_port,

               Timeout => "1.1",

               Type => SOCK_STREAM);

   if (!$@) {

      my $email_sender = $_[0];

      my $email_receiver = $_[1];

      print ">>>: $target\n" if ($DEBUG);

      $socket->recv($text,128);

      print "<<<: $text\n" if ($DEBUG);

      if ($text !~ m/^220/) {

         print "<<<: $text - unexpected greeting - exiting\n";

         close ($socket);

         return;

      } else {

         $socket->send("HELO localhost\n");

         print ">>>: HELO localhost\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ m/^250/) {

         print "<<<: $text - error\n";

         close ($socket);

         exit;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         $socket->send("mail from: $email_sender\n");

         print ">>>: mail from: $email_sender\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ m/^250/) {

         print "<<<: $text - server response unknown\n";

         close ($socket);

         return;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         $socket->send("rcpt to: $email_receiver\n");

         print ">>>: rcpt to: $email_receiver\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      print "<<<: $text\n" if ($DEBUG);

      if ($text !~ m/^250/) {

         $socket->send("quit\n");

         print ">>>: quit\n" if ($DEBUG);

         $socket->recv($text, 128);

         if ($text !~ m/^221/) {

            print "<<<: $text - error; forcing disconnect\n" if ($DEBUG);

            close ($socket);

            return;

         } else {

            # force close && return...

            print "<<<: $text\n" if ($DEBUG);

            close($socket);

            print "not successful; closed connection...\n";

            return;

         }

         close ($socket);

      } else {

         $socket->send("quit\n");

         print ">>>: quit\n" if ($DEBUG);

         $socket->recv($text, 128);

         print "<<<: $text\n" if ($DEBUG);

         print "relay successful - sender: $email_sender receiver: $email_receiver\n";

         close ($socket);

         exit;

         # return;

      }

   } else {

      print "unable to connect to $target\n";

      exit;

   }

}

sub do_smtp_auth {

   sleep 1; # better safe than sorry ;-)

   my $socket = IO::Socket::INET->new(PeerAddr => $target,

               PeerPort => $target_port,

               Timeout => "1.1",

               Type => SOCK_STREAM);

   if (!$@) {

      my $email_sender = $_[0];

      my $email_receiver = $_[1];

      print ">>>: $target\n";

      $socket->recv($text,128);

      print "<<<: $text\n" if ($DEBUG);

      if ($text !~ m/^220/) {

         print "<<<: $text - unexpected greeting\n";

         close ($socket);

         return;

      } else {

         $socket->send("EHLO localhost\n");

         print ">>>: EHLO localhost\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ /AUTH/) {

         print "<<<: $text - no AUTH method, giving up\n";

         close ($socket);

         return;

      } else {

         print "<<<: $text\n";

         $socket->send("auth login\n");

         print ">>>: auth login\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ m/^334/) {

         print "<<<: $text - error; giving up\n";

         close ($socket);

         return;

      } else {

         print "<<<: $text\n";

         $socket->send("username\n");

         print ">>>: username\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ m/^334/) {

         print "<<<: $text - error; giving up\n" if ($DEBUG);

         close ($socket);

         return;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         $socket->send("password\n");

         print ">>>: password\n";

      }

      $socket->recv($text, 128);

      if ($text !~ m/^235/) {

         print "<<<: $text - error; giving up\n" if ($DEBUG);

         close ($socket);

         return;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         $socket->send("mail from: $email_sender\n");

         print ">>>: mail from: $email_sender\n";

      }

      $socket->recv($text, 128);

      if ($text !~ m/^250/) {

         print "<<<: $text - error; giving up\n" if ($DEBUG);

         close ($socket);

         return;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         $socket->send("rcpt to: $email_receiver\n");

         print ">>>: rcpt to: $email_sender\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      if ($text !~ m/^250/) {

         print "<<<: $text - error: giving up\n" if ($DEBUG);

         close ($socket);

         return;

      } else {

         print "<<<: $text\n";

         $socket->send("quit\n");

         print ">>>: quit\n" if ($DEBUG);

      }

      $socket->recv($text, 128);

      print "relay succesful\n";

      if ($text !~ m/^221/) {

         print "<<<: $text - error; not understood\n" if ($DEBUG);

         close ($socket);

         return;

      } else {

         print "<<<: $text\n" if ($DEBUG);

         close ($socket);

         return;

      }

   } else {

   print "unable to connect\n";

   exit;

   }

}

exit;

```

beachtenswert v.a. der test auf fehlerhafte SMTP AUTH konfiguration in verbindung mit qmail...  :Wink: 

diese tests sind mir entweder beim durchforsten meiner mail logs aufgefallen oder habe sie auf div. foren + quellen zusammengetragen...

have fun  :Wink: 

rootshell

----------

## amne

 *rootshell wrote:*   

> nachdem es ja gross in mode gekommen ist (selbst für, naja, anfänger  )
> 
> sich einen rootie zu mieten und dann geballte 100Mbit auf die menschheit
> 
> loszulassen 
> ...

 

Oh Gott, noch ein Anfänger mit rootserver.  :Wink: 

----------

## ruth

hi amne...  :Wink: 

ja, genau... *lach*

gruss

rootshell

----------

## Carlo

 *rootshell wrote:*   

> natürlich in perl ( ich liebe es *grins* )

 

Masochist!  :Wink: 

Carlo

----------

## MrTom

Blödes Script! Bringt bei der Verbindung zu meinem Postfix 17x "not successful" und 1x "giving up"...  :Wink: 

Was meinst Du mit abgespeckte Version?

PS: Was ist Perl?  :Wink: 

----------

## platinumviper

 *rootshell wrote:*   

> natürlich in perl ( ich liebe es *grins* )

 

Darf man das einfach so sagen (siehe hier)?  :Laughing: 

platinumviper

----------

## MrTom

Hab mir gerade das Logo genauer angesehen?!?!

Da stimmt was nicht! Hab das mal schnell richtig gemacht  :Wink: 

Logo

----------

## holla die waldfee

hallo zusammen,

kann mir mal bitte jemand kurz erklären was es mit dem test 17 auf sich hat?

das ist nämlih der einzigste der bei mir anschlägt. aber auch nur wenn der alias aus einem wort besteht. 

nobody\!mail-abuse.net           relay success

nobody.test\!mail-abuse.net     relay no success

ich verwende postfix in 2.0.19 und hatte eigentlich gedacht ich hätte das system so konfiguriert das es kein openrelay ist  :Sad: 

danke

holla

----------

## MrTom

 *holla die waldfee wrote:*   

> nobody\!mail-abuse.net           relay success
> 
> nobody.test\!mail-abuse.net     relay no success
> 
> 

 

Hau mal die zwei Zeilen in die main.cf rein.

```
swap_bangpath = no

allow_percent_hack = no
```

Dann sollte das Problem wohl wech sein... Scheinbar hat wohl niemand das in seiner Config drin. Hab noch kein Howto gelesen, wo es drin ist! Dabei wird es doch auf der Webseite von Postfix so schön beschrieben.  :Wink: 

----------

## holla die waldfee

viele dank. man lernt ja nie aus   :Very Happy: 

----------

## ruth

hi,

freut mich, dass das programm so gut ankommt...  :Wink: 

 *Mr.Tom wrote:*   

> 
> 
> Was meinst Du mit abgespeckte Version?
> 
> 

 

naja, eigentlich ganz einfach... ist im quelltext ja auch beschrieben...

ich will nicht, dass der scanner von scriptkiddies zum durchforsten

ganzer netblocks benutzt wird...  :Wink: 

wenn jemand programmieren kann, dann kann der ja diese funktion selbst

nachimplementieren...

(naja, wenn das jemand kann, dann kann der wohl auch selbst einen scanner schreiben...)

den rset befehl/proxy scan hab ich nicht benutzt, um den scanner 'laut' zu machen.

schliesslich soll der gebrauch des scanners ja auch bemerkt werden...  :Wink: 

einige ganz üble tests hab ich rausgelassen - speziell qmail (was von anfängern

vielfach verwendet wird, weil es so 'sicher' ist, kann man leicht fehlerhaft konfigurieren.)

den bekanntesten konfigurationsfehler in verbindung mit SMTP AUTH prüft test 18.

da gibts aber schon noch 'n paar mehr..  :Wink: 

@carlo:

warum masochist ???

perl is soooo geil...  :Wink: 

und der erste open relay ist auch schon gestopft... so soll es sein, sehr gut...  :Wink: 

ach ja:

wenn jemand noch zusätzliche tests weiss:

bitte einfach dranhängen (als diff oder so...)

gruss

rootshell

----------

## Carlo

@rootshell: Dein Perl ist zugestandenermaßen lesbar und nicht eines von der Sorte, von der man sich Augenkrebs holt.  :Smile: 

Carlo

----------

## ruth

hi,

jaja, hihi, danke, danke...  :Wink: 

willst 'ne ASM version haben ??? *gg*

das ding tut ja nix anderes als eine telnet session nach der anderen abzuspulen...

und:

ach ja, die verschiedenen adressen in ein '@senders' / '@receivers' wäre cooler

aber was solls...  :Wink: 

KISS -> *grin*

gruss

rootshell

----------

## pkxl2

Nützliches Ding, danke. hatte o.g. weakness auch bei mir, zum Glück aber nur von intern nutzbar, da hinter NAT/Firewall. Trotzdem interessantes Stück code!

----------

## ruth

hi,

in diesem zusammenhang möchte ich ausserdem noch auf folgendes aufmerksam machen:

```

bash-2.05b$ telnet xxx.xxx.xxx.xxx 8080

Trying xxx.xxx.xxx.xxx...

Connected to xxx.xxx.xxx.xxx.

Escape character is '^]'.

CONNECT localhost:25 HTTP/1.0

HTTP/1.0 200 Connection established

220 xxx.xxx.[com | de | org | ... ] ESMTP Postfix

HELO localhost

250 xxx.xxx.[s.o]

MAIL FROM: <tester@test.org>

250 Ok

RCPT TO: <rootshell@front.ru>

250 Ok

DATA

354 End data with <CR><LF>.<CR><LF>

DIES IST EIN SPAMTEST !!!

.

250 Ok: queued as 4845737AC4

quit

221 Bye

Connection closed by foreign host.

bash-2.05b$

```

wie man sieht, ist auch jeder OFFENE HTTP Relay ein potentiell offener SMTP relay..

(so ein mta installiert ist... )

und nachdem sich ja hier jemand von localhost verbindet, sind die chancen auf einen emailversand hoch...

( ganz abgesehen vom offenen HTTP Relay... )

naja, ich hasse unfähige squid admins

(und gleichzeitig bin ich ganz froh drüber... *gg* )

also:

auch alle squids und konsorten abdichten...

(auch APACHES )

schönen abend noch...

gruss

rootshell

p.s. dass diese email angekommen ist, muss ich nicht erwähnen, oder ???   :Twisted Evil: 

----------

## BlinkEye

super idee und danke für diesen scanner.

ich habe ein problem: ich benütze auf dem server und auf dem desktop dieselben configs. wieso ist aber der erste test auf meinem server erfolgreich (und bricht dadurch das skript ab) während dem auf dem desktop alle tests nicht erfolgreich sind? sowohl auf dem server wie auf dem desktop ist apache, php und postfix am laufen...

----------

## ruth

hi,

also zunächst mal sollte klar sein, dass der scanner auf einer maschine laufen muss,

von der _kein_ relay erlaubt ist...

bsp:

postfix erlaubt senden(relay) von 192.168.1.0/24

dann macht es natürlich keinen sinn, den scanner auf der maschine 192.168.1.34 zu starten.

ein relay ist dann (natürlich) erlaubt.

also:

auf welcher maschine hast du den scanner gestartet?

auf welcher maschine läuft postfix?

----------

## BlinkEye

ok. jetzt läufts wieder. ich hatte wohl einen config fehler in postfix ...

 *MrTom wrote:*   

> Hau mal die zwei Zeilen in die main.cf rein. 
> 
> Code:
> 
> swap_bangpath = no 
> ...

 

danke!

----------

## lolli78

hallo,

 *rootshell wrote:*   

> hi,
> 
> also zunächst mal sollte klar sein, dass der scanner auf einer maschine laufen muss,
> 
> von der _kein_ relay erlaubt ist...
> ...

 

wenn das nicht geht, versuche mal diesen open relay scanner: http://www.abuse.net/relay.html

viel spaß...

lorenz

----------

## BlinkEye

yep, bin auch über diese page gestolpert, danke. scheinen die gleichen tests zu sein... (ausnahme der berüchtigte test 18)

----------

## b00gy

hi

erstmal danke fuer dein script

bei mir schlagen alle bis auf test 17 fehlt, aber was muss ich nun machen um das abzuschalten?

der scanner von abuse.net kann gar nix versenden

ich erlaube nur tls verbindungen mails zu verschicken, testet dein scanner das auch?

mfg b00gy

----------

## ts77

*jammer* ... so ein mist, ich bekomm keine mail durch ... alles in diesem blöden script schlägt fehlt   :Razz:  .

----------

