From a54907aaa613e0ef6d5946e3d45829a35316a032 Mon Sep 17 00:00:00 2001 From: fab Date: Sat, 21 Dec 2024 01:18:50 +0100 Subject: [PATCH] Create owasp2nginx.py --- owasp2nginx.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 owasp2nginx.py diff --git a/owasp2nginx.py b/owasp2nginx.py new file mode 100644 index 0000000..9c76051 --- /dev/null +++ b/owasp2nginx.py @@ -0,0 +1,54 @@ +import json +import os +from collections import defaultdict + +# Paths +INPUT_FILE = "owasp_rules.json" +OUTPUT_DIR = "waf_patterns/nginx" + +# Ensure output directory exists +os.makedirs(OUTPUT_DIR, exist_ok=True) + +def load_owasp_rules(file_path): + with open(file_path, "r") as f: + return json.load(f) + +def generate_nginx_waf(rules): + categorized_rules = defaultdict(list) + + # Group rules by category + for rule in rules: + category = rule.get("category", "generic").lower() + categorized_rules[category].append(rule["pattern"]) + + # Convert to Nginx conf files + for category, patterns in categorized_rules.items(): + output_file = os.path.join(OUTPUT_DIR, f"{category}.conf") + + with open(output_file, "w") as f: + f.write(f"# Nginx WAF rules for {category.upper()}\n") + f.write(f"location / {{\n") + f.write(f" set $attack_detected 0;\n\n") + + # Write rules as regex checks + for pattern in patterns: + f.write(f" if ($request_uri ~* \"{pattern}\") {{\n") + f.write(f" set $attack_detected 1;\n") + f.write(f" }}\n\n") + + # Block the request if an attack is detected + f.write(f" if ($attack_detected = 1) {{\n") + f.write(f" return 403;\n") + f.write(f" }}\n") + f.write(f"}}\n") + + print(f"[+] Generated {output_file} ({len(patterns)} patterns)") + +if __name__ == "__main__": + print("[*] Loading OWASP rules...") + owasp_rules = load_owasp_rules(INPUT_FILE) + + print(f"[*] Generating Nginx WAF configs from {len(owasp_rules)} rules...") + generate_nginx_waf(owasp_rules) + + print("[✔] Nginx WAF configurations generated successfully.")