PrestaShop

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

Perl backticks/qx// sinks in Apache mod_perl handlers (reachability and exploitation)

์‹ค์ œ ์‚ฌ๋ก€ ํŒจํ„ด: Perl ์ฝ”๋“œ๊ฐ€ ์…ธ ๋ช…๋ น ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ  backticks (๋˜๋Š” qx//)๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. mod_perl AccessHandler์—์„œ๋Š” $r->uri() ๊ฐ™์€ ๊ณต๊ฒฉ์ž ์ œ์–ด ์š”์ฒญ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ทธ ๋ฌธ์ž์—ด๋กœ ํ˜๋Ÿฌ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ถ„๊ธฐ์—์„œ ์›์‹œ ์ž…๋ ฅ์„ ๋‹จ์ˆœํžˆ ์ด์–ด๋ถ™์ด๊ณ  ์ด๋ฅผ ์…ธ๋กœ ํ‰๊ฐ€ํ•˜๋ฉด pre-auth RCE๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Risky Perl execution primitives (spawn a shell when given a single string):

  • Backticks / qx//: my $out = cmd ...;
  • system with a single string: system(โ€œ/bin/sh -c โ€˜โ€ฆโ€™โ€) implicitly
  • open with a pipe: open my $fh, โ€œcmd |โ€ or โ€œ| cmdโ€
  • IPC::Open3 with a single string

Minimal vulnerable shape observed in the wild:

sub getCASURL {
...
my $exec_cmd = "...";
if ($type eq 'login') {
$exec_cmd .= $uri;        # $uri from $r->uri() โ†’ attacker-controlled
my $out = `$exec_cmd`;    # backticks = shell
}
}

mod_perl์—์„œ์˜ ์ฃผ์š” ๋„๋‹ฌ์„ฑ ๊ณ ๋ ค์‚ฌํ•ญ:

  • Handler ๋“ฑ๋ก: httpd.conf๊ฐ€ ์š”์ฒญ์„ Perl ๋ชจ๋“ˆ๋กœ ๋ผ์šฐํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: PerlModule MOD_SEC_EMC::AccessHandler ๋ฐ ํŠน์ • ๊ฒฝ๋กœ ๋ฒ”์œ„์— ๋Œ€ํ•ด AccessHandler::handler๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ทจ์•ฝํ•œ ๋ถ„๊ธฐ ํŠธ๋ฆฌ๊ฑฐ: ์ธ์ฆ๋˜์ง€ ์•Š์€ ๋กœ๊ทธ์ธ ํ๋ฆ„์„ ๊ฐ•์ œํ•˜์—ฌ type == โ€œloginโ€œ์ด ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์˜ˆ์ƒ๋˜๋Š” auth cookie๋ฅผ ์ƒ๋žต).
  • ํ•ด์„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ: ์š”์ฒญ์ด ๊ตฌ์„ฑ๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ•ด์„๋˜๋Š” URI๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. Apache๊ฐ€ ์š”์ฒญ์„ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ ˆ๋Œ€ ๋ผ์šฐํŒ…ํ•˜์ง€ ์•Š์œผ๋ฉด sink์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Exploitation workflow

  1. httpd.conf๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ PerlModule/MOD_PERL ํ•ธ๋“ค๋Ÿฌ ๋ฒ”์œ„๋ฅผ ์ฐพ์•„ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ด์„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๋ณด๋‚ด ๋กœ๊ทธ์ธ ๋ฆฌ๋””๋ ‰ํŠธ ๊ฒฝ๋กœ๊ฐ€ ์„ ํƒ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค (type == โ€œloginโ€).
  3. ์š”์ฒญ URI ๊ฒฝ๋กœ์— ์‰˜ ๋ฉ”ํƒ€๋ฌธ์ž(shell metacharacters)๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ $r->uri()๊ฐ€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ช…๋ น ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ HTTP PoC (path injection via โ€˜;โ€™)

GET /ui/health;id HTTP/1.1
Host: target
Connection: close

Tips

  • ๊ตฌ๋ถ„์ž๋“ค์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”: ;, &&, |, backticks, $(โ€ฆ), ๊ทธ๋ฆฌ๊ณ  ์ธ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ธ์ฝ”๋”ฉ๋œ ์ค„๋ฐ”๊ฟˆ(%0A).
  • ์ด์ „ ํŒจ์น˜๊ฐ€ ๋‹ค๋ฅธ ์ธ์ž๋ฅผ ์ธ์šฉํ•˜์ง€๋งŒ ์–ด๋–ค ๋ถ„๊ธฐ์—์„œ๋Š” URI๋ฅผ ์ธ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด ๋์— ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ง๋ถ™์ด๋ฉด ์ข…์ข… ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค: ;id# or &&/usr/bin/id#

Hardening (Perl)

  • ์‰˜ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”. ์ธ์ˆ˜ ๋ฒกํ„ฐ ํ˜•ํƒœ์˜ ์‹คํ–‰์„ ์„ ํ˜ธํ•˜์„ธ์š”: system(โ€˜/usr/bin/curlโ€™, โ€˜โ€“silentโ€™, โ€˜โ€“โ€™, $safe_url) โ€” ์‰˜์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.
  • ์‰˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ถ„๊ธฐ์—์„œ ์—„๊ฒฉํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ด์Šค์ผ€์ดํ”„ํ•˜์„ธ์š”; $r->uri()๋ฅผ ์ ๋Œ€์  ์ž…๋ ฅ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์„ธ์š”. ๊ฒฝ๋กœ/์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋Š” URI::Escape์™€ ๊ฐ•๋ ฅํ•œ ํ—ˆ์šฉ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
  • ๋ช…๋ น ์‹คํ–‰์— backticks/qx// ์‚ฌ์šฉ์„ ํ”ผํ•˜์„ธ์š”; ์ •๋ง ํ•„์š”ํ•˜๋‹ค๋ฉด ์‰˜์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” open3/list ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ์„ ์บก์ฒ˜ํ•˜์„ธ์š”.
  • mod_perl ํ•ธ๋“ค๋Ÿฌ์—์„œ๋Š” auth/redirect ์ฝ”๋“œ ๊ฒฝ๋กœ์—์„œ ๋ช…๋ น ์‹คํ–‰์„ ํ”ผํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“  ๋ถ„๊ธฐ์—์„œ ๋™์ผํ•œ ์ •์ œ(๋˜๋Š” ๊ฒ€์ฆ)๋ฅผ ๋ณด์žฅํ•ด โ€œ๋ชจ๋‘ ๊ณ ์ณค์ง€๋งŒ ํ•œ ๋ถ„๊ธฐ๋งŒ ๋น ์ง„โ€ ํšŒ๊ท€๋ฅผ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

Vulnerability hunting

  • ์‰˜ ๋ช…๋ น์„ ์กฐ๋ฆฝํ•˜๋Š” ๋ชจ๋“ˆ์˜ ํŒจ์น˜-๋””ํ”„๋ฅผ ๊ฒ€์‚ฌํ•˜์„ธ์š”; ๋ถ„๊ธฐ ๊ฐ„ ๋ถˆ์ผ์น˜ํ•˜๋Š” ์ธ์šฉ์„ ์ฐพ์œผ์„ธ์š”(์˜ˆ: if ($type eq โ€˜loginโ€™)๊ฐ€ ์ด์Šค์ผ€์ดํ”„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ).
  • ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์‰˜์„ ์ฐพ๊ธฐ ์œ„ํ•ด backticks, qx//, open\s*(|||, and system\s*(\s*โ€œ๋ฅผ grepํ•˜์„ธ์š”. sink๋ถ€ํ„ฐ ์š”์ฒญ ์ง„์ž…($r)๊นŒ์ง€ ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด pre-auth๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.

Real-world case: Dell UnityVSA pre-auth RCE (CVE-2025-36604)

  • Pre-auth command injection via backticks in AccessTool.pm:getCASURL when type == โ€œloginโ€ concatenated raw $uri ($r->uri()).
  • Reachable through MOD_SEC_EMC::AccessHandler โ†’ make_return_address($r) โ†’ getCASLoginURL(โ€ฆ, type=โ€œloginโ€) โ†’ getCASURL(โ€ฆ, $uri, โ€˜loginโ€™).
  • Practical nuance: use a resolvable path covered by the handler; otherwise the module wonโ€™t execute and the sink wonโ€™t be hit.

References

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