Python в ИБ. Часть 4. Создаём продвинутый TCP-сервер.

Этот урок будет посвящён созданию более продвинутого и функционального TCP-сервера. Создание базового сервера было в уроке №2 (советуем ознакомиться).

Теория.

Теории будет не много. Здесь мы просто опишем, что будет из себя представлять наш новый сервер.

Во-первых, данный сервер будет создан с помощью фреймворка для сетевых серверов, который встроен в Python. Название фреймворка – “SocketServer”, документацию можно найти здесь.

Во-вторых, мы сделаем многопоточный сервер, чтобы он мог принимать сразу несколько соединений и обслуживать их одновременно. В этом нам поможет библиотека “threading”

В-третьих, мы добавим авторизацию и зашьём её прямо в код сервера (не самый лучшее решение, но для демонстрации концепции – сойдёт). Для этого мы будет использовать библиотеку “hashlib”, с помощью которой можно получать хеши для любых данных.

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

Практика.

Начнём писать код нашего сервера. А начнём мы как обычно с подключения библиотек и динамической передачей номера порта через аргументы командной строки.

Из библиотеки “hashlib” нам понадобится только алгоритм вычисления хеш-суммы MD5, по этому мы импортировали только его, а не всю библиотеку.

В документации к “SocketServer” можно найти пример многопоточного сервера (тут). Его мы и возьмём за основу, немного адаптировав (уберём часть кода, который нам не нужен). В частности уберём код функции “client”, т.к. он нам не нужен, мы будем подключаться с помощью  nc или своего клиента.

В итоге получим что-то вроде этого (изображение выше). Из добавленного нами только лишь бесконечный цикл в строках 35-39 (данный цикл для того, чтобы сервер закрылся только при исключении, например прерывании с клавиатуры). Также нужно подключить библиотеку “time”, т.к. мы используем от туда функцию sleep, в строке 37.

Если коротко пройтись по коду, то мы создаём объект класса “ThreadedTcpSever” (строка 28) и выставляем ему обработчик в виде класса RequestHandler. В классе RequestHandler есть метод handle, который является точкой входа обработки каждого соединения (если хотите – это функция main, для обработки пришедшего нам запроса). После создания сервер запускается в отдельном потоке, который будет создавать дополнительные потоки при подключении новых клиентов, а в основном потоке запускается бесконечный цикл, т.к. при завершении работы основного потока мы потеряем контроль над остальными потоками данного процесса.

Уже сейчас можно запускать наш сервер и подключаться к нему. Запуск сервера производится следующей командой.

Не забываем указывать порт. Теперь подключимся через nc.

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

Так и есть, один клиент был обработан в потоке 3, а второй в потоке 4.

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

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

Итак, имя пользователя у нас admin и пароль такой-же. Различные сценарии подключения вы можете видеть выше.

Теперь давайте сделаем “чуть” безопаснее. Добавим взятие хеша от переданного пароля и сравнение с хранящимся в памяти программы хешом.

Для начала получим хеш от верного пароля.

Отлично, теперь добавим его в код и чуть перепишем обработчик проверки пароля. Добавим хеш в виде глобальной переменной.

И изменим проверку пароля.

Протестируем полученный сервер.

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

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

Кстати, вы можете доработать это сервер в моменте отключения неактивных клиентов (например, клиент ничего не передаёт в течении 15 секунд), подумайте, как это реализовать (все библиотеки у вас уже подключены).

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

Вас ебали, ебут и будут ебать. Государство, хакеры, чиновники.
Остановить эту свингер-пати невозможно. Но мы научим предохраняться.
Следите за новостями на нашем канале @cybersecs или на сайте
cybersec.org