Введение
Любопытство и жажда получить конфиденциальную информацию становятся фундаментом в большинстве киберпреступлений. Человек очень часто размывает границы дозволенного и уже через некоторое время ему приходится отвечать перед законом. Но бывают ситуации, когда такого не происходит. Тогда приходится копать гораздо глубже, чем просто анализ систем на вирусы. Чтобы не ломать голову в таких ситуациях рекомендуется использовать приманки или скрипты-шпионы, которые активируются при вторжении в систему. В этой статье я расскажу как создать такую программу при помощи 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 - система обнаружения вторжений, протоколирующая все несанкционированные подключения к целевой системе.
В статье мы не будем поднимать собственный сервер, а попробуем отследить входящие подключения и действия злоумышленника на устройстве. Для этого выделим основные цели и задачи нашей программы, а это:
- Считывание нажатий всех клавиш;
- Фиксация новых подключений через прослушиваемые порты;
- Введение журнала для работы;
- Фиксация новых файлов или директорий.
Создаем основу
По стандарту любой код начинается с импорта нужных модулей. Все они уже тебе известны или ты как минимум уже встречался с ними ранее. Я их описал ниже в виде кода.
Python:
import logging
import psutil
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from pynput import keyboard
Чтобы все не казалось таким непонятным, давай еще раз пробежимся по ним и узнаем, за что они отвечают:
- logging - отвечает за введение журналов и отображения всех необходимых действий;
- psutil - создан с целью управления процессами;
- watchdog - аварийная перезагрузка, которая не дает скрипту зависнуть;
- pynput - считывает нажатия с клавиатуры и мыши.
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, он поможет снизить нагрузку на компьютер.
Последнее редактирование модератором: