На всех эта­пах прод­вижения по внут­ренней сети перед пен­тесте­ром сто­ит задача быс­тро разоб­рать все, что лежит на открыв­шихся общих ресур­сах. С каж­дым новым уров­нем дос­тупа объ­ем таких фай­лов рас­тет лавино­образно. Вот бы в локал­ке был свой Google! Сегод­ня поп­робу­ем его соз­дать самос­тоятель­но.

Это иссле­дова­ние получи­ло вто­рое мес­то на Pentest Award 2025 в катего­рии Out of scope. Сорев­нование еже­год­но про­водит­ся ком­пани­ей Awillix.

Пуб­личные сетевые шары в любой локал­ке — кла­дезь нес­трук­туриро­ван­ных дан­ных. Но если ты пен­тестер, копать­ся в них тяжело, осо­бен­но ког­да сро­ки под­жима­ют. Для защит­ников это та же боль: сетевые дис­ки зарас­тают мусором годами, и на это при­выч­но зак­рыва­ют гла­за.

При ана­лизе защищен­ности сетевые дис­ки и шары час­то изу­чают вруч­ную — бег­ло прос­матри­вают «инте­рес­ные» фай­лы и типовые катало­ги (нап­ример, ищут сло­во «пароль»). Но таких шар может быть десят­ки и даже сот­ни. Воз­можнос­ти руч­ного тру­да огра­ниче­ны: прос­мотр быс­тро прев­раща­ется в про­фана­цию, и этот век­тор поч­ти не отра­баты­вают. Вдо­бавок часть фай­лов может быть дос­тупна и по дру­гим про­токо­лам: FTP, NFS, rsync и даже HTTP.

Моя раз­работ­ка пыта­ется решить эту проб­лему. Она оди­нако­во полез­на и ата­кующим — что­бы быс­тро искать пароли и дру­гие чувс­тви­тель­ные дан­ные, — и защит­никам: мож­но под­нять неп­рерыв­ный кра­улинг и дер­жать его вклю­чен­ным.

Сис­тема на 99% соб­рана из готовых ком­понен­тов — поч­ти без допол­нитель­ного кода. Для раз­верты­вания тебе хва­тит пары команд.

Ис­кать чувс­тви­тель­ные дан­ные мож­но дву­мя спо­соба­ми. Самый оче­вид­ный — ана­лиз по име­ни фай­ла и его рас­положе­нию. Он быс­трый и ска­ниру­ет все фай­лы на сетевых шарах. Ты дела­ешь рекур­сивный обход дирек­торий, собира­ешь име­на, раз­меры, вре­мя изме­нения — это­го хва­тает, что­бы при­кинуть акту­аль­ность. Но содер­жимое при таком под­ходе оста­ется загад­кой: ты судишь толь­ко по наз­ванию. А оно час­то врет. Люди пря­чут важ­ное в 1.txt, 123.docx или дают фай­лу имя, понят­ное толь­ко авто­ру. В ито­ге ран­жирова­ние по име­ни — под­ход сла­бень­кий.

Ана­лиз по содер­жимому фай­лов дает самый пол­ный резуль­тат. Но он мед­леннее — при­ходит­ся гонять боль­ше тра­фика. Плюс всплы­вает еще одна проб­лема: сущес­тву­ет мно­жес­тво фор­матов, которые нель­зя ана­лизи­ровать одним и тем же спо­собом, нап­ример при помощи 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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии