Статья Приманка хакера. Как создать Honeypot используя Python

Logotype.png

Введение
Любопытство и жажда получить конфиденциальную информацию становятся фундаментом в большинстве киберпреступлений. Человек очень часто размывает границы дозволенного и уже через некоторое время ему приходится отвечать перед законом. Но бывают ситуации, когда такого не происходит. Тогда приходится копать гораздо глубже, чем просто анализ систем на вирусы. Чтобы не ломать голову в таких ситуациях рекомендуется использовать приманки или скрипты-шпионы, которые активируются при вторжении в систему. В этой статье я расскажу как создать такую программу при помощи Python.

План работы

Перед этим давай обозначим фронт работы, чтобы случайно не уйти в другую тему. Первым делом ударимся в теорию и я расскажу тебе немного о таком термине, как honeypot. После этого определимся с его базовыми функциями и рассмотрим все способы создания. От самого простого до самого продвинутого. Для этого тебе потребуется Python 3.10.x и любая удобная IDE под
написание кода. В остальном ничего сложного тебе ждать не стоит. Приступим к работе.


Немного теории
Honeypot (с англ. — «горшочек с мёдом») — ресурс, представляющий собой приманку для злоумышленников. Задача такой программы это подвергнуться атаке или несанкционированному исследованию, что впоследствии позволит изучить стратегию злоумышленника и определить перечень средств, с помощью которых могут быть нанесены удары по реально существующим объектам безопасности. Реализация Honeypot может представлять собой как специальный выделенный сервер, так и один сетевой сервис, задача которого это привлечь внимание взломщиков.

Honeypot появились с первыми компьютерными злоумышленниками. Honeypot’ам насчитывается по меньшей мере 20 лет разработки по их созданию и внедрению проводились параллельно с исследованиями IDS. Первым документальным упоминанием была книга Клиффорда Столла «The Cuckoo’s Egg», написанная в 1990 г. Через десять лет, в 2000 г. honeypot стали повсеместно распространенными системами-приманками. Впоследствии IDS и honeypot будут представлять собой единый комплекс по обеспечению информационной безопасности предприятия.

Помимо honeypot, сегодня применяются следующие средства защиты компьютерных сетей: honeynet, honeytoken, padded cell, IDS, IPS. Последние два не подходят под определение honeypot - они являются не приманками, а системами обнаружения и предотвращения вторжений. В то же время наиболее близким понятию honeypot становится IDS - система обнаружения вторжений, протоколирующая все несанкционированные подключения к целевой системе.

В статье мы не будем поднимать собственный сервер, а попробуем отследить входящие подключения и действия злоумышленника на устройстве. Для этого выделим основные цели и задачи нашей программы, а это:
  1. Считывание нажатий всех клавиш;
  2. Фиксация новых подключений через прослушиваемые порты;
  3. Введение журнала для работы;
  4. Фиксация новых файлов или директорий.
Конечно, этот список можно пополнить отправкой всей информации на другое устройство, через Telegram или почту, но я решил ограничится обычным доступом. Проще говоря работать наш скрипт будет в случаи удаленного подключения или физического контакта с компьютером. К примеру если ты ушел с рабочего места, а твой коллега решил проверить, что ты там делаешь.

Создаем основу
По стандарту любой код начинается с импорта нужных модулей. Все они уже тебе известны или ты как минимум уже встречался с ними ранее. Я их описал ниже в виде кода.
Python:
import logging
import psutil
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from pynput import keyboard

Чтобы все не казалось таким непонятным, давай еще раз пробежимся по ним и узнаем, за что они отвечают:
  1. logging - отвечает за введение журналов и отображения всех необходимых действий;
  2. psutil - создан с целью управления процессами;
  3. watchdog - аварийная перезагрузка, которая не дает скрипту зависнуть;
  4. pynput - считывает нажатия с клавиатуры и мыши.
Теперь следует создать основную функцию, в нее мы поместим вызов всех модулей для работы. То есть это пульт управления нашим скриптом, из которого будут вызываться все действия. Также поместим в него наш файл, в него будут записываться все изменения системы. Чтобы все было понятно назовем его system_changes и преобразуем в переменную. На коде это выглядит следующим образом:

Python:
if __name__ == "__main__":
    log_file = 'system_changes.log'
    input_handler = InputHandler(log_file)
    port_handler = PortHandler(log_file)
    file_handler = FileHandler(log_file)

    with keyboard.Listener(on_press=input_handler.on_press, on_release=input_handler.on_release) as listener:
        while True:
            port_handler.check_ports()

    # observer = Observer()
    # observer.schedule(file_handler, path='.', recursive=True)
    # observer.start()
    # try:
    #    while True:
    #        pass
    # except KeyboardInterrupt:
    #    observer.stop()
    #    observer.join()

В main функции создаются экземпляры классов InputHandler, PortHandler и FileHandler с указанием пути к текстовому файлу, и запускаются отслеживания нажатий клавиш на клавиатуре и проверка портов. Слежение за изменениями файловой системы закомментировано, чтобы не мешать работе других обработчиков. Все это будет записываться в указанный текстовый файл. Также тебе следует вызвать базовую конфигурацию для логирования при помощи этой части кода (в ней вызывается формат, уровень и дата):

Python:
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

Теперь давай займемся созданием наших классов, каждый из них будет отвечать за отдельный спектр задач. Начнем с InputHandler. В этом классе нам нужно определить методы нажатия и отпускания клавиш, для этого воспользуемся модулем logging:

Python:
class InputHandler:
    def __init__(self, log_file):
        self.log_file = log_file

    def on_press(self, key):
        logging.info(f"Key pressed: {key}")
        with open(self.log_file, 'a') as f:
            f.write(f"Key pressed: {key}\n")

    def on_release(self, key):
        logging.info(f"Key released: {key}")
        with open(self.log_file, 'a') as f:
            f.write(f"Key released: {key}\n")

Код максимально понятен и прост. Сначала мы логируем действие, тем самым выводя его на экран, а дальше просто записываем информацию в наш текстовый документ. Также чтобы каждый раз не перезаписывать сам файл мы открываем его на дозапись, тем самым обновляя всю необходимую информацию.

Теперь давай реализуем функцию просмотра запущенных на прослушивание портов. Конечно, ты можешь самостоятельно открыть терминал и написать волшебную команду netstat с флагом -a, но наша основная задача сохранять изменения системы. Поэтому переходим к созданию класса PortHandler, его я поместил чуть ниже Input и выглядит он следующим образом:

Python:
class PortHandler:
    def __init__(self, log_file):
        self.log_file = log_file

    def check_ports(self):
        for conn in psutil.net_connections():
            if conn.status == 'LISTEN':
                logging.info(f"Port {conn.laddr.port} is being listened")
                with open(self.log_file, 'a') as f:
                    f.write(f"Port {conn.laddr.port} is being listened\n")

В нем определен метод check_ports, который перебирает все активные соединения и записывает информацию о портах, на которых происходит прослушивание, в текстовый файл. Таким образом если вирус попробует соединится с хостингом ты об этом сразу же узнаешь. В условном цикле стоит статус прослушивания. Его ты можешь поменять, если хочешь узнать закрытые или просто открытые порты, но я не думаю, что эта информация будет полезнее нашей.

Теперь у нас остается последний класс FileHundler. В него мы поместим наш сканер папок и файлов. Как ты понимаешь его главная цель определить недавно созданный объект вместе с его расположением. В связке с считыванием нажатий клавиш ты сможешь узнать какую информацию вводил злоумышленник. В виде кода все выглядит следующим образом:

Python:
class FileHandler(FileSystemEventHandler):
    def __init__(self, log_file):
        self.log_file = log_file

    def on_created(self, event):
        if event.is_directory:
            logging.info(f"Directory created: {event.src_path}")
            with open(self.log_file, 'a') as f:
                f.write(f"Directory created: {event.src_path}\n")
        else:
            logging.info(f"File created: {event.src_path}")
            with open(self.log_file, 'a') as f:
                f.write(f"File created: {event.src_path}\n")

    def on_deleted(self, event):
        if event.is_directory:
            logging.info(f"Directory deleted: {event.src_path}")
            with open(self.log_file, 'a') as f:
                f.write(f"Directory deleted: {event.src_path}\n")
        else:
            logging.info(f"File deleted: {event.src_path}")
            with open(self.log_file, 'a') as f:
                f.write(f"File deleted: {event.src_path}\n")

В классе FileHandler определены методы on_created и on_deleted, которые вызываются при создании или удалении файлов или директорий. В каждом из этих методов информация о событии записывается в текстовый файл. Если тебе не нравится, что скрипт выводит всю информацию в консоль, то можешь добавить переменную logger в мэйн функцию программы и задать ей действие logger.getLogger(), после этих действий следующей строкой пишешь logger.disabled и передаешь туда булевое значение True. Готово! Теперь в твоей консоли все чисто и нет никаких навязчивых уведомлений.

Другой вариант решения проблемы это оставить пустым значение logging.info, тем самым программе просто нечего будет выводить. На основе такой базы ты можешь модифицировать honeypot добавляя в него различные фишки. Одна из таких это запись в автозагрузку при помощи взаимодействия с реестром. Для этого создай новую функцию и помести туда эту часть кода:

Python:
autoname = "honeypot.py"
path = os.path.dirname(os.path.realpath(__file__))
address = os.path.join(path, autoname)
key_reg = OpenKey(HKEY_CURRENT_USER,
                  r'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',
                  0, KEY_ALL_ACCESS)
SetValueEx(key_reg, autoname, 0, REG_SZ, address)
CloseKey(key_reg)

Перед этим не забудь импортировать os, иначе код просто не запустится. В случаи если ты хочешь получать всю информацию прямо на блюдце, то рекомендую использовать модуль , который отправляет все данные прямо в Telegram. Для этого требуется создать async функцию с командой и идентифицировать ее с помощью диспетчера. Ну а для этого рекомендую прочитать полную документацию.

На основе этой информации ты можешь спокойно собрать полноценный honeypot под различные задачи. Теперь предлагаю подвести итоги проведенной работы.

Подводим итоги
Обратимся снова к началу и посмотрим, как далеко мы продвинулись в достижении цели. Если ты настроил и создал все правильно, то перед тобой должен быть полноценно рабочий honeypot с базовыми функциями. Сам код легко читается и будет понятен без каких либо дополнительных комментариев. Чтобы фиксировать действия не так часто ты можешь прикрутить функцию time sleep, он поможет снизить нагрузку на компьютер.
 
Последнее редактирование модератором:

system-exe

One Level
13.11.2020
3
1
BIT
2
Интересная функция для меня новичка - логирование новосозданых файлов и каталогов.
Бывают случаи когда нужно понять куда та или иная программа создает файлы или логи.
Таким образом перед запуском програмvы можно запустить этот скрипт ну например в vs code терминале с установленным Py.
Только как остановить работу скрипта? (типа команды "Горшочек не вари" или "Хватит золотая антилопа")
Вопрос от новичка но в целях повышения образованности попрошу к нему отнестись МАКСИМАЛЬНО серьезно ))
 
  • Нравится
Реакции: Mark Klintov

Mark Klintov

Grey Team
23.07.2022
151
297
BIT
23
Интересная функция для меня новичка - логирование новосозданых файлов и каталогов.
Бывают случаи когда нужно понять куда та или иная программа создает файлы или логи.
Таким образом перед запуском програмvы можно запустить этот скрипт ну например в vs code терминале с установленным Py.
Только как остановить работу скрипта? (типа команды "Горшочек не вари" или "Хватит золотая антилопа")
Вопрос от новичка но в целях повышения образованности попрошу к нему отнестись МАКСИМАЛЬНО серьезно ))
В консоли сочетания Ctrl + C или закрыть программу через диспетчер
 
  • Нравится
Реакции: system-exe

z0l0v

Grey Team
06.10.2022
2
2
BIT
10
Отличная штука получается ! :)
Завтра запилю свой ночной горшочек с медом ;)

:unsure:У меня вопрос к автору или знатокам,
как адаптировать последний этап ("это запись в автозагрузку" windows) для линуксообразной оси?
 
  • Нравится
Реакции: Дядюшка Рик

leyline

New member
20.03.2024
1
0
BIT
36
Чисто из интереса, а возможно ли таким образом обнаружить майнер на компьютере? Ведь для майнинга вроде как использует интернет, а psutil позволит получить названия процесса, путь к нему и на сколько загружен цп этим процессом.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!