Gegenscanner


Dieser Artikel richtet sich an die Administratoren die ein Server im Internet haben der ständig von irgendwelchen Kindern gescannt wird, sei es bloß ein Portscanner wie NMAP oder ein richtiger Scanner wie Nessus. Ich habe so ein System aufgebaut damit diejenige Person auch sieht das der Server auf ein Angriff reagiert das der Administrator ebenfalls Informationen sammelt und das der Server jetzt schon über ein möglicherweise bevorstehenden Angriff Protokolldaten anlegt.
Als erstes brauchen wir ein Programm das ein Scann oder ein laufendes Angriff erkennt. Es gibt mehrere Programm die das können, ich habe mich für ein IDS Programm namens Snort entschieden. Wenn Snort gestartet wird, läuft es im Hintergrund und lauscht an der Netzwerkkarte, wenn das Programm ein verdächtiges Paket registriert, wird eine Warnung in die Logdatei geschrieben und zwar mit sämtlichen Informationen die dem Snort bekannt sind, wie zu Beispiel die IP Adresse des Angreifers welches Programm oder Exploit er benutzt und wo man weitere Informationen findet.
So ein Eintrag sieht dann ungefähr so aus:

[**] [1:628:2] SCAN nmap TCP [**]
[Classification: Attempted Information Leak] [Priority: 2]
10/10-22:23:00.501241 111.111.111.111:1029 -> 222.222.222.222:1
TCP TTL:117 TOS:0x0 ID:19719 IpLen:20 DgmLen:60
***A**** Seq: 0xEF0002 Ack: 0x0 Win: 0x4000 TcpLen: 40
TCP Options (4) => WS: 10 NOP MSS: 265 TS: 1061109567 0
[Xref => http://www.whitehats.com/info/IDS28]

Es ist nicht schwer zuerkenne das in der ersten Zeile die Beschreibung der Aktivität des Angreifers steht. Und in der dritten Zeile sieht man von wo und wohin der Angriff gehet.

Da Snort sehr viele Sachen in die Logdatei schreibt die eventuell gar kein Angriff oder Scann sind müssen wir alle Snort so konfigurieren das nur die für uns interessante Einträge in die Logdatei geschrieben werden.

Jetzt brauchen wir ein Programm das aus den Snort Logdatei die IP Adresse des Angreifers rausfiltert und ein Scanner startet. So ein Programm währe zum Beispiel Swatch oder noch besser man schreibt ein Perl Script.

Dieser Perl Script holt alle 5 Sekunden die letzten Einträge aus der Logdatei prüft die Beschreibug des Angriffs und startet ein gegenscann in meinem Fall wird die Header des Webservers empfangen sowie Banner von FTP und SSH Dienstes. Man kann natürlich alles mögliche starten wie zum Beispiel NMAP oder NAT zum scannen von Windowsfreigaben.

#!/usr/bin/perl
use strict;
use DBI;
use IO::Socket;

my ($snort_log_pfad,@snort_log,@scanned_ip,$zeile,$zeile1,@buf,$ip,@beschr,$ok);
$snort_log_pfad = "/var/log/snort/alert";
push(@beschr,' STEALTH ACTIVITY (NULL scan) detection ');
push(@beschr,' SCAN Proxy ');
push(@beschr,' SCAN Squid Proxy attempt ');
push(@beschr,' SCAN SOCKS Proxy attempt ');
push(@beschr,' SNMP trap tcp ');
push(@beschr,' SNMP request tcp ');
push(@beschr,' RPC portmap listing ');
push(@beschr,' X11 outgoing ');
push(@beschr,' NMAP FINGERPRINT ');
push(@beschr,' Incomplete RPC segment ');
push(@beschr,' WEB-IIS ');

while(1)
{
sleep(5);
#print ".";
open(LOG,"tail $snort_log_pfad |");
@snort_log = ;
close(LOG);
$ok = 0;
foreach $zeile (@snort_log)
{
foreach $zeile1 (@beschr)
{
if($zeile =~ /$zeile1/)
{
$ok = 1;
#print "INFO: $zeile";
}
}
if($zeile =~ /->/ && $ok == 1)
{
#print "Die Zeile aus SNORTLOG: $zeile";
@buf = split(/ /,$zeile);
if($buf[1] =~ /:/)
{
@buf = split(/:/,$buf[1]);
$ip = $buf[0];
}
else
{
$ip = $buf[1];
}
#print "IP: $ip\n";
@buf = grep(/^$ip$/,@scanned_ip);

#print "test $buf[0]\n";
if(not(@buf))
{
print "SCAN_IP: $ip\r\n";
push(@scanned_ip,$ip);
http_banner($ip);
ftp_banner($ip);
ssh_banner($ip);
}
}
}
}

sub http_banner()
{
my $http_ip = $_;
my $client = new IO::Socket::INET (PeerAddr => $http_ip,PeerPort => 80,Proto => 'tcp');
if($client)
{
print $client "HEAD / HTTP/1.0\r\n\r\n";
my @text = <$client>;
print @text;
my $ins = "";
foreach (@text)
{
$ins .= $_;
}
$client->close();
}
}

sub ftp_banner()
{
my $ftp_ip = $_;
my $client = new IO::Socket::INET (PeerAddr => $ftp_ip,PeerPort => 21,Proto => 'tcp');
if($client)
{
my $ftp_banner = <$client>;
print "$ftp_banner\r\n";
$client->close();
}
}

sub ssh_banner()
{
my $ssh_ip = $_;
my $client = new IO::Socket::INET (PeerAddr => $ssh_ip,PeerPort => 22,Proto => 'tcp');
if($client)
{
my $ssh_banner = <$client>;
print "$ssh_banner\r\n";
$client->close();
}
}


Das benutzen des Skriptes geschieht auf eigene Gefahr. Und man sollte immer etwas vorsichtig mit Gegenscannen sein den wenn man zuviel auf einmal scannt und der Angreifer ist gar keiner hat man bloß Unnanämlichkeiten mit den anderen Administratoren.