2. Typische Angriffe

Transcription

2. Typische Angriffe
2. Typische Angriffe
Wir befassen uns nun mit typischen Angriffen auf ein System, die versuchen, Schutzmechanismen
zu umgehen.
1
2 Typische Angriffe
nutzen Schwachstellen des Systems aus
Implementierungsschwächen
z.B. Buffer Overflows, werden ausgenutzt durch
Exploits
Nachlässigkeiten von Benutzern/ Sicherheitsadministratoren
z.B. veraltete Virensoftware, schlecht gewählte
Passwörter
Schwachstellen, die für einen Angriff genutzt werden, beruhen beispielsweise auf
Implementierungsfehlern der eingesetzten Software. Beispiele sind Buffer Overflows oder
Format-String Schwachstellen. Die Ausnutzung solcher Schwachstellen lässt sich mit Hilfe
entsprechender Programme oder Skripte (Exploits) weitgehend automatisieren. Dies ermöglicht
beispielsweise auch die Erstellung von Würmern. Außerdem basieren viele Angriffe auf
Nachlässigkeiten bei Benutzern bzw. Sicherheitsadministratoren (z.B. schlecht gewählte
Passwörter, veraltete Virensoftware).
2
2 Typische Angriffe
Interne Angriffe sind nicht zu unterschätzen
Mitarbeiter missbrauchen ihre Rechte
Studie InterGov (www.intergov.org) 2002:
80% der Angriffe von innen
Studie des Computer Security Institute(CSI) und FBI
2003: ca. 50% der Angriffe von innen
Angriffe kommen allerdings nicht nur von außen, d.h., das extern von nicht autorisierten Personen
versucht wird in ein System einzudringen, sondern auch von innen, d.h., autorisierte Personen
missbrauchen die ihnen gegebenen Rechte. Die Häufigkeit solcher internen Angriffe ist nicht zu
unterschätzen, wie zwei Studien der InterGov und des CSI/FBI zeigen. Gegen diese internen
Angriffe, bei denen Berechtigungen missbraucht werden, nützen dann auch die eingesetzten
Schutzmechanismen nichts.
3
Hier ist eine Aufstellung aus dem Sicherheitsreport des CSI/FBI, die zeigt, dass etwa die Hälfte
aller Angriffe von innen kommen.
4
2 Typische Angriffe
Social engineering
nicht technischer Angriff durch menschliche
Unachtsamkeiten
Passwort erfragen,
über die Schulter sehen,
im Müll suchen,
usw.
Neben Angriffen von innen bietet das Social Engineering die Möglichkeit, Schutzmechanismen
ohne technischen Aufwand zu umgehen. Unter Social Engineering fällt beispielsweise das
Erfragen von Passwörten unter Vorgabe falscher Tatsachen, das über die Schulter sehen bei der
Passworteingabe, das Nachstöbern im Müll nach sicherheitsrelevanten Informationen und vieles
erdenkliche mehr.
5
2.1 Buffer Overflows
Buffer Overflows (Pufferüberläufe)
Stellen die am häufigsten ausgebeutete
Schwachstelle dar.
Verursacht durch fehlende Längenüberprüfung bei
Eingaben für Puffer mit statischer Länge.
Arten von Buffer-Overflows: Stack-basiert
Heap-basiert
Buffer Overflows (Pufferüberläufe) stellen die in den letzten Jahren am häufigsten ausgebeutete
Schwachstelle dar, ein System erfolgreich anzugreifen. Buffer Overflows treten auf, wenn ein
Programm Puffer mit statischer Elementzahl ohne eine explizite Längenprüfung übergebener
Daten (z.B. Benutzereingaben) verarbeitet.
Reichen die für einen Puffer reservierten Bytes für Eingabedaten nicht aus, kommt es zu einem
Überlauf des Puffers. Dabei werden die überzähligen Daten in Speicherbereiche geschrieben,
welche sich jenseits des eigentlichen Puffers befinden. Dabei können beispielsweise sensitive
Daten überschrieben werden.
Es gibt mehrere Arten von Buffer Overflows, z.B. Stack-basierte Overflows oder Heap Overflows.
6
2.1 Buffer Overflows
Stack
Stack: Daten dynamischer lokaler
Variablen und Funktionsparameter.
dynamisch
Heap:dynamische Datenstrukturen
Heap
Data
Data: Daten initialisierter globaler
Variablen
Text
Text: Programmanweisungen
Prozessspeicherbereich
Das Stack-Segment enthält die dynamischen lokalen Daten und Funktionsparameter. Dynamische
lokale Variablen werden stets neu erzeugt, wenn die entsprechende Funktion, in der sie deklariert
sind, aufgerufen wird. Sie werden zerstört, wenn die Funktion verlassen wird. Statische lokale
Variablen werden im Daten-Bereich abgelegt.
Das Heap-Segment enthält die Daten für dynamische Datenstrukturen. Dynamische
Datenstrukturen
werden erst zur Programmausführung erzeugt.
In C werden solche
Datenstrukturen mit den Bibliotheksfunktionen malloc angelegt und mit free wieder freigegeben.
Das Data-Segment enthält die globalen Variablen. Globale Variablen können initialisiert, aber
auch uninitialisiert sein. Im ersteren Fall werden die globalen Variablen im Data-Segment
abgelegt, im zweiten Fall werden sie im BSS (Block Started by Symbol) Bereich abgelegt und mit
einem Wert 0 vorinitialisiert.
Das Text-Segment enthält alle Programmanweisungen, die von der CPU ausgeführt werden. Auf
diesen Bereich kann nur lesend zugegriffen werden, um zu verhindern, dass der Prozess selbst
seine Instruktionen modifiziert.
7
2.1 Buffer Overflows
Stack-basierte Buffer Overflows
– Nutzen Pufferüberläufe von Daten auf dem
Stack
– Lokale Parameter von Funktionen,
Rücksprungadresse, aktuelle Parameter
Wir befassen uns nun näher mit klassischen Stack-basierten Buffer Overflows. Lokale Variablen
eines
Prozesses
sowie
interne
Verwaltungsinformation
von
Funktionsaufrufen
(Rücksprungadresse, lokale Variablen, aktuelle Parameter) werden auf dem Stack abgelegt. Eine
klassische Stack-basierte Buffer Overflow Schwachstelle entsteht, wenn eine auf dem Stack
gesicherte Verwaltungsinformation modifiziert wird. Dabei wird ein lokaler Puffer mit statischer
Elementgröße, welcher sich auf dem Stack befindet, durch benutzerdefinierte Eingaben überfüllt,
so dass nachfolgende Stack-Bereiche überschrieben werden.
8
2.1 Buffer Overflows
void function (char *args ){
char buff2[4] = “ABC“;
char buff1[4];
strcpy(buff1,args);
}
int main( int argc, char *argv[]) {
if (argc >1)
function(argv[1]);
else
printf(“Kein Argument!“);
}
Parameter main
argc, argv
Rücksprungadr.
aus main
Parameter funct
args
Rücksprungadr.
aus function
lokale Variable
buff2
lokale Variable
buff1
Dies ist ein Beispiel einer Buffer Overflow-Schwachstelle. Der statische Puffer „buff1“ kann
durch eine Zeichenkette, die länger als 4-Zeichen ist, zum Überlaufen gebracht werden. Da der
Puffer „buff2“ auf dem Stack sofort dem Array „buff1“ folgt, wird „buff2“ durch die zu lange
Eingabe für „buff1“ überschrieben.
9
2.1 Buffer Overflows
Ein Server-Dienst...
....
#define PORT
7777
void do_sth(char *str)
{
char buff[24];
strcpy(buff, str);
printf("buff: %s\n", buff);
}
Ein etwas komplexeres Beispiel zeigt, wie man eine Denial-of-Service-Attacke mittels eines
Buffer Overflows durchführen kann. Bei dem Programm handelt es sich um einen Server-Dienst,
welcher auf Port 7777 auf entsprechende Anfragen lauscht. Wird eine Verbindung zu einem
Dienst hergestellt, nimmt dieser eine benutzerdefinierte Eingabe entgegen, welche anschließend
an die Unterfunktion do_sth weitergegeben wird. Innerhalb von do_sth wird die übergebene
Eingabe in den Puffer buff kopiert. Da der Eingabe-String eine Länge von 64 Zeichen umfassen
darf, der Puffer buff in do_sth jedoch lediglich 24 Elemente besitzt, kommt es zu einer klassischen
Buffer-Overflow-Schwachstelle.
10
int main(int argc, char *argv[])
{
char line[64];
....
// Server-Dienst konfigurieren
for ( ; ; ) {
connfd = accept( listenfd, (SA *) NULL, NULL);
write( connfd, "Eingabe: ", 9);
n = read( connfd, line, sizeof (line) -1 );
line[n] = 0;
do_sth( line );
close( connfd );
}
}
11
2.1 Buffer Overflows Gegenmaßnahmen
StackGuard
call fun()
Funktions– Compilererweiterung für gcc
Parameter fun()
– Compiler fügt „Wächtercode“
Rücksprung(canaries) vor Rücksprungadresse
Adresse aus fun()
ein
– Mehrere Techniken zur
Canary
Generierung des Canaries
– Source-Code muss voranden sein lokale Variablen/
Puffer
– Kein Schutz gegen Heap-Angriffe
Der StackGuard Compiler (http://www.cse.ogi.edu/DISC/projects/immunix/StackGuard/) ist eine
Erweiterung des gcc-Compilers. Der StackGuard Compiler fügt „Wächtercode“ (genannt canaries
nach den Kanarienvögeln zum Warnen der Bergarbeiter) in den zu compilierenden Code ein, der
dessen Funktionalität nicht beeinträchtigt. Dieser Wächtercode wird unmittelbar vor den
Rücksprungadressen von Funktionen eingefügt. Die Idee ist, dass bei einem Exploit auch
sämtliche Speicherstellen zwischen dem eigentlichen Überlaufpuffer und der Rücksprungadresse
überschrieben werden. Sollte dieser Wächtercode (canary) bei einem Buffer Overflow geändert
worden sein, wird dies gemeldet und das Programm gestoppt. Es gibt mehrere Techniken zur
Generierung des canary (z.B. zufällig generiert auf Basis von /dev/urandom), die davor schützen
sollen, dass ein Angreifer den Wert des canary erfährt.
Bsp: int fun( int a, char* b) {
char buff[24];
strcpy(buff, b);
return 0;}
Der Puffer „buff“ kommt auf den Stack und kann durch eine zu lange Eingabe für „b“ durch den
Befehl „strcpy“ überlaufen. Um die Rücksprungadresse durch den Überlauf zu modifizieren,
ändert sich auch das Canary.
StackGuard bietet jedoch keinen umfassenden Schutz gegen Buffer Overflows, da sich der Schutz
lediglich auf den Stack-Bereich des Prozessspeichers bezieht (nicht betrachtet werden
beispielsweise Angriffe auf den Heap). Außerdem bleiben Angriffe unbemerkt, die die
Speicheradressen vor dem ersten Canary modifizieren.
12
2.1 Buffer Overflows Gegenmaßnahmen
Weitere Compiler-Erweiterungen
– /GS-Option Microsoft
• Visual C++.Net
– StackShield
(http://www.angelfire.com/sk/stackshield)
– Stack Smashing Protection (SSP)
http://www.trl.ibm.com/projects/security/ssp
StackGuard ist eine von mehreren existierenden Compiler-Erweiterungen. So bietet Microsoft ein
zum StackGuard vergleichbares Konzept für Visual C++.Net. StackShield und Stack Smashing
Protection sind weitere Erweiterungen, die über StackGuard bzw. die /GS-Option hinausgehen.
13
2.1 Buffer Overflows Gegenmaßnahmen
• Wrapper für unsichere Bibliotheksfunktionen
• Libsafe http://www.research.avayalabs.com/project/libsafe
• Wird zwischen Programmcode und Standard-C-Bibliothek geladen
• Fängt unsichere Funktionen ab und ersetzt diese durch
Alternativfunktionen
• Probleme
– behandeln von allen unsicheren Funktionen
– Angriffe auf Heap
– Denial-of-Service (Programm bricht bei Pufferüberlauf ab)
Eine weitere Gegenmaßnahme gegen Buffer Overflows liegt in der Zuhilfenahme von Wrappern
für unsichere Bibliotheksfunktionen (wie gets, strcpy, strcat, sprintf, vsprintf etc.). Eine
entsprechende Implementierung ist Libsafe. Dabei handelt es sich um eine dynamisch ladbare
Bibliothek, die stets zwischen dem eigentlichen Programmcode und der Standard-C-Bibliothek
geladen wird. So wird Libsafe vor Ausführung der eigentlichen Funktionen der Standard-CBibliothek ausgeführt. Libsafe fängt alle potenziell unsicheren Funktionen ab und ersetzt diese
durch Alternativfunktionen, die als sicherer betrachtet werden, da zusätzliche Überprüfungen
hinsichtlich potenzieller Buffer Overflows durchgeführt werden. Wird ein Pufferüberlauf
gefunden, wird das Programm gestoppt.
Libsafe kann jedoch nicht alle Buffer Overflow Angriffe verhindern, da nur für eine begrenzte
Menge von Funktionen Alternativfunktionen bereitgestellt werden, die Schutzmechanismen auf
den Stackbereich des Prozessspeichers beschränkt sind und Denial-of-Service Angriffe weiterhin
möglich sind, da das Programm bei der Entdeckung eines Buffer Overflows abgebrochen wird.
14
2.1 Buffer Overflows Gegenmaßnahmen
Standard C Library Functions
gets(3C)
NAME
gets, fgets - get a string from a stream
SYNOPSIS
#include <stdio.h>
char *gets(char *s);
char *fgets(char *s, int n, FILE *stream);
DESCRIPTION
The gets() function reads bytes from the standard input stream (see intro(3)),
stdin, into the array pointed to by s, until a newline character is read or an end-offile condition is encountered. The newline character is discarded and the
string is terminated with a null byte.
If the length of an input line exceeds the size of s, indeterminate behavior
may result. For this reason, it is strongly recommended that gets() be avoided
in favor of fgets().
Beispiele unsicherer Funktionen der C-Bibliothek sind gets, strcpy, strcat, sprintf etc. Auf den
Manual-Seiten dieser Funktionen sind die Schwächen einer nicht vorhandenen
Längenüberprüfung für Felder dokumentiert.
15
2.1 Buffer Overflows Gegenmaßnahmen
Standard C Library Functions
string(3C)
NAME
string, strcasecmp, strncasecmp, strcat, strncat, strlcat,
strchr, strrchr, strcmp, strncmp, strcpy, strncpy, strlcpy,
strcspn, strspn, strdup, strlen, strpbrk, strstr, strtok,
strtok_r - string operations
DESCRIPTION
The arguments s, s1, and s2 point to strings (arrays of characters
terminated by a null character). The strcat(), strncat(), strlcat(),
strcpy(), strncpy(), strlcpy(), strtok(), and strtok_r() functions all
alter their first argument. These functions do not check for overflow of
the array pointed to by the first argument.
16
2.1 Buffer Overflows Gegenmaßnahmen
Standard C Library Functions
printf(3C)
NAME
printf, fprintf, sprintf, snprintf - print formatted output
DESCRIPTION
The sprintf() function places output, followed by the null byte
(\0), in consecutive bytes starting at s; it is the user's
responsibility to ensure that enough storage is available.
17
2.1 Buffer Overflows Gegenmaßnahmen
Modifikation der Prozessumgebung
– Nicht ausführbarer (non-executable) Stack
• Schädlicher Code kann nicht ausgeführt werden
• Implementierungen: Solaris (64-Bit), OpenBSD 3.2,
Linux( OpenWall, PaX)
• Problem:
– Vorhandener Code wird ausgenutzt
– Code wird auf den Heap gelegt
– Nicht ausführbarer (non-executable) Heap
• Schädlicher Code kann nicht ausgeführt werden
Das Ziel dieser Gegenmaßnahmen ist die Modifikation der Prozessumgebung, um die Ausnutzung
von Buffer Overflows zu unterbinden. Eine Methode liegt darin, den Stack-Bereich des
Prozessspeichers als nicht ausführbar (non-executable) zu kennzeichnen. So kann auf dem Stack
eingeschleuster schädlicher Code nicht mehr ausgeführt werden. Es gibt einige
Implementierungen: Alle Solaris-Plattformen auf 64-Bit Architekturen verwenden per Default
einen als nicht-ausführbar konfigurierten Stack. Auch OpenBSD wird ab Version 3.2 mit einer
non-executable-Funktionalität ausgeliefert. Unter Linux gibt es Implementierungen in Form von
Kernel-Patches, beispielsweise OpenWall und PaX. Ein nicht ausführbarer Stack verhindert
jedoch noch nicht die Ausnutzung von Buffer Overflows, da zum einen vorhandener Code für
einen Angriff ausgenutzt werden kann oder der schädliche Code auf dem Heap zur Ausführung
gebracht werden könnte. Daher ist eine weitere Maßnahme, auch den Heap als nicht-ausführbar
zu deklarieren. Aber auch dann gibt es Möglichkeiten, Buffer Overflows auszunutzen, die hier
aber nicht beschrieben werden.
18
2.1 Buffer Overflows
PaX: ein Patch für den Linux-Kernel
– http://pax.grsecurity.net/
– Nicht-ausführbarer Stack und Heap
– Zufällig gewählte Adressbereiche
(Address Space Layout Randomization)
– Probleme: Stabilität und Performance
Eine Implementierung von Speicherschutz gegen Buffer Overflows für Linux ist PaX
(http://pax.grsecurity.net/). PaX bietet einen nicht-ausführbaren Stack und Heap. Zudem hat PaX
einen weiteren Schutz gegen Buffer Overflows: das Generieren von zufälligen Speicheradressen
bei jedem Ausführen des Programms. Dadurch ist es nicht möglich mit einem Core-Dump die
Adressen auszulesen, um diese dann für den eingeschleusten Code zu benutzen.
19
2.2 Viren, Würmer und Trojaner
Viren
Infizieren zuvor korrekte Wirtsprogramme und
machen sie damit potentiell zu Schadprogrammen,
die transitiv weitere Programme infizieren.
Würmer
Programm, dass sich über das Netz fortpflanzt –
entweder selbsttätig oder als Anhängsel von E-mails
– und nach Belieben Unheil anrichtet.
Trojanische Pferde
Programm tut, was der Benutzer erwartet, aber
insgeheim noch anderes.
Viren, Würmer und Trojanische Pferde bilden weitere wichtige Klassen von Attacken auf ein ITSystem . Viren benötigen immer ein Wirtsprogramm zur Ausführung des Virus-Codes. Die
Ausführung des Virus bewirkt, dass eine Kopie (Reproduktion) in einen noch nicht infizierten
Speicherbereich geschrieben wird. Zusätzlich zur Reproduktion enthalten Viren oft einen
Schadensteil. Würmer sind die Weiterentwicklung von Viren im Zeitalter des Internets. Sie
können sich selbst aktiv über ein Netzwerk ausbreiten und brauchen, im Gegensatz zu Viren,
keinen Wirt. Ein Trojanisches Pferd täuscht eine Funktionalität vor, die darüberhinaus aber
auch eine verborgene, bedrohliche Funktionalität besitzt. Trojaner verfügen in der Regel nicht
über eine Infektionsfunktion und müssen daher gezielt auf den Rechner eines Opfers gebracht
werden. Dann erlauben sie einem Angreifer einen Zugriff auf Informationen und Funktionen des
Zielrechners.
20
2.2 Viren, Würmer und Trojaner
1997
1998
Bevor wir uns Viren, Würmer und Trojaner genauer ansehen, zeigen die folgenden Folien die
Verteilung der Virenmeldungen an das Bundesamt für Systemsicherheit (BSI) in den Jahren 1997
– 2002.
21
2.2 Viren, Würmer und Trojaner
1999
2000
22
2.2 Viren, Würmer und Trojaner
2001
2002
23
2.2.1 Computer Viren
Fred Cohen, Computer Viruses - Theory and
Experiments, 1984
Eine nicht selbständige Programmroutine,
die sich selbst reproduziert und dadurch vom
Anwender nicht kontrollierbare
Manipulationen in Systembereichen, an
anderen Programmen oder deren Umgebung
vornimmt.
Computer-Viren gehören zu den Programmen mit Schadensfunktionen. Als Schaden ist hier
insbesondere der Verlust oder die Verfälschung von Daten oder Programmen sicherlich von
größter Tragweite. Solche Funktionen von Programmen können sowohl unbeabsichtigt als auch
bewusst gesteuert auftreten. Ein Computer-Virus ist eine nicht selbständige Programmroutine, die
sich selbst reproduziert und dadurch vom Anwender nicht kontrollierbare Manipulationen in
Systembereichen, an anderen Programmen oder deren Umgebung vornimmt. Die Eigenschaft der
Reproduktion führte in Analogie zum biologischen Vorbild zu der Bezeichnung "Virus". Die
Möglichkeiten der Manipulation sind sehr vielfältig. Besonders häufig sind das Überschreiben
oder das Anlagern des Virus-Codes an andere Programme und Bereiche des Betriebssystems,
wobei dies immer so geschieht, dass zunächst der Virus-Code und dann erst das ursprüngliche
Programm ausgeführt wird.
Der Computervirus wird zwanzig Jahre alt ::
11:53:36
Artikel in astalavista.ch vom 14.11.2003
Fred Cohen setzte im November 1983 den ersten digitalen Übeltäter in Umlauf
Vor zwanzig Jahren erblickte der erste Computervirus offiziell das Licht der Öffentlichkeit.
Der Student Fred Cohen präsentierte an der University Southern California nach einer
Woche Entwicklungsarbeit am 10. November 1983 das Ergebnis seines Experiments:
den ersten Virus auf einem Unix-System. Seinen Namen bekam das kleine Programm,
da es ähnlich wie das biologische Virus seine Umgebung verändert und sich weiter
vermehren kann. ....
24
2.2.1 Computer Viren
Aufbau eines Computer-Virus
Reproduktions- /Infektionsteil
Mit diesem Programmteil wird die Vermehrung des Virus
durchgeführt.
Erkennungsteil
Hier wird geprüft, ob bereits die Infektion eines
Programms oder Systembereichs bereits erfolgte.
Schadensteil (payload)
Enthält die Schadensfunktion
Der allgemeine Aufbau eines Computer-Virus ist wie folgt:
Im Reproduktionsteil bzw. Infektionsteil wird die Vermehrung des Virus durchgeführt.
Potentielle Speicherbereiche für Viren sind der Code ausführbarer Programme von Benutzern,
Bereiche des Betriebssystems oder Sektoren eines Hintergrundspeichermediums.
Im Erkennungsteil wird geprüft, ob bereits die Infektion eines Programms oder Systembereichs
erfolgte. Die Verbreitung wird beschleunigt, wenn das Virus auf eine Infektion "verzichten" kann,
weil sie bereits geschehen ist. Jedes Wirts-Programm wird daher nur einmal infiziert. Die
Entdeckung wird damit auch verzögert, da durch mehrfache Anlagerung des Virus-Codes die
Dateien sonst so groß werden, dass sie entweder nicht mehr ausführbar sind oder aber dem
Benutzer die Größenänderung schneller auffällt.
Schadensteil (payload) In einigen Viren ist absichtlich eine Schadensfunktion programmiert, meist
das Überschreiben oder Verändern von Programmen oder Daten, oder aber auch nur die Ausgabe
von Meldungen und Geräuschen auf dem Rechner. Dieser Programmteil kann fehlen, aber auf
jeden Fall entsteht Schaden durch Inanspruchnahme von Speicherplatz im Hauptspeicher und auf
Datenträgern. Durch Programmierfehler, Veränderungen des Betriebssystems oder ähnliches
können weitere Schäden als Nebeneffekte auch dann auftreten, wenn sie nicht absichtlich
programmiert sind
25
2.2.1 Computer Viren
Bedingungsteil
enthält Bedingungen für die Verbreitung und die
Schadensfunktion
Tarnungsteil
Erschwert die Entdeckung des Virus, z.B. polymorphe Viren.
Sowohl die Verbreitung als auch die Schadensfunktion können von Bedingungen abhängig
programmiert sein, z.B. tritt bei einigen Viren der Schaden an einem bestimmten Datum oder bei
einer bestimmten Anzahl von Aufrufen ein. Diese Bedingungen sind im Bedingungsteil enthalten.
Auch dieser Teil kann fehlen.
Tarnungsteil Hierunter fallen Programmroutinen, um die Entdeckung des Virus im infizierten
System zu erschweren. Dieser Teil ist meist nur bei neueren Viren zu finden. Beispiele sind Stealthoder polymorphe Viren.
26
2.2.1 Computer Viren
program virus:=
{1234567;
subroutine infect-executable:=
{loop:file = get-random-executable-file;
if first-line-of-file = 1234567 then goto loop;
add virus to file; }
subroutine do-damage:= {whatever damage is to be done}
subroutine trigger-pulled:= {return true if some condition holds}
main-program:=
{infect-executable; if trigger-pulled then do-damage;}
Ein (abstraktes) Beispiel eines Virus zeigt der Pseudo-Code dieser Folie. Die Nummer 1234567
ist der Erkennungsteil, an dem ein bereits infiziertes Wirtsprogramm erkannt wird. Der
Beispielvirus infiziert in infect-executable ausf_hrbare Dateien. Sollte die ausf_hrbare
Datei schon infiziert sein, so wird nach einer weiteren uninfizierten Datei gesucht.
Nachdem das Programm infiziert wurde, wird der Schadensteil do-damage
ausgef_hrt, falls der Bedingungsteil trigger-pulled erf_llt ist.
Sp_ter werden wir uns einen konkreten Virus genau ansehen.
27
2.2.1 Computer Viren
Typische Programmstruktur im Binärcode (vereinfacht)
0
1
JUMP START
0
1
START
START
4710
4710
4711
JUMP 4711
Virus
JUMP START
Anhängen
Es gibt verschiedene Arten, wie ein Virus seinen Code in einer Datei platzieren kann:
1.
Anhängen: Der Virencode wird ans Ende der Datei angehängt. Eine Sprunganweisung zu
Beginn des Programms sorgt für eine Verzweigung zum Virencode. Nach dem Virencode
springt das Programm wieder zurück zum regulären Anfang des Programms. Nachteil dieser
Methode ist der Zuwachs bei der Dateigröße. Außerdem kann der Virencode am Ende des
Programms leicht von Anti-Viren-Programmen gefunden werden.
28
2.2.1 Computer Viren
Typische Programmstruktur im Binärcode (vereinfacht)
1
START
1000
JUMP START
Virus
4710
0
1
START
JUMP START
Virus
4710
5710
Voranstellen
Überschreiben
2.
Einfügen am Anfang: Der Virencode wird direkt an den Anfang der Programmdatei gestellt.
Bei jedem Aufruf der Datei wird dann zunächst der Virencode ausgeführt, bevor das
eigentliche Programm beginnt. Das Einfügen am Anfang ist jedoch komplizierter als das
Anhängen, da die Header-Struktur der Datei verändert werden muss. Auch hier wächst die
Dateigröße.
3.
Überschreiben: Programmcode wird durch den Virencode überschrieben. Dadurch verändert
sich die Dateigröße nicht. Allerdings birgt ein Überschreiben das Risiko, den Programmcode
zu beschädigen. Daher suchen die Viren nach Nullbytes in einer Datei und schreiben sich
dorthin. Um den Virencode beim Aufruf des Programms zur Ausführung zu bringen, muss
das Programm analysiert werden, um Einstiegspunkte zu finden oder man platziert direkt am
Anfang des Programms einen Verweis auf den Virencode.
29
2.2.1 Computer Viren
Maßnahmen von Viren, um unentdeckt zu
bleiben
– Stealth-Viren
• Lieber große Dateien als kleine, da Größenänderung
weniger auffällig
• Einklinken in den Überwachungsprozess von Viren, z.B.
Anti-Viren-Software: Verwischen von Spuren oder
Vorspielen falscher Informationen.
– Polymorphe Viren
• Selbstveränderung des Viren-Codes
– Retro-Viren
• Bekämpfen aktiv Anti-Viren-Programme
Um von Anti-Viren-Software nicht entdeckt zu werden, haben Viren eine Reihe von Maßnahmen,
um unentdeckt zu bleiben.
Stealth-Viren: Stealth-Viren entwickeln spezielle Techniken, um sich vor Antiviren-Programmen
zu verstecken. Eine einfache Tarnmaßnahme besteht darin, sich lieber an große Dateien zu hängen,
da dort der Größenzuwachs weniger auffällt. Eine weitere Möglichkeit ist das Einklinken in den
Überwachungsprozess von Viren. Der Stealth-Virus installiert sich dazu in den Arbeitsspeicher
und überwacht die Überwachungsfunktionen für Viren. Startet eine Überwachungsfunktion (z.B.
Anti-Viren-Programm), manipuliert der Virus die Betriebssystemfunktionen und verwischt seine
Spuren, bevor die Überwachungsfunktion ausgeführt wird. Nach Beendigung der
Überwachungsfunktion, werden die Tarnmaßnahmen wieder rückgängig gemacht und der Virus
arbeitet weiter. Ein Beispiel ist das Bootsektorvirus Ripper, das beim ersten Infizieren eines
Datenträgers eine Kopie des nicht-infizierten Bootsektors anlegt, bevor das Virus sich selbst in
den Bootsektor kopiert. Versucht ein Programm, den Bootsektor zu prüfen, täuscht das Virus das
Programm mit der originalen nicht-infizierten Kopie.
Polymorphe Viren: Viren haben einen bestimmten Binärcode, beinhalten also eine bestimmte
Byte-Reihenfolge, die von Anti-Viren-Programmen gesucht werden, um Viren zu entdecken.
Polymorphe Viren verändern in regelmäßigen Abständen (z.B. bei jeder 10. Infektion) ihre ByteReihenfolge mittels eines Mutationsalgorithmuses. Eine einfache Möglichkeit bei auf VBS
basierenden Viren ist die Variation von Leerzeichen, Ändern von Klein- und Großschreibung, da
dies für den VBS-Interpreter keinen Unterschied macht.
Retro-Viren: Retro-Viren werden unmittelbar gegen Anti-Viren-Programme eingesetzt. Diese
Viren beschädigen oder löschen Dateien des Anti-Viren-Programms oder speicherresidente AntiViren-Programme werden „abgeschossen“ oder deren Start verhindert.
30
2.2.1 Computer Viren
Arten von Viren
– Datei-Viren (File-Viren)
• Infizieren ausführbare Dateien
– Boot-Viren
• Infizieren den Boot-Sektor der Platte/Diskette
– Multipartite-Viren (File+Boot)
• Infizieren ausführbare Dateien und Boot-Sektoren
– Makro-Viren
• Nutzen leistungsfähige Skriptsprache aus
• Infizieren Daten/Skripte, die von Interpretierern
aufbereitet bzw. ausgeführt werden.
Man unterscheidet eine Reihe unterschiedlicher Virenarten:
Datei-Virus
Datei-Viren lagern sich an Programmdateien an. Dies geschieht so, dass beim Aufruf der VirusCode zuerst ausgeführt wird und erst anschließend das originale Programm. Dadurch läuft das
Programm anschließend wie gewohnt und der Virus wird nicht so schnell entdeckt. Es sind jedoch
auch primitivere, überschreibende Viren bekannt, die sich so an den Anfang des Wirts-Programms
setzen, dass dies nicht mehr fehlerfrei läuft.
Boot-Virus
Beim Booten werden u. a. Programmteile ausgeführt, die zwar eigenständig sind, sich aber in
sonst nicht zugänglichen und im Inhaltsverzeichnis der Disketten und Festplatten nicht sichtbaren
Sektoren befinden. Boot-Viren überschreiben den Boot- oder Partition-Sektor mit ihrem
Programm. Der originale Inhalt wird an eine andere Stelle auf dem Datenträger verlagert und
dann beim Start des Computers anschließend an den Virus-Code ausgeführt. Dadurch startet der
Computer scheinbar wie gewohnt. Der Boot-Virus gelangt jedoch bereits vor dem Laden des
Betriebssystems in den Arbeitsspeicher des Computers und verbleibt dort während der gesamten
Betriebszeit. Er kann deshalb den Boot-Sektor jeder nicht schreibgeschützten Diskette infizieren,
die während des Rechnerbetriebs benutzt wird, und sich auf diese Weise auf andere Computer
übertragen.
Multipartite-Viren
Sind eine Kombination aus Datei- und Boot-Viren.
Makro-Viren
Machen sich zunutze, dass weitverbreitete Office-Anwendungen, insbesondere die von Microsoft,
über eine leistungsfähige Skriptsprache zum Automatisieren von Abläufen verfügen. Makros
erledigen häufig benötigte Steuerungsaufgaben, die beim Zugriff auf die Datei durch das
zugehörige Programm automatisch ausgeführt werden. Makro-Viren infizieren Daten und Skripte,
die dann vom Interpretierer ausgeführt werden.
31
2.2.1 Computer Viren
Makro-Viren
– anwendungsspezifisch
– Liegen im Quelltext vor
– Visual Basic Script (VBS)
• Wird vom Windows Scripting Host (WSH) ausgeführt
• VBS-Viren können auf die Daten mehrerer
Anwendungen zugreifen
• Bietet Zugang zum Dateisystem und Lese- und
Schreibzugriffe in die Registry.
Makroviren sind im Gegensatz zu binären Computer-Viren nicht hardware- sondern
anwendungsspezifisch. Die Voraussetzung für ihren Erfolg ist das Vorhandensein einer
bestimmten Anwendung. Makro- und Skriptviren liegen im Quelltext vor, der relativ gut lesbar
und analysierbar. Dadurch können sie leichter von „Trittbrettfahrern“ modifiziert werden, um
neue Viren zu erzeugen. Eine oft benutzte Makrosprache für Viren ist Visual Basic Script (VBS),
die vom Windows Scripting Host (WSH) ausgeführt wird. Dadurch sind VBS-Viren nicht mehr
an eine Anwendung gebunden, es genügt wenn der WHS auf dem Rechner installiert ist. Damit
sind VBS-Viren nicht für eine Anwendung spezialisiert und können auf Daten aller Anwendungen
zugreifen, z.B. das Adressbuch von Outlook, das von VBS-Würmern genutzt wird, um sich selbst
per E-Mail zu verbreiten.
32
2.2.1 Computer Viren
Beispiel: VBS-Virus Internal
– Überschreibt alle .htm und .html Dateien im
lokalen Verzeichnis und allen
darüberliegenden Ordnern durch eine
Kopie seiner selbst.
– VBS-Skript ist in eine Webseite eingebettet
• <body OnLoad=“CheckIt();“>
• Beim Laden der Webseite wird das VBS.Skript
aufgerufen
Wir sehen uns nun ein Makro-Virus genauer an. Es handelt sich um das VBS-Virus Internal,
welches HTML-Seiten befällt. Das VBS-Skript des Virus ist in eine Webseite eingebettet und
überschreibt alle .htm bzw. .html Seiten des lokalen Verzeichnisses und allen darüber liegenden
Ordnern. Das Virus ist eine HTML-Datei, bei deren Aufruf das VBS-Skript ausgeführt wird.
Mittels des Events OnLoad wird beim Laden der Webseite die VBS-Funktion mit dem viralen
Code aufgerufen.
33
2.2.1 Computer Viren
<script language=“VBScript“>
<! - Sub CheckIt
If location.protocol = “file:“ then Call IsFile
End Sub
Virus tritt nur in Aktion, wenn das Dokument lokal auf
der Festplatte liegt
Das Skript überprüft zunächst den Protokolltyp der Webseite. Nur wenn es sich um den
Protokollbezeichner file handelt, das Dokument also lokal auf der Platte liegt, tritt das Virus in
Aktion.
34
2.2.1 Computer Viren
erzeuge Dateisystemobjekt zum Zugriff aufs Dateisystem
Set fso = CreateObject(“Script.FileSystemObject“)
erzeuge Windows-Verzeichnispfad
HostPath=Replace(location.href, file:///, ““)
HostPath=Replace(HostPath, “/“, “\“)
Vaterverzeichnis des aktuellen Verzeichnisses
cpath = fso.GetParentFolderName(HostPath)
Set folder = fso.GetFolder(cpath)
Die eigentliche Infektion beginnt mit dem Erzeugen eines Dateisystemobjektes fso, über das der
Zugriff auf das lokale Dateisystem erfolgt. Danach wird der lokale Pfad des HTML-Dokumentes
so verändert, dass er als Verzeichnisangabe benutzt werden kann (entfernen des
Protokollbezeichners file und Windows-Schrägstriche benutzen). Die Variable HostPath ist dann
der Pfad des Virus-HTML-Dokuments. Dann wird das übergeordnete Verzeichnis zum aktuellen
Verzeichnis ermittelt. Für den Zugriff auf dieses Verzeichnis wird ein Verzeichnisobjekt erstellt
und in der Variable folder gespeichert.
35
2.2.1 Computer Viren
While folder.IsRootFolder = false
Set folder = fso.GetFolder(cpath)
Set fc = folder.Files
cpath = fso.GetParentFolderName(cpath)
For each f1 in fc
s = fso.GetExtensionName(f1.name)
if f1.path <> HostPath then
if s = “htm“ pr s = “html“ then fso.CopyFile HostPath,
f1.path
End If
Wend
...
-->
</script>
Danach wird die zentrale Schleife ausgeführt, die bei Erreichen des Wurzelverzeichnisses
abgebrochen wird. Für jedes Verzeichnis werden die Dateien und Verzeichnisse und deren
Dateityp ermittelt. Handelt es sich um eine Datei des Typs htm oder html, wird diese mit einer
Kopie des Virendokumentes überschrieben (falls dies nicht schon geschah). Sind alle Dateien des
Verzeichnisses untersucht und gegebenenfalls infiziert, wird eine Verzeichnisebene höher
fortgesetzt.
36
2.2.1 Computer Viren
Nährboden für Viren
starke Aktivität am Rechner (Programmausführung)
Systeme ohne oder mit schwachen Schutzmechanismen
(z.B. MS-DOS, frühe Windows-Versionen)
System-Monopole (z.B. Windows für PCs)
Einschleppen durch Programme/Daten dubioser Herkunft
(z.B. übers Netz)
Die Ausbreitung von Viren kann durch ein bestimmtes Umfeld begünstigt werden. Da Viren zur
Verbreitung auf die Ausführung ihres Wirtsprogramms angewiesen sind, sind Umgebungen mit
hoher Rechneraktivität günstig, in denen viele Programme ausgeführt werden. Außerdem sind
Systeme mit keinem oder schwachen Schutzmechanismen stärker gefährdet. System-Monopole
wie Windows sind insbesondere für Makro-Viren günstig, da eine gemeinsame Skriptsprache auf
einer großen Anzahl von Rechner benutzt wird. Außerdem könne Viren durch das Einschleusen
von Programmen oder Daten aus dubiosen Quellen (z.B. übers Netz, Tauschbörsen) auf den
lokalen Rechner gelangen.
37
2.2.1 Computer Viren
Gegenmaßnahmen
– Beschränkung der Schreibrechte
– Dateischutz mit Prüfsummen oder
Verschlüsselung
– Möglichst das automatische Ausführen von
Makros ausschalten
– Viren-Scanner
Im folgenden einige Gegenmaßnahmen gegen Viren: Durch eine Beschränkung der Schreibrechte
wird das Modifizieren von Dateien schwerer. Das Verschlüsseln von Dateien hilft gegen
einfaches Überschreiben des verschlüsselten Codes durch den Virus-Code. Eine weitere
Möglichkeit ist es, eine Prüfsumme des Programms zu erstellen. Dadurch kann eine Verbreitung
des Virus unterbunden werden, der Befall jedoch nicht. Die automatische Ausführung von Makros
sollte nach Möglichkeit unterbunden werden. Die am häufigsten eingesetzten Werkzeuge gegen
Viren sind Viren-Scanner, die Programme auf Vorhandensein spezifischer Bytemuster bzw.
Codesequenzen durchsuchen.
38
2.2.2 Würmer
• Programm, das sich über das Netz fortpflanzt,
entweder selbsttätig (Internet Worm Morris 1988)
oder als Anhängsel von E-Mails (Love Letter, 2000)
• Typische Verbreitungsmethoden
– Nutzung von Diensten zur Fernausführung von
Programmen (z.B. Unix rsh)
– Sicherheitslücken in Internet Daemons (z.B.
offene Debug-Option in sendmail führt zur
Annahme und Ausführung von Shell Befehlen)
– Skripte als Anlagen zu E-Mails (z.B. in VBS
geschrieben), Öffnung führt zu weiteren
Verbreitung (z.B. mittels Adressdaten)
Im Gegensatz zu einem Virus ist ein Wurm ein eigenständiges, ablauffähiges Programm,
dass kein Wirtsprogramm zur Ausführung benötigt und sich über das Netz verbreitet.
Beispielwürmer sind Loveletter, Nimda, Melissa, CodeRed oder der Internet Worm Morris.
Würmer nutzen zum Teil reguläre Möglichkeiten (rsh in Unix, oder VBS-Skripte als
Anlagen zu E-Mails), um ihre Daten übers Netz zu übertragen, oder nutzen gezielt
bekannte Sicherheitslücken aus (z.B. offene Debug-Option in sendmail).
39
2.2.2 Würmer
Internet Wurm Morris 1988
http://www.snowplow.org/tom/worm/worm.html
http://world.std.com/~franl/worm.html
Nutzte Schwachstellen in UNIX-Systemen (VAX und SUN-3
Workstations mit Berkely UNIX 4.2 und 4.3)
Infizierte etwa 6000 Rechner (ca. 10% des damaligen Internets)
Systeme wurden abgeschaltet, um sich vor Attacken zu schützen
Kein expliziter Schadensteil, aber Netzwerkverkehr
Der Morris bzw. Internet-Wurm ist einer der ersten echten Massen-Würmer. Er ist nach seinem
Schöpfer Robert T. Morris benannt, Sohn eines hochrangigen Mitarbeiters der amerikanischen
National Security Agency (NSA). Der Morris-Wurm nutzte Schwachstellen in UNIX-Systemen
aus und infizierte ca. 6000 Rechner, was etwa 10% des damaligen Internets entspricht. Außerdem
wurden Rechner abgeschaltet und vom Netz genommen, um nicht infiziert zu werden. Der Wurm
hat keinen expliziten Schadensteil, jedoch legte er durch den erhöhten Netzverkehr große Teile
des Internets lahm.
40
2.2.2 Würmer
Angriff
suche nach Rechnern (/etc/hosts.equiv, /.rhosts, netstat,
Zufallsadressen) und Benutzerkonten (/etc/passwd)
nutze Sicherheitslücken aus:
fingerd (Informationen über Benutzer): buffer overflow
sendmail (e-mail Transport): offener Debug-Modus erlaubt
Zugriff auf entfernten Rechner
rsh: Passwörter knacken (Kombinationen aus Benutzername,
Liste „populärer“ Passwörter
kopiere Wurm auf entfernten Rechner und führe den Wurm aus
Die Aktivitäten des Wurms lassen sich in Angriffs- und Abwehraktivitäten unterteilen. Beim
Angriff wird zunächst nach Rechnern und Benutzerkonten gesucht, die angegriffen werden sollen.
Bei diesen Rechnern wird versucht, Sicherheitslücken auszunutzen. War dies erfolgreich, wird der
Wurm auf den entfernten Rechner kopiert und ausgeführt. Die Rechneradressen erhält der Wurm
aus den Dateien /etc/hosts.equiv, /.rhosts, aus der Routing-Information produziert durch netstat
sowie zufällig generierten Adressen. Der Morris-Wurm benutzt eine Reihe verschiedener
Techniken und Schwachstellen, um sich fortzupflanzen:
Eine Schwachstelle war die Ausnutzung eines Buffer Overflows im finger-Daemon, der auf
finger-Anfragen wartet und diese beantwortet. Das finger-Programm dient bei UNIX-Systemen
dazu, grundlegende Informationen über Benutzer abzufragen. Das finger-Programm überprüfte
nicht die Länge der finger-Anfrage.
Weiterhin nutzt der Wurm das sendmail-Programm, das für den Transport von E-Mails zuständig
ist. Das sendmail-Programm verfügt über einen Debug-Modus, in dem man von einem entfernten
Rechner Befehle übermitteln und ausführen kann. In manchen UNIX-Systemen war dieser
Debug-Modus standarmässig aktiviert. Der Wurm sendete eine geeignete Befehlssequenz an den
Ziel-Rechner, deren Ausführung bewirkte, dass auf dem Ziel-Rechner eine Shell gestartet wurde
mit der das Wurm-Programm übersetzt und ausgeführt wurde.
Außerdem versucht der Morris-Wurm auf eroberten Rechnern die Passwörter der Benutzerkonten
zu knacken. Dazu wurde eine Wortliste von 400 typischen Passwörtern und Kombinationen der
Benutzernamen ausprobiert. Ist ein Passwort gefunden, kann der Wurm mittels rsh auf den
entfernten Rechner zugreifen und eine Kopie des Wurms ausführen.
41
2.2.2 Würmer
aaa cornelius guntis noxious simon academia couscous hacker
nutrition simple aerobics creation hamlet nyquist singer airplane
creosote handily oceanography single albany cretin happening
ocelot smile albatross daemon harmony olivetti smiles albert
dancer harold olivia smooch alex daniel harvey oracle smother
alexander danny hebrides orca snatch algebra dave heinlein
orwell snoopy aliases december hello osiris soap alphabet
defoe help outlaw socrates ama deluge herbert oxford sossina
amorphous desperate hiawatha pacific sparrows analog develop
hibernia painless spit anchor dieter honey pakistan spring
andromache digital horse pam springer animals discovery horus
papers squires answer disney hutchins password strangle
anthropogenic dog imbroglio patricia stratford anvils drought
imperial penguin stuttgart anything duncan include peoria
subway aria eager ingres percolate success ariadne easier inna
persimmon summer arrow edges innocuous persona super
arthur edinburgh irishman pete superstageathena edwin isis
peter support atmosphere edwina japan philip supported aztecs
egghead jessica phoenix surfer azure eiderdown jester pierre
suzanne bacchus eileen jixian pizza swearer ...
Hier (ein Auszug) aus der Liste der Passwörter, mittels derer der Wurm die Passwörter zu
knacken versuchte.
42
2.2.2 Würmer
Verteidigungsmaßnahmen des Wurms
• ändern des Namens in sh
• wechseln der Prozess ID mit fork()
• setzt Core-Dump Größe auf 0 (kein Core Dump,
verhindert Analyse)
• löscht von ihm erzeugte Dateien, sobald nicht mehr
benötigt
• ...
Um unbemerkt zu bleiben, ändert der Wurm seinen Namen in sh. Dies ist der Prozessname der
Bourne Shell, welches ein üblicher Benutzerprozess ist. Wenn nun die Liste der laufenden
Prozesse betrachtet wird während der Wurm im System ist, bemerkt man nichts ungewöhnliches.
Der Wurm benutzt fork(), um seine Prozess ID zu ändern, um nicht zu lange die gleiche ID zu
besitzen. Der Wurm setzt die maximale Grösse des Core-Dumps auf Null. Der Core-Dump
erzeugt eine Kopie des laufenden CPU Prozesses für weitere Untersuchungen in den Speicher. Ein
Core-Dump erscheint wenn ein Programm abstürzt, kann aber auch erzwungen werden. Da der
Wurm die Größe auf 0 gesetzt hat, kann man bei einem (erzwungenen) Absturz keine Kopie des
Wurms erhalten. Dies erschwert, selbst beim Auffinden des Wurms, den Wurm zu stoppen, da
man nicht seine interne Struktur kennt. Außerdem löscht der Wurm alle Dateien von der Platte,
die er nicht mehr braucht (z.B. die Kopie des Wurmes).
43
2.2.2 Würmer
VBS-Mail-Wurm Melissa 1999
befallene Systeme: MS Word 97 /2000
verbreitet über e-mail
von: Anna Schultze
Betreff: Important Message from Anna Schultze
Here is that document you asked for ... don't show
anyone else ;-)
Anhang: list.doc
Der Wurm Melissa ist ein Beispiel eines Mail-Wurmes, der im Jahr 1999 Rechner mit Microsoft
Word 97 oder Word 2000 befiel. Der Melissa-Wurm verbreitet sich mittels eine e-mail mit
infizierter Word-Datei (List.doc) als Anhang. Diese Word-Datei enthält ein VBS-Skript, dass
beim Öffnen des Dokumentes ausgeführt wird.
44
2.2.2 Würmer
Vorgehensweise von Melissa
• ändert Makroeinstellungen so, dass Ausführung von
Makros erlaubt ist
• prüft die Windows-Registry
– HKEY_Current_User\Software\Microsoft\Office\Melissa? hat
den Wert ...by Kwyjibo?
– Nein: verschicke e-mail an die ersten 50 Einträge im MS
Outlook Adressbuch und setzte Registry-Eintrag
• Infiziert Normal.dot  jedes neue Word-Dokument ist
infiziert
Wird der Wurm ausgeführt, unternimmt Melissa die folgenden Schritte:
Der Wurm verringert die Sicherheitseinstellungen zur Ausführung von Makros, um das Ausführen
von Makros zu erlauben. Dadurch wird der Benutzer nicht benachrichtigt, wenn der Wurm
zukünftig ausgeführt wird.
Der
Wurm
prüft
dann
in
der
Windows-Registry
ob
der
Schlüssel
"HKEY_Current_User\Software\Microsoft\Office\Melissa?" den Wert „...by Kwyjibo“ besitzt.
Wenn dies nicht der Fall ist (kein Schlüsseleintrag oder nicht den Wert „...byKwyjibo“) sendet der
Wurm e-mails an die ersten 50 Einträge des Microsoft Outlook Adressbuches. Sollte eine der
Adressen eine Mailingliste sein, so werden e-mails an alle Einträge der Liste geschickt. Zur
Verbreitung muss Outlook installiert sein, muss aber nicht der Mail-Client zum Lesen der
Nachricht gewesen sein. Danach setzt der Virus den Wert des Registry-Schlüssels auf „... by
Kwyjibo".
Der Wurm infiziert danach die Normal.dot Vorlage von Word. Standardmäßig benutzen alle
Word-Dokumente die Normal.dot Vorlage, so dass jedes neu erzeugte Word-Dokument infiziert
wird
45
2.2.2 Würmer
• Bedingung für den Payload: die Minute der Stunde
muss mit dem Tag des Monats übereinstimmen
• Payload: fügt "Twenty-two points, plus triple-wordscore, plus fifty points for using all my letters. Game's
over. I'm outta here." ins aktuelle Dokument ein
Bemerkung: Diesen Satz sagt Bart Simpson in einer
Folge, in der er eine Partie Scrabble spielt und sie mit
dem Wort Kwyjibo gewinnt.
Schließlich, wenn die Minute der aktuellen Stunde mit dem Tag des Monats übereinstimmt, wird
der Payload des Wurms aktiviert. Der Wurm fügt die Nachricht "Twenty-two points, plus tripleword-score, plus fifty points for using all my letters. Game's over. I'm outta here." in das aktuelle
Dokument ein.
46
2.2.2 Würmer
• MyDoom, Januar 2004
– Verteiltes DoS auf Microsoft und SCO
– bisher schnellste Ausbreitung
– verbreitet über e-mail und peer-to-peer
• Sobig Worm, August 2003
– Verbreitung über Mail-Attachment
– Benutzt eigene SMTP-Engine zur Replikation
• SQL Slammer, Januar 2003
– Microsoft SQL 2000
– Buffer Overflow (Heap und Stack)
• Code Red, Juli 2001
– Index Dienst des Microsoft Internet Information Server (IIS)
– Buffer Overflow in Idq.dll
• http://en.wikipedia.org/wiki/Notable_computer_viruses_and_wor
ms
Weitere bekannte Würmer sind MyDoom, Sobig, Code Red und SQL Slammer usw. Die beiden
erstgenannten verbreiten sich über e-mail. Die beiden letztgenannten Würmer nutzen eine Buffer
Overflow-Schwachstelle aus: Code Red eine Schwachstelle im Index Dienst des Microsoft
Internet Information Server. Der Indexdienst indexiert Webseiten und lokale Festplatten. Der
Wurm Code Red verändert Webseiten. Der Wurm SQL Slammer nutze Buffer Overflows im
Microsoft SQL 2000 Server.
47
2.2.2 Würmer
Gegenmaßnahmen
– Restriktive Vergabe von Zugriffsrechten,
insbesondere für entfernte Rechner
– Patches einspielen,
– Sicherheitsmeldngen verfolgen
•
•
•
•
•
•
www.heise.de/security
www.bsi.de
www.cert.org
www.nsa.gov
www.microsoft.com/security
www.iig.uni-freiburg.de/telematik/spps/
Durch eine restriktive Vergabe von Zugriffsrechten lässt sich das unerlaubte Beschaffen von
Informationen und das Einbringen fremden Codes beschränken. Besonders Passwortdateien sind
zu schützen (auch Beschränkung der Leserechte). Kontrolliert werden müssen insbesondere die
Rechte bei Zugriffen von entfernten Rechnern. Da Würmer in der Regel bekannte
Implementierungsschwächen ausnutzen, müssen diese Lücken durch Administrationen mittels
Patches beseitigt werden, sobald Lücken (und die Patches) vorhanden sind. Die Lücken in
sendmail und fingerd waren beispielsweise schon lange vor dem Internet-Wurm bekannt. Aktuelle
Informationen zu Lücken werden regelmäßig im Internet veröffentlicht und sollten von
Administratoren verfolgt werden.
48
2.2.2 Würmer vs. Viren
Wurm
– Kann sich selbsttätig fortpflanzen, sich auf andere
Rechner kopieren
– Kann sich selbständig ausführen
– Nutzt Sicherheitslücken aus
Virus
– Integriert sich in ein Wirtsprogramm
– Kann nicht selbsttätig ausgeführt werden
– Benötigt, dass das Wirtsprogramm gestartet wird
Zwischen Würmern und Viren gibt es einige Unterschiede: Würmer können sich selbstständig
fortpflanzen, in dem sie sich über das Netz auf andere Rechner kopieren. Weiterhin brauchen
Würmer kein Wirtsprogramm, sondern können selbständig ausgeführt werden. Viren brauchen
immer ein Wirtsprogramm, das ausgeführt werden muss, um den Virus zu starten. Würmer nutzen
zu ihrer Verbreitung Sicherheitslücken in der Software aus.
49
2.2.2 Construction Kits
Wir basteln uns einen Virus oder Wurm....
Construction Kits
Next Generation Virus Construktion Kit
(NGVCK)
Virus Creation Laboratory
VBS Worm Generator
und viele mehr....
Es existieren mehrere Construction Kits, mit denen sich Viren und Würmer einfach erstellen
lassen, ohne dass viel Programmierarbeit notwenig ist. Beispielsweise wurde der Wurm
Kournikova mit den VBS Worm Generator erstellt. Auch wenn das Erstellen von Viren und
Würmern mit diesen Kits einfach möglich ist, sollte man es jedoch trotzdem nicht tun. Ein
generierter Wurm/Virus könnte aus Versehen in Umlauf gebracht werden, ohne dass man es
möchte.
50
2.2.3 Trojanische Pferde
Programme, die neben scheinbar nützlichen auch
nicht dokumentierte, schädliche Funktionen
enthalten und diese unabhängig vom ComputerAnwender und ohne dessen Wissen ausführen.
Spionagefunktionen (Passwörter),
Kommunikations- und Fernsteuerungskomponente
(z.B. NetBus)
Trojanische Pferde sind Programme, die neben scheinbar nützlichen auch nicht dokumentierte,
schädliche Funktionen enthalten und diese unabhängig vom Computer-Anwender und ohne
dessen Wissen ausführen. Trojaner können reine Spionagefunktionen (wie das Ermitteln von
Passwörtern) oder destruktive Funktionen besitzen. Häufig verfügen Trojaner über eine
Kommunikations- oder Fernsteuerungskomponente, um auf dieses Weise die erfassten Daten zu
übermitteln oder Befehle zur Fernsteuerung entgegenzunehmen.
51
2.2.3 Trojanische Pferde
• Abgerundete Beträge bei Zinsabrechnungen
auf eigenes Konto
• Durchsuchen der Festplatte nach Software
• Password-Sniffer
Ein Beispiel eines Trojaners ist das Programm eines Bankangestellten, der eine Software für
Zinsabrechnungen auf drei Stellen genau entwickeln sollte. Als zusätzliche Funktion ließ er
Restbeträge, die beim Abrunden anfielen, auf sein Konto gutschreiben. Ein anderes Beispiel ist
eine Demo-Version der Firma CadSoft, die versteckt die Festplatte des Benutzer-PCs nach
Programmen der Firma CadSoft durchsuchte und auf dem Bestellformular für das Handbuch
codierte.
Ein weiters Beispiel eines Trojanischen Pferdes sind „Password-Sniffer“. Password-Sniffer haben
meist das Erscheinungsbild des normalen Anmelde-Bildschirms, so dass der berechtigte
Anwender von der Manipulation nichts merkt. Der Password-Sniffer protokolliert dann heimlich
bei der Anmeldung das Passwort und ermöglichen dann dem Angreifer die unberechtigte Nutzung.
52
2.2.3 Trojanische Pferde
Ausnutzen der Windows Registry
– Trojaner beim Systemstart laden
•
•
•
•
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
...
– Trojaner mit anderen Programmen starten
• HKLM\SOFTWARE\Classes\exefile\shell\open\command
– Z.B. C:\Windows\Temp\trojan.exe “%1 %*“
• Übertragbar auf Dateitypen com, bat, html, mp3....
Um Trojaner zu aktivieren, gibt es mehrere Möglichkeiten. Die Windows-Registry bietet
beispielsweise Möglichkeiten, Programme beim Systemstart oder zu einem anderen Zeitpunkt
automatisch zur Ausführung zu bringen. Dazu können verschiedene Run-Schlüssel in der Registry
gesetzt werden. Die Run-Schlüssel unterscheiden sich in der Reihenfolge und der Art der
Ausführung der enthaltenden Programme. So werden beispielsweise die Schlüssel RunServices
und RunServicesOnce schon vor dem Anmeldebildschirm ausgeführt. Alle RunOnce-Schlüssel
werden nur einmal ausgeführt und dann automatisch entfernt. Beim Schlüssel RunOnceEx wird
bei seiner Verarbeitung ein Dialogfenster angezeigt (und eignet sich zum Verstecken von Trojaner
daher eher nicht).
53
2.2.3 Trojanische Pferde
Gegenmaßnahmen
Sensible Daten (Passworte, PIN, ..) nicht
ungeschützt speichern
Benutzerrechte beschränken
Signieren von Programmen
Sensible Daten, wie Pässwörter, PINs, TANs etc., sollten nicht auf der Festplatte gespeichert
werden, auf die ungehindert lesend zugegriffen werden kann. Wenn sensible Daten gespeichert
werden, so sollten sie möglichst verschlüsselt werden. Die Rechte von Benutzern zur Ausführung
von Betriebssystemdiensten sollte beschränkt werden, so dass jeder Benutzer nur die Dienste
bekommt, die er zur Erledigung seiner Aufgaben benötigt (Prinzip der minimalen Rechte).
Weiterhin kann man Programme mit der digitalen Unterschrift des Erzeugers versehen und vor
der Ausführung die Korrektheit der Signatur überprüfen.
54
2.2.3 Trojanische Pferde
Trojaner generieren....
Senna Spy Trojan Generator
Auch zum Generieren von Trojanern lassen sich Tools finden...
55
2.2.3 Trojanische Pferde
Trojaner generieren....
Senna Spy Trojan Generator
56
2.2.3 Trojanische Pferde
Trojaner generieren....
Senna Spy Trojan Generator
57