Содержание статьи
Это исследование получило второе место на Pentest Award 2025 в категории Out of scope. Соревнование ежегодно проводится компанией Awillix.
Публичные сетевые шары в любой локалке — кладезь неструктурированных данных. Но если ты пентестер, копаться в них тяжело, особенно когда сроки поджимают. Для защитников это та же боль: сетевые диски зарастают мусором годами, и на это привычно закрывают глаза.
При анализе защищенности сетевые диски и шары часто изучают вручную — бегло просматривают «интересные» файлы и типовые каталоги (например, ищут слово «пароль»). Но таких шар может быть десятки и даже сотни. Возможности ручного труда ограничены: просмотр быстро превращается в профанацию, и этот вектор почти не отрабатывают. Вдобавок часть файлов может быть доступна и по другим протоколам: FTP, NFS, rsync и даже HTTP.
Моя разработка пытается решить эту проблему. Она одинаково полезна и атакующим — чтобы быстро искать пароли и другие чувствительные данные, — и защитникам: можно поднять непрерывный краулинг и держать его включенным.

Система на 99% собрана из готовых компонентов — почти без дополнительного кода. Для развертывания тебе хватит пары команд.
Искать чувствительные данные можно двумя способами. Самый очевидный — анализ по имени файла и его расположению. Он быстрый и сканирует все файлы на сетевых шарах. Ты делаешь рекурсивный обход директорий, собираешь имена, размеры, время изменения — этого хватает, чтобы прикинуть актуальность. Но содержимое при таком подходе остается загадкой: ты судишь только по названию. А оно часто врет. Люди прячут важное в 1., 123. или дают файлу имя, понятное только автору. В итоге ранжирование по имени — подход слабенький.
Анализ по содержимому файлов дает самый полный результат. Но он медленнее — приходится гонять больше трафика. Плюс всплывает еще одна проблема: существует множество форматов, которые нельзя анализировать одним и тем же способом, например при помощи grep. И именно тут отпадает большинство готовых решений.
Многим привычнее все делать в Microsoft Word, и тогда чувствительные данные могут оказаться в документе вроде того, что на скриншоте ниже.

Есть еще и Excel, где часто лежат списки учеток. Сюда же добавь остальные офисные форматы, обожаемые в корпсегменте: PDF, PowerPoint, Visio и так далее.
В исполняемых файлах тоже попадаются вшитые строки — например, ODBC-строки подключения к базе данных вместе с паролями.
И наконец — архивы: ZIP, RAR, TAR, 7z. В них может быть все, что перечислено выше.
И ни один из этих форматов не возьмешь текстовым поиском — каждому нужен свой парсер.
Идея
Идея простая: не пилить парсеры, а использовать консольные утилиты GNU в Linux. Они вытащат текст даже из самых экзотических форматов. В Linux для любой задачи найдется команда. И для любого типа файлов — утилита или конвейер, который молча, без лишних вопросов и ошибок, прогонит файл и вернет хранящийся в нем текст.

Вместо того чтобы писать все с нуля, я попробовал решить вопрос с минимальными трудозатратами. К тому же чем проще архитектура, тем легче будет ее масштабировать. А на базе утилит GNU все работает надежно: эти инструменты проверены десятилетиями.
Такой подход работает не только с файлами, но и с протоколами. Сейчас краулер понимает HTTP, FTP, SMB, NFS и rsync — самые ходовые способы доступа к файлам в корпоративных сетях. Для всех этих протоколов в Linux есть консольные утилиты. Например, с SMB и NFS ты просто монтируешь сетевую шару в свою файловую систему — и она выглядит как локальная. В итоге можно полностью абстрагироваться от протокола.

Смонтировав удаленный сетевой диск в локальную файловую систему, ты работаешь с файлами без полного скачивания — читаешь только нужные куски. Это экономит трафик и ускоряет краулинг.
Поиск
Из‑за всем известных проблем с NDA я буду показывать работу не на реальных примерах, а на Hello World версиях.
Краулер устроен просто. Он работает как цепочка из следующих компонентов:
mount/Wget → find → file → парсер → CSV-индекс → SQLite/OpenSearch
В зависимости от протокола используется либо утилита mount (для SMB и NFS), либо Wget — для HTTP и FTP. Этими утилитами ты делаешь удаленное содержимое доступным локальному краулеру.
Как только удаленное содержимое становится доступным, стартует утилита find.

Find — это сердце краулера. У этой утилиты куча опций для тонкой настройки: лимит размера файлов, глубина, игнор путей и расширений и так далее. Для контроля глубины используй -maxdepth (и при необходимости -mindepth), порядок обхода переключает -depth (собирать слоями, не «проваливаясь» вглубь), а чтобы не уползти на сетевые или другие файловые системы — -xdev (синоним -mount в GNU find). По размеру можно фильтровать при помощи -size — чтобы не трогать гигантские бэкапы. Игнорить пути и расширения удобно через -path/-prune и -name/-iname.
Вывод find отдаем утилите file — она говорит, что это за файл. И на основе типа файла выбирается тот или иной парсер.

Распространенные форматы
Задача парсера — вытащить из файла только полезные данные в виде обычного текста, чтобы их потом можно было обработать на этапе поиска.
Например, если краулер встречает HTML-документ, он рендерит страницу и сохраняет только полезное — без верстки.

В Linux для этой задачи подойдет сразу несколько консольных браузеров. Мы будем использовать lynx.
С помощью утилиты uchardet можно автоматически определять кодировку, а при необходимости тулза iconv ее правит.

Если на вход попался файл Excel, он прогоняется через xls2csv — на выходе получим текст.

По сути, есть два формата файлов Excel: старый .xls и новый .xlsx. Они сильно отличаются друг от друга, поэтому парсить их приходится по‑разному.

С Word та же история: .doc вытаскиваем через catdoc, а .docx — обычным unzip.

Если краулер натыкается на PDF, он прогоняет его через pdf2txt.py.


Если краулер натыкается на презентацию PowerPoint, он прогоняет файл через такой пайплайн и вытаскивает текст.


Если используешь Microsoft Visio, то тут свой конвейер — смотри скриншоты.


Фреймворк Radare2 может распарсить почти любой исполняемый формат — EXE, DLL, SYS, ELF и другие — и вытащить из бинарника строки.


Если попадется картинка, вытаскиваем из нее текст через Tesseract.


Если это аудиофайл, текст в нем можно распознать утилитой Vosk.



Когда краулер натыкается на видео, он через FFmpeg с нужным FPS вытащит кадры и сохранит их как изображения.


Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
