Важные артефакты в Windows-III

В этой главе рассказывается о дополнительных артефактах, которые следователь может получить во время криминалистического анализа в Windows.

Журналы событий

Файлы журнала событий Windows, такие как name -suggests, представляют собой специальные файлы, в которых хранятся важные события, например, когда пользователь входит в систему, когда программа обнаруживает ошибку, об изменениях в системе, доступе RDP, событиях, связанных с приложением и т. Д. Кибер-исследователей всегда интересуют события информация журнала, потому что она предоставляет много полезной исторической информации о доступе к системе. В следующем скрипте Python мы собираемся обрабатывать как устаревшие, так и текущие форматы журнала событий Windows.

Для скрипта Python нам необходимо установить сторонние модули, а именно pytsk3, pyewf, unicodecsv, pyevt and pyevtИкс. Мы можем выполнить следующие шаги, чтобы извлечь информацию из журналов событий -

  • Сначала найдите все журналы событий, соответствующие входному аргументу.

  • Затем выполните проверку подписи файла.

  • Теперь обработайте каждый найденный журнал событий с помощью соответствующей библиотеки.

  • Наконец, запишите результат в электронную таблицу.

Код Python

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

Сначала импортируйте следующие библиотеки Python -

from __future__ import print_function
import argparse
import unicodecsv as csv
import os
import pytsk3
import pyewf
import pyevt
import pyevtx
import sys
from utility.pytskutil import TSKUtil

Теперь укажите аргументы для обработчика командной строки. Обратите внимание, что здесь он принимает три аргумента: первый - это путь к файлу улик, второй - тип файла доказательств, а третий - имя журнала событий для обработки.

if __name__ == "__main__":
   parser = argparse.ArgumentParser('Information from Event Logs')
   parser.add_argument("EVIDENCE_FILE", help = "Evidence file path")
   parser.add_argument("TYPE", help = "Type of Evidence",choices = ("raw", "ewf"))
   parser.add_argument(
      "LOG_NAME",help = "Event Log Name (SecEvent.Evt, SysEvent.Evt, ""etc.)")
   
   parser.add_argument(
      "-d", help = "Event log directory to scan",default = "/WINDOWS/SYSTEM32/WINEVT")
   
   parser.add_argument(
      "-f", help = "Enable fuzzy search for either evt or"" evtx extension", action = "store_true")
   args = parser.parse_args()
   
   if os.path.exists(args.EVIDENCE_FILE) and \ os.path.isfile(args.EVIDENCE_FILE):
      main(args.EVIDENCE_FILE, args.TYPE, args.LOG_NAME, args.d, args.f)
   else:
      print("[-] Supplied input file {} does not exist or is not a ""file".format(args.EVIDENCE_FILE))
   sys.exit(1)

Теперь взаимодействуйте с журналами событий, чтобы запросить существование указанного пользователем пути, создав наш TSKUtilобъект. Это можно сделать с помощьюmain() метод следующим образом -

def main(evidence, image_type, log, win_event, fuzzy):
   tsk_util = TSKUtil(evidence, image_type)
   event_dir = tsk_util.query_directory(win_event)
   
   if event_dir is not None:
      if fuzzy is True:
         event_log = tsk_util.recurse_files(log, path=win_event)
   else:
      event_log = tsk_util.recurse_files(log, path=win_event, logic="equal")
   
   if event_log is not None:
      event_data = []
      for hit in event_log:
         event_file = hit[2]
         temp_evt = write_file(event_file)

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

def write_file(event_file):
   with open(event_file.info.name.name, "w") as outfile:
      outfile.write(event_file.read_random(0, event_file.info.meta.size))
   return event_file.info.name.name
      if pyevt.check_file_signature(temp_evt):
         evt_log = pyevt.open(temp_evt)
         print("[+] Identified {} records in {}".format(
            evt_log.number_of_records, temp_evt))
         
         for i, record in enumerate(evt_log.records):
            strings = ""
            for s in record.strings:
               if s is not None:
                  strings += s + "\n"
            event_data.append([
               i, hit[0], record.computer_name,
               record.user_security_identifier,
               record.creation_time, record.written_time,
               record.event_category, record.source_name,
               record.event_identifier, record.event_type,
               strings, "",
               os.path.join(win_event, hit[1].lstrip("//"))
            ])
      elif pyevtx.check_file_signature(temp_evt):
         evtx_log = pyevtx.open(temp_evt)
         print("[+] Identified {} records in {}".format(
            evtx_log.number_of_records, temp_evt))
         for i, record in enumerate(evtx_log.records):
            strings = ""
            for s in record.strings:
			   if s is not None:
               strings += s + "\n"
         event_data.append([
            i, hit[0], record.computer_name,
            record.user_security_identifier, "",
            record.written_time, record.event_level,
            record.source_name, record.event_identifier,
            "", strings, record.xml_string,
            os.path.join(win_event, hit[1].lstrip("//"))
      ])
      else:
         print("[-] {} not a valid event log. Removing temp" file...".format(temp_evt))
         os.remove(temp_evt)
      continue
      write_output(event_data)
   else:
      print("[-] {} Event log not found in {} directory".format(log, win_event))
      sys.exit(3)
else:
   print("[-] Win XP Event Log Directory {} not found".format(win_event))
   sys.exit(2

Наконец, определите метод записи вывода в электронную таблицу следующим образом:

def write_output(data):
   output_name = "parsed_event_logs.csv"
   print("[+] Writing {} to current working directory: {}".format(
      output_name, os.getcwd()))
   
   with open(output_name, "wb") as outfile:
      writer = csv.writer(outfile)
      writer.writerow([
         "Index", "File name", "Computer Name", "SID",
         "Event Create Date", "Event Written Date",
         "Event Category/Level", "Event Source", "Event ID",
         "Event Type", "Data", "XML Data", "File Path"
      ])
      writer.writerows(data)

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

История Интернета

История Интернета очень полезна для судебных аналитиков; поскольку большинство киберпреступлений происходит только в Интернете. Давайте посмотрим, как извлечь историю Интернета из Internet Explorer, поскольку мы обсуждаем криминалистику Windows, а Internet Explorer по умолчанию поставляется с Windows.

В Internet Explorer история Интернета сохраняется в index.datфайл. Давайте посмотрим на скрипт Python, который извлечет информацию изindex.dat файл.

Мы можем выполнить следующие шаги, чтобы извлечь информацию из index.dat файлы -

  • Сначала найдите index.dat файлы в системе.

  • Затем извлеките информацию из этого файла, перебирая их.

  • Теперь запишите всю эту информацию в отчет CSV.

Код Python

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

Сначала импортируйте следующие библиотеки Python -

from __future__ import print_function
import argparse

from datetime import datetime, timedelta
import os
import pytsk3
import pyewf
import pymsiecf
import sys
import unicodecsv as csv

from utility.pytskutil import TSKUtil

Теперь укажите аргументы для обработчика командной строки. Обратите внимание, что здесь он будет принимать два аргумента: первый - это путь к файлу доказательств, а второй - тип файла улик.

if __name__ == "__main__":
parser = argparse.ArgumentParser('getting information from internet history')
   parser.add_argument("EVIDENCE_FILE", help = "Evidence file path")
   parser.add_argument("TYPE", help = "Type of Evidence",choices = ("raw", "ewf"))
   parser.add_argument("-d", help = "Index.dat directory to scan",default = "/USERS")
   args = parser.parse_args()
   
   if os.path.exists(args.EVIDENCE_FILE) and os.path.isfile(args.EVIDENCE_FILE):
      main(args.EVIDENCE_FILE, args.TYPE, args.d)
   else:
      print("[-] Supplied input file {} does not exist or is not a ""file".format(args.EVIDENCE_FILE))
      sys.exit(1)

Теперь интерпретируйте файл улик, создав объект TSKUtilи пройтись по файловой системе, чтобы найти файлы index.dat. Это можно сделать, указавmain() функционируют следующим образом -

def main(evidence, image_type, path):
   tsk_util = TSKUtil(evidence, image_type)
   index_dir = tsk_util.query_directory(path)
   
   if index_dir is not None:
      index_files = tsk_util.recurse_files("index.dat", path = path,logic = "equal")
      
      if index_files is not None:
         print("[+] Identified {} potential index.dat files".format(len(index_files)))
         index_data = []
         
         for hit in index_files:
            index_file = hit[2]
            temp_index = write_file(index_file)

Теперь определите функцию, с помощью которой мы можем скопировать информацию файла index.dat в текущий рабочий каталог, а позже они могут быть обработаны сторонним модулем -

def write_file(index_file):
   with open(index_file.info.name.name, "w") as outfile:
   outfile.write(index_file.read_random(0, index_file.info.meta.size))
return index_file.info.name.name

Теперь используйте следующий код для проверки подписи с помощью встроенной функции, а именно check_file_signature() -

if pymsiecf.check_file_signature(temp_index):
   index_dat = pymsiecf.open(temp_index)
   print("[+] Identified {} records in {}".format(
   index_dat.number_of_items, temp_index))

   for i, record in enumerate(index_dat.items):
   try:
      data = record.data
   if data is not None:
      data = data.rstrip("\x00")
   except AttributeError:
   
   if isinstance(record, pymsiecf.redirected):
      index_data.append([
         i, temp_index, "", "", "", "", "",record.location, "", "", record.offset,os.path.join(path, hit[1].lstrip("//"))])
   
   elif isinstance(record, pymsiecf.leak):
      index_data.append([
         i, temp_index, record.filename, "","", "", "", "", "", "", record.offset,os.path.join(path, hit[1].lstrip("//"))])
   continue
   
   index_data.append([
      i, temp_index, record.filename,
      record.type, record.primary_time,
      record.secondary_time,
      record.last_checked_time, record.location,
      record.number_of_hits, data, record.offset,
      os.path.join(path, hit[1].lstrip("//"))
   ])
   else:
      print("[-] {} not a valid index.dat file. Removing "
      "temp file..".format(temp_index))
      os.remove("index.dat")
      continue
      os.remove("index.dat")
      write_output(index_data)
   else:
      print("[-] Index.dat files not found in {} directory".format(path))
   sys.exit(3)
   else:
      print("[-] Directory {} not found".format(win_event))
   sys.exit(2)

Теперь определите метод, который будет печатать вывод в файле CSV, как показано ниже -

def write_output(data):
   output_name = "Internet_Indexdat_Summary_Report.csv"
   print("[+] Writing {} with {} parsed index.dat files to current "
   "working directory: {}".format(output_name, len(data),os.getcwd()))
   
   with open(output_name, "wb") as outfile:
      writer = csv.writer(outfile)
      writer.writerow(["Index", "File Name", "Record Name",
      "Record Type", "Primary Date", "Secondary Date",
      "Last Checked Date", "Location", "No. of Hits",
      "Record Data", "Record Offset", "File Path"])
      writer.writerows(data)

После запуска вышеуказанного скрипта мы получим информацию из файла index.dat в файле CSV.

Объемные теневые копии

Теневая копия - это технология, включенная в Windows для создания резервных копий или моментальных снимков компьютерных файлов вручную или автоматически. Это также называется службой моментальных снимков тома или службой теневого копирования тома (VSS).

С помощью этих файлов VSS судебные эксперты могут получить некоторую историческую информацию о том, как система менялась с течением времени и какие файлы существовали на компьютере. Технология теневого копирования требует, чтобы файловая система была NTFS для создания и хранения теневых копий.

В этом разделе мы увидим скрипт Python, который помогает получить доступ к любому объему теневых копий, присутствующих в судебно-медицинском изображении.

Для скрипта Python нам необходимо установить сторонние модули, а именно pytsk3, pyewf, unicodecsv, pyvshadow и vss. Мы можем следовать приведенным ниже инструкциям, чтобы извлечь информацию из файлов VSS.

  • Сначала получите доступ к тому необработанного образа и определите все разделы NTFS.

  • Затем извлеките информацию из этих теневых копий, перебирая их.

  • Теперь, наконец, нам нужно создать список файлов данных в снимках.

Код Python

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

Сначала импортируйте следующие библиотеки Python -

from __future__ import print_function
import argparse
from datetime import datetime, timedelta

import os
import pytsk3
import pyewf
import pyvshadow
import sys
import unicodecsv as csv

from utility import vss
from utility.pytskutil import TSKUtil
from utility import pytskutil

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

if __name__ == "__main__":
   parser = argparse.ArgumentParser('Parsing Shadow Copies')
   parser.add_argument("EVIDENCE_FILE", help = "Evidence file path")
   parser.add_argument("OUTPUT_CSV", help = "Output CSV with VSS file listing")
   args = parser.parse_args()

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

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

Теперь взаимодействуйте с объемом файла улик, создав TSKUtilобъект. Это можно сделать с помощьюmain() метод следующим образом -

def main(evidence, output):
   tsk_util = TSKUtil(evidence, "raw")
   img_vol = tsk_util.return_vol()

if img_vol is not None:
   for part in img_vol:
      if tsk_util.detect_ntfs(img_vol, part):
         print("Exploring NTFS Partition for VSS")
         explore_vss(evidence, part.start * img_vol.info.block_size,output)
      else:
         print("[-] Must be a physical preservation to be compatible ""with this script")
         sys.exit(2)

Теперь определите метод для исследования файла теневой копии проанализированного тома следующим образом:

def explore_vss(evidence, part_offset, output):
   vss_volume = pyvshadow.volume()
   vss_handle = vss.VShadowVolume(evidence, part_offset)
   vss_count = vss.GetVssStoreCount(evidence, part_offset)
   
   if vss_count > 0:
      vss_volume.open_file_object(vss_handle)
      vss_data = []
      
      for x in range(vss_count):
         print("Gathering data for VSC {} of {}".format(x, vss_count))
         vss_store = vss_volume.get_store(x)
         image = vss.VShadowImgInfo(vss_store)
         vss_data.append(pytskutil.openVSSFS(image, x))
write_csv(vss_data, output)

Наконец, определите метод записи результата в электронную таблицу следующим образом:

def write_csv(data, output):
   if data == []:
      print("[-] No output results to write")
      sys.exit(3)
   print("[+] Writing output to {}".format(output))
   if os.path.exists(output):
      append = True
with open(output, "ab") as csvfile:
      csv_writer = csv.writer(csvfile)
      headers = ["VSS", "File", "File Ext", "File Type", "Create Date",
         "Modify Date", "Change Date", "Size", "File Path"]
      if not append:
         csv_writer.writerow(headers)
      for result_list in data:
         csv_writer.writerows(result_list)

Как только вы успешно запустите этот скрипт Python, мы перенесем информацию, хранящуюся в VSS, в электронную таблицу.