สิ่งประดิษฐ์ที่สำคัญใน Windows-III

บทนี้จะอธิบายเกี่ยวกับสิ่งประดิษฐ์เพิ่มเติมที่นักวิจัยสามารถหาได้ในระหว่างการวิเคราะห์ทางนิติวิทยาศาสตร์บน Windows

บันทึกเหตุการณ์

ไฟล์บันทึกเหตุการณ์ของ Windows ในฐานะชื่อ - กระเป๋าเป็นไฟล์พิเศษที่เก็บเหตุการณ์สำคัญเช่นเมื่อผู้ใช้เข้าสู่ระบบคอมพิวเตอร์เมื่อโปรแกรมพบข้อผิดพลาดเกี่ยวกับการเปลี่ยนแปลงระบบการเข้าถึง RDP เหตุการณ์เฉพาะของแอปพลิเคชันเป็นต้นผู้ตรวจสอบไซเบอร์มักสนใจเหตุการณ์ ข้อมูลบันทึกเนื่องจากมีข้อมูลประวัติที่เป็นประโยชน์มากมายเกี่ยวกับการเข้าถึงระบบ ในสคริปต์ Python ต่อไปนี้เราจะประมวลผลทั้งรูปแบบบันทึกเหตุการณ์ Windows แบบเดิมและปัจจุบัน

สำหรับสคริปต์ Python เราจำเป็นต้องติดตั้งโมดูลของบุคคลที่สามคือ pytsk3, pyewf, unicodecsv, pyevt and pyevtx. เราสามารถทำตามขั้นตอนด้านล่างเพื่อดึงข้อมูลจากบันทึกเหตุการณ์ -

  • ขั้นแรกค้นหาบันทึกเหตุการณ์ทั้งหมดที่ตรงกับอาร์กิวเมนต์อินพุต

  • จากนั้นทำการตรวจสอบลายเซ็นไฟล์

  • ตอนนี้ประมวลผลบันทึกเหตุการณ์แต่ละรายการที่พบด้วยไลบรารีที่เหมาะสม

  • สุดท้ายเขียนผลลัพธ์ลงในสเปรดชีต

รหัส 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

สำเนาเงาระดับเสียง

Shadow Copy เป็นเทคโนโลยีที่รวมอยู่ใน Windows สำหรับการถ่ายสำเนาสำรองหรือภาพรวมของไฟล์คอมพิวเตอร์ด้วยตนเองหรือโดยอัตโนมัติ เรียกอีกอย่างว่า Volume Snapshot Service หรือ Volume Shadow Service (VSS)

ด้วยความช่วยเหลือของไฟล์ VSS เหล่านี้ผู้เชี่ยวชาญด้านนิติวิทยาศาสตร์สามารถมีข้อมูลในอดีตเกี่ยวกับการเปลี่ยนแปลงของระบบเมื่อเวลาผ่านไปและไฟล์ใดที่มีอยู่ในคอมพิวเตอร์ เทคโนโลยี Shadow copy กำหนดให้ระบบไฟล์เป็น NTFS สำหรับสร้างและจัดเก็บ Shadow copy

ในส่วนนี้เราจะเห็นสคริปต์ 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 ลงในสเปรดชีต