
Скрипт, который проверяет уязвимые системы Log4j (CVE-2021-44228) путем внедрения полезной нагрузки в общие HTTP-заголовки.
В пятницу, 10 декабря 2021 года, была опубликована новая proof-of-concept 1, касающаяся уязвимости удалённого выполнения кода (RCE) в Java-библиотеке 'log4j' 2. Эта уязвимость не была заранее раскрыта разработчикам программного обеспечения. Уязвимость отслеживается как CVE-2021-44228 3. Дополнительную информацию об уязвимости можно найти в документе Northwave Threat Response 4.
Northwave создала тестовый скрипт, который проверяет уязвимые системы путём внедрения полезной нагрузки в распространённые HTTP-заголовки и как часть HTTP GET-запроса. Уязвимые системы обнаруживаются путём прослушивания входящих DNS-запросов, содержащих UUID, специально созданный для цели. Используя прослушивание входящих DNS вместо развёртывания (например) LDAP-сервера, мы повышаем вероятность обнаружения уязвимых систем, у которых включена фильтрация исходящего трафика. На практике исходящий DNS часто разрешён. Ожидается высокая частота ложных отрицательных результатов, пожалуйста, прочитайте отказ от ответственности.
Проверяются следующие HTTP-заголовки:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAcceptДля каждой инъекции проверяются следующие префиксы JNDI:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apОбратите внимание, что скрипт выполняет только две конкретные проверки: HTTP-заголовки и HTTP GET-запрос. Это приведёт к ложным отрицательным результатам в случаях, когда необходимо нацелиться на другие заголовки, определённые поля ввода и т.д., чтобы вызвать уязвимость. Это очень вероятно.
ВАЖНО: Если проверка показала «уязвимость не обнаружена», переходите к проверкам файловой системы, как описано в документе Northwave Threat Response 4. Только запуск этого проверщика недостаточен для определения того, уязвима система или нет.
Во-первых, нам нужен поддомен для приёма входящих DNS-запросов. В данном случае мы используем зону log4jdnsreq.northwave.nl и развёртываем наш скрипт на log4jchecker.northwave.nl. Настройте DNS-запись следующим образом:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
Теперь настроим DNS-сервер BIND на системе Debian с помощью apt install bind9 и добавим следующее в файл /etc/bind/named.conf.options:
recursion no;
allow-transfer { none; };
Это отключает рекурсию, так как мы не хотим запускать открытый DNS-сервер. Настройте журналирование в /etc/bind/named.conf.local, добавив следующую конфигурацию:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
Не забудьте перезапустить BIND с помощью systemctl restart bind9. Проверьте работу журналирования, выполнив DNS-запрос для xyz.log4jdnsreq.northwave.nl. В файле /var/log/named/query.log должны появиться один или несколько запросов.
Важно убедиться, что поиск по именам серверов действительно регистрируется. Этот скрипт не может обнаружить уязвимые сайты, если ваша настройка DNS-сервера не регистрирует запросы
Проверьте ваш сервер, выполнив тестовый поиск (в идеале с другой машины):
dig test.log4jchecker.northwave.nl
Вы не должны ожидать ответа, но должны ожидать запись в файле журнала (cat /var/log/named/query.log). Эта запись может выглядеть примерно так:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
Не продолжайте, пока ответ не появится в журналах. Без этого скрипт не обнаружит уязвимости.
Установите любые зависимости Python с помощью pip install -r requirements.txt. Отредактируйте скрипт, изменив следующую строку на настроенную вами DNS-зону:
HOSTNAME = "log4jdnsreq.northwave.nl"
Теперь вы можете запустить скрипт, указав один URL с помощью параметра -u или список URL с помощью параметра -l:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
Последняя строка вывода показывает, была ли система признана уязвимой:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
Если уязвимость не была обнаружена, переходите к проверкам файловой системы, как описано в документе Northwave Threat Response 4. Ещё раз: только запуск этого проверщика недостаточен для определения того, уязвима система или нет.
Log4jcheck — это программное обеспечение с открытым исходным кодом, лицензированное по лицензии MIT.