SOAP/JAX-WS ThreadLocal Authentication Bypass

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

TL;DR

  • Bazı middleware zincirleri, kimlik doğrulanmış Subject/Principal’ı statik bir ThreadLocal içinde tutar ve yalnızca özel bir SOAP header geldiğinde bunu yeniler.
  • WebLogic/JBoss/GlassFish işçi thread’lerini yeniden kullandığı için, o header’ın olmaması thread tarafından işlenen son ayrıcalıklı Subject’in sessizce tekrar kullanılmasına neden olur.
  • Header içermeyen ama düzgün biçimlendirilmiş SOAP gövdeleriyle hedef endpoint’e ardışık istekler gönderin; yeniden kullanılan bir thread size çalınmış yönetici bağlamını verene kadar devam edin.
  • 2025 HID ActivID/IASP (HID-PSA-2025-002) gerçek dünyadan bir örnektir: JAX-WS handler bir SubjectHolder ThreadLocal’ı cache’ler ve kimlik doğrulanmamış SOAP çağrılarının önceki console/SSP istekleri tarafından ayarlanmış kimliği devralmasına izin verir.

Root Cause

Handlers similar to the following only overwrite the thread-local identity when the custom header is present, so the previous request’s context survives:

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;
}

Keşif

  1. Reverse proxy / routing kurallarını listeleyin; ?wsdl’yi engelleyip POST’ları kabul edebilecek gizli SOAP ağaçlarını bulun (bunları 80,443 - Pentesting Web Methodology akışıyla birlikte haritalayın).
  2. EAR/WAR/EJB artefaktlarını açın (unzip *.ear) ve application.xml, web.xml, @WebService anotasyonlarını ve handler zincirlerini (ör. LoginHandlerChain.xml) inceleyin; handler sınıfını, SOAP header QName’ini ve arka plandaki EJB isimlerini ortaya çıkarın.
  3. Eğer metadata eksikse, muhtemel ServiceName?wsdl yollarını brute-force edin veya geçici olarak lab proxy’lerini gevşetin; ardından kurtarılan herhangi bir WSDL’i Burp Suite Wsdler gibi araçlara import ederek temel SOAP envelope’ları oluşturun.
  4. Handler kaynaklarını, kimlik doğrulama header’ı eksik veya bozuk olduğunda asla temizlenmeyen ThreadLocal tutucuları (ör. SubjectHolder.setSubject()) için inceleyin.

İstismar

  1. Normal yanıt kodlarını ve geçersiz tokenlar için kullanılan hatayı öğrenmek amacıyla özel header ile geçerli bir istek gönderin.
  2. Aynı SOAP gövdesini header’ı atlayarak tekrar gönderin. XML’in well-formed olmasına ve gerekli namespace’lere dikkat edin, böylece handler sorunsuz şekilde çıkış yapsın.
  3. İsteği döngüye alın; daha önce ayrıcalıklı bir işlem gerçekleştirmiş bir threade denk geldiğinde, yeniden kullanılan Subject kullanıcı veya kimlik bilgisi yöneticileri gibi korumalı işlemlerin kilidini açar.
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 vaka çalışması (HID-PSA-2025-002)

  • Synacktiv, ActivID 8.6–8.7’deki JAX-WS LoginHandler’ın mySubjectHeader SOAP başlığı mevcut olduğunda veya console/SSP trafiği kimlik doğruladığında SubjectHolder.subject’ı ayarladığını, ancak başlık olmadığında bunu asla temizlemediğini gösterdi.
  • Aynı worker thread üzerinde sonraki herhangi bir SOAP çağrısı başlıksız ise o önbelleğe alınmış Subject’i devralır; bu da UserManager veya CredentialManager gibi uç noktalar üzerinden kimlik doğrulamasız yönetici kullanıcı oluşturulmasına veya kimlik bilgilerinin içe aktarılmasına izin verir.
  • Gözlemlenen güvenilir exploit deseni:
  1. Birçok thread üzerinde kimlik doğrulanmış bir bağlam tetikleyin (örn., /ssp’yi spamleyin veya başka bir tarayıcı sekmesinde /aiconsole’a admin olarak giriş yapın).
  2. Başlıksız SOAP gövdelerini yüksek paralellik ile /ac-iasp-backend-jaxws/UserManager veya diğer EJB destekli JAX-WS uç noktalarına gönderin; ‘enfekte’ bir thread’i yeniden kullanan her istek yükseltilmiş Subject ile çalışır.
  3. Ayrıcalıklı yanıtlar dönene kadar tekrarlayın; thread yeniden kullanım olasılığını maksimize etmek için Keep-Alive bağlantılarını ve büyük worker havuzlarını yeniden kullanın.
  • Handler ve süreç akışı vurguları:
  • LoginHandlerChain.xmlLoginHandler.handleMessage() mySubjectHeader’ı unmarshal eder ve Subject’ı SubjectHolder’a (statik bir ThreadLocal) kaydeder.
  • ProcessManager.triggerProcess() daha sonra SubjectHolder.getSubject()’ı iş süreçlerine enjekte eder, bu yüzden eksik başlıklar eski kimlikleri olduğu gibi bırakır.
  • Advisory’den gerçek dünya PoC’u iki adımlı SOAP suistimali kullanır: önce bilgi leak etmek için getUsers, sonra ayrıcalıklı thread’e denk geldiğinde sahte bir admin yerleştirmek için createUser + importCredential.

Hatanın Doğrulanması

  • Her çağrıdan önce ve sonra ThreadLocal içeriğini izlemek için JDWP (-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) veya benzeri debugging hook’ları ekleyin; böylece kimlik doğrulama yapılmamış bir isteğin önceki bir yönetici Subject’ini devraldığını doğrulayın.
  • Üretim appliance’larında ayrıca her istek için SubjectHolder.getSubject()’ı dökmek amacıyla JFR veya BTrace ile enstrümente edebilirsiniz; bu şekilde başlıksız yeniden kullanımı doğrulayın.

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin