23. Architectuur voor de Nieuwsgierigen
Voor als je wilt begrijpen hoe het in elkaar zit. Of hoe het niet uit elkaar valt. Dat is dezelfde vraag, maar dan met een optimistischer glazuur eroverheen.
De App Factory
app.py bevat create_app(). Flask, SQLAlchemy, Flask-Migrate, blueprints. Auto-creatie van een standaard instellingen-rij als de database leeg is, zodat de rest van de applicatie niet crasht bij de eerste start. Het is het fundament. Het is degelijk. Het is — voor dit project — bijna verdacht normaal. Alsof iemand één bestand wilde schrijven dat de volwassene in de kamer is. En dat is gelukt.
De Blueprints
| Bestand | Blueprint | Wat het doet |
|---|---|---|
index.py | index_bp | Dashboard — het zenuwcentrum |
agent.py | agent_bp | Agent C2 — de poppenspeler |
login.py | login_bp | Login/logout — de uitsmijter |
findings.py | findings_bp | Findings + rapport — de raison d’être |
tasks.py | tasks_bp | Task runner — het plichtsgetrouwe werkpaard |
macro.py | macro_bp | Generators + commands + screen + recordings |
notes.py | notes_bp | Notities |
rapport.py | rapport_bp | Rapportgeneratie — de broodwinner |
upload.py | upload_bp | File uploads |
download.py | download_bp | File downloads |
xxs.py | xxs_bp | XSS lab — de koekjesdief |
xxe.py | xxe_bp | XXE lab — de bestandenlezer |
csrf.py | csrf_bp | CSRF token-harvesting |
sqli2.py | sqli2_bp | SQLi relay |
ssrf.py | ssrf_bp | SSRF redirects |
output_view.py | output_bp | Output viewer |
search.py | search_bp | Zoekfunctie |
security.py | — | Toegangscontrole |
admin.py | — | Flask-Admin |
De Database
Eén SQLite-bestand. Auto-creatie met db.create_all(). Auto-migratie van ontbrekende kolommen. Standaard instellingen-rij als de database leeg is. Het is het model dat de PostgreSQL-purist doet huiveren, de MongoDB-evangelist doet glimlachen (om de verkeerde redenen), en de pragmaticus doet zeggen: “het werkt, en als het breekt, kopieer ik het bestand.” Dat laatste is — voor alle duidelijkheid — een valide backup-strategie voor SQLite. Het is zelfs de aanbevolen backup-strategie. De eenvoud is geen beperking. Het is een feature. Of dat is tenminste wat je jezelf vertelt om drie uur ’s nachts wanneer je de database per ongeluk hebt verwijderd en vijf seconden later een nieuwe hebt door de applicatie te herstarten. Vijf seconden. Dat is sneller dan je “oh nee” kunt zeggen. En je zegt “oh nee” snel.
De Mappenstructuur
De code zit in meuk/flask/. “Meuk” betekent “rommel” of “spullen” of “troep.” Het is alsof je broncode opslaat in een map genaamd misc_junk. Het is bescheidenheid tot het punt van zelfvernedering — het soort bescheidenheid dat ofwel authentiek is, ofwel de meest briljante vorm van sociale camouflage. Want niemand opent een map genaamd “meuk” en verwacht iets indrukwekkends. Waardoor alles dat je er wél in vindt des te indrukwekkender is. Het is de softwareversie van onderpresteren bij de eerste date en dan een perfect diner koken bij de tweede.
Templates in meuk/flask/html/. Static in static/. Database in meuk/flask/db/. Payloads in http/payloads/. Tools in http/tools/. Commands in http/commands/. Output in raw/. Rapporten in rapport/. Het is organisch gegroeid. Het is niet ontworpen. Het werkt. Het is een stad zonder stedenbouwkundige waar je toch de bakker kunt vinden. En de bakker verkoopt ook exploits, maar dat is een detail dat je voor jezelf houdt.