АнтиШелл в теории. Избавимся от SYSTEMcmd.exe

Автор: admin

Попробуем сегодня разобраться, что нужно для того, чтобы запретить запуск шелла в общем случае, а значит решить проблему с эксплоитами, руткитами, троянами и этим лоадером. В общем случае было бы неплохо иметь опциональную возможность блокирования "левых" CMD.EXE


В общем случае нас интересует возможность запрета получения командной строки с любого из системных процессов (не от пользователя). Будь-то svchost, lsass, или другой SYSTEM процесс, который при создании cmd-shell уже должен насторожить. Иными словами, если вы видете у себя в процессах cmd от пользователя SYSTEM – вы точно почуете неладное. Предлагаю написать драйвер, который запретит эту операции вообще!... Преступим.

Вступление.


Опытному читателю покажется идеальным метод, при котором после патча SDT Windows получить контроль над ZwCreateProcess(Ex) блокировать запуск CMD(Метод перехвата описан Гарри Неббетом). Думаю, что этот популярный способ плох сегодня, по следующим причинам:

1. Перехват SDT Windows – весьма варварский поступок по отношению к Windows. Не говоря о том, что в теории возможны существование программ, которые следят за изменениями SDT. Этот метод популярен в массах, а значит, его легко снять, легко заменить. Опора на изменение SDT дает невозможным портирование на последние линейки 64х версий Windows. Те, если придется портировать эту защиту на 64х – потребуются большие исследования по патчу 64х разрядного SDT, снятия защит и пр.


2. Сам факт того, что мы контролируем запуск процесса непосредственно через API – не очень удачное решение. Сегодня существуют способы запуска приложения без использования перехваченного CreateProcess, достаточно корректно отмапить приложение в память передать управление на точку входа… можно только представить какие последствия принесет внедрение такого метода запуска в эксплоит, и применения его на «якобы защищенную» систему.


Ну и наконец мы ведь не пишем зловредных программ – мы не изменяем SDT Windows. Мы создадим фильтр файловой системы. В целом наш фильтр будет похожим на драйвер-фильтр любой антивирусной программы.

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

ZwOpenProcessToken(NtCurrentProcess(), TOKEN_READ, &hToken);

Получим текущий TOKEN_USER:

ZwQueryInformationToken(hToken,
TokenUser,
tokenInformation,
TokenInformationSize,
&returnLength );

Конвертируем SID в строковое представление:

RtlConvertSidToUnicodeString(&uc_UserSID, userSID, TRUE);

Если он является S-1-5-18, мы можем с уверенностью предполагать, что процесс SYSTEM.

Что мы в этом случае должны предпринять?.. не передаем вниз по стеку IRP - блокируем чтение файла, завершив IRP:

Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; IoCompleteRequest(Irp, IO_NO_INCREMENT);

Итак, пока вы ищете «чудо заплатку» по сети – мы уже разрабатываем такой драйвер который поможет вам с вирусами, и уязвимостями вашего компьютера – и у вас не болит больше голова по этому поводу! Зимой теперь вам могут больше насолить грипп и простуда – мы рекомендуем пить малину, чай с лимоном и употреблять витамины.

Комментарии

Нет комментариев. Вы можете быть первым!

Оставить комментарий

:

:
: