Network Honeypots

С незапамятных времён антивирусные конторы использовали приманки для отлова малвари.

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

Несмотря на низкую частоту обновлений антивирусных баз, дизассемблировать весь файловый поток затруднительно. Проверку можно автоматизировать: запускаем предполагаемый файловый вирус рядом с подложными файлами-дрозофилами и если они изменены — однозначно детектируем файл как вредоносный.

Современные нам антивирусные ловушки эволюционировали до виртуальных машин, отдающих список вызываемых системных функций с последующей постановкой вердикта.

Чтобы определить криптолокер, достаточно запустить бинарь рядом с файлами из предполагаемого списка интереса: pdf, doc, mdb etc. А если после перезагрузки виртуальной машины в системе запускается новый код — детектируем (даже неизвестный) авторан.

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

Похожим образом ловят сетевых червей, достаточно разместить на сервере ловушку эмулирующую конкретный сервис: FTP, TELNET, SSH etc.

С точки зрения червя, необходимо понять настоящий перед ним сервис или фальшивка.

Максимум на что может рассчитывать наш семпл — краткосрочная аренда виртуальной машины с полноценной OS. Однако, в большинстве случаев используются эмуляторы.

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

Детали протокола

В качестве подопытного кролика был выбран telnet. Этот невероятно старый протокол возник на заре существования сетей. Первая версия датируется 1969 годом, а сравнительно актуальная 1983. Он проектировался до возникновения TCP, что не мешает ему работать до сих пор. Преимущественно используется для встраиваемой техники.

Каждый раз встречая новый протокол, надеюсь что обойдётся без чтения RFC. Пока ни разу не обошлось.

Для того чтобы быстро понять как устроен тот или иной протокол, бывает полезно посмотреть на дамп трафика. Нам поможет WireShark, имеющий встроенные парсеры.

telnet_wireshark

По сравнению с современными протоколами, telnet довольно запутанный. Согласно RFC он работает как воображаемое устройство по имени Network Virtual Terminal.

По-простому говоря, это протокол для работы с терминалом по сети.

Предполагается, что с терминалом будет взаимодействовать человек, поэтому на стороне сервера может быть любой софт, выводящий в терминал что угодно.

В ранней версии протокола не предусмотрена авторизация. Он стандартизирует только управляющие команды, которые могут быть вставлены в любое место в потоке символов.

Команда имеет длину от двух до произвольного количества байт. Начало команды обозначается управляющим символом IAC = 0xFF, что значит Interpret as Command. За ним следует код команды, от которой зависят дальнейшие байты.

На скриншоте выше WireShark показывает команду 0xFFFC01, что означает: IAT WON’T ECHO. В общем случае, команды «договариваются» о технических деталях, вроде количества строк на экране или режима передачи бинарных данных. Существует множество RFC расширяющих стандартный набор команд, вроде добавления NTLM авторизации.

Пишем свой Telnet-server

Написать полноценный telnet-server весьма непросто. Однако большинство червей эмулирует пользователя ещё хуже, так что обильный урожай логов нам обеспечен.

Писать мы будем на python, понятно что в production версиях нужно использовать готовые библиотеки, но в образовательных целях мы будем кодить всё нативно.

telnet_honeypot.py

Логика сервера была скопирована с реального устройства из Shodan. Пользователь нажимает клавишу, клиент отправляет её код на сервер, который в свою очередь возвращает её клиенту. При получении управляющего символа Ctrl+D рвём соединение. Читаем строку из сокета до символа переноса. Управляющие команды зачастую имеют длину 3 байта, мы их просто игнорируем.

Подключаемся через штатный telnet клиент винды и видим в логах введённые данные:

telnet-server-test

Ура! Наш телнет сервер изволил работать без явных нареканий.

Логи сервера

За неделю наблюдений накапало 45 тысяч (!) попыток авторизации, которые проводились с 573 различных IP адресов и перебирали суммарно 182 пароля. Почему так мало? Telnet-черви делают ставку на стандартные (оставленные производителями устройств) пароли:

Ограничения ловушек

Реализовать полноценную поддержку RFC — задача не из лёгких. Любой эмулятор не более чем «видимость» настоящей системы, реализующий самый базовый функционал. Существуют и более сложные системы, способные эмулировать исполнение системных команд через SSH и собирать семплы в автоматическом режиме.

В природе встречаются и настоящие, но кастрированные (посредством chroot) системы, зачастую не дающие исполнять ничего кроме шелла. Детектировать их можно по ограничениям для нашего приложения.

2 thoughts on “Network Honeypots

  1. Привет. Хорошие у тебя статьи! Пожалуйста напиши мануал по асемблеру? Сколько пробовал читать книг, так не понял его. Может ты же сможешь изложить все проще для понимания итп. Ведь чтобы делать реверс его же нужно знать

    1. Дарова. Мануалов по ассемблеру очень и очень много, лично я начинал с рассылок Калашникова под 16бит, хорошим введением в 32битный (и WinApi) будет цикл Уроки Iczelion‘а, я рекомендую установить ollydbg (читай мануалы от Рикардо Нарваха там же) и прям в нём ассемблировать\исполнять пошагово все интересные тебе опкоды и смотреть как меняется стек\регистры — это самый простой способ их выучить.

Добавить комментарий