+ Reply to Thread
Results 1 to 1 of 1

Thread: Exploit Development Course Part 5: Windows Basics (Перевод: klaus)

  1. #1
    klaus's Avatar

    Default Exploit Development Course Part 5: Windows Basics (Перевод: klaus)

    Перейти к содержанию


    Введение

    Это очень короткая по своему содержимому статья, содержащая некоторые факты о которых должны знать Windows разработчики, но Linux разработчики этого могут не знать.

    Win32 API

    Основное API операционной системы Windows предоставляется посредством динамических библиотек (DLL- Dynamic Link Libraries). Приложения имеют возможность импортировать функции из них и потом вызывать их. Таким образом, API ядра может меняться от версии к версии без вреда для приложений пользовательского режима (user mode).

    Формат исполняемых данных PE (Переносимый Выполняемый)

    Выполняемые файлы и динамические библиотеки являются РЕ (Portable Executable). Дальше будет использовать сокращение в виде «РЕ»). Каждый РЕ включает таблицу импорта и экспорта. Таблица импорта определяет функции для импорта и в каких файлах они размещены. Таблица экспорта соответственно определяет функции для экспорта, то есть функции, которые могут быть импортированы другими РЕ файлами.

    РЕ файл состоит и многих секций (для кода, данных и т.д.). Секция .reloc содержит информацию для перемещения выполняемого файла или DLL с одного места памяти в другое. Некоторые адреса в коде относительные (для относительных jmp), некоторые абсолютные: зависят от того, где в памяти размещен модуль.
    Загрузчик Windows начинает искать DLL начиная с текущей директории, поэтому может случиться так, что приложение будет распространятся с DLL отличающейся от такой же библиотеки в системной директории (\windows\system32). Эту проблему управления версиями прозвали DLL-адом.

    Одним из важных концептов является RVA (Relative Virtual Addressотносительный виртуальный адрес). РЕ файлы используют RVA для определения позиции элементов относительного базового адреса модуля. Другими словами, если модуль загружен по адресу В и элемент имеет RVA обозначенное как Х, тогда абсолютный адрес элемента будет равен В+Х.

    Поточность

    Если вы используете Windows, тогда для вас не будет странным концепт потоков, но если вы пришли с Linux, вам стоит запомнить то, что Windows предоставляет кванты процессорного времени потокам, в то время как Linux предоставляет это время процессам. Более того, здесь нету функции fork(). Вы можете создать новый процесс с помощью CreateProcess() и новый поток с CreateThreads(). Потоки выполняются внутри адресного пространства процесса которому он принадлежит, таким образом они разделяют память между собой.

    У потоков ограниченная поддержка не разделяемой памяти через механизм называемый TLS (Thread Local Storageлокальное хранилище потока). В основном, TEB каждого потока содержит основной TLS массив 64 двойных слова (DWORD) и произвольный TLS массив из максимум 1024 двойных слов который выделяется в ситуации, когда основному TLS массиву недостаточно существующих двойных слов. Сперва индекс, который соответствует позиции в одном из двух массивов должен быть выделен или зарезервирован с помощью TlsAlloc(), которая возвращает индекс на выделенное место. Далее, каждый поток может получить доступ к двойному слову (DWORD) в одном из двух TLS массивов процесса которому он принадлежит по индексу, который вернула функция упомянутая выше. DWORD может быть прочитан функцией TlsGetValue(Index) и записан по этому индексу с помощью TlsSetValue(Index, newValue).

    В виде примера, TlsGetValue(7) читает DWORD по индексу 7 из основного TLS массива в TEB текущего потока.

    Стоит заметить, что мы можем эмулировать данных механизм используя GetCurrentThreadId(), но это будет не так эффективно.

    Токены и имперсонация

    Токены (маркеры) – это нечто, свидетельствующее о наличии полномочий или прав доступа. Токены реализованы 32-х битными целыми числами на подобии файловых дескрипторов. Каждый процесс хранит внутреннюю структуру которая содержит информацию о правах доступа которые ассоциируются с токеном.
    Есть два типа токенов: первичный и вторичный. Когда процесс был создал, ему присваивается первичный токен. Каждый поток процесса может иметь токен процесса или вторичный токен, полученный из другого процесса, или же вызвать функцию LoginUser() которая возвращает новый токен если была запущена с корректными данными.

    Что бы присоединить токен к текущему потоку Вы можете использовать SetThreadToken(newToken). Что бы удалить, используется RevertToSelf() которая заставляет поток вернуться к своему первичному токену.

    Допустим, пользователь соединяется с сервером в Windows и отправляет имя пользователя и пароль. Сервер, запущен как SYSTEM, вызовет LogonUser() с предоставленными данными доступа и если они корректны, функция вернет токен. Затем сервер создает новый поток и созданный поток вызывает SetThreadToken(new_token) где new_token это токен который вернула функция LogonUser(). Таким образом поток выполняется с теми же привилегиями пользователя. Когда поток закончил обслуживать клиента, он либо уничтожается либо вызывает функцию revertToSelf() и помещается в пул свободных потоков (pool of free threads).

    Если вы можете заполучить контроль над сервером, вы можете вернуться к правам SYSTEM вызовом RevertToSelf() или поискать другой токен в памяти и присоединить его в текущему потоку с помощью SetThreadToken().
    Стоит помнить тот факт, что CreateProcess() использует первичный токен как токен для нового процесса. Это является проблемой в том случае, если поток который вызвал CreateProcess() имеет вторичный токен с привилегиями большими чем у первичного. В данном случае, процесс, который был создан, будет иметь меньше привилегий нежели поток, который его создал.

    Решение данной проблемы в создании нового первичного токена текущего процесса из вторичного токена используя DuplicateTokenEx(). Потом создать новый процесс вызвав CreateProcessAsUser() с новым первичным токеном.

    © Translated by klaus (r0 Crew)
    Last edited by klaus; 26-06-2015 at 08:37.
    Do not follow the ancient masters, seek what they sought. (c) Matsuo Bashō

  2. 7 пользователя(ей) сказали cпасибо:
    Dark Koder (24-06-2015) Shizoid (01-07-2015) benedict (25-06-2015) dukeBarman (23-06-2015) nosos (23-06-2015) root (25-06-2015) ximera (23-06-2015)
+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 12:27
vBulletin® Copyright ©2000 - 2017
www.reverse4you.org