Membuat Active Response Wazuh untuk handle chain attack pada cups-browsed
Sebelum kita membuat active response nya, ada baiknya kita mengetahui apa itu wazuh,active response, dan CVE-2024–47176.
Wazuh
Wazuh adalah platform keamanan open-source yang dirancang untuk mendeteksi ancaman keamanan dan mengelola kejadian dalam infrastruktur IT. Dengan fokus pada deteksi intrusi, analisis log, dan manajemen kepatuhan, Wazuh memungkinkan organisasi untuk memonitor dan melindungi lingkungan IT mereka secara real-time. Platform ini mengintegrasikan teknologi SIEM (Security Information and Event Management) untuk mengumpulkan, mengelola, dan menganalisis data keamanan dari berbagai sumber seperti log sistem, peristiwa jaringan, dan aktivitas pengguna. Wazuh juga menyediakan kemampuan untuk melakukan respons cepat terhadap ancaman yang terdeteksi, membantu menjaga keamanan infrastruktur dengan lebih efektif.
Active Response
Active Response adalah suatu kemampuan yang secara otomatis meresponse terhadap suatu ancaman terhadap sistem, yang tujuan nya untuk meminimalisir dampak dari ancaman tersebut. dalam konteks wazuh active response ini dibagi menjadi 2 yaitu Stateless dan Statefull. Pada tutorial kali ini kita akan coba membuat Stateless, karena saya lagi males hahaha
CVE-2024–47176
Adalah suatu vulnerability pada cups-browsed dimana tidak ada validasi inputan, yang jika di combine dengan vulnerability yang lain akan menghasilkan rce, dengan flow sebagai berikut
- Initial Access (CVE-2024–47176) Attacker akan menambahkan printer baru
- libcupsfilters and libppd (CVE-2024–47076, CVE-2024–47175) libcupsfilters dan libppd gagal memvalidasi atribut IPP dari server berbahaya dengan benar. Hal ini memungkinkan penyerang untuk menyuntikkan data berbahaya ke dalam sistem CUPS, sehingga menciptakan berkas PPD sementara.
- Command Execution (CVE-2024–47177): Data yang dikirim berisi parameter PPD, hal ini akan mentrigger FoomaticRIPCommandLine untuk menjalankan foomatic-rip. Saat print job dikirimkan, perintah dari attacker akan dijalankan
Dari hasil observasi diatas, kita mengetahui bahwa:
- Terdapat request pada port 631 dengan protokol udp
- Command Injection akan dieksekusi di cups-filters ketika memanggil foomatic-rip via cfGetPrinterAttributes5
Untuk mengecek apakah infrastrukter yang kita kelola terdampak, kita dapat mengecek apakah terdapat cups-browser/ apakah port 631 open dan apakah terdapat service cups-browsed
Dari hasi diatas jika kita simulasikan, dan kita amati di wazuh maka akan terdapat alert sebagai berikut
berdasarkan alert diatas, maka kita dapat melakukan block dengan firewall pada port 631:udp, dalam case ini saya menggunakan iptables
#!/usr/bin/python3
import sys
import json
import os
import datetime
import subprocess
from pathlib import PureWindowsPath, PurePosixPath
if os.name == "nt":
LOG_FILE = (
"C:\\Program Files (x86)\\ossec-agent\\active-response\\active-responses.log"
)
else:
LOG_FILE = "/var/ossec/logs/active-responses.log"
def write_debug_file(ar_name, msg):
with open(LOG_FILE, mode="a") as log_file:
ar_name_posix = str(
PurePosixPath(PureWindowsPath(ar_name[ar_name.find("active-response") :]))
)
log_file.write(
str(datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S"))
+ " "
+ ar_name_posix
+ ": "
+ msg
+ "\n"
)
def main(argv):
write_debug_file(argv[0], "Starting Tracker Engine")
input_str = ""
for line in sys.stdin:
input_str += line
break
try:
data = json.loads(input_str)
except json.JSONDecodeError as e:
print(f"Error parsing JSON: {e}")
sys.exit(1)
srcip = data.get("parameters", {}).get("alert", {}).get("data", {}).get("srcip")
if "." in srcip:
try:
cmd = f"iptables -A INPUT -s {srcip} -p udp --dport 631 -j DROP\n"
cmd2 = "iptables-save > /etc/iptables/rules.v4"
subprocess.run(cmd, shell=True, check=True)
subprocess.run(cmd2, shell=True, check=True)
write_debug_file(
argv[0], f"Block IP {srcip}, Malicious Activity Cups Browsed"
)
except subprocess.CalledProcessError as e:
write_debug_file(argv[0], str(e))
except Exception as e:
write_debug_file(argv[0], str(e))
elif ":" in srcip:
try:
cmd = f"ip6tables -A INPUT -s {srcip} -p udp --dport 631 -j DROP\n"
cmd2 = f"ip6tables-save | sudo tee /etc/ip6tables.rules"
subprocess.run(cmd, shell=True, check=True)
subprocess.run(cmd2, shell=True, check=True)
write_debug_file(
argv[0], f"BLock IP {srcip}, Malicious Activity Cups Browsed"
)
except subprocess.CalledProcessError as e:
write_debug_file(argv[0], str(e))
except Exception as e:
write_debug_file(argv[0], str(e))
print("Execution Success\n")
Cara kerja Active Response diatas adalah, jika rule 23502 ketrigger maka Wazuh Server akan memerintahkan Wazuh Agent untuk menjalankan Script tersebut, Script tersebut akan membaca stdin dari wazuh, dan menjalankan command:
iptables -A INPUT -s {srcip} -p udp --dport 631 -j DROP
Tentunya Active Response diatas tidak akan langsung jalan, kita perlu membuat Custom Rules nya dan mengintegrasinya ke dalam wazuh. Script diatas dapat di improve lagi untuk log implement ke rule yang lebih spesifik lagi (Cups Browsed)
Referensi:
https://wazuh.com/blog/detecting-cups-remote-code-execution-vulnerability-with-wazuh/