SOAP/JAX-WS ThreadLocal Authentication Bypass

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

TL;DR

  • Sommige middleware-kettings stoor die geverifieerde Subject/Principal binne ’n statiese ThreadLocal en verfris dit slegs wanneer ’n proprietêre SOAP header aankom.
  • Omdat WebLogic/JBoss/GlassFish werker-drade hergebruik, veroorsaak die weglating van daardie header dat die laaste bevoorregte Subject wat deur die draad verwerk is, stilweg hergebruik word.
  • Bombardeer die kwesbare endpoint met header-loos maar goed-gevormde SOAP bodies totdat ’n hergebruikte draad jou die gesteelde administrateur-konteks gee.
  • 2025 HID ActivID/IASP (HID-PSA-2025-002) is ’n werklike voorbeeld: JAX-WS handler kas ’n SubjectHolder ThreadLocal, wat nie-geauthentiseerde SOAP-aanroepe toelaat om die identiteit te erf wat deur vorige console/SSP-versoeke gestel is.

Worteloorsaak

Handlers soortgelyk aan die volgende oorskryf die ThreadLocal-identiteit slegs wanneer die pasgemaakte header teenwoordig is, sodat die konteks van die vorige versoek oorleef:

public boolean handleMessage(SOAPMessageContext ctx) {
if (!outbound) {
SOAPHeader hdr = ctx.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPHeaderElement e = findHeader(hdr, subjectName);
if (e != null) {
SubjectHolder.setSubject(unmarshal(e));
}
}
return true;
}

Verkenning

  1. Lys die reverse proxy / routing rules om verborge SOAP-bome te vind wat dalk ?wsdl blokkeer maar POSTs aanvaar (karter hulle langs die vloei in 80,443 - Pentesting Web Methodology).
  2. Pak die EAR/WAR/EJB artifacts uit (unzip *.ear) en inspekteer application.xml, web.xml, @WebService annotations, en handler chains (e.g., LoginHandlerChain.xml) om die handler-klas, SOAP header QName, en die onderliggende EJB-name te ontbloot.
  3. As metadata ontbreek, brute-force waarskynlike ServiceName?wsdl paadjies of maak lab proxies tydelik minder streng, en importeer enige herstelde WSDL in gereedskap soos Burp Suite Wsdler om standaard-enveloppe te genereer.
  4. Hersien die handler sources vir ThreadLocal houers (e.g., SubjectHolder.setSubject()) wat nooit skoongemaak word wanneer die authentication header ontbreek of malformed is.

Eksploitasie

  1. Stuur ’n geldige request met die proprietary header om die normale response-kodes en enige foutboodskap vir ongeldig tokens te bepaal.
  2. Stuur dieselfde SOAP-body weer sonder die header. Hou die XML welgevormd en respekteer die vereiste namespaces sodat die handler netjies kan afsluit.
  3. Herhaal die request; wanneer dit op ’n thread beland wat voorheen ’n bevoorregte aksie uitgevoer het, ontgrendel die hergebruikte Subject beskermde operasies soos gebruikers- of credential-managers.
POST /ac-iasp-backend-jaxws/UserManager HTTP/1.1
Host: target
Content-Type: text/xml;charset=UTF-8

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:jax="http://jaxws.user.frontend.iasp.service.actividentity.com">
<soapenv:Header/>
<soapenv:Body>
<jax:findUserIds>
<arg0></arg0>
<arg1>spl*</arg1>
</jax:findUserIds>
</soapenv:Body>
</soapenv:Envelope>

2025 HID ActivID/IASP gevallestudie (HID-PSA-2025-002)

  • Synacktiv het getoon dat die JAX-WS LoginHandler in ActivID 8.6–8.7 SubjectHolder.subject stel wanneer ’n mySubjectHeader SOAP header teenwoordig is of wanneer console/SSP-verkeer autentiseer, maar dit nooit skoonmaak wanneer die header afwesig is nie.
  • Enige daaropvolgende SOAP-oproep sonder die header op dieselfde worker thread erf daardie gecachte Subject, wat ongeauthentiseerde skep van administrateurgebruikers of credential-import moontlik maak via endpoints soos UserManager of CredentialManager.
  • Betroubare eksploitasiemodel waargeneem:
  1. Skep ’n geauthentiseerde konteks op baie threads (bv. spam /ssp of meld aan by /aiconsole as admin in ’n ander blaaier-oortjie).
  2. Stuur ’n vloed van header-loos SOAP-lywe na /ac-iasp-backend-jaxws/UserManager of ander EJB-backed JAX-WS endpunte met hoë parallelisme; elke hit wat ’n “infected” thread hergebruik voer uit met verhoogde Subject.
  3. Herhaal totdat geprivilegieerde antwoorde teruggestuur word; hergebruik Keep-Alive-verbindinge en groot worker pools om die waarskynlikheid van thread-hergebruik te maksimeer.
  • Hoofpunte van handler- en prosesvloei:
  • LoginHandlerChain.xmlLoginHandler.handleMessage() unmarshals mySubjectHeader en stoor die Subject in SubjectHolder (a statiese ThreadLocal).
  • ProcessManager.triggerProcess() injekteer later SubjectHolder.getSubject() in besigheidsprosesse, sodat afwesige headers verouderde identiteite onaangeraak laat.
  • In-veld PoC van die advisory gebruik ’n twee-stap SOAP-misbruik: eerste getUsers om info te leak, dan createUser + importCredential om ’n kwaaddoener admin te plant wanneer die geprivilegieerde thread raak.

Validering van die fout

  • Koppel JDWP (-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) of soortgelyke debugging-hake om die ThreadLocal-inhoude voor en na elke oproep te monitor, en bevestig dat ’n ongeauthentiseerde versoek ’n vorige administrateur Subject geërf het.
  • In produksie appliances kan jy ook met JFR of BTrace instrumenteer om SubjectHolder.getSubject() per versoek te dump, en header-loos hergebruik te verifieer.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks