Incompetent Bastard: Installatie en Eerste Stappen
Incompetent Bastard (IB) is een Flask-gebaseerd pentest dashboard dat speciaal ontworpen is voor geautoriseerde penetratietesten. Het bundelt payload-generatie, command-and-control, kwetsbaarheidslabs en rapportage in een enkel web-interface. In deze tutorial installeren we IB vanaf nul, starten we de applicatie voor het eerst op en maken we kennis met de basisinstellingen.
Deze tutorial is uitsluitend bedoeld voor gebruik in geautoriseerde testomgevingen. Gebruik IB alleen op systemen waarvoor je expliciete toestemming hebt.
Vereisten
- Python 3.10 of hoger
pipengitgeinstalleerd- Een Linux- of macOS-systeem (Kali Linux aanbevolen voor pentesting)
- Optioneel:
pandocen LaTeX (voor PDF-rapportgeneratie) - Optioneel:
msfvenom(Metasploit Framework, voor payload-generatie) - Optioneel:
screenenasciinema(voor sessierecording) - Basiskennis van de commandoregel
IB – IB draait standaard op
http://127.0.0.1:5000 en is alleen bereikbaar vanaf
localhost. Dit is een bewuste beveiligingsmaatregel. Pas dit alleen aan
als je weet wat je doet.
Stap 1: Repository Klonen
Clone de IB repository vanaf GitHub:
git clone https://github.com/jan-karel/incompetentbastard.git
cd incompetentbastardDe directorystructuur bevat onder andere:
app.py– De Flask app-factory metcreate_app()meuk/flask/– Alle blueprints (dashboards, labs, API endpoints)http/commands/– 460+ pre-built commando-bestandenhttp/payloads/– Gegenereerde payloadshttp/tools/– Pentest tools voor deployment op doelsystemenmeuk/flask/db/– SQLite database (wordt automatisch aangemaakt)static/– CSS en JavaScript voor het dashboard
Stap 2: Virtual Environment en Dependencies
Maak een Python virtual environment aan en installeer de vereiste pakketten:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtDe requirements.txt bevat onder andere Flask,
Flask-SQLAlchemy, Flask-Migrate, Flask-WTF en Flask-Bootstrap. Voor
ontwikkeling en testen is er ook een apart bestand:
pip install -r requirements-dev.txtDit voegt pytest, ruff (linter) en andere
development-tools toe.
IB – Controleer je Python-versie met
python3 --version. IB vereist minimaal Python 3.10 voor
alle features.
Stap 3: Eerste Keer Starten
Start de Flask-applicatie met het volgende commando:
flask --app app:create_app run --host 127.0.0.1 --port 5000Bij de eerste start gebeurt het volgende automatisch:
- De SQLite database wordt aangemaakt in
meuk/flask/db/db.sqlite - Alle databasetabellen worden gecreeerd via
db.create_all() - Een standaard instellingenrecord wordt aangemaakt met
localhostingesteld ophttp://127.0.0.1:5000 - Eventuele migraties voor nieuwe kolommen worden uitgevoerd
Open nu je browser en ga naar http://127.0.0.1:5000/. Je
ziet het IB command center dashboard.
Opstarten vanuit init.sh
Voor een volledige pentest-setup kun je het init-script gebruiken:
bash init.shDit script doet het volgende:
- Maakt alle benodigde directories aan (
raw/recon,raw/screenshots,meuk/logs, etc.) - Initialiseert de Metasploit database
- Start een OpenVPN-verbinding als
meuk/client.ovpnbestaat - Start screen sessies voor SMB-server, HTTP-server, Metasploit en tcpdump
- Logt versie-informatie van geinstalleerde tools
Na het uitvoeren kun je de actieve screen sessies bekijken:
screen -listStap 4: Het Dashboard Verkennen
Na het inloggen zie je het command center dashboard. De bovenste rij toont vijf KPI-panelen:
- Active Agents – Aantal actieve C2-agents die terugbellen
- Hooked Clients – Aantal browsers die via de XSS-beacon verbonden zijn
- Findings – Totaal aantal geregistreerde bevindingen
- Notes – Aantal operatornotities
- Commands – Aantal beschikbare commando-bestanden
Onder de KPI-rij vind je secties voor Quick Actions (payload-generators), Operator Snippets, Web Telemetry en de Command Library.
IB – Het dashboard pollt automatisch elke 5 seconden
naar /api/agents voor agent-updates. Je hoeft de pagina
niet te verversen om nieuwe agents te zien.
Stap 5: Settings Configureren
De instellingen zijn bereikbaar via het tandwiel-icoon rechtsboven op het dashboard. Het belangrijkste veld is Localhost URL.
Localhost URL
Dit is het adres dat IB gebruikt in alle gegenereerde payloads,
download-cradles en callback-URL’s. Standaard staat dit op
http://127.0.0.1:5000.
Wanneer je op een VPN- of pentestnetwerk werkt, moet je dit wijzigen naar het IP-adres dat het doelsysteem kan bereiken:
http://10.10.14.5:5000
Je kunt dit ook via de API instellen:
curl -X POST http://127.0.0.1:5000/api/settings \
-H "Content-Type: application/json" \
-d '{"localhost": "http://10.10.14.5:5000"}'Obfuscatie-instellingen
In de settings kun je ook obfuscatie configureren:
- Obfuscate downloads – Schakel automatische
AMSI-obfuscatie in voor
.ps1bestanden bij download - Obfuscatie techniek – Keuze uit
mixed,subexpr,format,chararrayofbacktick
Rapport-metadata
Onder de rapportage-sectie kun je project-informatie invullen die later in het rapport verschijnt:
- Rapport titel, subtitel en auteur
- Projectnaam en omgeving
- Classificatie (standaard TLP:RED)
- Taal (nl/en)
- Testtype (pentest, red team, etc.) en scope (blackbox, greybox, whitebox)
Stap 6: Environment Variables
IB ondersteunt diverse environment variables voor configuratie. Stel deze in voordat je de applicatie start:
export SECRET_KEY="jouw-geheime-sleutel"
export IB_ADMIN_USER="operator"
export IB_ADMIN_PASSWORD="sterk-wachtwoord"
flask --app app:create_app run --host 127.0.0.1 --port 5000Overzicht van alle variabelen:
| Variabele | Standaard | Doel |
|---|---|---|
SECRET_KEY |
Willekeurig (token_urlsafe) | Signing van sessies en CSRF-tokens |
IB_ADMIN_USER |
Niet ingesteld | Gebruikersnaam voor dashboard-authenticatie |
IB_ADMIN_PASSWORD |
Niet ingesteld | Wachtwoord voor dashboard-authenticatie |
PUBLIC_UPLOAD |
false |
Sta uploads toe van niet-localhost adressen |
PUBLIC_DOWNLOADS |
false |
Sta downloads toe van niet-localhost adressen |
SESSION_COOKIE_SECURE |
false |
Zet op true achter een HTTPS-proxy |
BEHIND_PROXY |
false |
Activeer ProxyFix (vertrouw X-Forwarded-For) |
IB – Als IB_ADMIN_USER en
IB_ADMIN_PASSWORD niet zijn ingesteld, is het dashboard
alleen bereikbaar vanaf localhost (127.0.0.1 en ::1). Dit is de
veiligste configuratie voor lokaal gebruik.
Authenticatie
Wanneer je credentials hebt geconfigureerd, verschijnt er een
loginpagina op /login. Na succesvolle authenticatie wordt
een sessiecookie gezet. De sessie wordt beheerd via Flask’s ingebouwde
sessiebeheer met de SECRET_KEY.
Je kunt ook API-toegang configureren via tokens:
export DASHBOARD_ACCESS_TOKEN="mijn-api-token"Gebruik dit token vervolgens in je API-calls:
curl -H "X-Dashboard-Token: mijn-api-token" \
http://127.0.0.1:5000/api/agentsStap 7: Draaien op een Pentestnetwerk
Tijdens een actieve pentest wil je IB bereikbaar maken voor doelsystemen. Start de applicatie op alle interfaces:
flask --app app:create_app run --host 0.0.0.0 --port 5000Stel vervolgens de localhost URL in naar je tun0 IP-adres:
# Achterhaal je tun0 IP
ip addr show tun0 | grep inet
# Stel in via API
curl -X POST http://127.0.0.1:5000/api/settings \
-H "Content-Type: application/json" \
-d '{"localhost": "http://10.10.14.5:5000"}'Of stel direct de BEHIND_PROXY variabele in als je
achter een reverse proxy draait:
export BEHIND_PROXY=trueDit activeert de Werkzeug ProxyFix middleware die
X-Forwarded-For headers vertrouwt.
IB – Draai IB nooit zonder authenticatie op een
publiek netwerk. Stel altijd IB_ADMIN_USER en
IB_ADMIN_PASSWORD in wanneer je --host 0.0.0.0
gebruikt.
Stap 8: Database Beheer
IB gebruikt SQLite als database, opgeslagen in
meuk/flask/db/db.sqlite. De applicatie maakt automatisch
alle tabellen aan bij de eerste start en voert schema-migraties uit voor
nieuwe kolommen.
Database resetten
Om met een schone database te beginnen:
rm meuk/flask/db/db.sqlite
flask --app app:create_app run --host 127.0.0.1 --port 5000Bij het opnieuw starten wordt de database opnieuw aangemaakt met alle tabellen.
Database migraties
IB gebruikt Flask-Migrate met render_as_batch=True voor
SQLite-compatibiliteit. Daarnaast voert create_app()
automatisch ALTER TABLE statements uit voor nieuwe
kolommen, zodat bestaande databases zonder problemen worden
bijgewerkt.
Stap 9: Verificatie
Controleer of alles correct werkt door de volgende endpoints te bezoeken:
# Dashboard
curl -s http://127.0.0.1:5000/ | head -5
# Settings API
curl -s http://127.0.0.1:5000/api/settings | python3 -m json.tool
# Agents API
curl -s http://127.0.0.1:5000/api/agents
# Commands API
curl -s http://127.0.0.1:5000/api/commands | python3 -m json.tool | head -20Je kunt ook de ingebouwde tests draaien om de applicatie te valideren:
source .venv/bin/activate
pytest -qEn een syntaxcheck uitvoeren:
python3 -m compileall app.py meuk/flask testsStap 10: Volgende Stappen
Nu IB draait, kun je verder met:
- Het IB Dashboard: Complete Rondleiding – Leer alle secties en functies van het dashboard kennen
- IB Payload Generators – Genereer payloads voor macro’s, meterpreter, PowerShell en meer
- De IB Command Library Beheersen – Doorzoek en gebruik de 460+ ingebouwde commando’s
- XSS Beacon Opzetten – Configureer de XSS-beacon voor browser-hooking
IB – Maak een bookmark aan voor
http://127.0.0.1:5000/ in je browser. Tijdens een pentest
wil je snel toegang tot het dashboard zonder steeds de URL te hoeven
typen.
Samenvatting
In deze tutorial hebben we de volgende stappen doorlopen:
- De IB repository gekloned vanaf GitHub
- Een virtual environment aangemaakt en dependencies geinstalleerd
- De applicatie voor het eerst opgestart, waarmee de database automatisch werd gecreeerd
- Het dashboard verkend en de KPI-panelen bekeken
- De localhost URL en obfuscatie-instellingen geconfigureerd
- Environment variables ingesteld voor authenticatie en beveiliging
- IB geconfigureerd voor gebruik op een VPN/pentestnetwerk
- Database beheer en reset procedure doorgenomen
- De installatie geverifieerd via API-calls en tests
IB is nu klaar voor gebruik. De applicatie draait op
http://127.0.0.1:5000/, de database is geinitialiseerd en
de basisinstellingen zijn geconfigureerd. In de volgende tutorials leer
je het dashboard in detail kennen en ga je aan de slag met
payload-generatie en de command library.