Windows-III'teki Önemli Eserler
Bu bölümde, bir araştırmacının Windows'ta adli tıp analizi sırasında elde edebileceği diğer eserler açıklanacaktır.
Olay Günlükleri
Windows olay günlüğü dosyaları, ad öngörüleri olarak, kullanıcının bilgisayarda oturum açması, program bir hatayla karşılaşması, sistem değişiklikleri, RDP erişimi, uygulamaya özel olaylar vb. Gibi önemli olayları depolayan özel dosyalardır. Siber araştırmacılar her zaman olaylarla ilgilenirler. günlük bilgileri, çünkü sisteme erişim hakkında birçok yararlı tarihsel bilgi sağlar. Aşağıdaki Python betiğinde hem eski hem de mevcut Windows olay günlüğü formatlarını işleyeceğiz.
Python betiği için, üçüncü taraf modülleri kurmamız gerekiyor. pytsk3, pyewf, unicodecsv, pyevt and pyevtx. Olay günlüklerinden bilgi almak için aşağıda verilen adımları takip edebiliriz -
İlk olarak, giriş bağımsız değişkeniyle eşleşen tüm olay günlüklerini arayın.
Ardından, dosya imzası doğrulaması yapın.
Şimdi, bulunan her olay günlüğünü uygun kitaplıkla işleyin.
Son olarak, çıktıyı elektronik tabloya yazın.
Python Kodu
Bu amaçla Python kodunu nasıl kullanacağımızı görelim -
Önce, aşağıdaki Python kitaplıklarını içe aktarın -
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
Şimdi, komut satırı işleyicisi için bağımsız değişkenleri sağlayın. Burada üç argümanı kabul edeceğini unutmayın - ilki kanıt dosyasına giden yol, ikincisi kanıt dosyasının türü ve üçüncüsü işlenecek olay günlüğünün adıdır.
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)
Şimdi, kullanıcı tarafından sağlanan yolun varlığını sorgulamak için olay günlükleriyle etkileşim kurun. TSKUtilnesne. Yardımı ile yapılabilirmain() yöntem aşağıdaki gibidir -
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)
Şimdi, imza doğrulaması yapmalı ve ardından tüm içeriği mevcut dizine yazacak bir yöntem tanımlamalıyız -
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
Son olarak, çıktıyı elektronik tabloya yazmak için aşağıdaki gibi bir yöntem tanımlayın -
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)
Yukarıdaki komut dosyasını başarıyla çalıştırdıktan sonra, olayların bilgilerini elektronik tabloda alacağız.
İnternet Geçmişi
İnternet geçmişi, adli tıp analistleri için çok yararlıdır; siber suçların çoğu yalnızca internet üzerinden gerçekleştiği için. Windows adli tıp hakkında tartışırken Internet Explorer'dan internet geçmişini nasıl çıkaracağımızı görelim ve Internet Explorer varsayılan olarak Windows ile birlikte gelir.
Internet Explorer'da internet geçmişi şuraya kaydedilir: index.datdosya. Bilgiyi buradan çıkaracak bir Python betiğine bakalım.index.dat dosya.
Bilgi almak için aşağıda verilen adımları takip edebiliriz index.dat dosyalar -
Önce şunu arayın: index.dat sistem içindeki dosyalar.
Ardından, bu dosyadaki bilgileri yineleyerek çıkarın.
Şimdi, tüm bu bilgileri bir CSV raporuna yazın.
Python Kodu
Bu amaçla Python kodunu nasıl kullanacağımızı görelim -
Önce, aşağıdaki Python kitaplıklarını içe aktarın -
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
Şimdi, komut satırı işleyicisi için bağımsız değişkenler sağlayın. Burada iki argümanı kabul edeceğine dikkat edin - ilki kanıt dosyasına giden yol, ikincisi ise kanıt dosyasının türü olacaktır -
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)
Şimdi, bir nesne oluşturarak kanıt dosyasını yorumlayın. TSKUtilindex.dat dosyalarını bulmak için dosya sisteminde yineleyin. Tanımlanarak yapılabilirmain() aşağıdaki gibi işlev -
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)
Şimdi, index.dat dosyasının bilgilerini mevcut çalışma dizinine kopyalayabileceğimiz ve daha sonra üçüncü taraf bir modül tarafından işlenebilecek bir işlev tanımlayın -
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
Şimdi, yerleşik işlevin yardımıyla imza doğrulamasını gerçekleştirmek için aşağıdaki kodu kullanın: 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)
Şimdi, aşağıda gösterildiği gibi CSV dosyasında çıktıyı yazdıracak bir yöntem tanımlayın -
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)
Yukarıdaki betiği çalıştırdıktan sonra, CSV dosyasındaki index.dat dosyasından bilgileri alacağız.
Birim Gölge Kopyaları
Gölge kopya, bilgisayar dosyalarının yedek kopyalarını veya anlık görüntülerini manuel veya otomatik olarak almak için Windows'ta bulunan teknolojidir. Birim anlık görüntü hizmeti veya birim gölge hizmeti (VSS) olarak da adlandırılır.
Bu VSS dosyalarının yardımıyla, adli tıp uzmanları, sistemin zaman içinde nasıl değiştiği ve bilgisayarda hangi dosyaların bulunduğu hakkında bazı tarihsel bilgilere sahip olabilir. Gölge kopya teknolojisi, gölge kopyaları oluşturmak ve depolamak için dosya sisteminin NTFS olmasını gerektirir.
Bu bölümde, adli görüntüde bulunan herhangi bir gölge kopya hacmine erişmeye yardımcı olan bir Python betiği göreceğiz.
Python betiği için üçüncü taraf modülleri pytsk3, pyewf, unicodecsv, pyvshadow ve vss. VSS dosyalarından bilgi çıkarmak için aşağıda verilen adımları takip edebiliriz
İlk olarak, ham görüntünün hacmine erişin ve tüm NTFS bölümlerini tanımlayın.
Ardından, bu gölge kopyalardan bilgileri yineleyerek çıkarın.
Şimdi, nihayet anlık görüntülerde verilerin bir dosya listesi oluşturmamız gerekiyor.
Python Kodu
Bu amaçla Python kodunu nasıl kullanacağımızı görelim -
Önce, aşağıdaki Python kitaplıklarını içe aktarın -
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
Şimdi, komut satırı işleyicisi için bağımsız değişkenler sağlayın. Burada iki argüman kabul edecektir - ilki kanıt dosyasına giden yol ve ikincisi çıktı dosyasıdır.
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()
Şimdi, girdi dosyası yolunun varlığını doğrulayın ve ayrıca dizini çıktı dosyasından ayırın.
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)
Şimdi, kanıt dosyasının hacmiyle etkileşime girmek için TSKUtilnesne. Yardımı ile yapılabilirmain() yöntem aşağıdaki gibidir -
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)
Şimdi, ayrıştırılmış birim gölge dosyasını keşfetmek için aşağıdaki gibi bir yöntem tanımlayın -
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)
Son olarak, sonucu elektronik tabloya yazma yöntemini aşağıdaki gibi tanımlayın -
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)
Bu Python betiğini başarıyla çalıştırdıktan sonra, VSS'de bulunan bilgileri bir elektronik tabloya alacağız.