Python Digital Network Forensics-I
Bab ini akan menjelaskan dasar-dasar yang terlibat dalam melakukan forensik jaringan menggunakan Python.
Memahami Forensik Jaringan
Forensik jaringan adalah cabang forensik digital yang menangani pemantauan dan analisis lalu lintas jaringan komputer, baik lokal maupun WAN (jaringan area luas), untuk keperluan pengumpulan informasi, pengumpulan bukti, atau deteksi intrusi. Forensik jaringan memainkan peran penting dalam menyelidiki kejahatan digital seperti pencurian kekayaan intelektual atau kebocoran informasi. Gambar komunikasi jaringan membantu penyidik untuk memecahkan beberapa pertanyaan penting sebagai berikut -
Situs web apa yang telah diakses?
Jenis konten apa yang telah diunggah di jaringan kami?
Jenis konten apa yang telah diunduh dari jaringan kami?
Server apa yang sedang diakses?
Apakah seseorang mengirimkan informasi sensitif di luar firewall perusahaan?
Internet Evidence Finder (IEF)
IEF adalah alat forensik digital untuk menemukan, menganalisis dan menyajikan bukti digital yang ditemukan di berbagai media digital seperti komputer, smartphone, tablet, dll. IEF sangat populer dan digunakan oleh ribuan profesional forensik.
Penggunaan IEF
Karena popularitasnya, IEF banyak digunakan oleh para profesional forensik. Beberapa kegunaan IEF adalah sebagai berikut -
Karena kemampuan pencariannya yang kuat, ini digunakan untuk mencari banyak file atau media data secara bersamaan.
Ini juga digunakan untuk memulihkan data yang dihapus dari ruang RAM yang tidak terisi melalui teknik ukiran baru.
Jika penyelidik ingin membangun kembali halaman web dalam format aslinya pada tanggal dibuka, mereka dapat menggunakan IEF.
Ini juga digunakan untuk mencari volume disk logis atau fisik.
Membuang Laporan dari IEF ke CSV menggunakan Python
IEF menyimpan data dalam database SQLite dan mengikuti skrip Python akan secara dinamis mengidentifikasi tabel hasil dalam database IEF dan membuangnya ke file CSV masing-masing.
Proses ini dilakukan dalam langkah-langkah yang ditunjukkan di bawah ini
Pertama, buat database hasil IEF yang akan menjadi file database SQLite yang diakhiri dengan ekstensi .db.
Kemudian, kueri database tersebut untuk mengidentifikasi semua tabel.
Terakhir, tulis tabel hasil ini ke file CSV individu.
Kode Python
Mari kita lihat bagaimana menggunakan kode Python untuk tujuan ini -
Untuk skrip Python, impor pustaka yang diperlukan sebagai berikut -
from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
Sekarang, kita perlu menyediakan jalur ke file database 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()
Sekarang, kami akan mengkonfirmasi keberadaan database IEF sebagai berikut -
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)
Sekarang, seperti yang kita lakukan di skrip sebelumnya, buat koneksi dengan database SQLite sebagai berikut untuk mengeksekusi kueri melalui kursor -
def main(database, out_directory):
print("[+] Connecting to SQLite database")
conn = sqlite3.connect(database)
c = conn.cursor()
Baris kode berikut akan mengambil nama tabel dari database -
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')]
Sekarang, kita akan memilih semua data dari tabel dan dengan menggunakan fetchall() metode pada objek kursor kita akan menyimpan daftar tupel yang berisi data tabel secara keseluruhan dalam variabel -
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()
Sekarang, dengan menggunakan CSV_Writer() metode kami akan menulis konten dalam file 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)
Script di atas akan mengambil semua data dari tabel database IEF dan menulis isinya ke file CSV pilihan kita.
Bekerja dengan Data Cache
Dari database hasil IEF, kita dapat memperoleh lebih banyak informasi yang belum tentu didukung oleh IEF itu sendiri. Kita dapat mengambil data yang di-cache, produk bi untuk informasi, dari penyedia layanan email seperti Yahoo, Google dll dengan menggunakan database hasil IEF.
Berikut adalah script Python untuk mengakses informasi data cache dari Yahoo mail, diakses di Google Chrome, dengan menggunakan database IEF. Perhatikan bahwa langkah-langkahnya kurang lebih sama seperti yang diikuti di skrip Python terakhir.
Pertama, impor pustaka yang diperlukan untuk Python sebagai berikut -
from __future__ import print_function
import argparse
import csv
import os
import sqlite3
import sys
import json
Sekarang, berikan jalur ke file database IEF bersama dengan dua argumen posisi yang diterima oleh penangan baris perintah seperti yang dilakukan di skrip terakhir -
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()
Sekarang, konfirmasikan keberadaan database IEF sebagai berikut -
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)
Sekarang, buat koneksi dengan database SQLite sebagai berikut untuk mengeksekusi kueri melalui kursor -
def main(database, out_csv):
print("[+] Connecting to SQLite database")
conn = sqlite3.connect(database)
c = conn.cursor()
Anda dapat menggunakan baris kode berikut untuk mengambil contoh catatan cache kontak 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)
Sekarang, daftar tupel yang dikembalikan dari kueri di atas untuk disimpan ke dalam variabel sebagai berikut -
contact_cache = c.fetchall()
contact_data = process_contacts(contact_cache)
write_csv(contact_data, out_csv)
Perhatikan bahwa di sini kita akan menggunakan dua metode yaitu process_contacts() untuk menyiapkan daftar hasil serta melakukan iterasi melalui setiap catatan cache kontak dan json.loads() untuk menyimpan data JSON yang diekstrak dari tabel menjadi variabel untuk manipulasi lebih lanjut -
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"]])
Sekarang untuk perusahaan, judul dan catatan, metode get digunakan seperti yang ditunjukkan di bawah ini -
company = c.get("company", "")
title = c.get("jobTitle", "")
notes = c.get("notes", "")
Sekarang, mari kita tambahkan daftar metadata dan elemen data yang diekstrak ke daftar hasil sebagai berikut -
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
Sekarang, dengan menggunakan CSV_Writer() metode, kami akan menulis konten dalam file 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)
Dengan bantuan script di atas, kita dapat memproses data yang di-cache dari Yahoo mail dengan menggunakan database IEF.