Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
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
Herramientas/GitHubGitHub/dinosn/liferay-ga4-rce-research
Análisis Dinámico (Sandboxing)Análisis de VulnerabilidadesExplotaciónScripting y AutomatizaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónPapers e InvestigaciónRed Teaming
GitHubdinosn/liferay-ga4-rce-research

liferay-ga4-rce-research

Ver Repositorio
65hace 1 mesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

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.


Probablemente estás buscando :)

https://github.com/dinosn/liferay-ga4-rce-research/blob/main/tools/liferay_ga4_check.py

Hallazgos de un vistazo

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.

IDHallazgoSeveridadAuthEstadoEvidencia
F-1Sobrescritura de tipo JSONWS → instanciación arbitraria de clases + setters → RCE como root (c3p0 HexAsciiSerializedMap → ObjectInputStream → escritura de archivo AspectJWeaver → JSP)Críticaninguna✅verified/f1-jsonws-deser-rce.md
F-2Pista javaClass de jabsorb en /poller/* → instanciación arbitraria de clases + inyección de campos, antes de la validación de userIdAlta (potencial)cualquier cuenta (auto-registro activado por defecto)✅ sumidero / brazo RCE abiertoverified/F-2-poller.md
F-4XML-RPC pingback.ping busca antes de validar → SSRF ciego + oráculo de puertos interno (alcanzó la shell Gogo en 127.0.0.1:11311)Medianinguna✅verified/f4-xmlrpc-pingback-ssrf.md
F-5IDOR de versionId en SyncDownloadServlet → leer cualquier versión de archivo de DL (cross-site, sin comprobación de VIEW sobre el objeto transmitido)Altaninguna (vía "tramo" visible para invitados)✅verified/F-5.md
F-6El motor de plantillas XSL ignora el sandboxing (secureProcessing=false, restricted descartado) → SSRF con document() y ejecución de comandos rt:exec de XSLTCCríticaautor 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 JSONWSCVE-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 TunnelServletCVE-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 plantillasCVE-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.
F-12 (mitad de enumeración)CVE-2021-33321 (login.secure.forgot.password=false)Valor por defecto inseguro conocido — confirmado de forma independiente en vivo.
F-12 (oráculo + ticket de reseteo con respuesta vacía)ninguno encontradoNuevo. 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 SimpleCaptchaninguno 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 pollerninguno encontradoNuevo. 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 pingbackninguno encontradoNuevo.
F-5 IDOR de versionId en syncninguno encontradoNuevo.
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)

RondaQué se ejecutóSalida
0 — deterministaauditorí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 previaSCA.md SEMGREP.md THREAT-MODEL.md ENTRYPOINTS.md PRIOR-ART.md
1 — generar25 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)45 candidatos en candidates/
2 — juzgar22 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")judge/
3 — verificación en vivo9 agentes atacando la instancia GA4 en Docker; cada afirmación respaldada por petición/respuesta capturadas; limpieza obligatoriaverified/

Registro: TRIED.md (todo lo intentado, incl. 3 cortes secos documentados) · INVENTORY.md (denominador de cobertura) · entorno/fixtures: ENV.md


Reproducir localmente con Docker

No hay una imagen oficial liferay/portal:7.0.3-ga4, así que hay que construirla desde el bundle oficial:

root@kitploit:~
# Dockerfile
FROM openjdk:8-jdk
RUN apt-get update && apt-get install -y --no-install-recommends unzip curl \
 && rm -rf /var/lib/apt/lists/*
RUN curl -sSL -o /tmp/liferay.zip \
    "https://downloads.sourceforge.net/project/lportal/Liferay%20Portal/7.0.3%20GA4/liferay-ce-portal-tomcat-7.0-ga4-20170613175008905.zip" \
 && unzip -q /tmp/liferay.zip -d /opt \
 && mv /opt/liferay-ce-portal-7.0-ga4 /opt/liferay \
 && rm /tmp/liferay.zip
EXPOSE 8080 11311
CMD ["/opt/liferay/tomcat-8.0.32/bin/catalina.sh", "run"]
root@kitploit:~
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.

Descargar herramienta
verified/F-6-F-7-template-engines.md
F-7Las plantillas restringidas de Velocity y FreeMarker exponen propsUtil / saxReaderUtil sin procesar → divulgación de propiedades del portal + file:// a invitadosAltaautor de plantillas✅verified/F-6-F-7-template-engines.md
F-8IDOR de la tabla Image_ vía /image/*?img_id=N — sin token, comprobaciones limitadas por prefijo eludidas al intercambiar el prefijo, ids secuenciales enumerablesMedianinguna✅verified/f-8-image-idor.md
F-11SimpleCaptcha = PIN de 4 dígitos, nunca se invalida con intentos fallidos, el contador de invitados nunca se incrementa → ruptura en ~5k peticionesMedianinguna✅verified/f11-f12-captcha-reminder.md
F-12Olvido 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 seguridadMedia-Altaninguna✅verified/f11-f12-captcha-reminder.md
F-13Anulació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)Altaninguna (se necesita un WCD en una página de invitados)✅verified/F-13-wcd-param-override.md
F-3El axis-extender de OSGi se salta ServiceAccessPolicy / el marcado de acceso remoto en los servicios SOAP de módulosMedia (Alta con módulo WSDD)ninguna🔬judge/axis-spring-remoting.md
F-9OpenID vincula la cuenta de la víctima al OpenID del atacante antes de la verificación de la aserción → toma de control de la cuentaAltaninguna (OpenID activado, no por defecto)🔬 🧪judge/sso-autologin.md
F-10readObject de TunnelServlet protegido solo por una lista negra de clases; gadgets ROME/JdbcRowSetImpl/c3p0/AspectJWeaver en el classpathPotencial críticopeer de confianza (secreto compartido + host permitido)✅ las barreras se mantienen pre-autenticaciónverified/f10-f20-tunnel-auth-pipeline.md
F-14TokenAutoLogin confía en una cabecera SM_USER sin más (sin verificación, sin lista blanca de IPs)Medianinguna (token SSO activado, no por defecto)🔬 🧪judge/sso-autologin.md
F-15La importación LAR de un administrador del sitio cuela RolesAdminPortletDataHandler → eliminación masiva de roles de empresa / borrado de permisosMediaadministrador del sitio🔬judge/export-import-lar.md
F-16OpenSocial (no está en el bundle por defecto): SSRF makeRequest pre-autenticación, JS de origen /gadgets/ifr, tokens de seguridad falsificables → suplantación, XSS almacenadoAlta ×4ninguna / miembro del sitio🔬 (condicional al despliegue)judge/opensocial-shindig.md
F-17WSRP (no está en el bundle por defecto): SSRF ProxyServlet pre-autenticación; endpoint de markup → renderizado arbitrario de portlets + persistencia de typeSettings de layoutMedianinguna🔬 (condicional al despliegue)judge/wsrp.md
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 encontradoNuevo.
F-13 lectura cross-site de WCDninguno encontradoNuevo. 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-extenderninguno encontradoNuevo.
F-9 OpenID vincula antes de verificarninguno encontradoNuevo.
F-14 confianza en la cabecera SM_USERninguno encontradoNuevo.
F-15 contrabando del data-handler de roles en LARninguno encontradoNuevo.
F-16 / F-17 OpenSocial / WSRPninguno encontradoNuevo, pero los módulos no están en el bundle por defecto de GA4 (Liferay-Releng-Bundle: false).