mirror of
https://github.com/mukul975/Anthropic-Cybersecurity-Skills.git
synced 2026-06-10 21:24:56 +03:00
c21af3347e
- Add scripts/agent.py and references/api-reference.md to all remaining skills - Update all 648 LICENSE files: copyright now reads 'Mahipal' - Add implementing-security-monitoring-with-datadog (new skill with full anatomy) - All 649 skills now have: SKILL.md, LICENSE, scripts/agent.py, references/api-reference.md
62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Purdue model OT network segmentation audit."""
|
|
import argparse, json, sys
|
|
from datetime import datetime, timezone
|
|
try:
|
|
import requests
|
|
except ImportError:
|
|
requests = None
|
|
|
|
def audit_config(target, token):
|
|
findings = []
|
|
if not requests: return [{"error": "requests required"}]
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
try:
|
|
resp = requests.get(f"{target}/api/v1/status", headers=headers, timeout=10)
|
|
if resp.status_code == 200:
|
|
data = resp.json()
|
|
if not data.get("enabled", True):
|
|
findings.append({"check": "Service Status", "status": "DISABLED", "severity": "CRITICAL"})
|
|
elif resp.status_code == 401:
|
|
findings.append({"check": "Authentication", "status": "UNAUTHORIZED", "severity": "HIGH"})
|
|
except requests.RequestException as e:
|
|
findings.append({"error": str(e)})
|
|
return findings
|
|
|
|
def check_compliance(target, token):
|
|
findings = []
|
|
if not requests: return []
|
|
headers = {"Authorization": f"Bearer {token}"}
|
|
try:
|
|
resp = requests.get(f"{target}/api/v1/compliance", headers=headers, timeout=10)
|
|
if resp.status_code == 200:
|
|
for item in resp.json().get("checks", []):
|
|
if item.get("status") != "PASS":
|
|
findings.append({"check": item.get("name"), "status": item.get("status"),
|
|
"severity": item.get("severity", "MEDIUM")})
|
|
except requests.RequestException:
|
|
pass
|
|
return findings
|
|
|
|
def main():
|
|
p = argparse.ArgumentParser(description="Purdue model OT network segmentation audit")
|
|
p.add_argument("--target", required=True, help="Target URL")
|
|
p.add_argument("--token", required=True, help="API token")
|
|
p.add_argument("--output", "-o", help="Output JSON report")
|
|
p.add_argument("--verbose", "-v", action="store_true")
|
|
a = p.parse_args()
|
|
print("[*] Purdue model OT network segmentation audit")
|
|
report = {"timestamp": datetime.now(timezone.utc).isoformat(), "findings": []}
|
|
report["findings"].extend(audit_config(a.target, a.token))
|
|
report["findings"].extend(check_compliance(a.target, a.token))
|
|
high = sum(1 for f in report["findings"] if f.get("severity") in ("HIGH", "CRITICAL"))
|
|
report["risk_level"] = "HIGH" if high else "MEDIUM" if report["findings"] else "LOW"
|
|
print(f"[*] {len(report['findings'])} findings, risk: {report['risk_level']}")
|
|
if a.output:
|
|
with open(a.output, "w") as f: json.dump(report, f, indent=2)
|
|
else:
|
|
print(json.dumps(report, indent=2))
|
|
|
|
if __name__ == "__main__":
|
|
main()
|