Honeypot - це сервер-приманка. Ти навмисне робиш його вразливим, ставиш окремо від усього цінного - і чекаєш, поки хтось спробує залізти. На справжньому сервері такого гостя банять одразу; приманка - навпаки: тут нема чого ламати, тому можна спокійно впустити й записати кожен його крок. Сенс не в тому, щоб когось упіймати й покарати, а в тому, щоб побачити - хто ходить, якими паролями стукає і що робить, коли «зайде».
Cowrie - це honeypot, що вдає із себе SSH- (і Telnet-) сервер. Він навмисне виглядає легкою здобиччю: впускає «хакера» зі слабким паролем, показує йому фейкову файлову систему, дає «виконувати» команди - і при цьому записує кожну спробу входу, кожну команду й кожен файл, який той намагається завантажити. Зловмисник думає, що зламав твій прод, а насправді бавиться в пісочниці під наглядом.
Що потрібно зробити?#
Підняти Cowrie в Docker, задати йому апетитне імʼя й слабкий пароль-приманку, а тоді - найцікавіше - самому зіграти зловмисника й подивитись, як пастка його ловить у реальному часі. Наприкінці зберемо короткий звіт із того, що вона записала.
З чим працюю?#
Окрема одноразова машина honeypot.linuxway.com.ua зі свіжим Debian і Docker (нема Docker - це на одну команду). Образ беру офіційний - cowrie/cowrie. Чесно: honeypot - це останнє місце, яке варто ставити поряд із чимось цінним, тож усе відбувається в ізольованій пісочниці, яку після запису не шкода знищити (про це - в кінці).
Ставимо пастку#
Створюємо проєкт і кладемо compose.yml. Cowrie всередині слухає SSH на порту 2222 (щоб не вимагати root у контейнері), а томи etc і var виносимо на хост - там будуть конфіг, логи й записи сесій:
| |
Якщо монтуєш etc як том, Cowrie більше не бачить вбудованих дефолтів - тому поклади туди cowrie.cfg.dist (береться з образу) і свій cowrie.cfg із перевизначеннями. Головне, що ми міняємо, - імʼя, яке побачить «гість». Нехай пастка виглядає як смачний прод-сервер:
| |
І etc/userdb.txt - правила входу. Це серце приманки: очевидні паролі root/admin відхиляємо (щоб було видно кілька невдалих спроб), а решту - впускаємо:
| |
Тепер піднімаємо:
Ready to accept SSH connections - пастка розставлена й чекає. Тепер найцікавіше.
Хтось клюнув#
А тепер зіграймо зловмисника. Я заходжу на пастку, як звичайний автоматичний брутфорсер: пробую root/root, root/admin - відмова, - а тоді слабкий root/123456 - і двері відчиняються. Усередині «гість» робить рутинну розвідку: хто я, що за система, скільки ядер (бо хоче запустити майнер), і намагається стягнути свій miner.sh.
Ліворуч - живий лог пастки, праворуч - те, що бачить зловмисник. Дивись, як кожен його крок одразу лягає в лог:
Найсмачніше, що «гість» впевнений, ніби сидить на справжньому web-prod-01: бачить правдоподібний /etc/passwd, 96 ГБ памʼяті (о, буде де майнити!), нормальний uname. А насправді кожна його команда - лише запис у нашому журналі. wget «качає» файл у нікуди, але URL ми вже зберегли - разом із паролями, якими він ломився, і всім, що він набрав.
А що в логах?#
Cowrie пише все у два файли: людиночитний cowrie.log і структурований cowrie.json (по події на рядок), а ще зберігає повний TTY-запис сесії - його потім можна відтворити покадрово. Рідного дашборда в Cowrie немає (дані зазвичай віддають у Grafana, ELK чи Splunk), але навіть із простого cowrie.json за хвилину збирається зведення: хто стукав, якими паролями, що робив усередині:

Ось вони, два невдалі паролі, один вдалий, уся розвідка і та сама спроба стягнути miner.sh. Для одного «гостя» виглядає скромно, але коли пастка постоїть відкритою в інтернеті добу, у цій таблиці будуть сотні рядків із усього світу - і ти раптом дуже наочно побачиш, що діється за дверима.
Навіщо дивитись, а не просто банити?#
Логічне питання: якщо вже видно, що стукає зловмисник, - чому не забанити одразу, навіщо впускати? Бо в приманки інша робота, ніж у файрвола. Банити на бойовому сервері ти й так будеш; honeypot про інше:
- Розвідка.
fail2banбачить лише факт брутфорсу й блокує IP. Honeypot показує, що зловмисник робить після входу: які команди, якими інструментами, звідки тягнеminer.sh. Це вже не «хтось стукав», а «ось повний сценарій атаки» - і ти знаєш, до чого готуватись на справжніх серверах. - Рання детекція без хибних спрацювань. Якщо приманка стоїть у внутрішній мережі, де легітимного трафіку до неї нема нуль, то будь-який дотик до неї - це вже інцидент. Нема чого фільтрувати, нема false positives: конект = хтось уже всередині периметра.
- Зразки на аналіз. Паролі, з якими ломляться, URL шкідливих скриптів, самі файли - усе це осідає в пастці живими зразками, а не абстрактною статистикою.
Коротко: файрвол - щоб не пустити, honeypot - щоб побачити й зрозуміти. Одне не замінює інше.
Куди ставити (і як не прострелити собі ногу)#
Одне застереження, важливіше за все інше. Honeypot - це сервіс, який ти навмисне робиш привабливим для зловмисників. Тому:
- Не став його поруч із чимось цінним. Окрема машина, окремий VLAN, жодного доступу звідти до твоєї справжньої інфраструктури. Якщо хтось таки вирветься з пастки - йому нема куди йти.
- У проді Cowrie вішають на порт 22 (а справжній SSH перевішують на інший порт), щоб ловити звичайний фоновий брутфорс. У демо я лишив
2222, щоб не чіпати робочий sshd пісочниці. - Не став на свій робочий Proxmox-вузол «аби було». Для цього й існують одноразові пісочниці: підняв, записав, знищив.
Куди далі#
Cowrie вміє значно більше: ловити ще й Telnet, працювати в proxy-режимі (пропускати атакувальника на справжню заздалегідь-жертовну систему й писати все по дорозі), віддавати події в SIEM, рахувати метрики, зберігати всі завантажені зловмисниками файли на аналіз. Є навіть експериментальний режим, де відповіді в шелі генерує LLM - щоб «гість» затримався довше.
Cowrie - це honeypot «з глибиною»: він дає фейковий шел і записує, що роблять усередині. Якщо ж тобі треба не вивчати атаку, а просто знати, що хтось постукав, - дивись у бік OpenCanary від Thinkst. Це легша приманка-tripwire: вона вдає одразу купу сервісів (SSH, HTTP, FTP, SMB, Redis, MSSQL…) і не грається в шел, а просто шле тобі сигнал тієї ж миті, щойно хтось торкнувся порту. Її ставлять усередині мережі як сторожа: нормального трафіку до неї нема, тож будь-який конект = тривога. Cowrie відповідає на питання «що робив зловмисник», OpenCanary - на питання «чи він уже тут».



