Криминалистика цифровых сетей Python-I
В этой главе будут объяснены основы проведения сетевой криминалистики с использованием Python.
Понимание сетевой криминалистики
Сетевая криминалистика - это ветвь цифровой криминалистики, которая занимается мониторингом и анализом трафика компьютерной сети, как локального, так и WAN (глобальной сети), в целях сбора информации, сбора доказательств или обнаружения вторжений. Сетевая криминалистика играет критически важную роль в расследовании цифровых преступлений, таких как кража интеллектуальной собственности или утечка информации. Картина сетевых коммуникаций помогает исследователю решить некоторые важные вопросы следующим образом:
Какие веб-сайты были посещены?
Какой контент был загружен в нашу сеть?
Какой контент был загружен из нашей сети?
К каким серверам осуществляется доступ?
Кто-то отправляет конфиденциальную информацию за пределы корпоративных брандмауэров?
Интернет-поиск улик (IEF)
IEF - это инструмент цифровой криминалистики для поиска, анализа и представления цифровых доказательств, обнаруженных на различных цифровых носителях, таких как компьютеры, смартфоны, планшеты и т. Д. Он очень популярен и используется тысячами специалистов-криминалистов.
Использование IEF
Из-за своей популярности IEF широко используется профессионалами-криминалистами. Некоторые из вариантов использования IEF следующие:
Благодаря мощным возможностям поиска он используется для одновременного поиска нескольких файлов или носителей данных.
Он также используется для восстановления удаленных данных из нераспределенного пространства ОЗУ с помощью новых методов вырезания.
Если исследователи хотят восстановить веб-страницы в их исходном формате на дату их открытия, они могут использовать IEF.
Он также используется для поиска в логических или физических дисковых томах.
Выгрузка отчетов из IEF в CSV с использованием Python
IEF хранит данные в базе данных SQLite, и следующий сценарий Python будет динамически определять таблицы результатов в базе данных IEF и выгружать их в соответствующие файлы 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.