Python Forensics - Краткое руководство
Python - это язык программирования общего назначения с простым, читаемым кодом, который могут легко понять как профессиональные разработчики, так и начинающие программисты. Python состоит из множества полезных библиотек, которые можно использовать с любой структурой стека. Многие лаборатории полагаются на Python для создания базовых моделей для прогнозов и проведения экспериментов. Это также помогает контролировать критически важные операционные системы.
Python имеет встроенные возможности для поддержки цифрового расследования и защиты целостности доказательств во время расследования. В этом руководстве мы объясним фундаментальные концепции применения Python в цифровой или вычислительной криминалистике.
Что такое вычислительная криминалистика?
Вычислительная криминалистика - это развивающаяся область исследований. Он занимается решением криминалистических задач цифровыми методами. Он использует вычислительную науку для изучения цифровых доказательств.
Вычислительная криминалистика включает в себя широкий круг субъектов, в отношении которых исследуются объекты, вещества и процессы, в основном на основе типовых доказательств, таких как отметки инструментов, отпечатки пальцев, отпечатки обуви, документы и т. Д., А также включает физиологические и поведенческие модели, ДНК и цифровые доказательства в места преступления.
На следующей диаграмме показан широкий круг вопросов, охватываемых вычислительной криминалистикой.
Вычислительная криминалистика реализована с помощью некоторых алгоритмов. Эти алгоритмы используются для обработки сигналов и изображений, компьютерного зрения и графики. Он также включает интеллектуальный анализ данных, машинное обучение и робототехнику.
Вычислительная криминалистика включает в себя различные цифровые методы. Лучшее решение для упрощения всех цифровых методов в судебной экспертизе - использование универсального языка программирования, такого как Python.
Поскольку Python нужен нам для всех действий в области вычислительной экспертизы, давайте продвинемся шаг за шагом и разберемся, как его установить.
Step 1 - Перейти к https://www.python.org/downloads/ и загрузите установочные файлы Python в соответствии с операционной системой, установленной в вашей системе.
Step 2 - После загрузки пакета / установщика щелкните exe-файл, чтобы начать процесс установки.
После завершения установки вы увидите следующий экран.
Step 3 - Следующим шагом является установка переменных среды Python в вашей системе.
Step 4 - После установки переменных среды введите команду «python» в командной строке, чтобы проверить, была ли установка успешной или нет.
Если установка прошла успешно, вы получите следующий вывод на консоли.
Коды, написанные на Python, очень похожи на коды, написанные на других традиционных языках программирования, таких как C или Pascal. Также сказано, что синтаксис Python в значительной степени заимствован из C. Это включает в себя многие ключевые слова Python, которые похожи на язык C.
Python включает условные операторы и операторы цикла, которые можно использовать для точного извлечения данных для криминалистической экспертизы. Для управления потоком он предоставляетif/else, while, а на высоком уровне for оператор, который перебирает любой «повторяемый» объект.
if a < b:
max = b
else:
max = a
Основная область, в которой Python отличается от других языков программирования, заключается в использовании dynamic typing. Он использует имена переменных, которые относятся к объектам. Эти переменные не нужно объявлять.
Типы данных
Python включает набор встроенных типов данных, таких как строки, логические значения, числа и т. Д. Существуют также неизменяемые типы, что означает значения, которые нельзя изменить во время выполнения.
Python также имеет составные встроенные типы данных, которые включают tuples которые являются неизменяемыми массивами, lists, и dictionariesкоторые представляют собой хеш-таблицы. Все они используются в цифровой криминалистике для хранения ценностей при сборе доказательств.
Сторонние модули и пакеты
Python поддерживает группы модулей и / или пакетов, которые также называются third-party modules (связанный код, сгруппированный в один исходный файл), используемый для организации программ.
Python включает обширную стандартную библиотеку, что является одной из основных причин его популярности в вычислительной криминалистике.
Жизненный цикл кода Python
Сначала, когда вы выполняете код Python, интерпретатор проверяет код на наличие синтаксических ошибок. Если интерпретатор обнаруживает какие-либо синтаксические ошибки, они немедленно отображаются как сообщения об ошибках.
Если синтаксических ошибок нет, то код компилируется для получения bytecode и отправляется в PVM (виртуальная машина Python).
PVM проверяет байт-код на наличие ошибок времени выполнения или логических ошибок. Если PVM обнаруживает какие-либо ошибки во время выполнения, они немедленно сообщаются в виде сообщений об ошибках.
Если байт-код не содержит ошибок, код обрабатывается, и вы получаете его результат.
На следующем рисунке графически показано, как код Python сначала интерпретируется для создания байт-кода и как этот байт-код обрабатывается PVM для получения выходных данных.
Для создания приложения в соответствии с руководящими принципами судебной экспертизы важно понимать и соблюдать его соглашения и шаблоны именования.
Соглашения об именах
Во время разработки приложений для криминалистической экспертизы Python правила и соглашения, которые необходимо соблюдать, описаны в следующей таблице.
Константы | Прописные буквы с разделением подчеркивания | ВЫСОКАЯ ТЕМПЕРАТУРА |
Имя локальной переменной | Строчные буквы с неровными заглавными буквами (подчеркивание необязательно) | текущая температура |
Имя глобальной переменной | Префикс gl в нижнем регистре с неровными заглавными буквами (подчеркивание необязательно) | gl_maximumRecordedTemperature |
Название функции | Заглавные буквы с неровными заглавными буквами (подчеркивание необязательно) при активном голосе | ConvertFarenheitToCentigrade (...) |
Имя объекта | Префикс ob_ нижний регистр с неровными заглавными буквами | ob_myTempRecorder |
Модуль | Подчеркивание, за которым следует строчная буква с неровными заглавными буквами | _tempRecorder |
Имена классов | Префикс class_ затем неровные колпачки и кратко | class_TempSystem |
Давайте рассмотрим сценарий, чтобы понять важность соглашений об именах в вычислительной криминалистике. Предположим, у нас есть алгоритм хеширования, который обычно используется для шифрования данных. Алгоритм одностороннего хеширования принимает входные данные в виде потока двоичных данных; это может быть пароль, файл, двоичные данные или любые цифровые данные. Затем алгоритм хеширования производитmessage digest (md) относительно данных, полученных на входе.
Практически невозможно создать новый двоичный вход, который будет генерировать данный дайджест сообщения. Даже один бит двоичных входных данных, если он изменен, сгенерирует уникальное сообщение, которое отличается от предыдущего.
пример
Взгляните на следующую программу-образец, которая следует вышеупомянутым соглашениям.
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
Вышеупомянутая программа производит следующий вывод.
В этой программе сценарий Python принимает ввод (ваше полное имя) и преобразует его в соответствии с алгоритмом хеширования md5. Он шифрует данные и при необходимости защищает информацию. Согласно руководящим принципам судебно-медицинской экспертизы, в этом шаблоне можно закрепить название улик или любые другие доказательства.
А hash functionопределяется как функция, которая отображает большой объем данных в фиксированное значение заданной длины. Эта функция гарантирует, что один и тот же ввод дает один и тот же вывод, который фактически определяется как хеш-сумма. Сумма хэша включает характеристику с конкретной информацией.
Отменить эту функцию практически невозможно. Таким образом, любая атака третьей стороны, такая как атака грубой силы, практически невозможна. Также такой алгоритм называетсяone-way cryptographic algorithm.
Идеальная криптографическая хеш-функция имеет четыре основных свойства:
- Должно быть легко вычислить хеш-значение для любого заданного ввода.
- Должно быть невозможно сгенерировать исходный ввод из его хэша.
- Должно быть невозможно изменить ввод без изменения хэша.
- Должно быть невозможно найти два разных входа с одинаковым хешем.
пример
Рассмотрим следующий пример, который помогает подбирать пароли с использованием символов в шестнадцатеричном формате.
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')
Схема
Мы объяснили логику этой программы с помощью следующей блок-схемы -
Вывод
Наш код выдаст следующий результат -
Введенный дважды пароль совпадает с хеш-функцией. Это гарантирует, что дважды введенный пароль будет точным, что помогает собирать полезные данные и сохранять их в зашифрованном виде.
В этой главе мы узнаем о взломе текстовых данных, полученных во время анализа и доказательства.
Обычный текст в криптографии - это обычный читаемый текст, например сообщение. С другой стороны, зашифрованный текст - это результат работы алгоритма шифрования, полученный после ввода обычного текста.
Простой алгоритм того, как мы превращаем текстовое сообщение в зашифрованный текст, - это шифр Цезаря, изобретенный Юлием Цезарем, чтобы хранить открытый текст в секрете от его врагов. Этот шифр включает сдвиг каждой буквы в сообщении «вперед» на три позиции в алфавите.
Ниже приводится демонстрационная иллюстрация.
а → D
b → E
c → F
....
ш → Z
х → А
у → В
z → C
пример
Сообщение, вводимое при запуске сценария Python, дает все возможности символов, которые используются для доказательства шаблона.
Типы используемых шаблонных доказательств следующие:
- Следы и следы шин
- Impressions
- Fingerprints
Все биометрические данные состоят из векторных данных, которые нам необходимо взломать, чтобы собрать убедительные доказательства.
Следующий код Python показывает, как вы можете создать зашифрованный текст из обычного текста:
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:])
Вывод
Теперь проверьте вывод этого кода. Когда мы вводим простой текст «Радхика», программа выдаст следующий зашифрованный текст.
Virtualizationэто процесс эмуляции ИТ-систем, таких как серверы, рабочие станции, сети и хранилища. Это не что иное, как создание виртуальной, а не реальной версии любой операционной системы, сервера, устройства хранения или сетевых процессов.
Основной компонент, который помогает в эмуляции виртуального оборудования, определяется как hyper-visor.
На следующем рисунке поясняются два основных типа используемой виртуализации системы.
Виртуализация используется в компьютерной криминалистике несколькими способами. Это помогает аналитику таким образом, что рабочая станция может использоваться в подтвержденном состоянии для каждого исследования. Восстановление данных возможно путем прикрепления образа диска в качестве дополнительного диска к виртуальной машине. Эту же машину можно использовать как программу восстановления для сбора доказательств.
Следующий пример помогает понять создание виртуальной машины с помощью языка программирования Python.
Step 1 - Пусть виртуальная машина будет называться dummy1.
Каждая виртуальная машина должна иметь минимум 512 МБ памяти, выраженной в байтах.
vm_memory = 512 * 1024 * 1024
Step 2 - Виртуальная машина должна быть подключена к кластеру по умолчанию, который был рассчитан.
vm_cluster = api.clusters.get(name = "Default")
Step 3 - Виртуальная машина должна загружаться с виртуального жесткого диска.
vm_os = params.OperatingSystem(boot = [params.Boot(dev = "hd")])
Все параметры объединяются в объект параметра виртуальной машины перед использованием метода добавления коллекции vms на виртуальную машину.
пример
Ниже приведен полный сценарий Python для добавления виртуальной машины.
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
Вывод
Наш код выдаст следующий результат -
Сценарий современных сетевых сред таков, что исследование может быть сопряжено с рядом трудностей. Это может произойти независимо от того, реагируете ли вы на поддержку в случае нарушения, расследуете действия инсайдеров, выполняете оценку уязвимости или проверяете соответствие нормативным требованиям.
Концепция сетевого программирования
Следующие определения используются в сетевом программировании.
Client - Клиент - это часть клиент-серверной архитектуры сетевого программирования, которая работает на персональном компьютере и рабочей станции.
Server - Сервер - это часть архитектуры клиент-сервер, которая предоставляет услуги другим компьютерным программам на том же или других компьютерах.
WebSockets- WebSockets обеспечивает протокол между клиентом и сервером, который работает через постоянное TCP-соединение. Благодаря этому двунаправленные сообщения могут передаваться между соединениями сокета TCP (одновременно).
WebSockets появились после многих других технологий, которые позволяют серверам отправлять информацию клиенту. Помимо подтверждения заголовка обновления, WebSockets не зависит от HTTP.
Эти протоколы используются для проверки информации, отправляемой или получаемой сторонними пользователями. Поскольку шифрование является одним из методов защиты сообщений, важно также защитить канал, по которому сообщения были переданы.
Рассмотрим следующую программу Python, которую клиент использует для handshaking.
пример
# 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()
Вывод
Он выдаст следующий результат -
Сервер, принимающий запрос на канал связи, будет включать следующий сценарий.
# 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()
Клиент и сервер, созданные с помощью программирования Python, слушают номер хоста. Первоначально клиент отправляет серверу запрос относительно данных, отправленных в номере хоста, и сервер принимает запрос и немедленно отправляет ответ. Таким образом, у нас может быть безопасный канал связи.
Модули в программах Python помогают в организации кода. Они помогают сгруппировать связанный код в один модуль, что упрощает понимание и использование. Он включает произвольно названные значения, которые можно использовать для привязки и ссылки. Проще говоря, модуль - это файл, состоящий из кода Python, который включает функции, классы и переменные.
Код Python для модуля (файла) сохраняется с .py расширение, которое компилируется по мере необходимости.
Example
def print_hello_func( par ):
print "Hello : ", par
return
Заявление об импорте
Исходный файл Python можно использовать как модуль, выполнив importоператор, который импортирует другие пакеты или сторонние библиотеки. Используемый синтаксис следующий -
import module1[, module2[,... moduleN]
Когда интерпретатор Python встречает оператор импорта, он импортирует указанный модуль, который присутствует в пути поиска.
Example
Рассмотрим следующий пример.
#!/usr/bin/python
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Radhika")
Он выдаст следующий результат -
Модуль загружается только один раз, независимо от того, сколько раз он был импортирован кодом Python.
From ... оператор импорта
Fromattribute помогает импортировать определенные атрибуты из модуля в текущее пространство имен. Вот его синтаксис.
from modname import name1[, name2[, ... nameN]]
Example
Чтобы импортировать функцию fibonacci из модуля fibиспользуйте следующую инструкцию.
from fib import fibonacci
Расположение модулей
Когда модуль импортируется, интерпретатор Python ищет следующие последовательности:
Текущий каталог.
Если модуль не существует, Python ищет каждый каталог в переменной оболочки PYTHONPATH.
Если расположение переменной оболочки не удается, Python проверяет путь по умолчанию.
Вычислительная криминалистика использует модули Python и сторонние модули для более удобного получения информации и извлечения доказательств. В следующих главах основное внимание уделяется реализации модулей для получения необходимого результата.
DShell
Dshellпредставляет собой набор инструментов для криминалистического анализа сети на основе Python. Этот инструментарий был разработан Исследовательской лабораторией армии США. Этот набор инструментов с открытым исходным кодом был выпущен в 2014 году. Основная цель этого набора инструментов - облегчить проведение судебных расследований.
Инструментарий состоит из большого количества декодеров, которые перечислены в следующей таблице.
Sr.No. | Название и описание декодера |
---|---|
1 | dns Это используется для извлечения запросов, связанных с DNS. |
2 | reservedips Определяет решения проблем DNS |
3 | large-flows Список чистых потоков |
4 | rip-http Используется для извлечения файлов из HTTP-трафика. |
5 | Protocols Используется для идентификации нестандартных протоколов |
Лаборатория армии США поддерживает репозиторий клонов на GitHub по следующей ссылке -
https://github.com/USArmyResearchLab/Dshell
Клон состоит из скрипта install-ubuntu.py () используется для установки этого инструментария.
После успешной установки будут автоматически созданы исполняемые файлы и зависимости, которые будут использоваться позже.
Зависимости следующие -
dependencies = {
"Crypto": "crypto",
"dpkt": "dpkt",
"IPy": "ipy",
"pcap": "pypcap"
}
Этот инструментарий можно использовать против файлов pcap (захват пакетов), которые обычно записываются во время инцидентов или во время предупреждения. Эти файлы pcap создаются либо libpcap на платформе Linux, либо WinPcap на платформе Windows.
Scapy
Scapy - это инструмент на основе Python, используемый для анализа и управления сетевым трафиком. Ниже приведена ссылка на набор инструментов Scapy -
http://www.secdev.org/projects/scapy/
Этот инструментарий используется для анализа обработки пакетов. Он очень способен декодировать пакеты большого количества протоколов и захватывать их. Scapy отличается от инструментария Dshell тем, что предоставляет исследователю подробное описание сетевого трафика. Эти описания были записаны в реальном времени.
Scapy имеет возможность строить графики с помощью сторонних инструментов или снятия отпечатков пальцев ОС.
Рассмотрим следующий пример.
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"
Этот сценарий дает подробное описание деталей страны в сетевом пакете, которые связываются друг с другом.
Приведенный выше сценарий выдаст следующий результат.
Searchingбезусловно, является одним из столпов судебной экспертизы. В наши дни поиск хорош только до того, как следователь собирает доказательства.
Поиск по ключевому слову в сообщении играет жизненно важную роль в криминалистике, когда мы ищем улики с помощью ключевого слова. Знание того, что следует искать в конкретном файле, а также в удаленных файлах, требует как опыта, так и знаний.
Python имеет различные встроенные механизмы со стандартными библиотечными модулями для поддержки searchоперация. По сути, следователи используют операцию поиска, чтобы найти ответы на такие вопросы, как «кто», «что», «где», «когда» и т. Д.
пример
В следующем примере мы объявили две строки, а затем использовали функцию find, чтобы проверить, содержит ли первая строка вторую строку или нет.
# 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)
Приведенный выше сценарий выдаст следующий результат.
“find”Функция в Python помогает в поиске ключевого слова в сообщении или абзаце. Это очень важно для сбора соответствующих доказательств.
Indexingфактически дает следователю возможность полностью изучить файл и собрать из него возможные доказательства. Свидетельство может содержаться в файле, образе диска, снимке памяти или сетевой трассировке.
Индексирование помогает сократить время на выполнение таких трудоемких задач, как keyword searching. Криминалистическое расследование также включает этап интерактивного поиска, на котором индекс используется для быстрого поиска ключевых слов.
Индексирование также помогает перечислить ключевые слова в отсортированном списке.
пример
В следующем примере показано, как можно использовать indexing в 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)
Приведенный выше сценарий выдаст следующий результат.
Извлечение ценной информации из доступных ресурсов является важной частью цифровой криминалистики. Получение доступа ко всей доступной информации имеет важное значение для процесса расследования, поскольку помогает получить соответствующие доказательства.
Ресурсы, содержащие данные, могут быть либо простыми структурами данных, такими как базы данных, либо сложными структурами данных, такими как изображение JPEG. Доступ к простым структурам данных можно легко получить с помощью простых инструментов рабочего стола, а для извлечения информации из сложных структур данных требуются сложные инструменты программирования.
Библиотека изображений Python
Библиотека изображений Python (PIL) добавляет в интерпретатор Python возможности обработки изображений. Эта библиотека поддерживает множество форматов файлов и предоставляет мощные возможности обработки изображений и графики. Вы можете скачать исходные файлы PIL с:http://www.pythonware.com/products/pil/
На следующем рисунке показана полная блок-схема извлечения данных из изображений (сложных структур данных) в PIL.
пример
Теперь давайте рассмотрим пример программирования, чтобы понять, как это работает.
Step 1 - Предположим, у нас есть следующее изображение, откуда нам нужно извлечь информацию.
Step 2- Когда мы открываем это изображение с помощью PIL, оно сначала отмечает необходимые точки, необходимые для извлечения доказательств, включая различные значения пикселей. Вот код для открытия изображения и записи его значений пикселей -
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 - Наш код выдаст следующий результат после извлечения значений пикселей изображения.
Полученные выходные данные представляют собой значения пикселей комбинации RGB, что дает лучшее представление о том, какие данные необходимы для доказательства. Полученные данные представлены в виде массива.
Криминалистическое расследование и анализ стандартного компьютерного оборудования, такого как жесткие диски, превратились в стабильную дисциплину, и за ней следят с помощью методов анализа нестандартного оборудования или временных доказательств.
Хотя смартфоны все чаще используются в цифровых расследованиях, они по-прежнему считаются нестандартными.
Судебно-медицинский анализ
Криминалистические расследования ищут такие данные, как принятые звонки или набранные номера со смартфона. Он может включать текстовые сообщения, фотографии или любые другие компрометирующие улики. Большинство смартфонов имеют функции блокировки экрана с помощью паролей или буквенно-цифровых символов.
Здесь мы рассмотрим пример, чтобы показать, как Python может помочь взломать пароль блокировки экрана для получения данных со смартфона.
Ручное обследование
Android поддерживает блокировку паролем с помощью ПИН-кода или буквенно-цифрового пароля. Максимальное количество парольных фраз должно составлять от 4 до 16 цифр или символов. Пароль смартфона хранится в системе Android в специальном файле под названиемpassword.key в /data/system.
Android хранит хэш-сумму SHA1 и MD5-хеш-сумму пароля. Эти пароли можно обработать в следующем коде.
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;
}
Взломать пароль с помощью dictionary attack поскольку хешированный пароль хранится в salt file. Этотsaltпредставляет собой строку шестнадцатеричного представления случайного целого числа размером 64 бита. Легко получить доступ кsalt используя Rooted Smartphone или же JTAG Adapter.
Смартфон с root-доступом
Дамп файла /data/system/password.key хранится в базе данных SQLite под lockscreen.password_saltключ. Подsettings.db, пароль сохраняется, и значение четко видно на следующем снимке экрана.
Адаптер JTAG
Специальное оборудование, известное как адаптер JTAG (Joint Test Action Group), может использоваться для доступа к salt. АналогичноRiff-Box или JIG-Adapter также может использоваться для тех же функций.
Используя информацию, полученную из Riff-бокса, мы можем найти положение зашифрованных данных, т.е. salt. Ниже приведены правила -
Найдите связанную строку «lockscreen.password_salt».
Байт представляет собой фактическую ширину соли, которая является ее length.
Это длина, которую на самом деле ищут, чтобы получить сохраненный пароль / пин-код смартфонов.
Этот набор правил помогает получить соответствующие данные о соли.
Наиболее широко используемый протокол для синхронизации времени, который получил широкое распространение на практике, реализуется через сетевой протокол времени (NTP).
NTP использует протокол пользовательских дейтаграмм (UDP), который использует минимальное время для передачи пакетов между сервером и клиентом, которые хотят синхронизироваться с заданным источником времени.
Особенности протокола сетевого времени следующие:
Порт сервера по умолчанию - 123.
Этот протокол состоит из множества доступных серверов времени, синхронизированных с национальными лабораториями.
Стандарт протокола NTP регулируется IETF, а предлагаемый стандарт - RFC 5905, озаглавленный «Протокол сетевого времени версии 4: спецификация протокола и алгоритмов» [NTP RFC]
Операционные системы, программы и приложения используют NTP для правильной синхронизации времени.
В этой главе мы сосредоточимся на использовании NTP с Python, которое возможно из сторонней библиотеки Python ntplib. Эта библиотека эффективно справляется с тяжелой работой, сравнивая результаты с моими локальными системными часами.
Установка библиотеки NTP
В ntplib доступен для скачивания по адресу https://pypi.python.org/pypi/ntplib/ как показано на следующем рисунке.
Библиотека предоставляет простой интерфейс для серверов NTP с помощью методов, которые могут переводить поля протокола NTP. Это помогает получить доступ к другим ключевым значениям, таким как дополнительные секунды.
Следующая программа Python помогает понять использование 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;
Вышеупомянутая программа выдаст следующий результат.
Разница во времени рассчитывается в указанной выше программе. Эти расчеты помогают в судебно-медицинских расследованиях. Полученные сетевые данные принципиально отличаются от анализа данных, найденных на жестком диске.
Разница в часовых поясах или получение точных часовых поясов может помочь в сборе доказательств для перехвата сообщений через этот протокол.
Специалистам-криминалистам обычно сложно применять цифровые решения для анализа огромного количества цифровых доказательств в отношении обычных преступлений. Большинство инструментов цифрового расследования являются однопоточными и могут выполнять только одну команду за раз.
В этой главе мы сосредоточимся на многопроцессорных возможностях Python, которые могут быть связаны с общими проблемами криминалистики.
Многопроцессорность
Многопроцессорность определяется как способность компьютерной системы поддерживать более одного процесса. Операционные системы, поддерживающие многопроцессорность, позволяют запускать несколько программ одновременно.
Существуют различные типы многопроцессорной обработки, такие как symmetric и asymmetric processing. Следующая диаграмма относится к симметричной многопроцессорной системе, которой обычно следуют при судебно-медицинской экспертизе.
пример
Следующий код показывает, как различные процессы перечислены внутри в программировании Python.
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."
Здесь функция list_append() помогает в перечислении набора процессов в системе.
Вывод
Наш код выдаст следующий результат -
В этой главе мы сосредоточимся на исследовании энергозависимой памяти с помощью Volatility, фреймворк судебной экспертизы на основе Python, применимый на следующих платформах: Android и Linux.
Энергозависимая память
Энергозависимая память - это тип хранилища, содержимое которого стирается при выключении или отключении питания системы. ОЗУ - лучший пример энергозависимой памяти. Это означает, что если вы работали с документом, который не был сохранен в энергонезависимой памяти, например на жестком диске, и компьютер потерял питание, то все данные будут потеряны.
В общем, криминалистическая экспертиза энергозависимой памяти следует той же схеме, что и другие судебные расследования -
- Выбор объекта расследования
- Получение данных судебной экспертизы
- Криминалистический анализ
Базовый volatility plugins которые используются для сборок Android RAM dumpдля анализа. После того, как дамп ОЗУ собран для анализа, важно начать поиск вредоносных программ в ОЗУ.
Правила YARA
YARA - популярный инструмент, который предоставляет надежный язык, совместим с регулярными выражениями на основе Perl и используется для проверки подозрительных файлов / каталогов и строк соответствия.
В этом разделе мы будем использовать YARA на основе реализации сопоставления с образцом и объединить их с питанием от сети. Полный процесс будет полезен для судебно-медицинской экспертизы.
пример
Рассмотрим следующий код. Этот код помогает в извлечении кода.
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)
Приведенный выше код даст следующий результат.
Количество реализованных правил YARA помогает лучше понять подозрительные файлы. Косвенно список подозреваемых файлов помогает собрать необходимую информацию для криминалистической экспертизы.
Ниже приведен исходный код на github: https://github.com/radhikascs/Python_yara
Основная задача цифровых расследований - защитить важные доказательства или данные с помощью шифрования или любого другого формата. Основной пример - хранение паролей. Поэтому необходимо понимать использование операционной системы Linux для внедрения цифровой криминалистики для защиты этих ценных данных.
Информация для всех локальных пользователей в основном хранится в следующих двух файлах:
- /etc/passwd
- etc/shadow
Первый обязательный, в нем хранятся все пароли. Второй файл является необязательным и хранит информацию о локальных пользователях, включая хешированные пароли.
Возникают проблемы, связанные с безопасностью хранения информации о пароле в файле, доступном для чтения каждому пользователю. Следовательно, хешированные пароли хранятся в/etc/passwd, где содержание заменяется специальным значением "x".
Соответствующие хэши нужно искать в /etc/shadow. Настройки в/etc/passwd может отменять детали в /etc/shadow.
Оба текстовых файла в Linux включают по одной записи в строке, и запись состоит из нескольких полей, разделенных двоеточиями.
Формат /etc/passwd выглядит следующим образом -
Sr.No. | Имя и описание поля |
---|---|
1 | Username Это поле состоит из атрибутов в удобочитаемом формате. |
2 | Password hash Он состоит из пароля в закодированной форме согласно функции шифрования Posix. |
Если хэш-пароль сохранен как empty, то соответствующему пользователю не потребуется пароль для входа в систему. Если это поле содержит значение, которое не может быть сгенерировано алгоритмом хеширования, например восклицательный знак, то пользователь не может войти в систему, используя пароль.
Пользователь с заблокированным паролем все еще может войти в систему, используя другие механизмы аутентификации, например, ключи SSH. Как упоминалось ранее, особое значение "x"означает, что хэш пароля должен быть найден в теневом файле.
В password hash включает в себя следующее -
Encrypted salt - The encrypted salt помогает поддерживать блокировку экрана, контакты и пароли.
Numerical user ID- В этом поле указывается ID пользователя. Ядро Linux присваивает системе этот идентификатор пользователя.
Numerical group ID - Это поле относится к основной группе пользователя.
Home directory - Новые процессы запускаются со ссылкой на этот каталог.
Command shell - Это необязательное поле обозначает оболочку по умолчанию, которая должна быть запущена после успешного входа в систему.
Цифровая криминалистика включает сбор информации, имеющей отношение к отслеживанию улик. Следовательно, идентификаторы пользователей полезны при ведении записей.
Используя Python, вся эта информация может быть автоматически проанализирована для индикаторов анализа, реконструируя недавнюю активность системы. Отслеживание просто и легко с реализацией Linux Shell.
Программирование на Python в Linux
пример
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:])
Вывод
Пароль хранится в шестнадцатеричном формате в pass_db.txtкак показано на следующем снимке экрана. Текстовые файлы сохраняются для дальнейшего использования в вычислительной криминалистике.
Индикаторы компрометации (IOC) определяются как «фрагменты данных судебной экспертизы, которые включают данные, обнаруженные в записях или файлах системного журнала, которые идентифицируют потенциально вредоносную активность в системе или сети».
Наблюдая за IOC, организации могут обнаруживать атаки и действовать быстро, чтобы предотвратить такие нарушения или ограничить ущерб, остановив атаки на более ранних этапах.
Есть несколько вариантов использования, которые позволяют запрашивать судебные артефакты, такие как -
- Ищем конкретный файл по MD5
- Поиск конкретной сущности, которая фактически хранится в памяти
- Конкретная запись или набор записей, которые хранятся в реестре Windows
Сочетание всего вышеперечисленного обеспечивает лучшие результаты при поиске артефактов. Как упоминалось выше, реестр Windows предоставляет идеальную платформу для создания и поддержки IOC, что напрямую помогает в вычислительной криминалистике.
Методология
Поищите места в файловой системе и, в частности, сейчас в реестре Windows.
Найдите набор артефактов, созданных с помощью инструментов криминалистики.
Обратите внимание на признаки любых неблагоприятных действий.
Жизненный цикл расследования
Investigative Life Cycle следует за IOC и ищет определенные записи в реестре.
Stage 1: Initial Evidence- Признаки взлома обнаруживаются либо на хосте, либо в сети. Лица, отвечающие за реагирование, исследуют и определят точное решение, которое является конкретным показателем судебной экспертизы.
Stage 2: Create IOCs for Host & Network- На основе собранных данных создается IOC, что легко сделать с помощью реестра Windows. Гибкость OpenIOC дает неограниченное количество вариантов того, как может быть создан индикатор.
Stage 3: Deploy IOCs in the Enterprise - После создания указанного IOC исследователь развернет эти технологии с помощью API в регистрах Windows.
Stage 4: Identification of Suspects- Размещение IOC помогает в идентификации подозреваемых в обычном порядке. Будут определены даже дополнительные системы.
Stage 5: Collect and Analyze Evidence - Доказательства против подозреваемых собираются и анализируются соответствующим образом.
Stage 6: Refine & Create New IOCs - Следственная группа может создавать новые IOC на основе своих доказательств и данных, обнаруженных на предприятии, и дополнительных разведывательных данных, и продолжать совершенствовать свой цикл.
На следующем рисунке показаны фазы жизненного цикла расследования -
Cloud computingможно определить как набор размещенных сервисов, предоставляемых пользователям через Интернет. Это позволяет организациям использовать или даже вычислять ресурс, который включает виртуальные машины (ВМ), хранилище или приложение в качестве утилиты.
Одним из наиболее важных преимуществ создания приложений на языке программирования Python является то, что он включает возможность развертывания приложений практически на любой платформе, включая cloudтакже. Это означает, что Python можно запускать на облачных серверах, а также запускать на удобных устройствах, таких как настольный компьютер, планшет или смартфон.
Одна из интересных перспектив - создание облачной базы с генерацией Rainbow tables. Это помогает в интеграции одно- и многопроцессорных версий приложения, что требует некоторых соображений.
Pi Cloud
Pi Cloud - это платформа облачных вычислений, которая объединяет язык программирования Python с вычислительной мощностью Amazon Web Services.
Давайте посмотрим на пример реализации облака Pi с rainbow tables.
Радужные столы
А rainbow table определяется как список всех возможных текстовых перестановок зашифрованных паролей, специфичных для данного алгоритма хеширования.
Радужные таблицы следуют стандартному шаблону, который создает список хешированных паролей.
Текстовый файл используется для генерации паролей, которые включают символы или простой текст паролей, которые необходимо зашифровать.
Файл используется облаком Pi, которое вызывает сохранение основной функции.
Вывод хешированных паролей также сохраняется в текстовом файле.
Этот алгоритм можно использовать для сохранения паролей в базе данных и создания хранилища резервных копий в облачной системе.
Следующая встроенная программа создает список зашифрованных паролей в текстовом файле.
пример
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()
Вывод
Этот код выдаст следующий результат -
Пароли хранятся в текстовых файлах, которые видны, как показано на следующем снимке экрана.