>
Июнь 2018
Пн Вт Ср Чт Пт Сб Вс
« Апр    
 123
45678910
11121314151617
18192021222324
252627282930  

Бессмертный SHELL. Продолжаем практику web shell строительства.

Иногда возникают ситуации, когда был залит web shell на хороший хост, с которого ой как не хочется уходить, тогда первым делом, конечно, надо хорошо закрепиться на сервере, создать условия для максимального затруднения обнаружения шелла (и в том числе для ав) в отдельном файле или уже существующем, а это первым делом обфускация, ну и несколько других моментов надо учитывать (некоторые можно посмотреть с нашей первой статье о web shell).

Но порой даже хорошие методы запрятывания могут быть сведены на “нет” тотальной чисткой и переустановкой движка. В таком случае надо иметь дополнительную подстраховку, которая, конечно тоже может быть ликвидирована внимательным администратором, но тем не менее она все равно хорошо прикрывает тылы и дает определенную вероятность на восстановление web shell.

Суть этого нехитрого метода заключается в загрузке определенного скрипта в память, чтобы он раз в некоторое время проверял наличие web shell и при его отсутствии встраивал его заново (или грузил временный, через который мы бы снова быстро встраивали основной). Этот метод теряет свое значение, когда происходит перезагрузка сервера (а это событие для серверов достаточно редкое) или админ сам обнаруживает странный процесс и убивает его, но с этим можно кое-что сделать, чтобы усложнить задачу (уйдет в конце).

Скрипт можно реализовать на большинстве языков, интерпретаторы которых установлены на сервере (можно и спецом на C, но легче на скриптовом), на bash’е и пр., исключением в большинстве случаев будет PHP, так как у него обычно есть ограничения на длительность выполнения, которое конечно можно обойти самозапуском, но это добавляет сложности и вероятности к обнаружению админом, так что лучше им пренебречь.

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

Схема работы.
Тут можно пойти двумя способами:

  1. Запуск под конкретные параметры локально;
  2. Запуск и ожидание поступления команд с параметрами с удаленного хоста;

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

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

Теперь более подробно о деталях. Алгоритм работы (серверной, основной части) может быть следующим:

  1. в отдельном потоке в бесконечном цикле проверка на получение команд (и реагирование, если получены);
  2. проверка наличия файлов по параметрам и реагирование;
  3. засыпаем на N секунд и возвращаемся на 3 шаг;

Детали: работать будет на UDP порту (чтобы не сильно светился при скане nmap’ом, ну и вообще без лишних хендшейков для меньшего засвета, если траф логируется), настройки будет хранить в памяти, при получении команды будет их менять динамически (если команда корректна), отвечать об успешности, будем проверять как наличие параметров для проверки и восстановления файлов, так и сами файлы и реагировать на эти ситуации. Параметрами будут – текстовая сигнатура, которую надо искать во всех файлах и папках указанного пути (это часть кода шелла), сам путь, где искать, линк на скачивание нового шелла и путь, куда его сохранять (встраивание в другие файлы можно реализовать самостоятельно при желании).

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

Серверная часть.
Для возможности запуска в отдельном потоке реализуем класс, через который потом и будем запускать:



Для проверки наличия шелла в файлах и реагирования, если он отсутствует лучше написать 2 отедльные функции, чтобы потом было легче допиливать:


Ну и надо сделать саму функцию, которая будет реализовывать саму логику и вызываться с перерывом:


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


Клиентская часть.
Тут вообще просто, вот функция для отправки данных, получения и отображения ответа:


Вот сам код для ввода команд и передачи в эту функцию


При запуске клиента, надо установить адрес серверной части и номер порта (ключе см. через –help). Синтаксис команд для отсылки на сервер очень прост и описан при запуске клиентского скрипта с примерром, так что повтоярть его тут не буду.

Запуск.
Отдельно хотелось бы заметить, что запускать серверную часть лучше все таки определенным образом, чтобы он не слишком “светился” при мониторинге процессов через top или какие-нибудь аналоги. Лучше:

  • не запускать через абсолютный путь, а через ./script (так как его длина может чисто визуально выделять его среди других процессов);
  • переименовать в какой-нибудь apache, php, mysql и пр. (естественно, удалив расширение);
  • еще лучше создать линк на интерпретатор: ln -s /usr/bin/python php и запустить с его помощью переименованный файл: ./php apache;

Так даже ключевое слово “python” должно пропасть при именовании и описании процесса скрипта.

Итог.
На выходе получили клиент-серверную связку из двух маленьких скритпов, которые должны по умолчанию запускаться на большинстве *nix системах (где обычно по умаолчанию стоит python, что будет достаточным условием, так как в скриптах исопльзовались стандартные модули), которые обладают минимальным функционалом для достижения поставленной цели, и которые с легкостью можно дорабатывать под свои конкретные нужды.

Рабочие файлы проекта можно скачать здесь

Share Button
[Всего голосов: 8    Средний: 2.8/5]

Вам может быть интересно также:

Last updated by at .

Leave a Reply

You can use these HTML tags

<a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">