📅  最后修改于: 2020-11-07 08:12:56             🧑  作者: Mango
本章将解释使用Python执行网络取证的基本原理。
网络取证是数字取证的一个分支,用于监视和分析局域网和WAN(广域网)中的计算机网络流量,以进行信息收集,证据收集或入侵检测。网络取证在调查数字犯罪(例如盗窃知识产权或信息泄漏)中起着至关重要的作用。网络通信的图片有助于研究人员解决以下一些关键问题-
访问了哪些网站?
我们的网络上载了什么样的内容?
从我们的网络下载了什么样的内容?
正在访问哪些服务器?
是否有人在公司防火墙之外发送敏感信息?
IEF是一种数字取证工具,用于查找,分析和呈现在不同的数字媒体(例如计算机,智能手机,平板电脑等)上找到的数字证据。它非常受欢迎,并被成千上万的取证专业人员使用。
由于它的流行,法医专家在很大程度上使用了IEF。 IEF的一些用途如下-
由于其强大的搜索功能,它可用于同时搜索多个文件或数据媒体。
它也用于通过新的雕刻技术从RAM的未分配空间中恢复已删除的数据。
如果调查人员要在打开之日以原始格式重建网页,则可以使用IEF。
它还用于搜索逻辑或物理磁盘卷。
IEF将数据存储在SQLite数据库中,并且以下Python脚本将动态标识IEF数据库中的结果表并将其转储到相应的CSV文件中。
此过程按以下步骤完成
首先,生成IEF结果数据库,该数据库将是一个以.db扩展名结尾的SQLite数据库文件。
然后,查询该数据库以标识所有表。
最后,将此结果表写入单个CSV文件。
让我们看看如何为此目的使用Python代码-
对于Python脚本,请按如下所示导入必要的库-
from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
现在,我们需要提供IEF数据库文件的路径-
if __name__ == '__main__':
parser = argparse.ArgumentParser('IEF to CSV')
parser.add_argument("IEF_DATABASE", help="Input IEF database")
parser.add_argument("OUTPUT_DIR", help="Output DIR")
args = parser.parse_args()
现在,我们将确认IEF数据库的存在,如下所示:
if not os.path.exists(args.OUTPUT_DIR):
os.makedirs(args.OUTPUT_DIR)
if os.path.exists(args.IEF_DATABASE) and \ os.path.isfile(args.IEF_DATABASE):
main(args.IEF_DATABASE, args.OUTPUT_DIR)
else:
print("[-] Supplied input file {} does not exist or is not a " "file".format(args.IEF_DATABASE))
sys.exit(1)
现在,就像我们在早期脚本中所做的那样,按如下所示与SQLite数据库建立连接以通过游标执行查询-
def main(database, out_directory):
print("[+] Connecting to SQLite database")
conn = sqlite3.connect(database)
c = conn.cursor()
以下代码行将从数据库中获取表的名称-
print("List of all tables to extract")
c.execute("select * from sqlite_master where type = 'table'")
tables = [x[2] for x in c.fetchall() if not x[2].startswith('_') and not x[2].endswith('_DATA')]
现在,我们将从表中选择所有数据,并通过在游标对象上使用fetchall()方法,将包含整个表数据的元组列表存储在变量中-
print("Dumping {} tables to CSV files in {}".format(len(tables), out_directory))
for table in tables:
c.execute("pragma table_info('{}')".format(table))
table_columns = [x[1] for x in c.fetchall()]
c.execute("select * from '{}'".format(table))
table_data = c.fetchall()
现在,通过使用CSV_Writer()方法,我们将内容写入CSV文件-
csv_name = table + '.csv'
csv_path = os.path.join(out_directory, csv_name)
print('[+] Writing {} table to {} CSV file'.format(table,csv_name))
with open(csv_path, "w", newline = "") as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerow(table_columns)
csv_writer.writerows(table_data)
上面的脚本将从IEF数据库的表中获取所有数据,并将内容写入我们选择的CSV文件中。
从IEF结果数据库中,我们可以获取IEF本身不一定支持的更多信息。我们可以使用IEF结果数据库从电子邮件服务提供商(如Yahoo,Google等)中获取缓存的数据(信息的双向产品)。
以下是Python脚本,用于使用IEF数据库从Yahoo邮件访问缓存的数据信息,该信息可在Google Chrome上访问。请注意,步骤与上一个Python脚本中的步骤大致相同。
首先,如下所示导入Python所需的库-
from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
import json
现在,提供到IEF数据库文件的路径,以及最后一个脚本中完成的两个命令行处理程序接受的位置参数-
if __name__ == '__main__':
parser = argparse.ArgumentParser('IEF to CSV')
parser.add_argument("IEF_DATABASE", help="Input IEF database")
parser.add_argument("OUTPUT_DIR", help="Output DIR")
args = parser.parse_args()
现在,确认存在IEF数据库,如下所示:
directory = os.path.dirname(args.OUTPUT_CSV)
if not os.path.exists(directory):os.makedirs(directory)
if os.path.exists(args.IEF_DATABASE) and \ os.path.isfile(args.IEF_DATABASE):
main(args.IEF_DATABASE, args.OUTPUT_CSV)
else: print("Supplied input file {} does not exist or is not a " "file".format(args.IEF_DATABASE))
sys.exit(1)
现在,按如下所示与SQLite数据库建立连接以通过游标执行查询:
def main(database, out_csv):
print("[+] Connecting to SQLite database")
conn = sqlite3.connect(database)
c = conn.cursor()
您可以使用以下代码行来获取Yahoo Mail联系人缓存记录的实例-
print("Querying IEF database for Yahoo Contact Fragments from " "the Chrome Cache Records Table")
try:
c.execute("select * from 'Chrome Cache Records' where URL like " "'https://data.mail.yahoo.com" "/classicab/v2/contacts/?format=json%'")
except sqlite3.OperationalError:
print("Received an error querying the database -- database may be" "corrupt or not have a Chrome Cache Records table")
sys.exit(2)
现在,从上述查询返回的元组列表将被保存到变量中,如下所示:
contact_cache = c.fetchall()
contact_data = process_contacts(contact_cache)
write_csv(contact_data, out_csv)
请注意,这里我们将使用两种方法,即process_contacts()来设置结果列表以及遍历每个联系人缓存记录,并使用json.loads()将从表中提取的JSON数据存储到变量中以进行进一步处理-
def process_contacts(contact_cache):
print("[+] Processing {} cache files matching Yahoo contact cache " " data".format(len(contact_cache)))
results = []
for contact in contact_cache:
url = contact[0]
first_visit = contact[1]
last_visit = contact[2]
last_sync = contact[3]
loc = contact[8]
contact_json = json.loads(contact[7].decode())
total_contacts = contact_json["total"]
total_count = contact_json["count"]
if "contacts" not in contact_json:
continue
for c in contact_json["contacts"]:
name, anni, bday, emails, phones, links = ("", "", "", "", "", "")
if "name" in c:
name = c["name"]["givenName"] + " " + \ c["name"]["middleName"] + " " + c["name"]["familyName"]
if "anniversary" in c:
anni = c["anniversary"]["month"] + \"/" + c["anniversary"]["day"] + "/" + \c["anniversary"]["year"]
if "birthday" in c:
bday = c["birthday"]["month"] + "/" + \c["birthday"]["day"] + "/" + c["birthday"]["year"]
if "emails" in c:
emails = ', '.join([x["ep"] for x in c["emails"]])
if "phones" in c:
phones = ', '.join([x["ep"] for x in c["phones"]])
if "links" in c:
links = ', '.join([x["ep"] for x in c["links"]])
现在对于公司,标题和注释,使用get方法,如下所示:
company = c.get("company", "")
title = c.get("jobTitle", "")
notes = c.get("notes", "")
现在,让我们将元数据列表和提取的数据元素追加到结果列表,如下所示:
results.append([url, first_visit, last_visit, last_sync, loc, name, bday,anni, emails, phones, links, company, title, notes,total_contacts, total_count])
return results
现在,通过使用CSV_Writer()方法,我们将内容写入CSV文件-
def write_csv(data, output):
print("[+] Writing {} contacts to {}".format(len(data), output))
with open(output, "w", newline="") as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerow([
"URL", "First Visit (UTC)", "Last Visit (UTC)",
"Last Sync (UTC)", "Location", "Contact Name", "Bday",
"Anniversary", "Emails", "Phones", "Links", "Company", "Title",
"Notes", "Total Contacts", "Count of Contacts in Cache"])
csv_writer.writerows(data)
借助上述脚本,我们可以使用IEF数据库处理来自Yahoo邮件的缓存数据。