↓ До тексту
  1. Статті/

Cowrie - honeypot, що ловить незваних гостей

·5 хвилин
cat /etc/passwd
Автор
cat /etc/passwd
Технічний блог про Linux, DevOps та Open Source технології.
Зміст

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 виносимо на хост - там будуть конфіг, логи й записи сесій:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  cowrie:
    image: cowrie/cowrie:latest
    container_name: cowrie
    restart: unless-stopped
    ports:
      - "2222:2222"            # SSH-пастка (у проді мапиш на 22)
    volumes:
      - ./etc:/cowrie/cowrie-git/etc     # cowrie.cfg + userdb.txt
      - ./var:/cowrie/cowrie-git/var     # логи, TTY-записи сесій, завантаження

Якщо монтуєш etc як том, Cowrie більше не бачить вбудованих дефолтів - тому поклади туди cowrie.cfg.dist (береться з образу) і свій cowrie.cfg із перевизначеннями. Головне, що ми міняємо, - імʼя, яке побачить «гість». Нехай пастка виглядає як смачний прод-сервер:

1
2
3
4
5
6
# etc/cowrie.cfg
[honeypot]
hostname = web-prod-01

[output_jsonlog]
enabled = true

І etc/userdb.txt - правила входу. Це серце приманки: очевидні паролі root/admin відхиляємо (щоб було видно кілька невдалих спроб), а решту - впускаємо:

1
2
3
4
# username:x:password   ( * = будь-що, ! = заборонити )
root:x:!root
root:x:!admin
root:x:*

Тепер піднімаємо:

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 за хвилину збирається зведення: хто стукав, якими паролями, що робив усередині:

Звіт пастки, зібраний з 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 - на питання «чи він уже тут».

Related

Beszel - легкий моніторинг серверів без Grafana

·4 хвилини
Prometheus + Grafana - це потужно, але для кількох домашніх серверів забагато. Beszel робить те саме простіше: hub + agent у Docker, і метрики всіх хостів з графіками на одній сторінці. Показую з відео встановлення в терміналі та відео роботи в браузері.

Homepage - один дашборд на всі домашні сервіси

·5 хвилин
Десяток вкладок із сервісами замінюємо однією акуратною стартовою сторінкою. Homepage - легкий YAML-дашборд, що піднімається за хвилину в Docker: групи сервісів, іконки, статус контейнерів, погода, пошук. З живим записом і скриншотами.