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

Kort opsomming

  • 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 herwin, veroorsaak die weglating van daardie header dat die laaste bevoorregte Subject wat deur die draad verwerk is, stilweg hergebruik word.
  • Stuur baie versoeke na die kwesbare endpoint sonder header, maar met goed-gevormde SOAP bodies, totdat ’n hergebruikte draad jou die gesteelde administrateurkonteks verleen.

Oorsaak

Handlers soortgelyk aan die volgende oorskryf die thread-local identiteit slegs wanneer die pasgemaakte header teenwoordig is, sodat die vorige versoek se konteks 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;
}

Recon

  1. Som die reverse proxy / routeringsreëls op om versteekte SOAP-bome te vind wat dalk ?wsdl blokkeer maar POSTs aanvaar (kaart hulle langs die vloei in 80,443 - Pentesting Web Methodology).
  2. Pak die EAR/WAR/EJB-artifacts uit (unzip *.ear) en ondersoek application.xml, web.xml, @WebService-annotasies, en handler chains (bv. LoginHandlerChain.xml) om die handler-klas, SOAP header QName, en die onderliggende EJB-name te ontdek.
  3. As metadata ontbreek, brute-force waarskynlike ServiceName?wsdl-paaie of verlig tydelik lab-proxies, en importeer enige herstelde WSDL in tooling soos Burp Suite Wsdler om baseline envelopes te genereer.
  4. Hersien die handler-bronne vir ThreadLocal-bewarings (bv. SubjectHolder.setSubject()) wat nooit skoongemaak word wanneer die authentiseringsheader ontbreek of foutief is nie.

Exploitation

  1. Stuur ’n geldige versoek met die eiesoortige header om die normale responskodes en enige fout wat by ongeldige tokens gebruik word te leer.
  2. Hersend dieselfde SOAP-lichaam terwyl jy die header weglaat. Hou die XML goedgevorm en respekteer die vereiste namespaces sodat die handler netjies kan uitstap.
  3. Lus die versoek; wanneer dit op ’n thread land wat voorheen ’n bevoorregte aksie uitgevoer het, ontgrendel die hergebruikte Subject beskermde operasies soos user 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>

Validering van die fout

  • Sluit JDWP (-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) of soortgelyke debugging hooks aan om die ThreadLocal-inhoud voor en na elke oproep te monitor, en bevestig dat ’n nie-geauthentiseerde aanvraag ’n vorige administrateur Subject geërf het.

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