Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ctftool — Интерактивный инструмент для исследования CTF | Kitploit
Инструменты/GitHubGitHub/taviso/ctftool
Фреймворки для эксплойтовФаззингТестирование на ПроникновениеОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubtaviso/ctftool

ctftool

Интерактивный инструмент для исследования CTF

Репозиторий
1.7k2634 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CTFTOOL

Просто хотите протестировать эксплойт SYSTEM? Нажмите здесь.

Видео эксплойта

Интерактивный инструмент для исследования CTF

Это 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 <команда>, чтобы получить подробную справку по конкретной команде.

root@kitploit:~
$ ./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>

Первое, что вы захотите сделать — подключиться к сеансу и посмотреть, какие клиенты подключены.

root@kitploit:~
ctf> connect
The ctf server port is located at \BaseNamedObjects\msctf.serverDefault1
NtAlpcConnectPort("\BaseNamedObjects\msctf.serverDefault1") => 0
Connected to CTF server@\BaseNamedObjects\msctf.serverDefault1, 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 Windows.

Если все зависимости установлены, достаточно ввести make в командной строке разработчика.

Я использую вариант "Build Tools" Visual Studio, и единственные выбранные мной компоненты — MSVC, MSBuild, CMake и SDK.

В этом проекте используются подмодули для некоторых зависимостей; убедитесь, что вы используете команду, подобную этой, для получения всего необходимого кода.

root@kitploit:~
git submodule update --init --recursive

Эксплойт

Примеры работают только на Windows 10 x64. Затронуты все платформы и версии, начиная с Windows XP, но PoC для них пока не реализован.

Этот инструмент был использован для обнаружения множества критических проблем безопасности в протоколе CTF, существовавших десятилетиями.

Если вы просто хотите протестировать эксплойт на Windows 10 x64 1903, запустите или дважды щёлкните ctftool.exe и введите эту команду:

root@kitploit:~
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> script .\scripts\ctf-consent-system.ctf

Это будет ждать появления диалогового окна UAC, скомпрометирует его и запустит оболочку.

Фактически, код эксплойта разделён на два этапа, которые можно использовать независимо. Например, вы можете скомпрометировать процесс, принадлежащий пользователю другого сеанса, используя необязательные параметры connect.

Большинство клиентов CTF могут быть скомпрометированы, так как ядро заставляет приложения, рисующие окна, загружать уязвимую библиотеку.

Просто подключитесь к сеансу, выберите клиента для компрометации (используйте команды scan и thread, или просто wait), затем:

root@kitploit:~
ctf> script .\scripts\ctf-exploit-common-win10.ctf

Примечания по эксплуатации

Построение цепочки переходов CFG, работающей на большинстве клиентов CTF, было довольно сложной задачей. В финальном эксплойте есть два основных компонента: произвольная запись примитива, а затем настройка наших регистров для вызова LoadLibrary().

Вы можете использовать dumpbin /headers /loadconfig, чтобы вывести список разрешённых целей ветвления.

Произвольная запись

Мне нужен был гаджет произвольной записи для создания объектов в предсказуемом месте. Лучший пригодный гаджет, который мне удалось найти, — это произвольное уменьшение dword в msvcrt!_init_time.

Это означает, что вместо простой установки нужных значений нам приходится уменьшать до тех пор, пока младший байт не достигнет нужного значения. Это много работы, но нам никогда не придётся делать более (2^8 - 1) * len уменьшений.

Запись уменьшением

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

Макет поддельного объекта

Существовало (конечно) множество гаджетов произвольной записи, проблема заключалась в том, чтобы восстановить управление выполнением после записи. Это оказалось довольно сложно, и именно поэтому я застрял на уменьшении dword, а не на чём-то более простом.

MSCTF перехватывает все исключения, поэтому задача состояла в том, чтобы найти такую произвольную запись, которая не испортила бы стек так, чтобы SEH выжил, или не привела бы к быстрому аварийному завершению без повреждений.

Гаджет msvcrt!_init_time был лучшим, что я смог найти: через несколько инструкций он разыменовывает NULL, не повреждая больше памяти. Это означает, что мы можем повторять его бесконечно.

Перенаправление выполнения

Я нашёл два полезных гаджета для настройки регистров. Первый был:

root@kitploit:~
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]

А второй:

root@kitploit:~
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 нарушает эти допущения и позволяет непривилегированным процессам отправлять ввод привилегированным процессам.

Для успешной атаки есть некоторые требования: насколько мне известно, она будет работать только в том случае, если у вас установлен язык отображения, использующий OoP TIP (внепроцессный процессор текстового ввода). Пользователи с языками ввода, использующими IME (китайский, японский, корейский и т. д.), и пользователи с инструментами специальных возможностей попадают в эту категорию.

Примеры атак включают...

  • Отправку команд в окно командной строки с повышенными привилегиями.
  • Чтение паролей из диалоговых окон или экрана входа.
  • Выход за пределы песочницы IL/AppContainer путём отправки ввода в окна без песочницы.

В каталоге сценариев есть пример сценария, который отправит ввод в окно блокнота, чтобы продемонстрировать, как работают сеансы редактирования.

Скриншот сеанса редактирования

Перехват монитора

Поскольку в протоколе CTF нет аутентификации между клиентами и серверами, злоумышленник, обладающий необходимыми привилегиями для записи в \BaseNamedObjects, может создать порт ALPC CTF и выдать себя за монитор.

Это позволяет обойти любые и все ограничения, налагаемые монитором.

Если вы хотите поэкспериментировать с этой атакой, попробуйте команду hijack в ctftool.

root@kitploit:~
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
ctf> hijack Default 1
NtAlpcCreatePort("\BaseNamedObjects\msctf.serverDefault1") => 0 00000218
NtAlpcSendWaitReceivePort("\BaseNamedObjects\msctf.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("\BaseNamedObjects\msctf.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("\BaseNamedObjects\msctf.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 поддерживает подключение к сеансам, отличным от текущего, если вы хотите поэкспериментировать с этой атакой.

root@kitploit:~
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 в ответ на многочисленные недостатки проектирования, которые помог выявить этот инструмент.

По этой причине считайте, что этот инструмент находится в состоянии proof-of-concept.

Поддерживаемые версии и платформы

Все версии Windows, начиная с Windows XP, используют CTF на всех поддерживаемых платформах.

Хотя CTF не являлся частью базовой системы до XP, начиная с Windows 98 и NT4 CTF использовался, если был установлен Microsoft Office.

ctftool поддерживает Windows 7 и более поздние версии на x86 и x64, но более ранние версии и другие платформы могут быть поддержаны; вклады приветствуются.

Аббревиатура

Microsoft не документирует, что означает CTF; это не объясняется ни в документации по текстовым службам, ни в примерах SDK, ни в именах символов, ни в заголовочных файлах, ни где-либо ещё. Моя теория состоит в том, что это от CTextFramework — то, как мог бы называться класс в венгерской нотации.

На некоторых сайтах утверждается, что ctfmon имеет отношение к ClearType Fonts или Azure Collaborative Translation Framework. Это ошибка.

Обновление: Jake Nelson находит свидетельства в пользу "Common Text Framework"

Авторы

Tavis Ormandy [email protected]

Лицензия

Весь оригинальный код предоставляется по лицензии Apache 2.0. Подробности см. в файле LICENSE.

Ниже перечислены импортированные сторонние проекты.

  • pe-parse, by Andrew Ruef et al.
    • pe-parse используется для реализации GetProcAddress() для 64-битных модулей из 32-битного процесса. Это используется в команде symbol и позволяет одному и тому же бинарному файлу работать на x64 и x86.
  • wineditline, by Paolo Tosco.
    • wineditline используется для реализации удобного ввода с командной строки и редактирования истории.
  • dynamorio, by Derek Bruening et al.
    • Я позаимствовал некоторые прототипы и определения типов из DR.
  • ntdll.h, by Ladislav Zezula.
    • Ladislav собрал некоторые определения структур и прототипы из различных выпусков WDK, DDK, SDK в один удобный файл.
Скачать инструмент