Учебники

Python Digital Network Forensics-I

В этой главе будут объяснены основы, связанные с проведением сетевой экспертизы с использованием Python.

Понимание сетевой криминалистики

Сетевая криминалистика — это подразделение цифровой криминалистики, которое занимается мониторингом и анализом трафика компьютерной сети, как локальной, так и глобальной (глобальной сети), в целях сбора информации, сбора доказательств или обнаружения вторжений. Сетевая криминалистика играет важную роль в расследовании цифровых преступлений, таких как кража интеллектуальной собственности или утечка информации. Картина сетевых коммуникаций помогает исследователю решить некоторые важные вопросы следующим образом:

  • Какие сайты были доступны?

  • Какой контент был загружен в нашу сеть?

  • Какой контент был загружен из нашей сети?

  • К каким серверам осуществляется доступ?

  • Кто-то отправляет конфиденциальную информацию за пределы брандмауэров компании?

Какие сайты были доступны?

Какой контент был загружен в нашу сеть?

Какой контент был загружен из нашей сети?

К каким серверам осуществляется доступ?

Кто-то отправляет конфиденциальную информацию за пределы брандмауэров компании?

Internet Evidence Finder (IEF)

IEF является цифровым инструментом судебной экспертизы для поиска, анализа и представления цифровых доказательств, обнаруженных на различных цифровых носителях, таких как компьютеры, смартфоны, планшеты и т. Д. Он очень популярен и используется тысячами судебных экспертов.

Использование IEF

Из-за своей популярности IEF широко используется профессионалами-криминалистами. Некоторые из вариантов использования IEF:

  • Благодаря мощным возможностям поиска он используется для одновременного поиска нескольких файлов или носителей данных.

  • Он также используется для восстановления удаленных данных из нераспределенного пространства оперативной памяти с помощью новых методов вырезания.

  • Если следователи хотят перестроить веб-страницы в их первоначальном формате в день их открытия, они могут использовать IEF.

  • Он также используется для поиска на логических или физических дисковых томах.

Благодаря мощным возможностям поиска он используется для одновременного поиска нескольких файлов или носителей данных.

Он также используется для восстановления удаленных данных из нераспределенного пространства оперативной памяти с помощью новых методов вырезания.

Если следователи хотят перестроить веб-страницы в их первоначальном формате в день их открытия, они могут использовать IEF.

Он также используется для поиска на логических или физических дисковых томах.

Вывод отчетов из IEF в CSV с использованием Python

IEF хранит данные в базе данных SQLite, и следующий скрипт Python будет динамически определять таблицы результатов в базе данных IEF и выгружать их в соответствующие файлы CSV.

Этот процесс выполняется в шагах, показанных ниже

  • Сначала создайте базу данных результатов IEF, которая будет представлять собой файл базы данных SQLite, заканчивающийся расширением .db.

  • Затем запросите эту базу данных, чтобы определить все таблицы.

  • Наконец, запишите эти таблицы результатов в отдельный файл CSV.

Сначала создайте базу данных результатов IEF, которая будет представлять собой файл базы данных SQLite, заканчивающийся расширением .db.

Затем запросите эту базу данных, чтобы определить все таблицы.

Наконец, запишите эти таблицы результатов в отдельный файл CSV.

Код Python

Давайте посмотрим, как использовать код Python для этой цели —

Для скрипта Python импортируйте необходимые библиотеки следующим образом:

from __future__ import print_function

import argparse
import csv
import os
import sqlite3
import sys

Теперь нам нужно указать путь к файлу базы данных IEF —

if __name__ == '__main__':
   parser = argparse.ArgumentParser('IEF to CSV')
   parser.add_argument("IEF_DATABASE", help="Input IEF database")
   parser.add_argument("OUTPUT_DIR", help="Output DIR")
   args = parser.parse_args()

Теперь мы подтвердим существование базы данных IEF следующим образом:

if not os.path.exists(args.OUTPUT_DIR):
   os.makedirs(args.OUTPUT_DIR)
if os.path.exists(args.IEF_DATABASE) and \ os.path.isfile(args.IEF_DATABASE):
   main(args.IEF_DATABASE, args.OUTPUT_DIR)
else:
   print("[-] Supplied input file {} does not exist or is not a " "file".format(args.IEF_DATABASE))
   sys.exit(1)

Теперь, как мы делали в более ранних сценариях, установите соединение с базой данных SQLite следующим образом, чтобы выполнить запросы через курсор —

def main(database, out_directory):
   print("[+] Connecting to SQLite database")
   conn = sqlite3.connect(database)
   c = conn.cursor()

Следующие строки кода извлекают имена таблиц из базы данных —

print("List of all tables to extract")
c.execute("select * from sqlite_master where type = 'table'")
tables = [x[2] for x in c.fetchall() if not x[2].startswith('_') and not x[2].endswith('_DATA')]

Теперь мы выберем все данные из таблицы и, используя метод fetchall () объекта курсора, сохраним список кортежей, содержащих данные таблицы, в виде переменной —

print("Dumping {} tables to CSV files in {}".format(len(tables), out_directory))

for table in tables:
c.execute("pragma table_info('{}')".format(table))
table_columns = [x[1] for x in c.fetchall()]

c.execute("select * from '{}'".format(table))
table_data = c.fetchall()

Теперь, используя метод CSV_Writer (), мы запишем содержимое в файл CSV —

csv_name = table + '.csv'
csv_path = os.path.join(out_directory, csv_name)
print('[+] Writing {} table to {} CSV file'.format(table,csv_name))

with open(csv_path, "w", newline = "") as csvfile:
   csv_writer = csv.writer(csvfile)
   csv_writer.writerow(table_columns)
   csv_writer.writerows(table_data)

Приведенный выше скрипт извлечет все данные из таблиц базы данных IEF и запишет содержимое в CSV-файл по нашему выбору.

Работа с кэшированными данными

Из базы данных результатов IEF мы можем получить больше информации, которая не обязательно поддерживается самим IEF. Мы можем получить кэшированные данные, два продукта для информации, от поставщика услуг электронной почты, такого как Yahoo, Google и т. Д., Используя базу данных результатов IEF.

Ниже приведен скрипт Python для доступа к данным кэшированных данных из почты Yahoo, доступ к которой осуществляется через Google Chrome, с использованием базы данных IEF. Обратите внимание, что шаги будут более или менее такими же, как и в последнем скрипте Python.

Сначала импортируйте необходимые библиотеки для Python следующим образом:

from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
import json

Теперь укажите путь к файлу базы данных IEF вместе с двумя позиционными аргументами, принимаемыми обработчиком командной строки, как это было сделано в последнем скрипте —

if __name__ == '__main__':
   parser = argparse.ArgumentParser('IEF to CSV')
   parser.add_argument("IEF_DATABASE", help="Input IEF database")
   parser.add_argument("OUTPUT_DIR", help="Output DIR")
   args = parser.parse_args()

Теперь подтвердите существование базы данных IEF следующим образом:

directory = os.path.dirname(args.OUTPUT_CSV)

if not os.path.exists(directory):os.makedirs(directory)
if os.path.exists(args.IEF_DATABASE) and \ os.path.isfile(args.IEF_DATABASE):
   main(args.IEF_DATABASE, args.OUTPUT_CSV)
   else: print("Supplied input file {} does not exist or is not a " "file".format(args.IEF_DATABASE))
sys.exit(1)

Теперь установите соединение с базой данных SQLite следующим образом, чтобы выполнить запросы через курсор —

def main(database, out_csv):
   print("[+] Connecting to SQLite database")
   conn = sqlite3.connect(database)
   c = conn.cursor()

Вы можете использовать следующие строки кода для извлечения экземпляров записи кэша контактов Yahoo Mail —

print("Querying IEF database for Yahoo Contact Fragments from " "the Chrome Cache Records Table")
   try:
      c.execute("select * from 'Chrome Cache Records' where URL like " "'https://data.mail.yahoo.com" "/classicab/v2/contacts/?format=json%'")
   except sqlite3.OperationalError:
      print("Received an error querying the database --    database may be" "corrupt or not have a Chrome Cache Records table")
      sys.exit(2)

Теперь список кортежей, возвращаемых из вышеуказанного запроса, будет сохранен в переменную следующим образом:

contact_cache = c.fetchall()
contact_data = process_contacts(contact_cache)
write_csv(contact_data, out_csv)

Обратите внимание, что здесь мы будем использовать два метода, а именно process_contacts () для настройки списка результатов, а также итерации по каждой записи кэша контактов и json.loads () для сохранения данных JSON, извлеченных из таблицы, в переменную для дальнейшей манипуляции —

def process_contacts(contact_cache):
   print("[+] Processing {} cache files matching Yahoo contact cache " " data".format(len(contact_cache)))
   results = []
   
   for contact in contact_cache:
      url = contact[0]
      first_visit = contact[1]
      last_visit = contact[2]
      last_sync = contact[3]
      loc = contact[8]
	   contact_json = json.loads(contact[7].decode())
      total_contacts = contact_json["total"]
      total_count = contact_json["count"]
      
      if "contacts" not in contact_json:
         continue
      for c in contact_json["contacts"]:
         name, anni, bday, emails, phones, links = ("", "", "", "", "", "")
            if "name" in c:
            name = c["name"]["givenName"] + " " + \ c["name"]["middleName"] + " " + c["name"]["familyName"]
            
            if "anniversary" in c:
            anni = c["anniversary"]["month"] + \"/" + c["anniversary"]["day"] + "/" + \c["anniversary"]["year"]
            
            if "birthday" in c:
            bday = c["birthday"]["month"] + "/" + \c["birthday"]["day"] + "/" + c["birthday"]["year"]
            
            if "emails" in c:
               emails = ', '.join([x["ep"] for x in c["emails"]])
            
            if "phones" in c:
               phones = ', '.join([x["ep"] for x in c["phones"]])
            
            if "links" in c:
              links = ', '.join([x["ep"] for x in c["links"]])

Теперь для компании, заголовка и заметок используется метод get, как показано ниже —

company = c.get("company", "")
title = c.get("jobTitle", "")
notes = c.get("notes", "")

Теперь давайте добавим список метаданных и извлеченных элементов данных в список результатов следующим образом:

results.append([url, first_visit, last_visit, last_sync, loc, name, bday,anni, emails, phones, links, company, title, notes,total_contacts, total_count])
return results   

Теперь, используя метод CSV_Writer () , мы запишем содержимое в файл CSV —

def write_csv(data, output):
   print("[+] Writing {} contacts to {}".format(len(data), output))
   with open(output, "w", newline="") as csvfile:
      csv_writer = csv.writer(csvfile)
      csv_writer.writerow([
         "URL", "First Visit (UTC)", "Last Visit (UTC)",
         "Last Sync (UTC)", "Location", "Contact Name", "Bday",
         "Anniversary", "Emails", "Phones", "Links", "Company", "Title",
         "Notes", "Total Contacts", "Count of Contacts in Cache"])
      csv_writer.writerows(data)  

С помощью приведенного выше сценария мы можем обработать кэшированные данные из почты Yahoo с помощью базы данных IEF.