Python-digital-forensics-python-digital-network-forensics
Pythonデジタルネットワークフォレンジック-I
この章では、Pythonを使用してネットワークフォレンジックを実行する際の基礎について説明します。
ネットワークフォレンジックについて
ネットワークフォレンジックは、情報収集、証拠収集、または侵入検知を目的として、ローカルおよびWAN(ワイドエリアネットワーク)の両方のコンピューターネットワークトラフィックの監視と分析を扱うデジタルフォレンジックのブランチです。 ネットワークフォレンジックは、知的財産の盗難や情報漏洩などのデジタル犯罪の調査に重要な役割を果たします。 ネットワーク通信の写真は、次のように調査員がいくつかの重要な問題を解決するのに役立ちます-
- どのWebサイトにアクセスしましたか?
- ネットワークにはどのようなコンテンツがアップロードされていますか?
- ネットワークからどのようなコンテンツがダウンロードされましたか?
- どのサーバーにアクセスしていますか?
- 誰かが会社のファイアウォールの外に機密情報を送信していますか?
インターネットエビデンスファインダー(IEF)
IEFは、コンピューター、スマートフォン、タブレットなどのさまざまなデジタルメディアで見つかったデジタル証拠を検索、分析、および提示するためのデジタルフォレンジックツールです。 これは非常に人気があり、数千人の法医学専門家によって使用されています。
IEFの使用
IEFは人気があるため、科学捜査の専門家によってかなり使用されています。 IEFの用途のいくつかは次のとおりです-
- その強力な検索機能により、複数のファイルまたはデータメディアを同時に検索するために使用されます。
- また、新しいカービング手法により、RAMの未割り当て領域から削除されたデータを回復するためにも使用されます。
- 調査者が、開かれた日に元の形式でWebページを再構築する場合は、IEFを使用できます。
- また、論理ディスクボリュームまたは物理ディスクボリュームの検索にも使用されます。
Pythonを使用してIEFからCSVにレポートをダンプする
IEFはSQLiteデータベースにデータを保存し、次のPythonスクリプトはIEFデータベース内の結果テーブルを動的に識別し、それぞれのCSVファイルにダンプします。
このプロセスは、以下に示す手順で実行されます
- まず、拡張子が.dbのSQLiteデータベースファイルであるIEF結果データベースを生成します。
- 次に、そのデータベースを照会して、すべてのテーブルを識別します。 *最後に、この結果テーブルを個々のCSVファイルに書き込みます。
Pythonコード
この目的のために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結果データベースを使用します。
以下は、IEFデータベースを使用して、Google ChromeでアクセスされるYahooメールからキャッシュされたデータ情報にアクセスするためのPythonスクリプトです。 手順は、最後のPythonスクリプトの手順とほぼ同じであることに注意してください。
まず、次のようにPythonに必要なライブラリをインポートします-
from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
import json
ここで、最後のスクリプトで行われたように、コマンドラインハンドラーが受け入れる2つの位置引数とともに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メールからキャッシュされたデータを処理できます。