¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!
liferay-ga4-rce-research — Investigación de seguridad sobre Liferay CE 7.0.3 GA4: RCE pre-autenticación como root (clase CVE-2020-7961) reproducido de extremo a extremo, más 16 hallazgos adicionales — 8+ sin CVE conocido. Caza en bucle con agentes: 25 generadores, 22 jueces, 9 validadores en vivo en Docker. Rastro de evidencia + verificador de un solo paso incluido. | Kitploit
Investigación de seguridad sobre Liferay CE 7.0.3 GA4: RCE pre-autenticación como root (clase CVE-2020-7961) reproducido de extremo a extremo, más 16 hallazgos adicionales — 8+ sin CVE conocido. Caza en bucle con agentes: 25 generadores, 22 jueces, 9 validadores en vivo en Docker. Rastro de evidencia + verificador de un solo paso incluido.
Compartir
Liferay CE 7.0.3 GA4 — Investigación de Vulnerabilidades (RAPTOR Loop-Hunt)
Una auditoría de seguridad de Liferay Portal CE 7.0.3 GA4 (git tag 7.0.3-ga4, commit
b2d7cc68a) realizada con la metodología RAPTOR loop-hunt:
reconocimiento determinista → 25 agentes generadores aislados leyendo el código fuente crudo → 22 agentes jueces
independientes refutando desde el código crudo → 9 validadores en vivo atacando una instancia GA4 real en Docker.
Titular: RCE no autenticado como root reproducido de extremo a extremo (clase CVE-2020-7961),
más otras 8 vulnerabilidades verificadas en vivo — varias de ellas sin CVE conocido.
⚠️ Legal/ético: todo esto apunta a una instancia de prueba autoalojada. Liferay CE 7.0 está
al final de su vida útil (última versión 7.0.6 GA7, 2018); estos problemas no tienen parche
aguas arriba. Usa este material solo contra sistemas que poseas o para los que tengas
autorización explícita de prueba.
Estado: ✅ verificado en vivo contra la instancia GA4 en Docker · 🔬 confirmado por código (un juez
independiente re-derivó el rastro completo desde el código fuente crudo) · 🧪 requiere config/condicionado
por configuración.
ID
Hallazgo
Severidad
Auth
Estado
Evidencia
F-1
Sobrescritura de tipo JSONWS → instanciación arbitraria de clases + setters → RCE como root (c3p0 HexAsciiSerializedMap → ObjectInputStream → escritura de archivo AspectJWeaver → JSP)
El motor de plantillas XSL ignora el sandboxing (secureProcessing=false, restricted descartado) → SSRF con document()y ejecución de comandos rt:exec de XSLTC
Crítica
autor de plantillas del sitio
✅
Lista completa curada, incluidos los rechazos: FINDINGS.md · informe narrativo: REPORT.md
Nuevo vs. conocido — comparación de CVE
Catálogo de ~50 problemas conocidos de Liferay 7.0.x usado como referencia previa: PRIOR-ART.md
(OSV [email protected], barrido de NVD, avisos de Code White / CERT-EU).
Hallazgo
¿CVE conocido?
Relación
F-1 RCE por deserialización JSONWS
CVE-2020-7961 (CISA KEV, explotado en la naturaleza)
Reproducción + re-derivación independiente. Confirmado sin parche en GA4; cadena completa probada con un gadget de escritura de archivo AspectJWeaver (los PoC públicos normalmente usan JdbcRowSetImpl JNDI).
F-10 readObject de TunnelServlet
CVE-2020-15842 (coincidencia de clase)
Clase conocida. Confirmada la protección de deserialización basada solo en lista negra; barreras pre-autenticación verificadas en vivo (no explotable sin secreto compartido/host permitido).
F-7 escape de propsUtil en plantillas
CVE-2020-13445 (inyección de plantillas, FreeMarker/Velocity)
Variante. Misma clase de bug (la API de plantillas no logra restringir objetos sensibles), mecanismo diferente: objetos PropsImpl/saxReaderUtil sin procesar expuestos dentro del contexto restringido.
Valor por defecto inseguro conocido — confirmado de forma independiente en vivo.
F-12 (oráculo + ticket de reseteo con respuesta vacía)
ninguno encontrado
Nuevo. Bypass de captcha con JSESSIONID nuevo en el paso 2; answer vacía crea un ticket de reseteo válido de 24 h para cuentas sin pregunta de seguridad sin conocimiento previo de ningún secreto.
F-11 fuerza bruta a SimpleCaptcha
ninguno encontrado (CVE-2019-6588 es un problema de captcha diferente — XSS)
Nuevo. PIN de 4 dígitos + sin invalidación + bypass del contador de invitados.
F-2 deserialización jabsorb del poller
ninguno encontrado
Nuevo. Sumidero confirmado en vivo; la weaponización bloqueada por la inyección de campos de LiferaySerializer (investigación abierta).
F-4 oráculo SSRF de pingback
ninguno encontrado
Nuevo.
F-5 IDOR de versionId en sync
ninguno encontrado
Nuevo.
F-6 RCE del motor XSL
"Nuevo" = no se localizó ningún CVE coincidente en los avisos de OSV/NVD/Liferay al 2026-07; los hallazgos no se han
enviado para asignación de CVE (la línea de producto está EOL).
CVEs conocidos confirmados presentes en GA4 pero no re-probados en vivo
CVE-2020-15840 (bypass del filtro de URL con doble codificación), CVE-2024-8980 + CVE-2025-43748
(CSRF → RCE en la consola de scripts), CVE-2021-33335 (toma de control de admin de empresa — GA4 es el
límite inferior del rango afectado), CVE-2017-1000425 (XSS en flash.jsp), CVE-2021-29040 (errores JSONWS verbosos),
CVE-2022-41414 / CVE-2023-33949 (valores por defecto de enumeración/registro), CVE-2025-62261 (tokens
de reseteo en texto plano — NVD menciona directamente 7.0.3 GA4). Ver PRIOR-ART.md.
El proceso (RAPTOR loop-hunt)
Ronda
Qué se ejecutó
Salida
0 — determinista
auditoría de dependencias raptor-sca (727 deps), 17 reglas de Semgrep (1,098 anclas), modelo de amenazas, manifiesto de puntos de entrada desde web.xml, catálogo de CVEs de referencia previa
25 agentes aislados, uno por corte de componente × lente de clase de bug, razonando solo desde el código fuente crudo (sin resúmenes previos — anti-anclaje)
22 agentes independientes refutando cada candidato desde el código crudo; un descarte requiere evidencia visible en el código ("no des por sentado que la capa no visible es segura")
docker build -t liferay-ga4 .
docker run -d --name liferay-ga4 -p 8080:8080 liferay-ga4
# first boot takes several minutes — wait for it:
until [ "$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8080/)" = 200 ]; do sleep 10; done
Después complete el asistente de configuración inicial en http://localhost:8080/ (BD HSQL por defecto; el asistente
establece la contraseña de administrador para [email protected]).
Ejecutar el validador de una sola pasada
tools/liferay_ga4_check.py es un script Python 3 de un solo archivo, que solo usa la biblioteca estándar — apúntalo
a cualquier instancia GA4 y probará todos los hallazgos verificados en vivo:
root@kitploit:~
# passive validation of all findings (safe, no payloads detonated)
python3 tools/liferay_ga4_check.py http://localhost:8080
# with an account (self-registration is on by default) for the poller sink test
python3 tools/liferay_ga4_check.py http://localhost:8080 --user [email protected] --password '***'
# full RCE proof (opt-in): drops a SELF-DELETING JSP via the deserialization file-write
# gadget and fetches the command output; adjust --web-root to your install
python3 tools/liferay_ga4_check.py http://localhost:8080 --rce \
--web-root /opt/liferay/tomcat-8.0.32/webapps/ROOT
Salida esperada contra una instalación GA4 por defecto: 9 hallazgos VULNERABLE
(F-1, F-1+RCE, F-2, F-4, F-5*, F-8, F-11, F-12, F-13*) además de F-10 confirmado no vulnerable
(la barrera del túnel se mantiene). *F-5 y F-13 requieren parámetros de fixture (--leg-uuid/--version-id,
--wcd-page/--group-id/--article-id) — ver --help.
El gadget de deserialización se genera en Python puro dentro del script (verificado byte a byte contra
el payload AspectJWeaver de ysoserial usado en el engagement) — no se necesitan Java, jars ni ysoserial.
Verificado sólido (para que puedas calibrar el resto)
Tickets de reseteo de contraseña (UUID de 128 bits, un solo uso, 24 h), renovación de sesión al iniciar sesión
con ticket, cookie remember-me AES-128 con clave SecureRandom por empresa, hash PBKDF2 por defecto, la
pila XML del portal (entidades externas deshabilitadas por defecto), protecciones digest WebDAV/SharePoint,
bloqueos por IP de localhost en /api/axis|/api/liferay|/api/atom, validación de rutas de subida, protecciones
anti-traversal /combo/sprite, y la consola de scripts y la UI web de Gogo restringidas a omni-admin.
Declaración de cobertura y limitaciones
La cobertura se registró por componente contra el inventario completo (TRIED.md).
No cubierto: revisión función por función de todo el árbol de 4 GB (solo anclas de Semgrep),
la mayor parte de modules/apps fuera de foundation/web-experience a nivel de archivo,
la investigación del gadget de F-2, las pruebas en vivo con configuración no predeterminada
(F-9/F-14) y la alcanzabilidad de CVEs de la dependencia PDFBox 2.0.3. El bucle se pausó
para elaborar el informe, no porque se agotara.
Las plantillas restringidas de Velocity y FreeMarker exponen propsUtil / saxReaderUtil sin procesar → divulgación de propiedades del portal + file:// a invitados
IDOR de la tabla Image_ vía /image/*?img_id=N — sin token, comprobaciones limitadas por prefijo eludidas al intercambiar el prefijo, ids secuenciales enumerables
Olvido de contraseña: enumeración de usuarios + oráculo de respuesta del recordatorio sin captcha (bypass con sesión nueva); una respuesta vacía genera un ticket de reseteo real para cuentas sin pregunta de seguridad
Anulación de parámetros de petición en Web Content Display (groupId/articleId/ddmTemplateKey) → lectura cross-site de artículos no destinados a invitados (journal.article.view.permission.check.enabled=false por defecto)
Alta
ninguna (se necesita un WCD en una página de invitados)
OpenSocial (no está en el bundle por defecto): SSRF makeRequest pre-autenticación, JS de origen /gadgets/ifr, tokens de seguridad falsificables → suplantación, XSS almacenado
WSRP (no está en el bundle por defecto): SSRF ProxyServlet pre-autenticación; endpoint de markup → renderizado arbitrario de portlets + persistencia de typeSettings de layout
ninguno encontrado (CVE-2020-13445 cubre solo FreeMarker/Velocity)
Nuevo. El motor XSL quedó fuera de todos los arreglos previos de inyección de plantillas.
F-8 IDOR de Image_
ninguno encontrado
Nuevo.
F-13 lectura cross-site de WCD
ninguno encontrado
Nuevo. Valor por defecto inseguro de raíz (journal.article.view.permission.check.enabled=false) más una nueva vía de entrega (anulación de parámetros de petición del portlet).
F-3 bypass de SAP del axis-extender
ninguno encontrado
Nuevo.
F-9 OpenID vincula antes de verificar
ninguno encontrado
Nuevo.
F-14 confianza en la cabecera SM_USER
ninguno encontrado
Nuevo.
F-15 contrabando del data-handler de roles en LAR
ninguno encontrado
Nuevo.
F-16 / F-17 OpenSocial / WSRP
ninguno encontrado
Nuevo, pero los módulos no están en el bundle por defecto de GA4 (Liferay-Releng-Bundle: false).