![]() |
Автор: DiabloNova
Переводчик: ARCHANGEL Оригинал (EN): www.rootkit.com Источник (RU): www.reverse4you.org CsrWalker – использование csrss в качестве детектора руткитов Игра в обнаружение и сокрытие всегда была интересной. Особенно когда предметом этой игры становились такие объекты, как процессы Windows. Как вы, возможно, знаете, существует огромное количество «крутых» утилит для доказательства возможности сокрытия процессов, основной задачей которых является сокрытие процессов, созданных в режиме пользователя, от всевозможных методов перечисления процессов. Эта статья повествует о создании программы обнаружения скрытых процессов, работающей лишь в третьем кольце защиты. К статье также прилагаются исходные коды, доказывающие возможность создания такой программы. Ниже представлен небольшой список доступных утилит для сокрытия процессов (большинство из них уже устарели, но некоторые – новые): Hacker Defender FU/FUTO rkdemo (1.0-1.2) phide_ex Z0mBiE Некоторые другие, не представленные здесь. Принцип работы этих утилит – внедрение в ядро Windows для манипулирования внутренними объектами с целью сокрытия процессов от таких программ, как TaskManager или Process Explorer. С другой стороны, существует множество общедоступных (и приватных) утилит-детекторов, основной целью работы которых является выявление скрытого содержимого путём проведения ряда проверок внутренностей операционной системы. Каждая новая программа сокрытия процессов обходит все (или почти все) ранее известные методы обнаружения. В основном, это происходит, потому что заранее известно, как антируткит будет искать скрытые процессы. Большинство методов обнаружения основывается на поиске таких объектов, как EPROCESS и ETHREAD, несколькими различными методами. Например, для этого можно использовать анализ таблицы PspCidTable (таблицы дескрипторов), списки планировщика (как поступает GMER v1.14), проверять определённые поля в EPROCESS, такие как LIST_ENTRY, перехватывать KiSwapContext, искать потоки, выполнять поиск процессов полным перебором и т.д. Вообще-то, всего этого вполне достаточно для поиска любой существующей на сегодня малвари, которая скрывает процессы во время работы. Если в привате и существует какая-то малварь, способная лучше выполнять сокрытие, то это – неважно, так как она находится в привате. Это было вступление. Мистический CSRSS всегда был мне интересен просто потому, что он выполняет роль супервизора для процессов пользовательского режима. Для продолжения работы все win32 процессы должны информировать CSRSS о своём создании на стадии инициализации. Именно этот компонент выполняет всю работу по инициализации подсистем процессов (из csrsrv.dll, которая является сердцем CSRSS). Именно он – новый обнаружитель скрытых процессов (встроенный в NT с самого начала). Всё это – абсолютно недокументированно. Всё, что я получил, когда попытался найти ссылки по данному материалу, были исходные коды ReactOs, которые были неполными и попросту отличались от NT. Реверсинг и восстановление кода менеджера подсистем заняло много времени, но это было забавно и не так уж сложно при наличии небольшого куска исходного кода. CSRSS – не такая содержательная вещь, наиболее интересные моменты содержаться в csrsrv.dll. Внутри неё содержится неэкспортируемый символ CsrRootProcess. Он выполняет огромную роль в CSRSS, поскольку является указателем на структуру CSR_PROCESS, выглядящую так: Код:
//Vista/2008 csrsrv.dll (истинно также для XP, 2003)CsrInsertProcess для меня была ключом, помогающим найти CsrRootProcess. Она вызывается из CsrCreateProcess – экспортируемой, но недокументированной функции, вызов расположен ближе к концу CsrCreateProcess. Код:
text:75B15E94 call CsrSetBackgroundPriorityКод:
text:75B14CC9 ; int __stdcall CsrInsertProcess(int Session, int a2, int a3)Код:
CsrInsertProcess( .... )Код:
.text:75B152D3 CsrLockProcessByClientId proc near Кроме этого, CSRSS также хранит список потоков в структуре, на которую указывает другой неэкспортируемый символ – CsrHashThread. Это массив из 256 элементов, где каждый элемент представлен структурой LIST_ENTRY. Каждый LIST_ENTRY указывает на структуру CSR_THREAD: Код:
typedef struct _CSR_THREAD { // Код:
.text:75B15353 CsrLockThreadByClientId proc nearНаиболее важным здесь является проход по структуре, на которую указывает CsrRootProcess. Но только CLIENT_ID и ещё немного информации становится доступной. Я потратил немного времени на написание небольшого детектора, который использует CsrRootProcess и CsrHashThread для поиска скрытых процессов. Результат был действительно впечатляющим. Даже не смотря на то, что внутренности CSRSS не предоставляют исчерпывающей информации о процессах (из них не удалось получить ETHREAD или EPROCESS, или я не нашёл способа, как это сделать {Примечание переводчика: про очки я тут не писал}) полученной информации хватило для обнаружения всех вышеупомянутых руткитов. Тем не менее, я думаю, что такой способ обнаружения непригоден для практического использования из-за малого объёма предоставляемой информации. Именно поэтому вы и читаете это сейчас. Посмотрите скриншоты (они настоящие). Пожалуйста, не беспокойте меня расспросами о примерах для теста. Если у вас их нет, значит на то есть свои причины. CsrWalker против RKDEMO v1.2. http://nrg-team.org/web_files/ARCHAN...kdemo12rq1.gif CsrWalker против PHIDE_EX http://nrg-team.org/web_files/ARCHAN...deexpocbh1.gif CsrWalker против Z0mBiE v1.1 http://nrg-team.org/web_files/ARCHAN...mbiepocra1.gif CsrWalker против n0name PoC http://nrg-team.org/web_files/ARCHAN...namepocdb0.gif Самой крутой фишкой всего этого является то, что всё было сделано исключительно из режима пользователя, а код, обнаруживающий скрытые процессы, легко портировать на все версии Windows NT от 2000 до 2008. Важное дополнение дляWindows Vista В Windows Vista и старше существует несколько процессов csrss.exe, одновременно выполняющихся в системе. Это было сделано для большей изоляции процессов, работающих под учётной записью SYSTEM, от всех остальных (я полагаю, что в этих системах каждая учётная запись имеет свой собственный csrss.exe). Поэтому под Windows Vista данный метод обнаружения скрытых процессов был слегка доработан. Перед просмотром csrss.exe необходимо построить список этих самых csrss.exe, а после – просмотреть каждый из них. Под ХР задача упрощалась – можно было получить идентификатор процесса csrss.exe с помощью простого вызова CsrGetProcessId. Всё, что делает эта функция – это считывает переменную, содержащую этот самый идентификатор. .text:77F5BAE2 public CsrGetProcessId .text:77F5BAE2 CsrGetProcessId proc near .text:77F5BAE2 mov eax, CsrProcessId .text:77F5BAE7 retn .text:77F5BAE7 CsrGetProcessId endp Начиная с Windows Vista, мы больше не можем полагаться только на это значение. Лучшим способом получения списка запущенных процессов csrss.exe будет проход по глобальной таблице дескрипторов и восстановление имён объектов, описываемых этими дескрипторами. Причина таких действий заключается в том, что csrss имеет права эксклюзивного доступа на два дескриптора типа Port/ALPC с именами ApiPort и SbApiPort. Однако под Windows Vista объекты типа ALPC имеют некоторые ограничения на открытие/чтение информации (для примера попробуйте просмотреть их свойства через ProcessExplorer и будете удивлены), поэтому данный метод не подходит. Существует несколько возможных решений, и одно из них реализовано в CsrWalker’е. Первое – искать все процессы с именем csrss.exe и пытаться разобрать их внутренние структуры, описанные выше. Неплохой метод, но он не подходит для настоящих хакеров. Второе – произвести внедрение кода в процесс, работающий под учётной записью SYSTEM, например, в один из процессов с именем svchost.exe, после из этого процесса вызвать CsrGetProcessId. Я оставлю это тем, кто хочет попробовать и улучшить/обойти CsrWalker. Помните, это только доказательство концепции. Поэтому это может работать, а может и нет. Никаких BSOD’ов, я обещаю. Файлы к статье ARCHANGEL © AHTeam, r0 Crew |
Очень обширно.
Хотя можно было бы срезать на пару моментах |
Отлично =) Было бы канешн неплохо чтоб указывало путь к файлу но и так оч хорошо. я успокоился немного =) У меня 42/0
|
| Время: 15:03 |