Python Forensics - Kurzanleitung

Python ist eine universelle Programmiersprache mit leicht lesbarem Code, der sowohl von professionellen Entwicklern als auch von unerfahrenen Programmierern leicht verstanden werden kann. Python besteht aus vielen nützlichen Bibliotheken, die mit jedem Stack-Framework verwendet werden können. Viele Labors verlassen sich auf Python, um grundlegende Modelle für Vorhersagen zu erstellen und Experimente durchzuführen. Es hilft auch, kritische Betriebssysteme zu steuern.

Python verfügt über integrierte Funktionen zur Unterstützung digitaler Ermittlungen und zum Schutz der Beweisintegrität während einer Ermittlungen. In diesem Tutorial werden die grundlegenden Konzepte der Anwendung von Python in der digitalen Forensik oder der Computerforensik erläutert.

Was ist Computerforensik?

Computational Forensics ist ein aufstrebendes Forschungsgebiet. Es befasst sich mit der Lösung forensischer Probleme mit digitalen Methoden. Es nutzt Computerwissenschaften, um digitale Beweise zu untersuchen.

Die Berechnungsforensik umfasst eine breite Palette von Themen, bei denen Objekte, Substanzen und Prozesse untersucht werden, hauptsächlich basierend auf Musternachweisen wie Werkzeugmarken, Fingerabdrücken, Schuhabdrücken, Dokumenten usw., sowie physiologische und Verhaltensmuster, DNA und digitale Nachweise Tatorte.

Das folgende Diagramm zeigt das breite Spektrum der unter Computational Forensics behandelten Themen.

Computerforensik wird mit Hilfe einiger Algorithmen implementiert. Diese Algorithmen werden für die Signal- und Bildverarbeitung, Computer Vision und Grafik verwendet. Dazu gehören auch Data Mining, maschinelles Lernen und Robotik.

Computerforensik umfasst verschiedene digitale Methoden. Die beste Lösung, um alle digitalen Methoden in der Forensik zu vereinfachen, ist die Verwendung einer universellen Programmiersprache wie Python.

Da wir Python für alle Aktivitäten der Computerforensik benötigen, gehen wir Schritt für Schritt vor und verstehen, wie es installiert wird.

Step 1 - Geh zu https://www.python.org/downloads/ und laden Sie die Installationsdateien von Python entsprechend dem Betriebssystem herunter, das Sie auf Ihrem System haben.

Step 2 - Klicken Sie nach dem Herunterladen des Pakets / Installationsprogramms auf die exe-Datei, um den Installationsvorgang zu starten.

Nach Abschluss der Installation wird der folgende Bildschirm angezeigt.

Step 3 - Der nächste Schritt besteht darin, die Umgebungsvariablen von Python in Ihrem System festzulegen.

Step 4 - Geben Sie nach dem Festlegen der Umgebungsvariablen an der Eingabeaufforderung den Befehl "python" ein, um zu überprüfen, ob die Installation erfolgreich war oder nicht.

Wenn die Installation erfolgreich war, erhalten Sie die folgende Ausgabe auf der Konsole.

Die in Python geschriebenen Codes sehen den in anderen herkömmlichen Programmiersprachen wie C oder Pascal geschriebenen Codes ziemlich ähnlich. Es wird auch gesagt, dass die Syntax von Python stark von C übernommen wurde. Dies schließt viele der Python-Schlüsselwörter ein, die der C-Sprache ähnlich sind.

Python enthält Bedingungs- und Schleifenanweisungen, mit denen die Daten für die Forensik genau extrahiert werden können. Für die Flusskontrolle bietet esif/else, whileund ein hohes Niveau for Anweisung, die ein "iterierbares" Objekt durchläuft.

if a < b: 
   max = b 
else: 
   max = a

Der Hauptbereich, in dem sich Python von anderen Programmiersprachen unterscheidet, ist die Verwendung von dynamic typing. Es werden Variablennamen verwendet, die sich auf Objekte beziehen. Diese Variablen müssen nicht deklariert werden.

Datentypen

Python enthält eine Reihe integrierter Datentypen wie Zeichenfolgen, Boolesche Werte, Zahlen usw. Es gibt auch unveränderliche Typen, dh die Werte, die während der Ausführung nicht geändert werden können.

Python verfügt auch über zusammengesetzte integrierte Datentypen, einschließlich tuples die unveränderliche Arrays sind, lists, und dictionariesDas sind Hash-Tabellen. Alle werden in der digitalen Forensik verwendet, um Werte zu speichern und Beweise zu sammeln.

Module und Pakete von Drittanbietern

Python unterstützt Gruppen von Modulen und / oder Paketen, die auch aufgerufen werden third-party modules (zugehöriger Code in einer einzigen Quelldatei zusammengefasst) zum Organisieren von Programmen.

Python enthält eine umfangreiche Standardbibliothek, was einer der Hauptgründe für seine Beliebtheit in der Computerforensik ist.

Lebenszyklus von Python-Code

  • Wenn Sie einen Python-Code ausführen, überprüft der Interpreter den Code zunächst auf Syntaxfehler. Wenn der Interpreter Syntaxfehler entdeckt, werden diese sofort als Fehlermeldungen angezeigt.

  • Wenn keine Syntaxfehler vorliegen, wird der Code kompiliert, um a zu erzeugen bytecode und an PVM (Python Virtual Machine) gesendet.

  • Das PVM überprüft den Bytecode auf Laufzeit- oder logische Fehler. Falls das PVM Laufzeitfehler findet, werden diese sofort als Fehlermeldungen gemeldet.

  • Wenn der Bytecode fehlerfrei ist, wird der Code verarbeitet und Sie erhalten seine Ausgabe.

Die folgende Abbildung zeigt grafisch, wie der Python-Code zuerst interpretiert wird, um einen Bytecode zu erzeugen, und wie der Bytecode vom PVM verarbeitet wird, um die Ausgabe zu erzeugen.

Für die Erstellung einer Anwendung gemäß den forensischen Richtlinien ist es wichtig, die Namenskonventionen und -muster zu verstehen und zu befolgen.

Regeln der Namensgebung

Während der Entwicklung von Python-Forensikanwendungen werden die zu befolgenden Regeln und Konventionen in der folgenden Tabelle beschrieben.

Konstanten Großbuchstaben mit Unterstrich HOHE TEMPERATUR
Name der lokalen Variablen Kleinbuchstaben mit holprigen Kappen (Unterstriche sind optional) aktuelle Temperatur
Globaler Variablenname Präfix gl Kleinbuchstaben mit holprigen Kappen (Unterstriche sind optional) gl_maximumRecordedTemperature
Funktionsname Großbuchstaben mit holprigen Kappen (Unterstriche optional) mit aktiver Stimme ConvertFarenheitToCentigrade (...)
Objektname Präfix ob_ Kleinbuchstaben mit holprigen Kappen ob_myTempRecorder
Modul Ein Unterstrich, gefolgt von Kleinbuchstaben mit holprigen Kappen _tempRecorder
Klassennamen Präfix class_ dann holprige Kappen und kurz halten class_TempSystem

Nehmen wir ein Szenario, um die Bedeutung von Namenskonventionen in der Computerforensik zu verstehen. Angenommen, wir haben einen Hashing-Algorithmus, der normalerweise zum Verschlüsseln von Daten verwendet wird. Der Einweg-Hashing-Algorithmus nimmt die Eingabe als einen Strom von Binärdaten auf. Dies kann ein Passwort, eine Datei, Binärdaten oder beliebige digitale Daten sein. Der Hashing-Algorithmus erzeugt dann amessage digest (md) in Bezug auf die in der Eingabe empfangenen Daten.

Es ist praktisch unmöglich, einen neuen Binäreingang zu erstellen, der einen bestimmten Nachrichtenauszug generiert. Selbst ein einzelnes Bit der binären Eingabedaten erzeugt bei Änderung eine eindeutige Nachricht, die sich von der vorherigen unterscheidet.

Beispiel

Schauen Sie sich das folgende Beispielprogramm an, das den oben genannten Konventionen folgt.

import sys, string, md5   # necessary libraries
print "Please enter your full name"
line = sys.stdin.readline()
line = line.rstrip()
md5_object = md5.new()
md5_object.update(line)
print md5_object.hexdigest()   # Prints the output as per the hashing algorithm i.e. md5
exit

Das obige Programm erzeugt die folgende Ausgabe.

In diesem Programm akzeptiert das Python-Skript die Eingabe (Ihren vollständigen Namen) und konvertiert sie gemäß dem md5-Hashing-Algorithmus. Es verschlüsselt die Daten und sichert die Informationen bei Bedarf. Gemäß den forensischen Richtlinien kann der Name von Beweisen oder anderen Beweisen in diesem Muster gesichert werden.

EIN hash functionist definiert als die Funktion, die eine große Datenmenge einem festen Wert mit einer bestimmten Länge zuordnet. Diese Funktion stellt sicher, dass dieselbe Eingabe zu derselben Ausgabe führt, die tatsächlich als Hash-Summe definiert ist. Die Hash-Summe enthält ein Merkmal mit spezifischen Informationen.

Diese Funktion kann praktisch nicht zurückgesetzt werden. Daher ist ein Angriff Dritter wie ein Brute-Force-Angriff praktisch unmöglich. Diese Art von Algorithmus wird auch genanntone-way cryptographic algorithm.

Eine ideale kryptografische Hash-Funktion hat vier Haupteigenschaften:

  • Es muss einfach sein, den Hashwert für eine bestimmte Eingabe zu berechnen.
  • Es muss unmöglich sein, die ursprüngliche Eingabe aus seinem Hash zu generieren.
  • Es muss unmöglich sein, die Eingabe zu ändern, ohne den Hash zu ändern.
  • Es muss unmöglich sein, zwei verschiedene Eingaben mit demselben Hash zu finden.

Beispiel

Betrachten Sie das folgende Beispiel, das beim Abgleichen von Kennwörtern mithilfe von Zeichen im Hexadezimalformat hilft.

import uuid
import hashlib
  
def hash_password(password):
   # userid is used to generate a random number
   salt = uuid.uuid4().hex #salt is stored in hexadecimal value
   return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt
     
def check_password(hashed_password, user_password):
   # hexdigest is used as an algorithm for storing passwords
   password, salt = hashed_password.split(':')
   return password == hashlib.sha256(salt.encode()
      + user_password.encode()).hexdigest()

new_pass = raw_input('Please enter required password ')
hashed_password = hash_password(new_pass)
print('The string to store in the db is: ' + hashed_password)
old_pass = raw_input('Re-enter new password ')

if check_password(hashed_password, old_pass):
   print('Yuppie!! You entered the right password')
else:
   print('Oops! I am sorry but the password does not match')

Flussdiagramm

Wir haben die Logik dieses Programms anhand des folgenden Flussdiagramms erläutert:

Ausgabe

Unser Code erzeugt die folgende Ausgabe:

Das zweimal eingegebene Passwort stimmt mit der Hash-Funktion überein. Dies stellt sicher, dass das zweimal eingegebene Passwort korrekt ist. Dies hilft beim Sammeln nützlicher Daten und beim Speichern in einem verschlüsselten Format.

In diesem Kapitel erfahren Sie, wie Sie Textdaten knacken, die während der Analyse und des Beweises abgerufen wurden.

Ein einfacher Text in der Kryptographie ist ein normal lesbarer Text, z. B. eine Nachricht. Ein Chiffretext hingegen ist die Ausgabe eines Verschlüsselungsalgorithmus, der nach der Eingabe von Klartext abgerufen wird.

Ein einfacher Algorithmus, wie wir eine einfache Textnachricht in einen Chiffretext verwandeln, ist die Caesar-Chiffre, die von Julius Caesar erfunden wurde, um den Klartext vor seinen Feinden geheim zu halten. Bei dieser Chiffre wird jeder Buchstabe in der Nachricht "vorwärts" um drei Stellen im Alphabet verschoben.

Es folgt eine Demo-Illustration.

a → D.

b → E.

c → F.

....

w → Z.

x → A.

y → B.

z → C.

Beispiel

Eine Nachricht, die beim Ausführen eines Python-Skripts eingegeben wird, bietet alle Möglichkeiten von Zeichen, die als Musterbeweis verwendet werden.

Folgende Arten von Musternachweisen werden verwendet:

  • Reifenspuren und Markierungen
  • Impressions
  • Fingerprints

Alle biometrischen Daten bestehen aus Vektordaten, die wir knacken müssen, um vollständige Beweise zu sammeln.

Der folgende Python-Code zeigt, wie Sie einen Chiffretext aus einfachem Text erstellen können -

import sys

def decrypt(k,cipher): 
   plaintext = '' 
   
   for each in cipher: 
      p = (ord(each)-k) % 126 
      
      if p < 32: 
         p+=95 
         plaintext += chr(p) 
         print plaintext 

def main(argv):
   if (len(sys.argv) != 1): 
      sys.exit('Usage: cracking.py') 
      cipher = raw_input('Enter message: ') 
      
      for i in range(1,95,1): 
         decrypt(i,cipher)
         
if __name__ == "__main__": 
   main(sys.argv[1:])

Ausgabe

Überprüfen Sie nun die Ausgabe dieses Codes. Wenn wir einen einfachen Text "Radhika" eingeben, erzeugt das Programm den folgenden Chiffretext.

Virtualizationist der Prozess der Emulation von IT-Systemen wie Servern, Workstations, Netzwerken und Speicher. Es ist nichts anderes als die Erstellung einer virtuellen als einer tatsächlichen Version eines Betriebssystems, eines Servers, eines Speichergeräts oder von Netzwerkprozessen.

Die Hauptkomponente, die bei der Emulation virtueller Hardware hilft, ist definiert als hyper-visor.

In der folgenden Abbildung werden die beiden Haupttypen der verwendeten Systemvirtualisierung erläutert.

Virtualisierung wurde in der Computerforensik auf verschiedene Weise eingesetzt. Es hilft dem Analysten so, dass die Workstation für jede Untersuchung in einem validierten Zustand verwendet werden kann. Die Datenwiederherstellung ist insbesondere durch Anhängen des DD-Images eines Laufwerks als sekundäres Laufwerk an eine virtuelle Maschine möglich. Dieselbe Maschine kann als Wiederherstellungssoftware verwendet werden, um die Beweise zu sammeln.

Das folgende Beispiel hilft beim Verständnis der Erstellung einer virtuellen Maschine mithilfe der Programmiersprache Python.

Step 1 - Lassen Sie die virtuelle Maschine 'dummy1' heißen.

Jede virtuelle Maschine muss über 512 MB Arbeitsspeicher mit minimaler Kapazität verfügen, ausgedrückt in Bytes.

vm_memory = 512 * 1024 * 1024

Step 2 - Die virtuelle Maschine muss an den berechneten Standardcluster angeschlossen sein.

vm_cluster = api.clusters.get(name = "Default")

Step 3 - Die virtuelle Maschine muss von der virtuellen Festplatte booten.

vm_os = params.OperatingSystem(boot = [params.Boot(dev = "hd")])

Alle Optionen werden zu einem Parameterobjekt der virtuellen Maschine zusammengefasst, bevor die Methode add der vms-Auflistung zur virtuellen Maschine verwendet wird.

Beispiel

Im Folgenden finden Sie das vollständige Python-Skript zum Hinzufügen einer virtuellen Maschine.

from ovirtsdk.api import API #importing API library
from ovirtsdk.xml import params

try: #Api credentials is required for virtual machine
   api = API(url = "https://HOST", 
      username = "Radhika", 
      password = "a@123", 
      ca_file = "ca.crt")
      
   vm_name = "dummy1"
   vm_memory = 512 * 1024 * 1024 #calculating the memory in bytes
   vm_cluster = api.clusters.get(name = "Default")
   vm_template = api.templates.get(name = "Blank")
   
   #assigning the parameters to operating system
   vm_os = params.OperatingSystem(boot = [params.Boot(dev = "hd")])
   
   vm_params = params.VM(name = vm_name,
      memory = vm_memory,
      cluster = vm_cluster,
      template = vm_template
      os = vm_os)

   try: 
      api.vms.add(vm = vm_params) 
      print "Virtual machine '%s' added." % vm_name #output if it is successful. 
   except Exception as ex: 
      print "Adding virtual machine '%s' failed: %s" % (vm_name, ex) 
      api.disconnect()
      
except Exception as ex: 
   print "Unexpected error: %s" % ex

Ausgabe

Unser Code erzeugt die folgende Ausgabe:

Das Szenario moderner Netzwerkumgebungen ist so, dass die Untersuchung aufgrund einer Reihe von Schwierigkeiten schwierig sein kann. Dies kann passieren, unabhängig davon, ob Sie auf eine Unterstützung für Sicherheitsverletzungen reagieren, Insideraktivitäten untersuchen, Bewertungen in Bezug auf Sicherheitslücken durchführen oder die Einhaltung gesetzlicher Vorschriften überprüfen.

Konzept der Netzwerkprogrammierung

Die folgenden Definitionen werden bei der Netzwerkprogrammierung verwendet.

  • Client - Der Client ist Teil der Client-Server-Architektur der Netzwerkprogrammierung, die auf einem PC und einer Workstation ausgeführt wird.

  • Server - Der Server ist Teil der Client-Server-Architektur, die Dienste für andere Computerprogramme auf demselben oder anderen Computern bereitstellt.

  • WebSockets- WebSockets stellen ein Protokoll zwischen dem Client und dem Server bereit, das über eine dauerhafte TCP-Verbindung ausgeführt wird. Dadurch können bidirektionale Nachrichten zwischen der TCP-Socket-Verbindung (gleichzeitig) gesendet werden.

WebSockets folgen vielen anderen Technologien, mit denen die Server Informationen an den Client senden können. Abgesehen vom Handshake des Upgrade-Headers ist WebSockets unabhängig von HTTP.

Diese Protokolle werden verwendet, um die Informationen zu validieren, die von Drittbenutzern gesendet oder empfangen werden. Da die Verschlüsselung eine der Methoden zum Sichern von Nachrichten ist, ist es auch wichtig, den Kanal zu sichern, über den die Nachrichten übertragen wurden.

Betrachten Sie das folgende Python-Programm, für das der Client verwendet handshaking.

Beispiel

# client.py
import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# get local machine name
host = socket.gethostname()
port = 8080

# connection to hostname on the port.
s.connect((host, port))

# Receive no more than 1024 bytes
tm = s.recv(1024)
print("The client is waiting for connection")
s.close()

Ausgabe

Es wird die folgende Ausgabe erzeugt -

Der Server, der die Anforderung für den Kommunikationskanal akzeptiert, enthält das folgende Skript.

# server.py
import socket
import time

# create a socket object
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# get local machine name 
host = socket.gethostname()
port = 8080

# bind to the port
serversocket.bind((host, port))

# queue up to 5 requests 
serversocket.listen(5)

while True:
   # establish a connection 
   clientsocket,addr = serversocket.accept()
   print("Got a connection from %s" % str(addr))
   currentTime = time.ctime(time.time()) + "\r\n"
   clientsocket.send(currentTime.encode('ascii'))
   clientsocket.close()

Der mit Hilfe der Python-Programmierung erstellte Client und Server lauschen der Hostnummer. Zu Beginn sendet der Client eine Anfrage bezüglich der in der Hostnummer gesendeten Daten an den Server, und der Server akzeptiert die Anfrage und sendet sofort eine Antwort. Auf diese Weise können wir einen sicheren Kommunikationskanal haben.

Module in Python-Programmen helfen bei der Organisation des Codes. Sie helfen bei der Gruppierung von verwandtem Code in einem einzigen Modul, wodurch das Verständnis und die Verwendung erleichtert werden. Es enthält beliebig benannte Werte, die zum Binden und Verweisen verwendet werden können. Mit einfachen Worten, ein Modul ist eine Datei, die aus Python-Code besteht und Funktionen, Klassen und Variablen enthält.

Der Python-Code für ein Modul (eine Datei) wird mit gespeichert .py Erweiterung, die bei Bedarf kompiliert wird.

Example

def print_hello_func( par ): 
   print "Hello : ", par 
   return

Import Statement

Die Python-Quelldatei kann als Modul verwendet werden, indem ein ausgeführt wird importAnweisung, die andere Pakete oder Bibliotheken von Drittanbietern importiert. Die verwendete Syntax lautet wie folgt:

import module1[, module2[,... moduleN]

Wenn der Python-Interpreter auf die import-Anweisung stößt, importiert er das angegebene Modul, das im Suchpfad vorhanden ist.

Example

Betrachten Sie das folgende Beispiel.

#!/usr/bin/python

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Radhika")

Es wird die folgende Ausgabe erzeugt -

Ein Modul wird nur einmal geladen, unabhängig davon, wie oft es von Python-Code importiert wurde.

Von ... Importanweisung

FromAttribut hilft beim Importieren bestimmter Attribute aus einem Modul in einen aktuellen Namespace. Hier ist seine Syntax.

from modname import name1[, name2[, ... nameN]]

Example

So importieren Sie die Funktion fibonacci aus dem Modul fibVerwenden Sie die folgende Anweisung.

from fib import fibonacci

Module suchen

Beim Importieren des Moduls sucht der Python-Interpreter nach den folgenden Sequenzen:

  • Das aktuelle Verzeichnis.

  • Wenn das Modul nicht vorhanden ist, durchsucht Python jedes Verzeichnis in der Shell-Variablen PYTHONPATH.

  • Wenn der Speicherort der Shell-Variablen fehlschlägt, überprüft Python den Standardpfad.

Computerforensik verwendet Python-Module und Module von Drittanbietern, um die Informationen abzurufen und Beweise einfacher zu extrahieren. Weitere Kapitel konzentrieren sich auf die Implementierung von Modulen, um die erforderliche Ausgabe zu erhalten.

DShell

Dshellist ein Python-basiertes Toolkit für die forensische Netzwerkanalyse. Dieses Toolkit wurde vom US Army Research Laboratory entwickelt. Die Veröffentlichung dieses Open-Source-Toolkits erfolgte im Jahr 2014. Der Schwerpunkt dieses Toolkits liegt auf der einfachen Durchführung forensischer Untersuchungen.

Das Toolkit besteht aus einer großen Anzahl von Decodern, die in der folgenden Tabelle aufgeführt sind.

Sr.Nr. Name und Beschreibung des Decoders
1

dns

Dies wird verwendet, um DNS-bezogene Abfragen zu extrahieren

2

reservedips

Identifiziert die Lösungen für DNS-Probleme

3

large-flows

Auflistung der Netflows

4

rip-http

Es wird verwendet, um die Dateien aus dem HTTP-Verkehr zu extrahieren

5

Protocols

Wird zur Identifizierung von nicht standardmäßigen Protokollen verwendet

Das US Army Laboratory hat das Klon-Repository in GitHub unter folgendem Link gepflegt:

https://github.com/USArmyResearchLab/Dshell

Der Klon besteht aus einem Skript install-ubuntu.py () wird für die Installation dieses Toolkits verwendet.

Nach erfolgreicher Installation werden automatisch die ausführbaren Dateien und Abhängigkeiten erstellt, die später verwendet werden.

Die Abhängigkeiten sind wie folgt:

dependencies = { 
   "Crypto": "crypto", 
   "dpkt": "dpkt", 
   "IPy": "ipy", 
   "pcap": "pypcap" 
}

Dieses Toolkit kann für die PCAP-Dateien (Packet Capture) verwendet werden, die normalerweise während der Vorfälle oder während der Warnung aufgezeichnet werden. Diese pcap-Dateien werden entweder von libpcap auf der Linux-Plattform oder von WinPcap auf der Windows-Plattform erstellt.

Scapy

Scapy ist ein Python-basiertes Tool zur Analyse und Bearbeitung des Netzwerkverkehrs. Es folgt der Link zum Scapy-Toolkit -

http://www.secdev.org/projects/scapy/

Dieses Toolkit wird zur Analyse der Paketmanipulation verwendet. Es ist sehr gut in der Lage, Pakete einer großen Anzahl von Protokollen zu dekodieren und zu erfassen. Scapy unterscheidet sich vom Dshell-Toolkit durch eine detaillierte Beschreibung des Netzwerkverkehrs für den Ermittler. Diese Beschreibungen wurden in Echtzeit aufgezeichnet.

Scapy kann mithilfe von Tools von Drittanbietern oder Fingerabdrücken von Betriebssystemen geplottet werden.

Betrachten Sie das folgende Beispiel.

import scapy, GeoIP #Imports scapy and GeoIP toolkit 
from scapy import * 
geoIp = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE) #locates the Geo IP address 
def locatePackage(pkg): 
src = pkg.getlayer(IP).src #gets source IP address 
dst = pkg.getlayer(IP).dst #gets destination IP address 
srcCountry = geoIp.country_code_by_addr(src) #gets Country details of source 
dstCountry = geoIp.country_code_by_addr(dst) #gets country details of destination 
print src+"("+srcCountry+") >> "+dst+"("+dstCountry+")\n"

Dieses Skript enthält eine detaillierte Beschreibung der Länderdetails im Netzwerkpaket, die miteinander kommunizieren.

Das obige Skript erzeugt die folgende Ausgabe.

Searchingist sicherlich eine der Säulen der forensischen Untersuchung. Heutzutage ist die Suche nur so gut wie der Ermittler, der die Beweise durchführt.

Das Suchen eines Schlüsselworts aus der Nachricht spielt eine wichtige Rolle in der Forensik, wenn wir mithilfe eines Schlüsselworts nach Beweisen suchen. Das Wissen darüber, was in einer bestimmten Datei zusammen mit denen in gelöschten Dateien gesucht werden soll, erfordert sowohl Erfahrung als auch Wissen.

Python verfügt über verschiedene integrierte Mechanismen mit zu unterstützenden Standardbibliotheksmodulen searchBetrieb. Grundsätzlich verwenden Ermittler die Suchoperation, um Antworten auf Fragen wie "wer", "was", "wo", "wann" usw. zu finden.

Beispiel

Im folgenden Beispiel haben wir zwei Zeichenfolgen deklariert und dann mit der Suchfunktion überprüft, ob die erste Zeichenfolge die zweite Zeichenfolge enthält oder nicht.

# Searching a particular word from a message
str1 = "This is a string example for Computational forensics of gathering evidence!";
str2 = "string";

print str1.find(str2)
print str1.find(str2, 10)
print str1.find(str2, 40)

Das obige Skript erzeugt die folgende Ausgabe.

“find”Die Funktion in Python hilft bei der Suche nach einem Schlüsselwort in einer Nachricht oder einem Absatz. Dies ist entscheidend für die Sammlung geeigneter Beweise.

IndexingTatsächlich bietet der Ermittler einen vollständigen Blick auf eine Akte und sammelt potenzielle Beweise daraus. Der Beweis kann in einer Datei, einem Disk-Image, einem Speicher-Snapshot oder einer Netzwerk-Ablaufverfolgung enthalten sein.

Indizierung hilft bei der Verkürzung der Zeit für zeitaufwändige Aufgaben wie keyword searching. Die forensische Untersuchung umfasst auch eine interaktive Suchphase, in der der Index zum schnellen Auffinden von Schlüsselwörtern verwendet wird.

Die Indizierung hilft auch beim Auflisten der Schlüsselwörter in einer sortierten Liste.

Beispiel

Das folgende Beispiel zeigt, wie Sie verwenden können indexing in Python.

aList = [123, 'sample', 'zara', 'indexing'];

print "Index for sample : ", aList.index('sample')
print "Index for indexing : ", aList.index('indexing')

str1 = "This is sample message for forensic investigation indexing";
str2 = "sample";

print "Index of the character keyword found is " 
print str1.index(str2)

Das obige Skript erzeugt die folgende Ausgabe.

Das Extrahieren wertvoller Informationen aus den verfügbaren Ressourcen ist ein wesentlicher Bestandteil der digitalen Forensik. Der Zugriff auf alle verfügbaren Informationen ist für einen Untersuchungsprozess von entscheidender Bedeutung, da hierdurch geeignete Beweise abgerufen werden können.

Ressourcen, die Daten enthalten, können entweder einfache Datenstrukturen wie Datenbanken oder komplexe Datenstrukturen wie ein JPEG-Bild sein. Auf einfache Datenstrukturen kann mit einfachen Desktop-Tools leicht zugegriffen werden, während das Extrahieren von Informationen aus komplexen Datenstrukturen ausgefeilte Programmierwerkzeuge erfordert.

Python Imaging Library

Die Python Imaging Library (PIL) erweitert Ihren Python-Interpreter um Bildverarbeitungsfunktionen. Diese Bibliothek unterstützt viele Dateiformate und bietet leistungsstarke Bildverarbeitungs- und Grafikfunktionen. Sie können die Quelldateien von PIL herunterladen von:http://www.pythonware.com/products/pil/

Die folgende Abbildung zeigt das vollständige Flussdiagramm zum Extrahieren von Daten aus Bildern (komplexe Datenstrukturen) in PIL.

Beispiel

Lassen Sie uns nun ein Programmierbeispiel haben, um zu verstehen, wie es tatsächlich funktioniert.

Step 1 - Angenommen, wir haben das folgende Bild, aus dem wir Informationen extrahieren müssen.

Step 2- Wenn wir dieses Bild mit PIL öffnen, werden zunächst die zum Extrahieren von Beweisen erforderlichen Punkte notiert, einschließlich verschiedener Pixelwerte. Hier ist der Code zum Öffnen des Bildes und Aufzeichnen seiner Pixelwerte -

from PIL import Image
im = Image.open('Capture.jpeg', 'r')
pix_val = list(im.getdata())
pix_val_flat = [x for sets in pix_val for x in sets]
print pix_val_flat

Step 3 - Unser Code erzeugt nach dem Extrahieren der Pixelwerte des Bildes die folgende Ausgabe.

Die gelieferte Ausgabe stellt die Pixelwerte der RGB-Kombination dar, wodurch ein besseres Bild davon erhalten wird, welche Daten für den Nachweis benötigt werden. Die abgerufenen Daten werden in Form eines Arrays dargestellt.

Die forensische Untersuchung und Analyse von Standard-Computerhardware wie Festplatten hat sich zu einer stabilen Disziplin entwickelt und wird mithilfe von Techniken zur Analyse von Nicht-Standardhardware oder vorübergehenden Beweisen verfolgt.

Obwohl Smartphones zunehmend in digitalen Untersuchungen eingesetzt werden, gelten sie immer noch als nicht standardisiert.

Forensische Analyse

Forensische Untersuchungen suchen nach Daten wie empfangenen Anrufen oder gewählten Nummern vom Smartphone. Es kann Textnachrichten, Fotos oder andere belastende Beweise enthalten. Die meisten Smartphones verfügen über Bildschirmsperrfunktionen mit Kennwörtern oder alphanumerischen Zeichen.

Hier zeigen wir anhand eines Beispiels, wie Python dabei helfen kann, das Kennwort für die Bildschirmsperre zu knacken, um Daten von einem Smartphone abzurufen.

Manuelle Prüfung

Android unterstützt die Kennwortsperre mit PIN-Nummer oder alphanumerischem Kennwort. Die Grenze beider Passphrasen muss zwischen 4 und 16 Ziffern oder Zeichen liegen. Das Passwort eines Smartphones wird im Android-System in einer speziellen Datei namens gespeichertpassword.key im /data/system.

Android speichert eine gesalzene SHA1-Hashsum und MD5-Hashsum des Passworts. Diese Passwörter können im folgenden Code verarbeitet werden.

public byte[] passwordToHash(String password) {

   if (password == null) { 
      return null; 
   }

   String algo = null;
   byte[] hashed = null;

   try { 
      byte[] saltedPassword = (password + getSalt()).getBytes(); 
      byte[] sha1 = MessageDigest.getInstance(algo = "SHA-1").digest(saltedPassword);
      byte[] md5 = MessageDigest.getInstance(algo = "MD5").digest(saltedPassword); 
      hashed = (toHex(sha1) + toHex(md5)).getBytes(); 
   } catch (NoSuchAlgorithmException e) { 
      Log.w(TAG, "Failed to encode string because of missing algorithm: " + algo); 
   }
   
   return hashed;
}

Es ist nicht möglich, das Passwort mit Hilfe von zu knacken dictionary attack da das Hash-Passwort in a gespeichert ist salt file. Diesesaltist eine hexadezimale Zeichenfolge einer zufälligen Ganzzahl von 64 Bit. Es ist leicht zu erreichensalt durch die Nutzung Rooted Smartphone oder JTAG Adapter.

Verwurzeltes Smartphone

Der Speicherauszug der Datei /data/system/password.key wird in der SQLite-Datenbank unter dem gespeichert lockscreen.password_saltSchlüssel. Untersettings.dbwird das Passwort gespeichert und der Wert ist im folgenden Screenshot deutlich sichtbar.

JTAG-Adapter

Für den Zugriff auf das Gerät kann eine spezielle Hardware verwendet werden, die als JTAG-Adapter (Joint Test Action Group) bekannt ist salt. Ebenso aRiff-Box oder ein JIG-Adapter kann auch für die gleiche Funktionalität verwendet werden.

Unter Verwendung der von Riff-Box erhaltenen Informationen können wir die Position der verschlüsselten Daten ermitteln, dh die salt. Es folgen die Regeln -

  • Suchen Sie nach der zugehörigen Zeichenfolge "lockscreen.password_salt".

  • Das Byte repräsentiert die tatsächliche Breite des Salzes, die seine ist length.

  • Dies ist die Länge, nach der tatsächlich gesucht wird, um das gespeicherte Passwort / die gespeicherte PIN des Smartphones zu erhalten.

Diese Regeln helfen dabei, die entsprechenden Salzdaten zu erhalten.

Das am weitesten verbreitete Protokoll zum Synchronisieren von Zeit, das als Praxis weithin akzeptiert wurde, wird über das Network Time Protocol (NTP) durchgeführt.

NTP verwendet das User Datagram Protocol (UDP), das die Mindestzeit für die Kommunikation der Pakete zwischen dem Server und dem Client verwendet, der mit der angegebenen Zeitquelle synchronisieren möchte.

Das Network Time Protocol bietet folgende Funktionen:

  • Der Standard-Server-Port ist 123.

  • Dieses Protokoll besteht aus vielen zugänglichen Zeitservern, die mit nationalen Labors synchronisiert sind.

  • Der NTP-Protokollstandard wird von der IETF geregelt, und der vorgeschlagene Standard lautet RFC 5905 mit dem Titel „Network Time Protocol Version 4: Protokoll- und Algorithmusspezifikation“ [NTP RFC].

  • Betriebssysteme, Programme und Anwendungen verwenden NTP, um die Zeit ordnungsgemäß zu synchronisieren.

In diesem Kapitel konzentrieren wir uns auf die Verwendung von NTP mit Python, die über die Python-Bibliothek ntplib von Drittanbietern möglich ist. Diese Bibliothek erledigt das schwere Heben effizient, wodurch die Ergebnisse mit meiner lokalen Systemuhr verglichen werden.

Installieren der NTP-Bibliothek

Das ntplib steht zum Download unter zur Verfügung https://pypi.python.org/pypi/ntplib/ wie in der folgenden Abbildung gezeigt.

Die Bibliothek bietet eine einfache Schnittstelle zu NTP-Servern mithilfe von Methoden, mit denen NTP-Protokollfelder übersetzt werden können. Dies hilft beim Zugriff auf andere Schlüsselwerte wie Schaltsekunden.

Das folgende Python-Programm hilft beim Verständnis der Verwendung von NTP.

import ntplib
import time

NIST = 'nist1-macon.macon.ga.us'
ntp = ntplib.NTPClient()
ntpResponse = ntp.request(NIST)

if (ntpResponse):
   now = time.time()
   diff = now-ntpResponse.tx_time
   print diff;

Das obige Programm erzeugt die folgende Ausgabe.

Die Zeitdifferenz wird im obigen Programm berechnet. Diese Berechnungen helfen bei forensischen Untersuchungen. Die erhaltenen Netzwerkdaten unterscheiden sich grundlegend von der Analyse der auf der Festplatte gefundenen Daten.

Der Unterschied in den Zeitzonen oder das Erhalten genauer Zeitzonen kann dabei helfen, Beweise für die Erfassung der Nachrichten über dieses Protokoll zu sammeln.

Forensiker finden es normalerweise schwierig, digitale Lösungen anzuwenden, um die Berge digitaler Beweise bei häufigen Verbrechen zu analysieren. Die meisten digitalen Untersuchungstools sind Single-Threaded-Tools und können jeweils nur einen Befehl ausführen.

In diesem Kapitel konzentrieren wir uns auf die Multiprozessor-Funktionen von Python, die sich auf die allgemeinen forensischen Herausforderungen beziehen können.

Mehrfachverarbeitung

Multiprocessing ist definiert als die Fähigkeit des Computersystems, mehr als einen Prozess zu unterstützen. Die Betriebssysteme, die Multiprocessing unterstützen, ermöglichen die gleichzeitige Ausführung mehrerer Programme.

Es gibt verschiedene Arten der Mehrfachverarbeitung, wie z symmetric und asymmetric processing. Das folgende Diagramm bezieht sich auf ein symmetrisches Multiprozessorsystem, das normalerweise bei forensischen Untersuchungen angewendet wird.

Beispiel

Der folgende Code zeigt, wie verschiedene Prozesse intern in der Python-Programmierung aufgelistet werden.

import random
import multiprocessing

def list_append(count, id, out_list): 
   #appends the count of number of processes which takes place at a time
   for i in range(count):
      out_list.append(random.random())
         
   if __name__ == "__main__": 
      size = 999  
      procs = 2
      # Create a list of jobs and then iterate through 
      # the number of processes appending each process to 
      # the job list  
      jobs = []
         
   for i in range(0, procs): 
      out_list = list() #list of processes 
      process1 = multiprocessing.Process(
         target = list_append, args = (size, i, out_list))

      # appends the list of processes
      jobs.append(process)

   # Calculate the random number of processes
   for j in jobs:
      j.start()  #initiate the process

   # After the processes have finished execution
   for j in jobs:
      j.join()
      print "List processing complete."

Hier die Funktion list_append() Hilft bei der Auflistung der Prozesse im System.

Ausgabe

Unser Code erzeugt die folgende Ausgabe:

In diesem Kapitel konzentrieren wir uns auf die Untersuchung des flüchtigen Speichers mit Hilfe von Volatility, ein Python-basiertes Forensik-Framework, das auf den folgenden Plattformen anwendbar ist: Android und Linux.

Flüchtiger Speicher

Flüchtiger Speicher ist eine Art von Speicher, bei dem der Inhalt gelöscht wird, wenn das System ausgeschaltet oder unterbrochen wird. RAM ist das beste Beispiel für einen flüchtigen Speicher. Wenn Sie an einem Dokument gearbeitet haben, das nicht in einem nichtflüchtigen Speicher wie einer Festplatte gespeichert wurde, und der Computer die Stromversorgung verloren hat, gehen alle Daten verloren.

Im Allgemeinen folgt die flüchtige Speicherforensik demselben Muster wie andere forensische Untersuchungen -

  • Auswahl des Untersuchungsziels
  • Forensische Daten erfassen
  • Forensische Analyse

Das Grundlegende volatility plugins die für Android-Gather verwendet werden RAM dumpzur Analyse. Sobald der RAM-Speicherauszug zur Analyse erfasst wurde, ist es wichtig, mit der Suche nach Malware im RAM zu beginnen.

YARA-Regeln

YARA ist ein beliebtes Tool, das eine robuste Sprache bietet, mit Perl-basierten regulären Ausdrücken kompatibel ist und zum Untersuchen der verdächtigen Dateien / Verzeichnisse und zum Übereinstimmen von Zeichenfolgen verwendet wird.

In diesem Abschnitt verwenden wir YARA basierend auf der Implementierung des Mustervergleichs und kombinieren sie mit der Stromversorgung. Der gesamte Prozess ist für die forensische Analyse von Vorteil.

Beispiel

Betrachten Sie den folgenden Code. Dieser Code hilft beim Extrahieren des Codes.

import operator
import os
import sys

sys.path.insert(0, os.getcwd())
import plyara.interp as interp

# Plyara is a script that lexes and parses a file consisting of one more Yara
# rules into a python dictionary representation.
if __name__ == '__main__': 
   file_to_analyze = sys.argv[1] 
   rulesDict = interp.parseString(open(file_to_analyze).read()) 
   authors = {} 
   imps = {} 
   meta_keys = {} 
   max_strings = [] 
   max_string_len = 0 
   tags = {} 
   rule_count = 0  

   for rule in rulesDict: 
      rule_count += 1  
   
   # Imports 
   if 'imports' in rule: 
      for imp in rule['imports']: 
         imp = imp.replace('"','') 
         
         if imp in imps: 
            imps[imp] += 1 
         else: 
            imps[imp] = 1  
   # Tags 
   if 'tags' in rule: 
      for tag in rule['tags']: 
         if tag in tags: 
            tags[tag] += 1 
         else: 
            tags[tag] = 1
            
   # Metadata 
   if 'metadata' in rule: 
      for key in rule['metadata']: 
         if key in meta_keys: 
            meta_keys[key] += 1
         else: 
            meta_keys[key] = 1 
         
         if key in ['Author', 'author']: 
            if rule['metadata'][key] in authors: 
               authors[rule['metadata'][key]] += 1 
            else: 
               authors[rule['metadata'][key]] = 1  

   #Strings 
   if 'strings' in rule: 
      for strr in rule['strings']: 
         if len(strr['value']) > max_string_len: 
            max_string_len = len(strr['value']) 
            max_strings = [(rule['rule_name'], strr['name'], strr['value'])] 
         elif len(strr['value']) == max_string_len: 
            max_strings.append((rule['rule_name'], strr['key'], strr['value']))  
   
   print("\nThe number of rules implemented" + str(rule_count))
   ordered_meta_keys = sorted(meta_keys.items(), key = operator.itemgetter(1),
      reverse = True)
   ordered_authors = sorted(authors.items(), key = operator.itemgetter(1), 
      reverse = True)
   ordered_imps = sorted(imps.items(), key = operator.itemgetter(1), reverse = True)
   ordered_tags = sorted(tags.items(), key = operator.itemgetter(1), reverse = True)

Der obige Code erzeugt die folgende Ausgabe.

Die Anzahl der implementierten YARA-Regeln hilft dabei, ein besseres Bild der verdächtigen Dateien zu erhalten. Indirekt hilft die Liste der verdächtigen Dateien beim Sammeln geeigneter Informationen für die Forensik.

Es folgt der Quellcode in Github: https://github.com/radhikascs/Python_yara

Das Hauptanliegen digitaler Untersuchungen ist es, wichtige Beweise oder Daten mit Verschlüsselung oder einem anderen Format zu sichern. Das grundlegende Beispiel ist das Speichern der Passwörter. Es ist daher notwendig, die Verwendung des Linux-Betriebssystems für die digitale forensische Implementierung zu verstehen, um diese wertvollen Daten zu sichern.

Informationen für alle lokalen Benutzer werden meist in den folgenden beiden Dateien gespeichert:

  • /etc/passwd
  • etc/shadow

Der erste ist obligatorisch und speichert alle Passwörter. Die zweite Datei ist optional und speichert Informationen zu den lokalen Benutzern, einschließlich der gehashten Kennwörter.

Es treten Probleme hinsichtlich des Sicherheitsproblems beim Speichern der Kennwortinformationen in einer Datei auf, die von jedem Benutzer gelesen werden kann. Daher werden gehashte Passwörter in gespeichert/etc/passwd, wo der Inhalt durch einen speziellen Wert ersetzt wird "x".

Die entsprechenden Hashes müssen nachgeschlagen werden /etc/shadow. Die Einstellungen in/etc/passwd kann die Details in überschreiben /etc/shadow.

Beide Textdateien in Linux enthalten einen Eintrag pro Zeile und der Eintrag besteht aus mehreren Feldern, die durch Doppelpunkte getrennt sind.

Das Format von /etc/passwd ist wie folgt -

Sr.Nr. Feldname & Beschreibung
1

Username

Dieses Feld besteht aus den Attributen des für Menschen lesbaren Formats

2

Password hash

Es besteht aus dem Passwort in codierter Form gemäß der Posix-Kryptofunktion

Wenn das Hash-Passwort als gespeichert ist emptyDann benötigt der entsprechende Benutzer kein Kennwort, um sich beim System anzumelden. Wenn dieses Feld einen Wert enthält, der vom Hash-Algorithmus nicht generiert werden kann, z. B. ein Ausrufezeichen, kann sich der Benutzer nicht mit einem Kennwort anmelden.

Ein Benutzer mit einem gesperrten Kennwort kann sich weiterhin mit anderen Authentifizierungsmechanismen anmelden, z. B. SSH-Schlüsseln. Wie bereits erwähnt, ist der Sonderwert "x"bedeutet, dass der Passwort-Hash in der Schattendatei gefunden werden muss.

Das password hash beinhaltet die folgenden -

  • Encrypted salt - Die encrypted salt Hilft bei der Pflege der Bildschirmsperren, Pins und Passwörter.

  • Numerical user ID- Dieses Feld gibt die ID des Benutzers an. Der Linux-Kernel weist diese System-ID dem System zu.

  • Numerical group ID - Dieses Feld bezieht sich auf die primäre Gruppe des Benutzers.

  • Home directory - Die neuen Prozesse werden mit einer Referenz dieses Verzeichnisses gestartet.

  • Command shell - Dieses optionale Feld gibt die Standard-Shell an, die nach einer erfolgreichen Anmeldung am System gestartet werden soll.

Die digitale Forensik umfasst das Sammeln der Informationen, die für die Verfolgung von Beweismitteln relevant sind. Daher sind die Benutzer-IDs bei der Pflege der Datensätze hilfreich.

Mit Python können alle diese Informationen automatisch auf die Analyseindikatoren analysiert werden, um die letzten Systemaktivitäten zu rekonstruieren. Mit der Implementierung von Linux Shell ist das Tracking einfach und unkompliziert.

Python-Programmierung unter Linux

Beispiel

import sys
import hashlib
import getpass

def main(argv):
   print '\nUser & Password Storage Program in Linux for forensic detection v.01\n' 
  
   if raw_input('The file ' + sys.argv[1] + ' will be erased or overwrite if 
         it exists .\nDo you wish to continue (Y/n): ') not in ('Y','y') : 
   sys.exit('\nChanges were not recorded\n') 
  
   user_name = raw_input('Please Enter a User Name: ')
   password = hashlib.sha224(getpass.getpass('Please Enter a Password:')).hexdigest()
   
   # Passwords which are hashed  
   try: 
      file_conn = open(sys.argv[1],'w') 
      file_conn.write(user_name + '\n') 
      file_conn.write(password + '\n') 
      file_conn.close() 
   except: 
      sys.exit('There was a problem writing the passwords to file!')
      
if __name__ == "__main__": 
   main(sys.argv[1:])

Ausgabe

Das Passwort wird in einem hexadezimalen Format in gespeichert pass_db.txtwie im folgenden Screenshot gezeigt. Die Textdateien werden zur weiteren Verwendung in der Computerforensik gespeichert.

Kompromissindikatoren (IOC) sind definiert als "forensische Daten, einschließlich Daten in Systemprotokolleinträgen oder -dateien, die potenziell böswillige Aktivitäten in einem System oder Netzwerk identifizieren".

Durch die Überwachung auf IOC können Unternehmen Angriffe erkennen und schnell handeln, um das Auftreten solcher Verstöße zu verhindern oder Schäden zu begrenzen, indem sie Angriffe in früheren Phasen stoppen.

Es gibt einige Anwendungsfälle, mit denen forensische Artefakte abgefragt werden können, z.

  • Suche nach einer bestimmten Datei von MD5
  • Suche nach einer bestimmten Entität, die tatsächlich im Speicher gespeichert ist
  • Bestimmter Eintrag oder Satz von Einträgen, der in der Windows-Registrierung gespeichert ist

Die Kombination aller oben genannten Punkte liefert bessere Ergebnisse bei der Suche nach Artefakten. Wie oben erwähnt, bietet die Windows-Registrierung eine perfekte Plattform zum Generieren und Verwalten von IOC, was direkt bei der Computerforensik hilft.

Methodik

  • Suchen Sie nach den Speicherorten im Dateisystem und speziell jetzt in der Windows-Registrierung.

  • Suchen Sie nach Artefakten, die mit forensischen Tools erstellt wurden.

  • Achten Sie auf Anzeichen von nachteiligen Aktivitäten.

Untersuchungslebenszyklus

Der investigative Lebenszyklus folgt dem IOC und sucht nach bestimmten Einträgen in einer Registrierung.

  • Stage 1: Initial Evidence- Der Nachweis des Kompromisses wird entweder auf einem Host oder im Netzwerk erkannt. Die Antwortenden untersuchen und identifizieren die genaue Lösung, die ein konkreter forensischer Indikator ist.

  • Stage 2: Create IOCs for Host & Network- Nach den gesammelten Daten wird das IOC erstellt, was mit der Windows-Registrierung problemlos möglich ist. Die Flexibilität von OpenIOC bietet eine unbegrenzte Anzahl von Permutationen, wie ein Indikator hergestellt werden kann.

  • Stage 3: Deploy IOCs in the Enterprise - Sobald das angegebene IOC erstellt wurde, stellt der Prüfer diese Technologien mithilfe der API in Windows-Registern bereit.

  • Stage 4: Identification of Suspects- Der Einsatz von IOC hilft bei der Identifizierung von Verdächtigen auf normale Weise. Sogar zusätzliche Systeme werden identifiziert.

  • Stage 5: Collect and Analyze Evidence - Beweise gegen die Verdächtigen werden gesammelt und entsprechend analysiert.

  • Stage 6: Refine & Create New IOCs - Das Untersuchungsteam kann neue IOCs auf der Grundlage ihrer im Unternehmen gefundenen Beweise und Daten sowie zusätzlicher Informationen erstellen und ihren Zyklus weiter verfeinern.

Die folgende Abbildung zeigt die Phasen des Untersuchungslebenszyklus -

Cloud computingkann als eine Sammlung von gehosteten Diensten definiert werden, die Benutzern über das Internet bereitgestellt werden. Es ermöglicht Organisationen, die Ressource zu nutzen oder sogar zu berechnen, einschließlich virtueller Maschinen (VMs), Speicher oder einer Anwendung als Dienstprogramm.

Einer der wichtigsten Vorteile beim Erstellen von Anwendungen in der Programmiersprache Python besteht darin, dass Anwendungen praktisch auf jeder Plattform bereitgestellt werden können, einschließlich cloudauch. Dies bedeutet, dass Python auf Cloud-Servern ausgeführt und auch auf handlichen Geräten wie Desktop, Tablet oder Smartphone gestartet werden kann.

Eine der interessanten Perspektiven ist die Schaffung einer Cloud-Basis mit der Generierung von Rainbow tables. Es hilft bei der Integration von Einzel- und Mehrfachverarbeitungsversionen der Anwendung, was einige Überlegungen erfordert.

Pi Cloud

Pi Cloud ist die Cloud-Computing-Plattform, die die Programmiersprache Python in die Rechenleistung von Amazon Web Services integriert.

Schauen wir uns ein Beispiel für die Implementierung von Pi-Clouds mit an rainbow tables.

Regenbogentabellen

EIN rainbow table ist definiert als eine Auflistung aller möglichen Klartextpermutationen von verschlüsselten Passwörtern, die für einen bestimmten Hash-Algorithmus spezifisch sind.

  • Regenbogentabellen folgen einem Standardmuster, das eine Liste von Hash-Passwörtern erstellt.

  • Eine Textdatei wird verwendet, um Passwörter zu generieren, die Zeichen oder einfachen Text von zu verschlüsselnden Passwörtern enthalten.

  • Die Datei wird von der Pi Cloud verwendet, die die zu speichernde Hauptfunktion aufruft.

  • Die Ausgabe von Hash-Passwörtern wird ebenfalls in der Textdatei gespeichert.

Dieser Algorithmus kann verwendet werden, um Kennwörter auch in der Datenbank zu speichern und einen Sicherungsspeicher im Cloud-System zu haben.

Das folgende integrierte Programm erstellt eine Liste verschlüsselter Kennwörter in einer Textdatei.

Beispiel

import os
import random
import hashlib
import string
import enchant    #Rainbow tables with enchant 
import cloud      #importing pi-cloud

def randomword(length): 
   return ''.join(random.choice(string.lowercase) for i in range(length))

print('Author- Radhika Subramanian')

def mainroutine():
   engdict = enchant.Dict("en_US")
   fileb = open("password.txt","a+")

   # Capture the values from the text file named password
   while True:
      randomword0 = randomword(6)
      if engdict.check(randomword0) == True:
         randomkey0 = randomword0+str(random.randint(0,99))
      elif engdict.check(randomword0) == False:
         englist = engdict.suggest(randomword0)
         if len(englist) > 0:
            randomkey0 = englist[0]+str(random.randint(0,99))
         else:
            randomkey0 = randomword0+str(random.randint(0,99))

      randomword3 = randomword(5)
      if engdict.check(randomword3) == True:
         randomkey3 = randomword3+str(random.randint(0,99))
      elif engdict.check(randomword3) == False:
         englist = engdict.suggest(randomword3)
         if len(englist) > 0:
            randomkey3 = englist[0]+str(random.randint(0,99))
         else:
            randomkey3 = randomword3+str(random.randint(0,99))
      
      if 'randomkey0' and 'randomkey3' and 'randomkey1' in locals():
         whasher0 = hashlib.new("md5")
         whasher0.update(randomkey0)
         whasher3 = hashlib.new("md5")
         whasher3.update(randomkey3)
         whasher1 = hashlib.new("md5")
         whasher1.update(randomkey1)
         print(randomkey0+" + "+str(whasher0.hexdigest())+"\n")
         print(randomkey3+" + "+str(whasher3.hexdigest())+"\n")
         print(randomkey1+" + "+str(whasher1.hexdigest())+"\n")
         fileb.write(randomkey0+" + "+str(whasher0.hexdigest())+"\n") 
         fileb.write(randomkey3+" + "+str(whasher3.hexdigest())+"\n")
         fileb.write(randomkey1+" + "+str(whasher1.hexdigest())+"\n")

jid = cloud.call(randomword)  #square(3) evaluated on PiCloud
cloud.result(jid)
print('Value added to cloud')
print('Password added')
mainroutine()

Ausgabe

Dieser Code erzeugt die folgende Ausgabe -

Die Passwörter werden in den sichtbaren Textdateien gespeichert, wie im folgenden Screenshot gezeigt.