Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
liferay-ga4-rce-research — Security research on Liferay CE 7.0.3 GA4: pre-auth RCE as root (CVE-2020-7961 class) reproduced end-to-end, plus 16 more findings — 8+ with no known CVE. Agentic loop-hunt: 25 generators, 22 judges, 9 live validators on Docker. Evidence trail + one-go checker included. | Kitploit
Tools/GitHubGitHub/dinosn/liferay-ga4-rce-research
Dynamic Analysis (Sandboxing)Vulnerability AnalysisExploitationScripting & AutomationWeb Application ExploitationWeb SecurityPenetration TestingPapers & ResearchRed Teaming

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
GitHubdinosn/liferay-ga4-rce-research

liferay-ga4-rce-research

Security research on Liferay CE 7.0.3 GA4: pre-auth RCE as root (CVE-2020-7961 class) reproduced end-to-end, plus 16 more findings — 8+ with no known CVE. Agentic loop-hunt: 25 generators, 22 judges, 9 live validators on Docker. Evidence trail + one-go checker included.

View Repository
651 month agoNot yet reviewed
Share

Liferay CE 7.0.3 GA4 — Vulnerability Research (RAPTOR Loop-Hunt)

A security audit of Liferay Portal CE 7.0.3 GA4 (git tag 7.0.3-ga4, commit b2d7cc68a) performed with the RAPTOR loop-hunt methodology: deterministic recon → 25 isolated generator agents reading raw source → 22 independent judge agents refuting from raw → 9 live validators attacking a real GA4 instance in Docker.

Headline: unauthenticated RCE as root reproduced end-to-end (CVE-2020-7961 class), plus 8 more live-verified vulnerabilities — several of them with no known CVE.

⚠️ Legal/ethical: everything here targets a self-hosted test instance. Liferay CE 7.0 is end-of-life (last release 7.0.6 GA7, 2018); these issues are unpatched upstream. Use this material only against systems you own or are explicitly authorized to test.


You are probably looking for :)

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

Findings at a glance

Status: ✅ live-verified against the Docker GA4 instance · 🔬 confirmed-by-code (independent judge re-derived the full trace from raw source) · 🧪 needs/config-gated.

IDFindingSeverityAuthStatusEvidence
F-1JSONWS type-override → arbitrary class instantiation + setters → RCE as root (c3p0 HexAsciiSerializedMap → ObjectInputStream → AspectJWeaver file-write → JSP)Criticalnone✅verified/f1-jsonws-deser-rce.md
F-2/poller/* jabsorb javaClass hint → arbitrary class instantiation + field injection, before userId validationHigh (potential)any account (self-registration default-on)✅ sink / RCE arm openverified/F-2-poller.md
F-4XML-RPC pingback.ping fetch-before-validate → blind SSRF + internal port oracle (reached Gogo shell on 127.0.0.1:11311)Mediumnone✅verified/f4-xmlrpc-pingback-ssrf.md
F-5SyncDownloadServlet versionId IDOR → read any DL file version (cross-site, no VIEW check on the streamed object)Highnone (via guest-viewable "leg")✅verified/F-5.md
F-6XSL template engine ignores sandboxing (secureProcessing=false, restricted dropped) → document() SSRF and XSLTC rt:exec command executionCriticalsite template author✅verified/F-6-F-7-template-engines.md

Full curated list with rejections: FINDINGS.md · narrative report: REPORT.md


New vs. known — CVE comparison

Catalogue of ~50 known Liferay 7.0.x issues used as prior art: PRIOR-ART.md (OSV [email protected], NVD sweep, Code White / CERT-EU advisories).

FindingKnown CVE?Relationship
F-1 JSONWS deserialization RCECVE-2020-7961 (CISA KEV, exploited in the wild)Reproduction + independent re-derivation. Confirmed unpatched in GA4; full chain proven with an AspectJWeaver file-write gadget (public PoCs typically use JdbcRowSetImpl JNDI).
F-10 TunnelServlet readObjectCVE-2020-15842 (class match)Known class. Blacklist-only deserialization guard confirmed; pre-auth barriers verified live (not exploitable without shared secret/allowed host).
F-7 template propsUtil escapeCVE-2020-13445 (template injection, FreeMarker/Velocity)Variant. Same bug class (template API fails to restrict sensitive objects), different mechanism: raw PropsImpl/saxReaderUtil objects exposed inside the restricted context.
F-12 (enumeration half)CVE-2021-33321 (login.secure.forgot.password=false)Known insecure default — independently confirmed live.
F-12 (oracle + empty-answer reset ticket)none foundNew. Fresh-JSESSIONID captcha bypass on step 2; empty answer creates a valid 24 h reset ticket for query-less accounts with zero secret knowledge.
F-11 SimpleCaptcha brute-forcenone found (CVE-2019-6588 is a different captcha issue — XSS)New. 4-digit PIN + no invalidation + guest counter bypass.
F-2 poller jabsorb deserializationnone foundNew. Sink confirmed live; weaponization blocked by LiferaySerializer field-injection (open research).
F-4 pingback SSRF oraclenone foundNew.
F-5 sync versionId IDORnone foundNew.
F-6 XSL engine RCEnone found (CVE-2020-13445 covers FreeMarker/Velocity only)New. The XSL engine was outside every prior template-injection fix.
F-8 Image_ IDORnone foundNew.

"New" = no matching CVE located in OSV/NVD/Liferay advisories as of 2026-07; findings have not been submitted for CVE assignment (the product line is EOL).

Known CVEs confirmed present in GA4 but not re-tested live

CVE-2020-15840 (double-encoded URL filter bypass), CVE-2024-8980 + CVE-2025-43748 (CSRF → script console RCE), CVE-2021-33335 (company-admin takeover — GA4 is the floor of the affected range), CVE-2017-1000425 (flash.jsp XSS), CVE-2021-29040 (verbose JSONWS errors), CVE-2022-41414 / CVE-2023-33949 (enumeration/registration defaults), CVE-2025-62261 (reset tokens in plaintext — NVD names 7.0.3 GA4 directly). See PRIOR-ART.md.


The process (RAPTOR loop-hunt)

RoundWhat ranOutput
0 — deterministicraptor-sca dependency audit (727 deps), 17 Semgrep rules (1,098 anchors), threat model, entrypoint manifest from web.xml, prior-art CVE catalogueSCA.md SEMGREP.md THREAT-MODEL.md ENTRYPOINTS.md PRIOR-ART.md
1 — generate25 isolated agents, one per component slice × bug-class lens, reasoning from raw source only (no prior summaries — anti-anchoring)45 candidates in candidates/
2 — judge22 independent agents refuting each candidate from raw; a kill requires evidence visible in code ("don't assume the unseen layer is secure")judge/
3 — live-verify9 agents attacking the Docker GA4 instance; every claim backed by captured request/response; mandatory cleanupverified/

Ledger: TRIED.md (everything attempted, incl. 3 documented dry slices) · INVENTORY.md (coverage denominator) · environment/fixtures: ENV.md


Reproduce locally with Docker

There is no official liferay/portal:7.0.3-ga4 image, so build from the official bundle:

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

Then complete the one-time setup wizard at http://localhost:8080/ (default HSQL DB; the wizard sets the admin password for [email protected]).

Run the one-go validator

tools/liferay_ga4_check.py is a single-file, stdlib-only Python 3 script — point it at any GA4 instance and it tests every live-verified finding:

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

Expected output against a default GA4 install: 9 findings VULNERABLE (F-1, F-1+RCE, F-2, F-4, F-5*, F-8, F-11, F-12, F-13*) plus F-10 confirmed not vulnerable (tunnel barrier holds). *F-5 and F-13 need fixture parameters (--leg-uuid/--version-id, --wcd-page/--group-id/--article-id) — see --help.

The deserialization gadget is generated in pure Python inside the script (byte-verified against the ysoserial AspectJWeaver payload used in the engagement) — no Java, jars, or ysoserial needed.


Verified solid (so you can calibrate the rest)

Password-reset tickets (128-bit UUID, single-use, 24 h), session renewal on ticket login, remember-me cookie AES-128 with per-company SecureRandom key, default PBKDF2 hashing, the portal-wide XML stack (external entities disabled by default), WebDAV/SharePoint digest gates, /api/axis|/api/liferay|/api/atom localhost IP locks, upload path validation, /combo /sprite traversal guards, omni-admin gating of the script console and Gogo web UI.

Coverage statement & limitations

Coverage was tracked per component against the full inventory (TRIED.md). Not covered: function-by-function altitude over the whole 4 GB tree (Semgrep anchors only), most of modules/apps outside foundation/web-experience at file altitude, the F-2 gadget research, non-default-config live tests (F-9/F-14), and PDFBox 2.0.3 dependency-CVE reachability. The loop was paused for reporting, not because it ran dry.

Download Tool
F-7Velocity and FreeMarker restricted templates expose raw propsUtil / saxReaderUtil → portal property + file:// disclosure to guestsHightemplate author✅verified/F-6-F-7-template-engines.md
F-8Image_ table IDOR via /image/*?img_id=N — no token, prefix-scoped checks bypassed by prefix swap, sequential ids enumerableMediumnone✅verified/f-8-image-idor.md
F-11SimpleCaptcha = 4-digit PIN, never invalidated on wrong guesses, guest counter never increments → ~5k-request breakMediumnone✅verified/f11-f12-captcha-reminder.md
F-12Forgot-password: user enumeration + reminder-answer oracle without captcha (fresh-session bypass); empty answer fires a real reset ticket for query-less accountsMedium-Highnone✅verified/f11-f12-captcha-reminder.md
F-13Web Content Display request-param override (groupId/articleId/ddmTemplateKey) → cross-site read of non-guest articles (journal.article.view.permission.check.enabled=false default)Highnone (needs a WCD on a guest page)✅verified/F-13-wcd-param-override.md
F-3OSGi axis-extender skips ServiceAccessPolicy / remote-access marking on module SOAP servicesMedium (High w/ WSDD module)none🔬judge/axis-spring-remoting.md
F-9OpenID links victim account to attacker's OpenID before assertion verification → account takeoverHighnone (OpenID enabled, non-default)🔬 🧪judge/sso-autologin.md
F-10TunnelServlet readObject guarded only by a class blacklist; ROME/JdbcRowSetImpl/c3p0/AspectJWeaver gadgets on classpathCritical potentialtrusted peer (shared secret + allowed host)✅ barriers hold pre-authverified/f10-f20-tunnel-auth-pipeline.md
F-14TokenAutoLogin trusts a bare SM_USER header (no verification, no IP allowlist)Mediumnone (token SSO enabled, non-default)🔬 🧪judge/sso-autologin.md
F-15Site-admin LAR import smuggles RolesAdminPortletDataHandler → mass company-role deletion / permission wipeMediumsite admin🔬judge/export-import-lar.md
F-16OpenSocial (not in default bundle): pre-auth makeRequest SSRF, /gadgets/ifr origin JS, forgeable security tokens → impersonation, stored XSSHigh ×4none / site member🔬 (deployment-conditional)judge/opensocial-shindig.md
F-17WSRP (not in default bundle): pre-auth ProxyServlet SSRF; markup endpoint → arbitrary portlet render + layout typeSettings persistenceMediumnone🔬 (deployment-conditional)judge/wsrp.md
F-13 WCD cross-site readnone foundNew. Root insecure default (journal.article.view.permission.check.enabled=false) plus a new delivery path (portlet request-param override).
F-3 axis-extender SAP bypassnone foundNew.
F-9 OpenID link-before-verifynone foundNew.
F-14 SM_USER header trustnone foundNew.
F-15 LAR roles data-handler smugglenone foundNew.
F-16 / F-17 OpenSocial / WSRPnone foundNew, but modules are not in the default GA4 bundle (Liferay-Releng-Bundle: false).