Ga naar inhoud

Automated pentest (aanvalsoppervlak)

De inventaris van monsys weet wát er op je hosts draait (poorten, certificaten, pakketten, runtimes). De automated-pentest-laag kijkt van buitenaf en beantwoordt wat de inventaris niet kan: wat is écht bereikbaar vanaf internet, en is een gevonden CVE ook uitbuitbaar?

Het is opt-in, draait alleen tegen bewezen-eigen scope, en is detect-only: nooit exploitatie, nooit brute force, nooit iets geschreven op een target.

Een scanner raakt uitsluitend een asset die als geverifieerde scope-rij bestaat. Er is geen vrij invoerveld dat direct een scan start. Eigendom wordt op drie manieren bewezen:

  • agent_vhost: een agent vond het domein in nginx/Caddy/certbot op zijn host. Dit wordt alleen automatisch geverifieerd als er een publiek-CA- certificaat op die host de naam dekt (je kunt geen publiek cert krijgen voor een domein dat je niet beheert). Zonder dat is het een kandidaat, niet scanbaar, tot DNS-TXT of handmatige bevestiging.
  • dns_txt: plaats een _monsys-challenge.<domein> TXT-record met de getoonde token. Voor domeinen zonder agent.
  • manual_admin: een tenant-owner voegt een domein/IP toe met TOTP.

In het dashboard: Beveiliging → Aanvalsoppervlak.

  1. “Importeer domeinen van agents”: je agent-vhosts komen binnen, geverifieerd via hun certificaat.
  2. Zet de policy aan met TOTP. Standaard staat scannen uit.
  3. Kies een onderhoudsvenster; geplande scans draaien alleen daarin.
  4. “Scan nu” (TOTP) voor een directe run. De kill-switch staat ernaast en stopt een lopende scan binnen seconden.

Alle scanners draaien als open source in gepinde Docker-containers op de hub.

Fase Scanner Wat het detecteert
1 nmap open poorten en diensten (connect scan, geen OS-probe)
1 testssl.sh zwakke/verlopen certificaten, oude TLS-versies, zwakke ciphers
1 nuclei misconfiguraties, exposed files (.git, .env), ontbrekende security-headers, standaard-logins
2 nuclei (CVE) bevestigt dat een CVE uit de inventaris echt reageert → exploiteerbaar bevestigd
3 OWASP ZAP passieve baseline per webapplicatie

nuclei draait met de tags misconfig,exposure,ssl,default-login; alles intrusief (DoS, brute force, fuzzing, actieve injectie) is uitgesloten en out-of-band interactie staat uit.

  • Eén chokepoint. Elke scanner krijgt zijn targets uitsluitend via de interne functie ResolveTargets, die (a) scope-lidmaatschap controleert met een tenant_id-filter, (b) de SSRF/private-range-guard herhaalt op het opgeloste IP (geen RFC1918, loopback, link-local, CGNAT, 169.254, NAT64/6to4/Teredo, cloud-metadata), (c) de kill-switch, opt-in en het venster afdwingt.
  • Geharde, gepinde containers. Scanners draaien via een sudo-wrapper (/usr/local/sbin/monsys-scan) met images gepind op digest, --read-only, --cap-drop ALL, --security-opt no-new-privileges, pids-, geheugen- en cpu-limieten, non-root waar de tool het toelaat, en DNS gepind op publieke resolvers. De hostnaam wordt via --add-host aan het gecontroleerde IP gekoppeld, zodat DNS-rebinding onmogelijk is. De onbevoorrechte hub kiest alleen een scanner-naam en levert een gevalideerd targetbestand; het docker run zelf zit in de wrapper.
  • Kill-switch stopt echt. Elke container heeft een naam die de hub via de kill-verb van de wrapper kan docker kill-en; de worker controleert het vlaggetje elke paar seconden.
  • Redactie. Evidence wordt recursief geredigeerd (tokens, JWT’s, basic-auth in URL’s, private keys) voordat het wordt opgeslagen. Ruwe scanner-output wordt nooit bewaard.

Findings landen op de pagina met categorie, ernst, status (open / opgelost / aanvaard / vals-positief) en worden week-op-week vergeleken (“nieuw sinds vorige week”). Een bevestigde CVE tilt de bijbehorende blootstelling naar “exploiteerbaar bevestigd” met een melding.

Elke scan-run is Ed25519-ondertekend en komt in de maandelijkse audit-pack: wie, wanneer, welke scope, welke findings. Dat is reproduceerbaar bewijs dat je de doeltreffendheid van je maatregelen beoordeelt: direct bruikbaar voor een NIS2-audit.

De hub heeft nodig:

  • Docker op de host en de wrapper /usr/local/sbin/monsys-scan + /etc/sudoers.d/monsys-scan (meegeleverd in hub/packaging/).
  • Een beschrijfbare /var/lib/monsys/scan-targets (in de systemd ReadWritePaths van de hub-unit) en een gecachete templateset in /var/lib/monsys/nuclei-templates (read-only ingemount).
  • De scanner-images worden op digest gepind; ververs de templateset periodiek buiten de scan om.

Detect-only is geen vervanging voor een handmatige pentest met exploitatie; het vangt het bereikbare, bekende en misgeconfigureerde oppervlak, continu. nuclei- templates zijn gecachet en worden niet per run gedownload. ZAP draait één container per domein.