Đồ tạo tác quan trọng trong Windows-III

Chương này sẽ giải thích về các hiện vật khác mà điều tra viên có thể thu được trong quá trình phân tích pháp y trên Windows.

Nhật ký sự kiện

Tệp nhật ký sự kiện Windows, như tên –suggests, là các tệp đặc biệt lưu trữ các sự kiện quan trọng như khi người dùng đăng nhập trên máy tính, khi chương trình gặp lỗi, về các thay đổi hệ thống, quyền truy cập RDP, các sự kiện cụ thể của ứng dụng, v.v. Các nhà điều tra mạng luôn quan tâm đến sự kiện thông tin nhật ký vì nó cung cấp nhiều thông tin lịch sử hữu ích về việc truy cập hệ thống. Trong tập lệnh Python sau, chúng tôi sẽ xử lý cả định dạng nhật ký sự kiện cũ và hiện tại của Windows.

Đối với tập lệnh Python, chúng ta cần cài đặt các mô-đun của bên thứ ba, cụ thể là pytsk3, pyewf, unicodecsv, pyevt and pyevtx. Chúng tôi có thể làm theo các bước dưới đây để trích xuất thông tin từ nhật ký sự kiện -

  • Đầu tiên, hãy tìm kiếm tất cả các bản ghi sự kiện khớp với đối số đầu vào.

  • Sau đó, thực hiện xác minh chữ ký tệp.

  • Bây giờ, xử lý từng bản ghi sự kiện được tìm thấy với thư viện thích hợp.

  • Cuối cùng, ghi đầu ra vào bảng tính.

Mã Python

Hãy để chúng tôi xem cách sử dụng mã Python cho mục đích này -

Đầu tiên, nhập các thư viện Python sau:

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

Bây giờ, cung cấp các đối số cho trình xử lý dòng lệnh. Lưu ý rằng ở đây nó sẽ chấp nhận ba đối số - thứ nhất là đường dẫn đến tệp bằng chứng, thứ hai là loại tệp bằng chứng và thứ ba là tên của nhật ký sự kiện cần xử lý.

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)

Bây giờ, tương tác với nhật ký sự kiện để truy vấn sự tồn tại của đường dẫn do người dùng cung cấp bằng cách tạo TSKUtilvật. Nó có thể được thực hiện với sự giúp đỡ củamain() phương pháp như sau -

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)

Bây giờ, chúng ta cần thực hiện xác minh chữ ký, sau đó xác định một phương thức sẽ ghi toàn bộ nội dung vào thư mục hiện tại -

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

Cuối cùng, xác định một phương thức để ghi đầu ra vào bảng tính như sau:

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)

Khi bạn chạy thành công tập lệnh trên, chúng tôi sẽ nhận được thông tin của các sự kiện đăng nhập vào bảng tính.

Lịch sử Internet

Lịch sử Internet rất hữu ích cho các nhà phân tích pháp y; vì hầu hết các tội phạm mạng chỉ xảy ra trên internet. Hãy để chúng tôi xem cách trích xuất lịch sử internet từ Internet Explorer, khi chúng ta thảo luận về tính năng pháp lý của Windows và Internet Explorer đi kèm với Windows theo mặc định.

Trên Internet Explorer, lịch sử internet được lưu trong index.dattập tin. Hãy để chúng tôi xem xét một tập lệnh Python, tập lệnh này sẽ trích xuất thông tin từindex.dat tập tin.

Chúng tôi có thể làm theo các bước dưới đây để trích xuất thông tin từ index.dat tập tin -

  • Đầu tiên, hãy tìm kiếm index.dat các tệp trong hệ thống.

  • Sau đó, trích xuất thông tin từ tệp đó bằng cách lặp lại chúng.

  • Bây giờ, hãy ghi tất cả thông tin này vào báo cáo CSV.

Mã Python

Hãy để chúng tôi xem cách sử dụng mã Python cho mục đích này -

Đầu tiên, nhập các thư viện Python sau:

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

Bây giờ, cung cấp các đối số cho trình xử lý dòng lệnh. Lưu ý rằng ở đây nó sẽ chấp nhận hai lập luận - thứ nhất là đường dẫn đến tệp bằng chứng và thứ hai là loại tệp bằng chứng -

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)

Bây giờ, hãy diễn giải tệp bằng chứng bằng cách tạo một đối tượng TSKUtilvà lặp qua hệ thống tệp để tìm tệp index.dat. Nó có thể được thực hiện bằng cách xác địnhmain() chức năng như sau -

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)

Bây giờ, hãy xác định một hàm với sự trợ giúp của chúng ta có thể sao chép thông tin của tệp index.dat vào thư mục làm việc hiện tại và sau này chúng có thể được xử lý bởi mô-đun bên thứ ba -

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

Bây giờ, hãy sử dụng đoạn mã sau để thực hiện xác thực chữ ký với sự trợ giúp của hàm tích hợp cụ thể là 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)

Bây giờ, hãy xác định một phương thức sẽ in đầu ra trong tệp CSV, như được hiển thị bên dưới:

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)

Sau khi chạy tập lệnh trên, chúng ta sẽ lấy thông tin từ tệp index.dat trong tệp CSV.

Bản sao Volume Shadow

Bản sao bóng là công nghệ có trong Windows để sao lưu các bản sao lưu hoặc ảnh chụp nhanh các tệp máy tính theo cách thủ công hoặc tự động. Nó còn được gọi là dịch vụ chụp nhanh âm lượng hoặc dịch vụ đổ bóng âm lượng (VSS).

Với sự trợ giúp của các tệp VSS này, các chuyên gia pháp y có thể có một số thông tin lịch sử về cách hệ thống đã thay đổi theo thời gian và những tệp nào tồn tại trên máy tính. Công nghệ sao chép bóng tối yêu cầu hệ thống tệp phải là NTFS để tạo và lưu trữ các bản sao bóng.

Trong phần này, chúng ta sẽ thấy một tập lệnh Python, giúp truy cập vào bất kỳ khối lượng bản sao bóng mờ nào có trong hình ảnh pháp y.

Đối với tập lệnh Python, chúng ta cần cài đặt các mô-đun của bên thứ ba, cụ thể là pytsk3, pyewf, unicodecsv, pyvshadowvss. Chúng tôi có thể làm theo các bước dưới đây để trích xuất thông tin từ các tệp VSS

  • Đầu tiên, truy cập khối lượng ảnh thô và xác định tất cả các phân vùng NTFS.

  • Sau đó, trích xuất thông tin từ các bản sao bóng đó bằng cách lặp lại chúng.

  • Bây giờ, cuối cùng chúng ta cần tạo một danh sách tệp dữ liệu trong ảnh chụp nhanh.

Mã Python

Hãy để chúng tôi xem cách sử dụng mã Python cho mục đích này -

Đầu tiên, nhập các thư viện Python sau:

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

Bây giờ, cung cấp các đối số cho trình xử lý dòng lệnh. Ở đây nó sẽ chấp nhận hai đối số - đầu tiên là đường dẫn đến tệp bằng chứng và thứ hai là tệp đầu ra.

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()

Bây giờ, xác thực sự tồn tại của đường dẫn tệp đầu vào và cũng tách thư mục khỏi tệp đầu ra.

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)

Bây giờ, hãy tương tác với khối lượng của tệp bằng chứng bằng cách tạo TSKUtilvật. Nó có thể được thực hiện với sự giúp đỡ củamain() phương pháp như sau -

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)

Bây giờ, xác định một phương pháp để khám phá tệp bóng khối lượng được phân tích cú pháp như sau:

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)

Cuối cùng, xác định phương thức ghi kết quả trong bảng tính như sau:

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)

Khi bạn chạy thành công tập lệnh Python này, chúng tôi sẽ nhận được thông tin nằm trong VSS vào một bảng tính.