Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
vsftpd-deny-file-brace-child — vsftpd 3.0.5 — высокий — удалённый — остаточная привилегия — фигурная скобка deny_file пропускает .private/secret | Kitploit
Инструменты/GitHubGitHub/abraxas/vsftpd-deny-file-brace-child
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСбор информацииСетевая безопасностьТестирование на ПроникновениеЛаборатории и Практика
GitHub
abraxas/vsftpd-deny-file-brace-child

vsftpd-deny-file-brace-child

vsftpd 3.0.5 — высокий — удалённый — остаточная привилегия — фигурная скобка deny_file пропускает .private/secret

Репозиторий
76 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Abraxas Labs - vsftpd-deny-file-brace-child

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vsftpd-deny-file-brace-child

vsftpd-deny-file-brace-child

Класс: Остаточная привилегия Достижимость: Удалённая

vsftpd 3.0.5 — Chris Evans

Пример из man-страницы (vsftpd.conf.5): deny_file={*.mp3,*.mov,.private}. Совпадающие имена «не должны быть доступны никаким образом», включая «скачивание, переход в каталог, воздействие на что-либо внутри каталога». vsf_access_check_file (access.c:16-43) вызывает vsf_filename_passes_filter для клиентского пути как есть, затем str_locate_str для всей brace-настройки. Фильтр сопоставляется с последним компонентом / префиксом; остаток /secret не проходит; подстрока {*.mp3,*.mov,.private} не находится.

CWD .private запрещён (basename совпадает). RETR .private/secret и RETR dir/.private проходят. Именно это «внутри каталога» и ломает данный остаток.

CVE-2015-1419 — это публичный патч realpath/basename в дистрибутивах. Официальный 3.0.5 его так и не принял. Brace-ветка в Debian по-прежнему сопоставляется с полным путём, поэтому этот обход дочернего элемента сохраняется и в пропатченных пакетах дистрибутивов. Не подавайте повторно 2015-1419.

Этот остаток — промах deny-list, управляемый конфигурацией. Это не неаутентифицированный RCE, не побег из chroot и не чтение хостового /etc.

IDCVE пока нет
КлассОстаточная привилегия
ДостижимостьУдалённая (аутентифицированный FTP)
CWECWE-863, CWE-22
CVSSHigh: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
Продуктvsftpd (Chris Evans)
Затронутоvsftpd 3.0.5 официальный tarball SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3
Аутентификацияаутентифицированный FTP USER/PASS (анонимный в лаборатории). deny_file задан как brace-список (по умолчанию не задан)
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1. Анонимный доступ только для чтения. Файл-свидетель.

Что может сделать атакующий

Кто: аутентифицированный FTP-пользователь (анонимный ftp в лаборатории). UID сессии после обычного сброса привилегий vsftpd. deny_file — это дополнительная политика, которая должна была отнять у этого UID определённые возможности. Рецепты виртуальных пользователей, упомянутые в man-странице, используют общий guest_username, поэтому Unix DAC их не разделяет. Штатный 3.0.5 с tunable_deny_file NULL — это не данный остаток.

Конфиденциальность (доказано в лаборатории)

Метод + точка срабатыванияПривилегия
RETR .private/secret с документированным brace deny_file={*.mp3,*.mov,.private}handle_retr str_open файла, имя каталога которого находится в deny-списке, от имени uid сессии. Лаборатория: 150/226, 37 байт, тело VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS
RETR dir/.privateта же точка срабатывания. Файл с именем .private в другом каталоге (must_match_at_current_pos отклоняет совпадение с индексом > 0). Лаборатория: 150/226, тело DIRDOT-VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS

Целостность (выведено из того же шлюза vsf_access_check_file; лаборатория была только для чтения)

Метод + точка срабатыванияПривилегия
STOR / APPE по тому же пути при write_enable=YEShandle_upload_common создание / перезапись от имени uid сессии
DELE / RNTO по тому же путиstr_unlink / переименование имени, которое denylist должен был остановить

Разведка (выведено)

Метод + точка срабатыванияПривилегия
LIST .private/x (или LIST внутри запрещённого дерева)handle_dir_common проверяет доступ для полного аргумента (промах), затем str_opendir для префикса .private после разделения по слэшу. Только имена. Unix DAC по-прежнему применяется

Доказанные в лаборатории отрицательные результаты (тот же запуск)

Метод + точка срабатыванияРезультат
CWD .private550 Permission denied. Basename .private совпадает с brace
RETR song.mp3550. *.mp3 — это шаблон последнего компонента, и он действительно совпадает

Чего этот остаток не даёт

  • Файлы, которые uid сессии не может открыть на уровне Unix
  • Сам CWD .private (basename совпадает)
  • Скрытие dirent в LIST через hide_file (basename из readdir; RETR скрытого имени документирован как намеренный)
  • Хостовый /etc из chroot
  • Неаутентифицированный HTTP (http_enable по умолчанию выключен; GET в режиме FTP убивает сессию)
  • Не-brace deny_file=.private спасается резервным поиском подстроки (str_locate_str для .private в .private/secret)
  • Пропуск неаутентифицированного входа, PORT bounce, root, побег из chroot

Как я это нашёл

Я зафиксировал официальный vsftpd 3.0.5 (SHA-256 26b602ae...c91d3), а не зеркало на GitHub или дерево Debian/Fedora. Девятнадцать поисков по исходникам. Скомпилированный по умолчанию демон не имеет неопубликованных остатков уровня Critical/High. Этот требует, чтобы оператор скопировал brace-пример из man-страницы.

vsf_filename_passes_filter (ls.c) сопоставляет * / ? / невложенные {,} и делает полезную работу только для шаблона последнего компонента. Для имени .private/secret против {*.mp3,*.mov,.private}:

  1. Brace-альтернативы *.mp3, *.mov, .private сопоставляются в начале .private/secret. Остаток /secret не проходит, если только токен не был *.
  2. Резервный поиск подстроки ищет литерал {*.mp3,*.mov,.private} и не находит.

Уже публичное ложное направление: CVE-2015-1419 — это realpath только в дистрибутивах. В официальном Changelog такого исправления нет. Даже brace-ветка в Debian копирует полный нормализованный путь, поэтому дочерние элементы всё равно проходят.

Лаборатория

cd lab
./run.sh

Управление через loopback 127.0.0.1:18710, PASV 18711-18718. Compose-проект vsftpd-deny-file-brace-child. Официальный tarball 3.0.5, анонимный доступ только для чтения, deny_file={*.mp3,*.mov,.private}. Свидетель VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS. Последняя строка:

SUCCESS vsftpd-deny-file-brace-child cwd-dotprivate=550 retr-child=yes retr-dir-dotprivate=yes mp3=550 VSFTPD-DENY-FILE-BRACE-CHILD-WITNESS

Исправление

Сопоставлять brace-альтернативы с каждым компонентом пути или применять realpath / basename перед фильтром (с обычными оговорками о симлинках). Документированный пример должен действительно запрещать дочерние элементы.

Приём сообщений от вендора: [email protected] (vsftpd). Не открывайте публичный issue на GitHub в любом зеркале vsftpd.

Контакты

Abraxas Labs — abraxaslabs.tech — github.com/abraxas — @abraxas_null — [email protected]

Скачать инструмент