Windows-III의 중요한 아티팩트
이 장에서는 조사자가 Windows에서 포렌식 분석 중에 얻을 수있는 추가 아티팩트에 대해 설명합니다.
이벤트 로그
이름이 제안하는 Windows 이벤트 로그 파일은 사용자가 컴퓨터에 로그온 할 때, 프로그램에 오류가 발생할 때, 시스템 변경, RDP 액세스, 응용 프로그램 특정 이벤트 등에 대한 중요한 이벤트를 저장하는 특수 파일입니다. 사이버 조사자는 항상 이벤트에 관심이 있습니다. 시스템 액세스에 대한 유용한 기록 정보를 많이 제공하므로 정보를 기록합니다. 다음 Python 스크립트에서 레거시 및 현재 Windows 이벤트 로그 형식을 모두 처리합니다.
Python 스크립트의 경우 타사 모듈을 설치해야합니다. pytsk3, pyewf, unicodecsv, pyevt and pyevt엑스. 아래 단계에 따라 이벤트 로그에서 정보를 추출 할 수 있습니다.
먼저 입력 인수와 일치하는 모든 이벤트 로그를 검색합니다.
그런 다음 파일 서명 확인을 수행하십시오.
이제 적절한 라이브러리에서 찾은 각 이벤트 로그를 처리합니다.
마지막으로 스프레드 시트에 출력을 씁니다.
파이썬 코드
이 목적으로 파이썬 코드를 사용하는 방법을 살펴 보겠습니다.
먼저 다음 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)
위의 스크립트를 성공적으로 실행하면 스프레드 시트에서 이벤트 로그 정보를 가져옵니다.
인터넷 역사
인터넷 기록은 법의학 분석가에게 매우 유용합니다. 대부분의 사이버 범죄는 인터넷을 통해서만 발생합니다. Windows 포렌식에 대해 논의하면서 Internet Explorer에서 인터넷 기록을 추출하는 방법을 살펴 보겠습니다. Internet Explorer는 기본적으로 Windows와 함께 제공됩니다.
Internet Explorer에서는 인터넷 기록이 index.dat파일. 다음에서 정보를 추출 할 Python 스크립트를 살펴 보겠습니다.index.dat 파일.
아래 단계에 따라 정보를 추출 할 수 있습니다. index.dat 파일-
먼저 index.dat 시스템 내의 파일.
그런 다음 해당 파일을 반복하여 해당 파일에서 정보를 추출하십시오.
이제이 모든 정보를 CSV 보고서에 씁니다.
파이썬 코드
이 목적으로 파이썬 코드를 사용하는 방법을 살펴 보겠습니다.
먼저 다음 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)
이제 다음 개체를 만들어 증거 파일을 해석합니다. TSKUtilindex.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)
위의 스크립트를 실행하면 CSV 파일의 index.dat 파일에서 정보를 가져옵니다.
볼륨 섀도 복사본
섀도 복사본은 컴퓨터 파일의 백업 복사본 또는 스냅 샷을 수동 또는 자동으로 생성하기 위해 Windows에 포함 된 기술입니다. 볼륨 스냅 샷 서비스 또는 VSS (볼륨 섀도우 서비스)라고도합니다.
이러한 VSS 파일의 도움으로 법의학 전문가는 시간이 지남에 따라 시스템이 어떻게 변경되었는지와 컴퓨터에 어떤 파일이 존재했는지에 대한 과거 정보를 얻을 수 있습니다. 섀도 복사본 기술을 사용하려면 섀도 복사본을 만들고 저장하려면 파일 시스템이 NTFS 여야합니다.
이 섹션에서는 포렌식 이미지에있는 모든 볼륨의 섀도 복사본에 액세스하는 데 도움이되는 Python 스크립트를 볼 것입니다.
Python 스크립트의 경우 타사 모듈을 설치해야합니다. pytsk3, pyewf, unicodecsv, pyvshadow 과 vss. 아래 단계에 따라 VSS 파일에서 정보를 추출 할 수 있습니다.
먼저 원시 이미지의 볼륨에 액세스하고 모든 NTFS 파티션을 식별합니다.
그런 다음 섀도 복사본을 반복하여 정보를 추출합니다.
이제 마지막으로 스냅 샷 내에 데이터 목록을 파일로 만들어야합니다.
파이썬 코드
이 목적으로 파이썬 코드를 사용하는 방법을 살펴 보겠습니다.
먼저 다음 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에있는 정보를 스프레드 시트로 가져옵니다.