Python Dijital Ağ Adli Tıp-II

Önceki bölümde, Python kullanarak ağ adli bilişiminin bazı kavramları ele alındı. Bu bölümde, Python kullanarak ağ adli bilimi daha derin bir düzeyde anlayalım.

Güzel Çorba ile Web Sayfasının Korunması

World Wide Web (WWW) benzersiz bir bilgi kaynağıdır. Ancak, endişe verici bir oranda içerik kaybı nedeniyle mirası yüksek risk altındadır. Bir dizi kültürel miras ve akademik kurum, kar amacı gütmeyen kuruluşlar ve özel işletmeler, ilgili sorunları araştırmış ve web arşivlemesi için teknik çözümlerin geliştirilmesine katkıda bulunmuştur.

Web sayfasının korunması veya web arşivlenmesi, verilerin World Wide Web'den toplanması, verilerin bir arşivde korunmasının sağlanması ve gelecekteki araştırmacılar, tarihçiler ve halkın kullanımına sunulması sürecidir. Web sayfasını korumaya devam etmeden önce, aşağıda verildiği gibi web sayfasının korunmasıyla ilgili bazı önemli konuları tartışalım -

  • Change in Web Resources - Web kaynakları, web sayfasının korunması için bir zorluk olan her gün değişmeye devam ediyor.

  • Large Quantity of Resources - Web sayfasının korunması ile ilgili bir diğer konu da, korunması gereken kaynakların büyük olmasıdır.

  • Integrity - Web sayfaları, bütünlüğünü korumak için yetkisiz değişikliklere, silinmeye veya kaldırılmaya karşı korunmalıdır.

  • Dealing with multimedia data - Web sayfalarını korurken multimedya verileriyle de ilgilenmemiz gerekir ve bunlar bunu yaparken sorunlara neden olabilir.

  • Providing access - Korumanın yanı sıra, web kaynaklarına erişim sağlama ve sahiplik sorunlarını çözme meselesi de çözülmelidir.

Bu bölümde, adlı Python kitaplığını kullanacağız. Beautiful Soup web sayfasının korunması için.

Güzel Çorba Nedir?

Beautiful Soup, HTML ve XML dosyalarından veri çekmek için bir Python kitaplığıdır. İle kullanılabilirurlibçünkü bir çorba nesnesi oluşturmak için bir girişe (belge veya url) ihtiyaç duyar, çünkü web sayfasının kendisini getiremez. Bununla ilgili ayrıntılı olarak www.crummy.com/software/BeautifulSoup/bs4/doc/ adresinden bilgi edinebilirsiniz.

Kullanmadan önce aşağıdaki komutu kullanarak bir üçüncü taraf kitaplığı kurmamız gerektiğini unutmayın -

pip install bs4

Ardından, Anaconda paket yöneticisini kullanarak Beautiful Soup'u aşağıdaki gibi kurabiliriz -

conda install -c anaconda beautifulsoup4

Web Sayfalarını Korumak için Python Komut Dosyası

Beautiful Soup adlı üçüncü taraf kitaplığı kullanarak web sayfalarını korumak için Python betiği burada tartışılmaktadır -

İlk olarak, gerekli kitaplıkları aşağıdaki gibi içe aktarın -

from __future__ import print_function
import argparse

from bs4 import BeautifulSoup, SoupStrainer
from datetime import datetime

import hashlib
import logging
import os
import ssl
import sys
from urllib.request import urlopen

import urllib.error
logger = logging.getLogger(__name__)

Bu komut dosyasının iki konumsal bağımsız değişken alacağını unutmayın; aşağıda gösterildiği gibi, biri korunacak URL ve diğeri istenen çıktı dizini -

if __name__ == "__main__":
   parser = argparse.ArgumentParser('Web Page preservation')
   parser.add_argument("DOMAIN", help="Website Domain")
   parser.add_argument("OUTPUT_DIR", help="Preservation Output Directory")
   parser.add_argument("-l", help="Log file path",
   default=__file__[:-3] + ".log")
   args = parser.parse_args()

Şimdi, döngüde olmak için bir dosya ve akış işleyicisi belirleyerek komut dosyası için günlük kaydını ayarlayın ve edinme sürecini gösterildiği gibi belgeleyin -

logger.setLevel(logging.DEBUG)
msg_fmt = logging.Formatter("%(asctime)-15s %(funcName)-10s""%(levelname)-8s %(message)s")
strhndl = logging.StreamHandler(sys.stderr)
strhndl.setFormatter(fmt=msg_fmt)
fhndl = logging.FileHandler(args.l, mode='a')
fhndl.setFormatter(fmt=msg_fmt)

logger.addHandler(strhndl)
logger.addHandler(fhndl)
logger.info("Starting BS Preservation")
logger.debug("Supplied arguments: {}".format(sys.argv[1:]))
logger.debug("System " + sys.platform)
logger.debug("Version " + sys.version)

Şimdi, istenen çıktı dizininde girdi doğrulamasını aşağıdaki gibi yapalım -

if not os.path.exists(args.OUTPUT_DIR):
   os.makedirs(args.OUTPUT_DIR)
main(args.DOMAIN, args.OUTPUT_DIR)

Şimdi, tanımlayacağız main() Aşağıdaki gibi giriş URL'sinde ek doğrulama ile birlikte asıl adın önündeki gereksiz öğeleri kaldırarak web sitesinin temel adını çıkaran işlev -

def main(website, output_dir):
   base_name = website.replace("https://", "").replace("http://", "").replace("www.", "")
   link_queue = set()
   
   if "http://" not in website and "https://" not in website:
      logger.error("Exiting preservation - invalid user input: {}".format(website))
      sys.exit(1)
   logger.info("Accessing {} webpage".format(website))
   context = ssl._create_unverified_context()

Şimdi urlopen () yöntemini kullanarak URL ile bir bağlantı açmamız gerekiyor. Try-exclude bloğunu aşağıdaki gibi kullanalım -

try:
   index = urlopen(website, context=context).read().decode("utf-8")
except urllib.error.HTTPError as e:
   logger.error("Exiting preservation - unable to access page: {}".format(website))
   sys.exit(2)
logger.debug("Successfully accessed {}".format(website))

Sonraki kod satırları, aşağıda açıklandığı gibi üç işlevi içerir -

  • write_output() ilk web sayfasını çıktı dizinine yazmak için

  • find_links() bu web sayfasındaki bağlantıları tanımlama işlevi

  • recurse_pages() web sayfasındaki tüm bağlantıları yineleme ve keşfetme işlevi.

write_output(website, index, output_dir)
link_queue = find_links(base_name, index, link_queue)
logger.info("Found {} initial links on webpage".format(len(link_queue)))
recurse_pages(website, link_queue, context, output_dir)
logger.info("Completed preservation of {}".format(website))

Şimdi tanımlayalım write_output() yöntem aşağıdaki gibidir -

def write_output(name, data, output_dir, counter=0):
   name = name.replace("http://", "").replace("https://", "").rstrip("//")
   directory = os.path.join(output_dir, os.path.dirname(name))
   
   if not os.path.exists(directory) and os.path.dirname(name) != "":
      os.makedirs(directory)

Web sayfasıyla ilgili bazı ayrıntıları günlüğe kaydetmemiz ve ardından verilerin karmasını kullanarak hash_data() yöntem aşağıdaki gibidir -

logger.debug("Writing {} to {}".format(name, output_dir)) logger.debug("Data Hash: {}".format(hash_data(data)))
path = os.path.join(output_dir, name)
path = path + "_" + str(counter)
with open(path, "w") as outfile:
   outfile.write(data)
logger.debug("Output File Hash: {}".format(hash_file(path)))

Şimdi tanımla hash_data() yardımı ile okuduğumuz yöntem UTF-8 kodlanmış veriler ve ardından SHA-256 hash'i aşağıdaki gibidir -

def hash_data(data):
   sha256 = hashlib.sha256()
   sha256.update(data.encode("utf-8"))
   return sha256.hexdigest()
def hash_file(file):
   sha256 = hashlib.sha256()
   with open(file, "rb") as in_file:
      sha256.update(in_file.read())
return sha256.hexdigest()

Şimdi bir oluşturalım Beautifulsoup altındaki web sayfası verilerinden çıkan nesne find_links() yöntem aşağıdaki gibidir -

def find_links(website, page, queue):
   for link in BeautifulSoup(page, "html.parser",parse_only = SoupStrainer("a", href = True)):
      if website in link.get("href"):
         if not os.path.basename(link.get("href")).startswith("#"):
            queue.add(link.get("href"))
   return queue

Şimdi tanımlamalıyız recurse_pages() aşağıdaki gibi web sitesi URL'sinin, mevcut bağlantı kuyruğunun, doğrulanmamış SSL bağlamının ve çıktı dizininin girişlerini sağlayarak yöntemi -

def recurse_pages(website, queue, context, output_dir):
   processed = []
   counter = 0
   
   while True:
      counter += 1
      if len(processed) == len(queue):
         break
      for link in queue.copy(): if link in processed:
         continue
	   processed.append(link)
      try:
      page = urlopen(link,      context=context).read().decode("utf-8")
      except urllib.error.HTTPError as e:
         msg = "Error accessing webpage: {}".format(link)
         logger.error(msg)
         continue

Şimdi, bir dosyada erişilen her web sayfasının çıktısını, bağlantı adını, sayfa verilerini, çıktı dizinini ve sayacı aşağıdaki gibi ileterek yazın -

write_output(link, page, output_dir, counter)
queue = find_links(website, page, queue)
logger.info("Identified {} links throughout website".format(
   len(queue)))

Şimdi, web sitesinin URL'sini, çıktı dizinini ve günlük dosyasının yolunu sağlayarak bu betiği çalıştırdığımızda, ileride kullanılmak üzere bu web sayfasıyla ilgili ayrıntıları alacağız.

Virüs Avı

Adli analistlerin, güvenlik araştırmacılarının ve olay yanıtlayanların yararlı yazılım ile kötü amaçlı yazılım arasındaki farkı nasıl anlayabileceğini hiç merak ettiniz mi? Cevap sorunun kendisinde yatıyor, çünkü bilgisayar korsanları tarafından hızla üretilen kötü amaçlı yazılım hakkında çalışmadan, araştırmacıların ve uzmanların yararlı yazılım ile kötü amaçlı yazılım arasındaki farkı söylemesi oldukça imkansız. Bu bölümde tartışalımVirusShare, bu görevi gerçekleştirmek için bir araç.

VirusShare'i Anlamak

VirusShare, güvenlik araştırmacılarına, olay müdahale ekiplerine ve adli tıp analistlerine canlı kötü amaçlı kod örnekleri sağlamak için özel sektöre ait en büyük kötü amaçlı yazılım örnekleri koleksiyonudur. 30 milyondan fazla örnek içerir.

VirusShare'in faydası, ücretsiz olarak kullanılabilen kötü amaçlı yazılım karmalarının listesidir. Herkes bu karmaları çok kapsamlı bir karma kümesi oluşturmak için kullanabilir ve bunu potansiyel olarak kötü amaçlı dosyaları tanımlamak için kullanabilir. Ancak VirusShare'i kullanmadan önce, şu adresi ziyaret etmenizi öneririz:https://virusshare.com daha fazla ayrıntı için.

Python kullanarak VirusShare'den Yeni Satırla Sınırlandırılmış Karma Listesi Oluşturma

VirusShare'den bir karma listesi, X-way ve EnCase gibi çeşitli adli tıp araçları tarafından kullanılabilir. Aşağıda tartışılan komut dosyasında, yeni satırla ayrılmış bir karma listesi oluşturmak için VirusShare'den karma listelerin indirilmesini otomatik hale getireceğiz.

Bu komut dosyası için üçüncü taraf bir Python kitaplığına ihtiyacımız var tqdm aşağıdaki gibi indirilebilir -

pip install tqdm

Bu komut dosyasında, önce VirusShare hash sayfasını okuyacağımızı ve en son hash listesini dinamik olarak tanımlayacağımızı unutmayın. Ardından ilerleme çubuğunu başlatacağız ve hash listesini istenen aralıkta indireceğiz.

Önce, aşağıdaki kitaplıkları içe aktarın -

from __future__ import print_function

import argparse
import os
import ssl
import sys
import tqdm

from urllib.request import urlopen
import urllib.error

Bu komut dosyası, hash kümesi için istenen yol olan bir konumsal bağımsız değişken alacaktır -

if __name__ == '__main__':
   parser = argparse.ArgumentParser('Hash set from VirusShare')
   parser.add_argument("OUTPUT_HASH", help = "Output Hashset")
   parser.add_argument("--start", type = int, help = "Optional starting location")
   args = parser.parse_args()

Şimdi, standart giriş doğrulamasını aşağıdaki gibi gerçekleştireceğiz -

directory = os.path.dirname(args.OUTPUT_HASH)
if not os.path.exists(directory):
   os.makedirs(directory)
if args.start:
   main(args.OUTPUT_HASH, start=args.start)
else:
   main(args.OUTPUT_HASH)

Şimdi tanımlamalıyız main() ile işlev **kwargs bir argüman olarak bu bir sözlük oluşturacaktır çünkü aşağıda gösterildiği gibi sağlanan anahtar argümanları desteklemek için başvurabiliriz -

def main(hashset, **kwargs):
   url = "https://virusshare.com/hashes.4n6"
   print("[+] Identifying hash set range from {}".format(url))
   context = ssl._create_unverified_context()

Şimdi, kullanarak VirusShare hash sayfasını açmamız gerekiyor urlib.request.urlopen()yöntem. Try-exclude bloğunu aşağıdaki gibi kullanacağız -

try:
   index = urlopen(url, context = context).read().decode("utf-8")
except urllib.error.HTTPError as e:
   print("[-] Error accessing webpage - exiting..")
   sys.exit(1)

Şimdi, indirilen sayfalardan en son hash listesini tanımlayın. Bunu HTML'nin son örneğini bularak yapabilirsinizhrefVirusShare karma listesine etiket. Aşağıdaki kod satırları ile yapılabilir -

tag = index.rfind(r'a href = "hashes/VirusShare_')
stop = int(index[tag + 27: tag + 27 + 5].lstrip("0"))

if "start" not in kwa<rgs:
   start = 0
else:
   start = kwargs["start"]

if start < 0 or start > stop:
   print("[-] Supplied start argument must be greater than or equal ""to zero but less than the latest hash list, ""currently: {}".format(stop))
sys.exit(2)
print("[+] Creating a hashset from hash lists {} to {}".format(start, stop))
hashes_downloaded = 0

Şimdi kullanacağız tqdm.trange() aşağıdaki gibi bir döngü ve ilerleme çubuğu oluşturma yöntemi -

for x in tqdm.trange(start, stop + 1, unit_scale=True,desc="Progress"):
   url_hash = "https://virusshare.com/hashes/VirusShare_"\"{}.md5".format(str(x).zfill(5))
   try:
      hashes = urlopen(url_hash, context=context).read().decode("utf-8")
      hashes_list = hashes.split("\n")
   except urllib.error.HTTPError as e:
      print("[-] Error accessing webpage for hash list {}"" - continuing..".format(x))
   continue

Yukarıdaki adımları başarıyla gerçekleştirdikten sonra, metin dosyasının altına eklemek için hash set metin dosyasını + modunda açacağız.

with open(hashset, "a+") as hashfile:
   for line in hashes_list:
   if not line.startswith("#") and line != "":
      hashes_downloaded += 1
      hashfile.write(line + '\n')
   print("[+] Finished downloading {} hashes into {}".format(
      hashes_downloaded, hashset))

Yukarıdaki komut dosyasını çalıştırdıktan sonra, metin biçiminde MD5 hash değerlerini içeren en son hash listesini alacaksınız.