In diesem Abschnitt werden wir die Komponenten untersuchen, die zum Aufbau einer erfolgreichen Threat-Intelligence-Plattform erforderlich sind. Wie bereits erwähnt, werden in diesem Kurs Daten-Scraping-Techniken an fiktiven Websites getestet, die Sie lokal mit Docker einrichten können. Hier erhalten Sie einen Einblick in die Arten von Websites, mit denen wir arbeiten werden.

Die in diesem Abschnitt behandelten Themen umfassen:

  1. Clearnet-Forum
  2. Tor-Forum
  3. Nicht-LLM-Ansatz für die Textanalyse
  4. Umgang mit Anti-Scraping-Technologien
  5. Intelligence-Watchlists

Clearnet-Forum

Obwohl die meisten Cybercrime-Websites nicht stark auf JavaScript angewiesen sind, ist es wichtig zu verstehen, wie man Daten aus Clearnet-Websites scrapt. Die meisten Clearnet-Websites rufen Daten häufig mithilfe von JavaScript aus dem Backend ab und aktualisieren dann das Frontend dynamisch. Wenn Sie den Quellcode der Seite anzeigen, finden Sie möglicherweise keine verwertbaren Daten, da der Inhalt nach dem ersten Laden der Seite geladen wird. Ein gutes Beispiel ist unser eigener Scraper, bei dem fast alle Inhalte dynamisch sind und sich ständig ändern.

In solchen Fällen verwenden wir Headless Browser wie Playwright, um mit der Seite zu interagieren und Daten aus dem DOM (Document Object Model) zu extrahieren, nachdem sie vollständig geladen und gerendert wurde.

Um dies zu üben, können Sie das für diesen Kurs erstellte Dummy-Clearnet-Cybercrime-Forum von GitHub herunterladen:

https://github.com/CyberMounties/clearnet_forum

Das Repository enthält eine vollständige Anleitung zur Einrichtung des Forums auf Ihrem lokalen Rechner.


Tor-Forum

Ein Großteil der Cyberkriminalität findet aufgrund seiner datenschutzorientierten Architektur auf Tor statt. Unser simuliertes Tor-Forum wurde ohne JavaScript entwickelt, um reale Szenarien nachzubilden und gleichzeitig einfach zu bleiben. Im Gegensatz zum Clearnet-Forum, das über eine Shoutbox (allgemeiner Chat) verfügt, ist dies beim Tor-Forum nicht der Fall.

Sie können das Dummy-Tor-Forum für diesen Kurs einrichten, indem Sie es von GitHub herunterladen: https://github.com/CyberMounties/tornet_forum

Das Repository enthält detaillierte Anweisungen zum Konfigurieren und Ausführen des Forums vor Ort.


Nicht-LLM-Ansatz zur Textanalyse

Anstelle von Large Language Models (LLMs) oder KI können Sie auch traditionelle Natural Language Processing (NLP)-Bibliotheken wie spaCy zur Datenanalyse verwenden. Diese Tools können bei Aufgaben wie Textklassifizierung, Entitätserkennung und Musterabgleich helfen. Sie haben jedoch Einschränkungen: In der Regel erfordern sie mehr manuelle Anpassungen, die Erstellung von Regeln und Training, um mit LLMs vergleichbare Ergebnisse zu erzielen. Sie können zwar für bestimmte Anwendungsfälle effektiv sein, aber ihre Einrichtung für komplexe Aufgaben wie die Identifizierung von IAB-Aktivitäten kann erheblich mehr Zeit und Aufwand erfordern.

Beispiel mit spaCy

Erstellen Sie ein Verzeichnis, richten Sie eine virtuelle Umgebung ein und installieren Sie die Abhängigkeiten:

mkdir non_llm_cti && cd non_llm_cti
python3 -m venv venv
source venv/bin/activate
pip install spacy
python -m spacy download en_core_web_sm

Erstellen Sie eine Skriptdatei mit dem Namen „main.py” und fügen Sie den folgenden Code ein:

import spacy
import re
from typing import Tuple

# Load spaCy's English model
nlp = spacy.load("en_core_web_sm")

# Define keywords and patterns for initial access detection
ACCESS_KEYWORDS = {
    "access", "vpn", "rdp", "network", "server", "admin", "credentials", 
    "login", "remote", "domain", "shell", "backdoor"
}
SALE_KEYWORDS = {"sell", "selling", "offer", "offering", "sale", "available", "price", "btc", "escrow"}
NEGATIVE_KEYWORDS = {"hosting", "vps", "software", "malware", "loader", "botnet"}
OBFUSCATION_PATTERNS = [
    r"acc[e3]ss",  # Handles "acc3ss", "access"
    r"v[pP][nN]",  # Handles "VPN", "VpN", "vpn"
    r"rd[pP]",     # Handles "RDP", "rdp"
]

def preprocess_text(text: str) -> str:
    """Normalize text by converting to lowercase and handling basic obfuscation."""
    text = text.lower()
    for pattern in OBFUSCATION_PATTERNS:
        text = re.sub(pattern, re.search(pattern, text).group().replace("3", "e"), text) if re.search(pattern, text) else text
    return text

def analyze_post(text: str) -> Tuple[str, float]:
    """
    Analyze a post to determine if it offers initial access.
    Returns: (classification, confidence_score)
    Classifications: 'positive' (initial access sale), 'neutral' (general ad), 'negative' (unrelated)
    """
    # Preprocess text
    text = preprocess_text(text)
    doc = nlp(text)

    # Initialize scores
    access_score = 0.0
    sale_score = 0.0
    negative_score = 0.0

    # Rule 1: Check for access-related keywords
    for token in doc:
        if token.lemma_ in ACCESS_KEYWORDS:
            access_score += 0.4
        if token.lemma_ in SALE_KEYWORDS:
            sale_score += 0.3
        if token.lemma_ in NEGATIVE_KEYWORDS:
            negative_score += 0.5

    # Rule 2: Dependency parsing for sales intent (e.g., "selling access")
    for token in doc:
        if token.lemma_ in SALE_KEYWORDS and token.head.lemma_ in ACCESS_KEYWORDS:
            access_score += 0.3
            sale_score += 0.3
        elif token.lemma_ in ACCESS_KEYWORDS and token.head.lemma_ in SALE_KEYWORDS:
            access_score += 0.3
            sale_score += 0.3

    # Rule 3: Named entities (e.g., "RBC Bank", "EU telecom") for context
    for ent in doc.ents:
        if ent.label_ in ["ORG", "GPE"]:
            access_score += 0.2

    # Rule 4: Regex for specific patterns (e.g., "access to [entity]")
    access_pattern = r"\b(access|vpn|rdp)\b.*\b(to|for|at)\b.*\b(bank|telecom|network|company|org)\b"
    if re.search(access_pattern, text, re.IGNORECASE):
        access_score += 0.3

    # Rule 5: Cryptocurrency or escrow mentions
    if any(word in text for word in ["btc", "bitcoin", "escrow", "monero"]):
        sale_score += 0.2

    # Calculate total score and determine classification
    total_score = access_score + sale_score - negative_score
    if access_score >= 0.4 and sale_score >= 0.3 and total_score > 0.5:
        classification = "positive"
        confidence = min(total_score, 1.0)
    elif negative_score > access_score and negative_score > sale_score:
        classification = "negative"
        confidence = min(negative_score, 1.0)
    else:
        classification = "neutral"
        confidence = min(max(access_score, sale_score, negative_score), 1.0)

    return classification, confidence

def main():
    # Test cases
    test_posts = [
        # Positive: Initial access sale with details
        """Back again, mods nuked my last thread. Selling VPN access to a big EU telecom, one of them household names in Germany (you figure it out). Full internal access, you can pivot to servers, grab call logs, or mess with billing systems. Been stable for a month, no kicks. Asking $4,000 BTC, negotiable for bulk buyers (got 2 more telecoms). I'll throw in logs or a test connection for proof, but only if you're serious. Escrow or MM accepted, I'm vouched here. Hit me up in PM, let's make this quick. No skids, please.""",
        # Positive: Direct initial access sale
        "Initial access to RBC Bank available, full admin creds, $5k BTC, DM for details.",
        # Neutral: General ad, not access-related
        "Selling malware loader, high quality, $200, contact me for demo.",
        # Negative: Unrelated service
        "Offering VPS hosting, 16GB RAM, $50/month, legit service."
    ]

    for i, post in enumerate(test_posts, 1):
        classification, confidence = analyze_post(post)
        print(f"\nPost {i}:")
        print(f"Text: {post[:100]}..." if len(post) > 100 else f"Text: {post}")
        print(f"Classification: {classification.capitalize()}")
        print(f"Confidence: {confidence:.2f}")

if __name__ == "__main__":
    main()


Führen Sie das Programm aus und sehen Sie sich die Ergebnisse selbst an:

$ python3 main.py

Post 1:
Text: Back again, mods nuked my last thread. Selling VPN access to a big EU telecom, one of them household...
Classification: Positive
Confidence: 1.00

Post 2:
Text: Initial access to RBC Bank available, full admin creds, $5k BTC, DM for details.
Classification: Positive
Confidence: 1.00

Post 3:
Text: Selling malware loader, high quality, $200, contact me for demo.
Classification: Negative
Confidence: 1.00

Post 4:
Text: Offering VPS hosting, 16GB RAM, $50/month, legit service.
Classification: Negative
Confidence: 1.00

Wie gezeigt, ist dieser Ansatz weniger zuverlässig, insbesondere bei der korrekten Einstufung des dritten Beitrags als „neutral“. Er erfordert umfangreiche Anpassungen und Feinabstimmungen, die in diesem Fall die Vorteile nicht aufwiegen, da einfachere, anpassungsfähigere Lösungen wie bestehende KI-APIs verfügbar sind.


Anti-Scraping-Technologien

Das Extrahieren von Daten aus Websites ist in kleinem Umfang unkompliziert, wird jedoch komplex, wenn Websites Anti-Scraping-Technologien einsetzen, um den automatisierten Zugriff zu blockieren. Viele Websites haben Nutzungsbedingungen, die das Scraping verbieten, und Entwickler implementieren Schutzmaßnahmen, um diese Einschränkungen durchzusetzen.

Zu den gängigen Anti-Scraping-Techniken gehören:

  • CAPTCHAs: Benutzer müssen Rätsel oder bildbasierte Aufgaben lösen, um zu bestätigen, dass sie keine Bots sind.
  • Ratenbegrenzung: Begrenzt die Anzahl der Anfragen von einer einzelnen IP-Adresse oder einem einzelnen Konto innerhalb eines bestimmten Zeitraums.
  • Kontosperrungen: Konten werden nach der Erkennung verdächtiger Aktivitäten oder übermäßiger fehlgeschlagener Anmeldeversuche vorübergehend oder dauerhaft gesperrt.
  • IP-Sperren: Der Datenverkehr von IP-Adressen, die automatisierte Muster oder missbräuchliches Verhalten aufweisen, wird blockiert.
  • Header- und Verhaltensprüfungen: Anfragen, die vom typischen Browser-Verhalten abweichen, wie z. B. fehlende Header oder unrealistische Interaktionsmuster, werden erkannt.

Tools wie Playwright können dabei helfen, einige der Anti-Bot-Abwehrmaßnahmen zu umgehen, indem sie einen echten Browser simulieren. Dies reicht jedoch nicht aus. Verwenden Sie daher möglicherweise undetected chrome driver.

Obwohl dieser Kurs nicht auf die Umgehung aller fortgeschrittenen Anti-Scraping-Techniken eingeht, veranschaulicht das folgende Beispiel, wie Sie mit Playwright menschenähnliche Tippgeschwindigkeiten simulieren können.

Um zu beginnen, richten Sie eine Umgebung ein und installieren Sie die Abhängigkeiten:

mkdir play && cd play
touch play.py
python3 -m venv venv
source venv/bin/activate
sudo apt install libavif16
pip3 install playwright
playwright install

Öffnen Sie play.py und geben Sie diesen Code ein:

from playwright.sync_api import sync_playwright
import time
import os

def fill_input_slowly():
    text_to_type = "This is a test string"
    local_html = """
    <!DOCTYPE html>
    <html>
    <body>
        <form>
            <input type="text" id="fname" name="fname" value="Hamy">
        </form>
    </body>
    </html>
    """
    
    # Write the HTML to a temporary file
    html_file_path = "temp.html"
    with open(html_file_path, "w") as f:
        f.write(local_html)
    
    with sync_playwright() as p:
        # Set headless to True if you don't want to see the browser
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            page.goto(f"file://{os.path.abspath(html_file_path)}", timeout=60000)
            input_field = page.locator("input#fname[name='fname']")
            input_field.wait_for(timeout=10000) 
            input_field.clear()

            for char in text_to_type:
                input_field.type(char, delay=750)
            time.sleep(2)
            
        except Exception as e:
            print(f"Error occurred: {e}")
        
        finally:
            browser.close()
            if os.path.exists(html_file_path):
                os.remove(html_file_path)

if __name__ == "__main__":
    fill_input_slowly()

Intelligence-Watchlists

Eines der Hauptmerkmale, das diesen Kurs von den meisten CTI-Schulungen unterscheidet, ist, dass Sie lernen, wie Sie realistische Intelligence-Watchlists erstellen. Diese Watchlists funktionieren wie ein automatisiertes Überwachungssystem, das die Aktivitäten eines Benutzers kontinuierlich überwacht. Anstatt nur Momentaufnahmen von Daten zu sammeln, erstellen Sie Tools, mit denen Sie Änderungen und Aktionen in Echtzeit verfolgen können.

Der Hauptzweck dieser Beobachtungslisten besteht darin, zu demonstrieren, wie die Aktivitäten eines Bedrohungsakteurs über mehrere Plattformen hinweg miteinander verknüpft werden können, damit Sie sich ein vollständiges Bild von seinem Verhalten machen können. Dies ist unerlässlich, um produktive Bedrohungsakteure zu verfolgen, Daten aus verschiedenen Quellen zu korrelieren und Muster zu verstehen, die auf böswillige Absichten hindeuten können.

Um ein Beobachtungslistenprofil zu erstellen, definieren Sie Folgendes:

  • Link: Die Kennung der Person oder Entität, die Sie überwachen möchten.
  • Häufigkeit: Wie oft das System nach neuen Aktivitäten sucht. Optionen:
    • Niedrig: Alle 24 Stunden
    • Mittel: Alle 12 Stunden
    • Hoch: Alle 6 Stunden
    • Sehr hoch: Alle 1 Stunde
    • Kritisch: Alle 5 Minuten
  • Priorität: Die Tiefe der gesammelten Informationen. Optionen:
    • Alles: Alle verfügbaren Daten (Beiträge und Kommentare)
    • Nur Beiträge: Nur die vom Benutzer geposteten Inhalte
    • Nur Kommentare: Nur die vom Benutzer abgegebenen Kommentare

Eine Beobachtungsliste mit niedriger Priorität überprüft beispielsweise alle 24 Stunden die Aktivitäten und sammelt relevante Daten. Die Ergebnisse können im JSON-Format exportiert werden, um sie einfach herunterzuladen und mit anderen Plattformen abzugleichen.